July 16, 2026

1.1.0-beta Ships, Dead Weight Goes With It

The 1.1.0 beta finally went out — and took a feature that had never once fired in production, plus a chunk of write-only logging code, down with it.

1.1.0-beta went out the door today — the release the thread rework and the OOM-killing memory rewrite have been building toward for a week. No fanfare needed; the point of shipping in the open is that it just happens.

The best part of the day wasn’t the release, though. It was finding a feature that never worked, not even once, and cutting it instead of fixing it. The rich-media list card had an “action button” that routed through a generic chat-action endpoint — and that endpoint parked the request forever whenever the underlying action was policy-gated, because a gated action never opened the row a completion check looks for. The check that was supposed to say “this is done” structurally could never fire. Nobody noticed, because nobody was using it — the feature had been sitting there, silently broken, since it shipped. Instead of patching the checker, ripped the whole thing out: the endpoint, the channel enum, the frontend host component, the dead CSS. Wired the list card straight to the list endpoint instead — one hop, no detour through a system it never needed. Net minus 603 lines for a feature that was already contributing zero.

The API migration that ate almost every other vertical last week picked off the last real straggler today too: chat itself moved onto the same Endpoint/Action contract. Small behavioral change buried in the port — it stopped hiding real handler crashes behind a blanket 500. A genuine fault now surfaces through the normal error path instead of a masked envelope.

Went hunting for more dead weight while rebuilding the context meter, and found a write-only request-logging path nobody was reading — a field threaded through two provider objects, written to disk, read by nothing, because whatever used to read it got left behind in an earlier rewrite. Gone, along with the file-path helper that only existed to support it. Separately, every context-window size calculation got collapsed onto one shared helper, which made a second thing obvious: a cached token-limit column that had drifted out of sync with it. Deleted too.

The actual feature work was the meter itself. It used to poll an endpoint for how full the context window was; now it gets pushed a signal straight off the one moment in the provider layer where the token count and the window size both exist together. A provider that doesn’t hand back a token count now shows nothing on the meter, instead of a fabricated zero. The log table behind it got cut down to what it actually is: a spend ledger, one type column instead of three that meant almost the same thing.

Rest of the day was cleanup that matters more than it sounds. Doc ingestion stopped duplicating its own page-fetching logic and started reading through the same path the reader tool already uses, which fixed a real drift bug — watched folders and manual uploads had quietly started storing documents differently, and watched docs fell back to a slower re-read on every view. Both paths write the same fields now. And updates to Chalie itself are manual again: no more in-app update command pretending to manage its own upgrade path. Re-run the installer when you want a new version, on purpose.

Two features that were never pulling their weight are gone. One that was faking precision with a poll is now honest and live. Not a bad set of trades for a release day.

  • Shipped 1.1.0-beta, closing out the thread rework and memory rewrite that had been building toward it

  • Found and deleted a list-card action-button feature that had never fired once in production, due to a structurally broken completion check — net -603 LOC

  • Moved chat onto the Endpoint/Action contract, the last major straggler from last week’s API migration, and stopped masking real handler crashes behind a blanket 500

  • Replaced the polled context-meter endpoint with a live pushed signal, deleted a write-only request-logging path and a stale token-limit cache column, and reduced the backing log table to a plain spend ledger

  • Unified document ingestion onto one shared reader path, fixing a drift bug where watched folders stored documents differently than uploads