Repository navigation
Releases: Hedronite/geode
Release list
v3.0.0
Geode 3.0.0. Major version: local geode run and Linux custody now refuse a secret binding with an empty or unusable allow_hosts, and macOS now enforces allow_hosts.
Crates: geode-cli, geode-grotto, geode-tui, geode-redact, geode-os at 3.0.0.
BREAKING
- Linux custody and local
geode runrefuse a secret binding whoseallow_hostsis empty or unusable (policy_deny, nothing spawned). Tokens issued with an empty list no longer run and must be reissued with the hosts they may contact.
Security
test-trusted-rootis also refused at build time for any optimized build (opt-levelother than 0), so a custom profile with debug assertions on cannot ship the test-only trust-root switch. The release check script now proves this.geode run --homerefuses a path that is itself a symlink. The flag docs now say plainly that these checks are a usability guard, not a security boundary.- CI fails if any release, publish, or tag workflow does not run
check-no-test-trusted-root.sh. - The interim custody argv lint compares path components and requires the pinned command to sit directly in
/usr/local/libexec/hedronite. geode-grottoalso refuses itstest-trusted-rootfeature in any optimized build, matching the CLI guard.- The release-workflow guard ignores comments, requires
check-no-test-trusted-root.shon arun:line or inside a run block, and detects release triggers in map, flow-list (on: [release]), and scalar (on: release) form. cargo test -p geode-cliwith default features passes. The run tests that spawn a child with a secret need the test-only host override and are compiled only withtest-trusted-root, which CI uses.- Local
geode runenforcesallow_hostsfor every secret binding on every platform, including macOS. The check is the custody allowlist (AllowList): a host that is not listed ishost_deniedand is not dialed. A secret binding with an empty or unusableallow_hostsis refused before spawn (non-zero exit). There is no environment variable, flag, or config key that disables the check. Pass hosts with repeatable--allow-host. macOS confines the child with a deny-by-default seatbelt: file and process access is limited to what the child needs to run, mach-lookup is a named allowlist with no network service, Apple events are denied, and network helper programs cannot be exec'd. LaunchServices, the preferences daemon, and the keychain service are not on that list. The seatbelt used when there is no egress proxy is deny-by-default as well and has no outbound network. Outbound network for a confined run is allowed only to the local egress proxy. The proxy listens on both loopback stacks, because the seatbelt loopback name covers both, and refuses to start if either bind fails. Each run puts a token in the proxy URL; a request without it is not dialed. A process that can read the child environment can present that token. A DNS answer in a loopback, private, link-local, multicast, benchmarking, reserved, NAT64, or other non-global range is not dialed unless the request host is an IP literal already onallow_hosts. Proxy denials are audit rows with outcomehost_denied. Linux keeps the network namespace and the same proxy checks. - The egress dial filter treats the local-use NAT64 prefix
64:ff9b:1::/48as restricted, next to the well-known prefix64:ff9b::/96. A name that resolves into that range is not dialed unless the request host is an IP literal already onallow_hosts.
Changed
- Tests: CLI test helpers point
HOMEand the XDG dirs at per-test tempdirs and dropGEODE_KEY_FILE/GEODE_PASSPHRASE, so no test can resolve the operator's key. Custodygeode_rungains Fix 3 audit-fault tests (started-row and close-row) on the in-process daemon.
Full changelog: v2.0.0...v3.0.0
v1.2.1
Patch on 1.2.0. Command help describes what each command does. Internal design notes are no longer in the help text.
Behavior, exit codes, and the vault format are unchanged. GDE1 objects stay readable. Suite 0x01 stays. A Read token still defaults geode_read to text.
Identity lock: git tag v1.2.1 = Cargo 1.2.1 = crates.io geode-redact → geode-os → geode-grotto → geode-tui → geode-cli.
v1.2.0
Compatible 1.x minor on the 1.0 contract. Foundry pack v034: keyring custody and inject-only exec. GDE1 objects written by 1.0.0, 1.0.1, and 1.1.0 remain readable. Suite 0x01 stays. A Read token still defaults geode_read to text. Existing custody verbs, exit codes, and MCP tools geode_list / geode_read / geode_write for a token 1.1.0 already accepts are unchanged.
Added
geode-redactcovers the v1 encodings. Shell quoting is not claimed. A named binding redacts as[REDACTED:NAME].Op::Injectis separate fromRead. An inject-only token defaultsgeode_readtohash. ExplicittextwithoutReadisplaintext_denied.token issueacceptsallow_cmds,allow_hosts,peer_uid, andredact.token inspectprints those claims and does not print sealed bytes.geode runinjects locally with a clean child env.geode audit verifychecks the hash chain.geode agent serve --custodyruns the custody daemon. Linux children run asgeode-run. macOS children stay_geodeunder a seatbelt. No same-uid mode. Norun_as_peer.geode custody unlock,lock, andstatus.statusprints no key bytes.- MCP
geode_runis advertised only by a--custodyserver when the token holdsInject. One buffered result. Linux non-emptyallow_hostsuses a per-child network namespace. If that namespace cannot be made, the run ispolicy_deny. macOS refuses a non-empty list before spawn. An empty list recordshosts: unrestricted.
Not in this tag
geode run --fileandgeode run --socketexit 1. The custodygeode_runtool is the remote run surface.- The machine hook is a later verb. UKI and PCR signing stay on the LE13 interim.
- Darwin
geode mountstill exits 1. Windows is not offered.
Identity lock: git tag v1.2.0 = Cargo 1.2.0 = crates.io geode-redact → geode-os → geode-grotto → geode-tui → geode-cli.
v1.1.0
Compatible 1.x minor on the 1.0 contract. geode sign pub and geode sign blob are the Ed25519 cosign verb. The key stays in Geode. Custody verbs, exit codes, MCP tools geode_list / geode_read / geode_write, and GDE1 suite 0x01 are unchanged. GDE1 objects written by 1.0.0 and 1.0.1 remain readable.
Added
geode sign pubwrites the Ed25519 identity public key as SPKI PEM (BEGIN PUBLIC KEY).geode sign blob PATHsigns the raw file bytes (RFC 8032, no prehash). The signature file is standard base64 plus one trailing newline.- The seed is
blake3::derive_key("geode/v1/ed25519-identity", ISK). A second identity file is a second key on the same verb. Verify with cosign v2.6.5:verify-blob --key pub.pem --signature sig --insecure-ignore-tlog --offline payload. geode key puband.gpubstay X25519.
Not in this tag
- The machine hook is a later verb. UKI and PCR signing stay on the LE13 interim.
Identity lock: git tag v1.1.0 = Cargo 1.1.0 = crates.io geode-grotto → geode-tui → geode-cli.
v1.0.1
Compatible 1.x patch on the 1.0 contract. CLI verbs, exit codes, MCP tools geode_list / geode_read / geode_write, and GDE1 suite 0x01 are unchanged. GDE1 objects written by 1.0.0 remain readable.
Fixed
- Linux FUSE intern path: inherent helpers take the existing
Nodetype - TUI tests that spawn
geodelocate the binary undercargo llvm-cov's target dir - GitHub Actions: sysdeps before
--all-features, MSRV 1.89, feature-matrix, nonempty record-only coverage. No job-levelRUSTFLAGS. No--fail-under-lines.
Changed
- rust-tops kit drop-in and grotto property tests. Density extracts group the same seal/read fields; on-disk format and CLI surface are unchanged.
Identity lock: git tag v1.0.1 = Cargo 1.0.1 = crates.io geode-grotto → geode-tui → geode-cli.
Darwin live FUSE remains a later 1.x.y patch. Windows is not offered.
v1.0.0
Contract freeze. GDE1 objects written by 0.2.x remain readable. Suite 0x01 is unchanged.
The public API is geode-grotto, the geode CLI, and MCP tools geode_list, geode_read, and geode_write on --stdio or --socket PATH. The next incompatible change to those is 2.0.0.
HedronDB integration and the h3s projected-token cookbook are 1.x minors. The Darwin live FUSE mount is a 1.x.y patch. Linux FUSE shipped in 0.2.8. Windows is not offered.
Identity lock: git tag v1.0.0 = Cargo 1.0.0 = crates.io geode-grotto, geode-tui, geode-cli.
v0.2.9
Compatible 0.x patch. Foundry pack v032: the agent Unix socket.
geode agent serve --socket PATH serves the same newline-delimited JSON MCP frames as --stdio on a mode-0600 Unix socket. --stdio and --socket are mutually exclusive. Passing both exits 1. Passing neither exits 1. --stdio alone is unchanged.
No format change. GDE1 objects from 0.2.8 remain readable. macOS live FUSE is not in this tag. Windows is not offered.
Identity lock: git tag v0.2.9 = Cargo 0.2.9 = crates.io geode-grotto, geode-tui, geode-cli.
v0.2.8
Compatible 0.x patch. Foundry pack v030. No format change. GDE1 objects from 0.2.7 remain readable. macOS live FUSE is not in this tag. Windows is not offered.
- On Linux, feature
fuseruns a real FUSE session. Foreground is the default.--daemonforks and writes a pid file.geode unmountcallsfusermount3 -u. - Kernel-free
MountSessionover the shipped VFS. geode mount --helpdocuments the Linux session, the read-write default versus--read-only, and that Darwin is unsupported.
Identity lock: git v0.2.8 = Cargo 0.2.8 = crates.io geode-grotto → geode-tui → geode-cli.
v0.2.7
Compatible 0.x patch. Foundry pack v029. No format change. GDE1 objects from 0.2.6 remain readable. A live FUSE session is still unsupported.
geode mountwithout--read-onlyis read-write.--read-onlystays read-only. Darwin livegeode mountexits 1.--tokencannot mount. Every mount prints the UID-bypass warning.- Manifest entries may be
kind: dir.geode opencreates the directory and does not read an object for it. geode mount --helpdocuments the read-write default versus--read-only.
Identity lock: git v0.2.7 = Cargo 0.2.7 = crates.io geode-grotto → geode-tui → geode-cli.
v0.2.6 — git sidecar
Compatible 0.x patch. Foundry pack v028 (git sidecar + hooks). GDE1 objects from 0.2.5 remain readable.
geode git init|add|status|unlock|lock- BIND_PATHS git-mode; add gitignores plaintext; lock unlinks working copies
--tokencannot git-init/add- Help documents GitHub-visible metadata
crates.io: geode-grotto → geode-tui → geode-cli