README.md
gno.land/p/moul/x/plan9/synfs/v0
A synthetic, read-only file server whose contents are computed at read time. This is the package that makes the rest of the suite adoptable.
1import synfs "gno.land/p/moul/x/plan9/synfs/v0"
2
3t := synfs.New("dev", "sys", func() int64 { return runtime.ChainHeight() })
4t.Root().
5 Add("sysname", func() string { return runtime.ChainID() }).
6 Add("height", func() string { return strconv.FormatInt(runtime.ChainHeight(), 10) })
In Plan 9 a device is not storage, it is code behind a name: reading /dev/time
runs a function. A realm that wants to publish its state as a browsable tree
does the same thing here, in a few lines, and gets ls, cat, stat and
mountability for free.
Read-only by construction. The tree implements ninep.File and not
ninep.Mutable, so every method is free of side effects and the tree is safe to
hand to a namespace owned by somebody else. That is the property the whole
cross-realm mount story rests on.
Two details worth knowing:
- A synthetic file pins
Qid.Versionat 0 forever. Its contents can change on every block, so a version would be a lie; a client that needs change detection should read the file. AddRangeserves the 9P read window itself, for a file with no natural end./dev/zerouses it: an unbounded read returns nothing rather than an endless value, which is what stopscat /dev/zerofrom being a denial of service.
Live demo: r/moul/x/plan9/dev
publishes the chain itself as a device tree. Design and analysis:
moul/gno-contracts#136.
Not affiliated with Plan 9. Plan 9 from Bell Labs is the work of the Computing Science Research Center at Bell Labs; the name and the marks are theirs, and the copyright is held by the Plan 9 Foundation. This package borrows the vocabulary and none of the code: it is an independent homage, asking what that ecosystem's spirit looks like on a chain. Full attribution: NOTICE.
Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.
Dependency graph:

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.