Skip to content

ReferenceLook things up as you need them.

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)

MIT license.