When installed, we put all our Python modules in /opt/thinlinc/modules/thinlinc. That is not how things are organised in the source tree, though. Instead, what ends up in thinlinc/ is spread out over many folders, only to be merged in the final build steps. This confuses language servers, as they try to follow the same semantics as Python itself¹. That means, only one directory can contain the modules for the "thinlinc" package. So the language server often only finds some of our modules. Modern Python has an alternative to packages called "namespaces". This allows using multiple directories with the same name to be searched for modules. We can probably abuse this to get something working. E.g. by not having any __init__.py in the source tree, and packaging it is as part of the build process instead. We could consider dropping __init__.py completely. But that could decrease robustness, as Python would search multiple places for "thinlinc" modules. And there should just be one such directory. ¹ https://github.com/microsoft/pyright/issues/2882