eleven releases, then we stopped
second one of these. every two weeks, what shipped, what we learned, and where we’re going.
these were the two heaviest weeks of code we’ve ever shipped, and then we stopped shipping entirely. every solstone surface is frozen while we finish moving the journal’s core from Python to Rust. no new work goes out on any platform until it lands, and then every surface comes back together in one release. the one thing still in flight is the iphone and watch build we handed apple before the freeze; if apple clears it, testers get it.
(new here? solstone is the platform: sol is the app that lives on your devices, experiences your day with you, and keeps it all in your journal, the memory, on a computer you choose. open source, local-first. your journal is always private, only yours.)
every surface moved
fourteen days:
- journal: 11 releases (0.9.0 → 1.0.22), and the version line unified so one number now means the same release everywhere
- mac: 9 releases of the journal’s own app (1.0.10 → 1.0.22), and sol through 6 of its own (1.4.7 → 1.4.16)
- linux: 2 releases (1.0.0 → 1.0.2), the first after june’s ground-up Rust rebuild
- iphone and watch: off raw build numbers and onto a proper version line, with 0.1.1 in testers’ hands and 0.1.2 with apple
- terminal: sol in the terminal, rebuilt in Rust and released as 1.0.0
- windows stays generally available at 0.2.11, android at 0.2.2 beta
- around 60 fixes across all of it, counted from the changelogs
- still just jer and extro on all of it: around 1,200 commits across the product repos, about 710,000 lines changed (vendored and generated files excluded)
the big themes
you can verify a journal release yourself. every journal release since 1.0.12 lands in a signed, hash-chained public record whose entries are locked against being replaced once published, with a second append-only copy we keep ourselves and a weekly audit that re-verifies every signature against both. checking a solstone release used to mean trusting whichever company hosts our code mirror. ten of this cycle’s eleven journal releases are in the chain, which is its full depth so far; 0.9.1 came out just before it started. linux has its first entry. the other surfaces aren’t in it yet.
the journal installs like a mac app. it is a real installer and a real application now, not a terminal install. it updates itself, and what runs where is visible instead of implied.
one version number. the journal and its mac app used to carry separate version lines, which meant “what am i running” had two answers. they’re one line now, so 1.0.22 means the same release whichever surface you’re looking at.
pairing got direct. mac devices pair with your journal over your own network, with the transport, certificate pinning and admission rules owned by one shared library instead of re-implemented per platform.
why we stopped
the journal has been converting to Rust one piece at a time, in the background, while everything kept shipping. that worked while the pieces were independent. it stopped working when the remaining pieces were the ones every other surface depends on: sol on your mac, on your phone, on your watch, in the terminal, all talking to the journal through interfaces the conversion is going to reshape.
so we were maintaining a half-converted thing and honoring interfaces on both sides of the seam that we already knew we were going to change. we stopped to finish the conversion properly and bring every surface back in one coordinated release instead of threading it through partial releases for another month.
what’s ahead
the conversion, and then everything at once. the health importer is still ahead of us, and what moved this cycle is that the conversion now decides what it gets built on rather than the old Python path. the next wave of speaker recognition is built and proven against the old path, waiting on the same release.
we’ll post the next one of these in two weeks whether or not the freeze has lifted.
sol pbc is a public benefit corporation. article 8 of our articles of incorporation makes the promises about your data structural rather than a policy we could quietly change. what that means.