[Does Nim need package-level visibility? - Nim forum]([https://forum.nim-lang.org/t/4293](https://forum.nim-lang.org/t/4293)) suggested introducing package-level visibility and gave proper rationale for why something like that; however, as noted, it would add complexity to the language (eg: no syntax for that was suggested and it's not clear how to extend the simple * for package-level visibility; likely a macro {.pkg.} would be needed.
Instead, I'd like to suggest something simpler:import foo {.private.} (syntax can be discussed) which imports symbols in foo, as if they were declared public, eg: foo.nim: type Bar* = object field1*: int field2: float proc bar(a:int): int = ... Run tfoo.nim: import foo {.private.} doAssert bar(10) == 10 # we can access `bar` thanks to `{.private.}` pragma Run The idea is to provide an escape hatch to visibility, and the user of {.private.} knows what he's doing. In particular, changes to private symbols are still allowed and are **not considered breaking changes**. Since typically {.private.} would be used within boundaries of a library, this wouldn't result in actual breakages. Additional use cases are enabled by this feature, notably for debugging purposes.