Changelog
Pull requests merged into each release. Generated by git-cliff from cliff.toml; do not edit by hand.
0.3.0 - 2026-10-18
- Set _xsrf on pages from a generic --static-dir (#140)
- Bump the npm group across 1 directory with 2 updates (#136)
- Fix the interrupted-prompt kernel test racing ipykernel's abort queue (#138)
- Move frontend/ to tlockney/ganymede-ui (#135)
- Pin cdp-kernel 0.6.0 in CI and docs (#133)
- install.sh: refuse musl and old glibc, survive a failed cdp-kernel install (#131)
- Contents: ETag and If-Match precondition on saves (#75) (#130)
- Docs: link the site title to the home page (#129)
- Bump the cargo group across 2 directories with 9 updates (#119)
- Bump the actions group with 3 updates (#113)
- Presentation: landing page, README, known gaps and changelog pages (#127)
- fix(server): Ctrl-C stops the server with requests still open (#126)
0.2.0 - 2026-10-18
- Release v0.2.0 (#124)
- CLI behaviour: exit 2 on empty stdin, run --json marks unfinished cells, execute keeps going, nbclient flag aliases (#109)
- Deploy the site from the latest release, not main (#118)
- CLI: completions, attach documented, lab clean/uninstall, extension disable/enable, --json lists (#108)
- Kernel-host test gaps: fake-kernel modes, real-process and real-ZMQ tests (#68) (#110)
- Docs accuracy pass: roadmap, protocol status, language rule, READMEs (#116)
- Add SECURITY.md, a docs security page, and CONTRIBUTING.md (#114)
- Release hardening: provenance attestation, release profile, Rosetta check, recovery doc (#111)
- Default config file, --log-level/--log-file, kernel-id prefix on kernel output (#55) (#102)
- CI hygiene: SHA-pinned actions, least privilege, MSRV, cargo deny, dependabot (#107)
- Keep kernel output across a websocket drop and replay it on reconnect (#53) (#106)
- Startup nudge backs off; cdp-kernel conformance scenarios in kernels.rs (#69) (#105)
- lab install: HTTPS only, host allowlist, timeouts, size caps, yanked releases, version specifiers (#104)
- Contents: rename without the check-then-rename race (#75) (#103)
- Kernels die with the host; a second Ctrl-C stops; replay protection (#70) (#101)
- ganymede info: report Ganymede's own paths and build details (#100)
- Notebook validation message and unknown cell types (#73) (#99)
- Answer 404 for contents paths outside the root, as jupyter_server (#54) (#98)
- Server auth and REST parity fixes: constant-time token, Secure cookie, CORS, Location headers (#96)
- Contents: lock saves per path, first checkpoint, safer trust key (#75) (#94)
- Kernel host: SIGTERM before SIGKILL, cancelled-request cleanup, stop signals in the CLI (#93)
- nbformat: read leniently like Python nbformat; repair cell ids (#90)
- Append chunked uploads instead of keeping the last chunk (#52) (#89)
- Reject unknown config keys; make -q, -v and --startup-timeout work for serve and lab (#91)
- Server: file I/O off the async workers; serialize nbconfig PATCH (#97)
- Resolve --existing in the Jupyter runtime dir; print error chains once (#95)
- Add MIT LICENSE and third-party notices in release archives (#92)
- Confine kernel working directories to the contents root (#88)
- Parse kernelspecs and message headers as leniently as jupyter_client (#87)
- Write notebooks atomically everywhere, through symlinks (#74) (#86)
- Refuse login redirects with control characters in next (#85)
- Create connection files 0600 from the start (#81)
- Validate extension names from wheels and records (#78)
- Dev log: one file per entry in docs/notes/ (#84)
- Free kernel records, report kernel deaths, handle failed restarts (#82)
- Keep floats and big integers exact on save (#79)
- Reject legacy websocket binary frames with no buffers (#80)
- Accept request bodies up to 512 MiB and answer 413 past it (#77)
- Check Host and XSRF when auth is off (#76)
- Build the docs for the custom domain (#40)
- Docs: step-by-step workstation install without Jupyter (#38)
- CI: workstation install with no Python on PATH (#37)
- Add
ganymede lab: start JupyterLab in one command (#33)
0.1.0 - 2026-10-17
- Release 0.1.0 (#36)
- Add
ganymede lab extension: prebuilt JupyterLab extensions from wheels (#32) - Release through a PR, tag on merge; fix flaky kernel startup (#24)
- Notebook trust: sign on save, mark cells trusted, share Jupyter's store (#31)
- Add cookie login for browser frontends (#30)
- Add
ganymede lab install: JupyterLab's frontend from PyPI, no Python (#29) - Add a curl install script for release binaries (#28)
- Add a survey of other Jupyter clients to the docs (#27)
- Add a project site and docs, and move the design notes into them (#22)
- Add release tooling, a changelog, and issue-linked PRs (#14)
- Add a release workflow that packages the ganymede binary (#5)
- Add the engine library, the ganymede CLI, and e2e parity with Jupyter (#4)
- Serve JupyterLab and validate against JupyterLab and VS Code (#3)
- Rename crates from jcore- to ganymede- (#2)
- Rename to Ganymede and add CI (#1)