Skip to content

ChatWalaʻau v0.106.0

Choose a tag to compare

@motojinc25 motojinc25 released this 14 Jul 09:37

This release rebuilds the chat sidebar for scale and makes the startup path honest: 「a compact, collapsible sidebar that loads hundreds of conversations as you scroll, operator-controlled model order, and an app that tells you when the backend is not up instead of pretending it is」.

Highlights

A sidebar that scales to hundreds of chats (v0.106.0)

  • The chat list now loads a page at a time as you scroll instead of fetching every conversation at once. A folder's chats load when you open it.
  • Listing your chats is dramatically cheaper. The server used to open and fully parse every conversation file -- message bodies and all -- on every sidebar load, just to read eleven metadata fields. It now keeps a small metadata index and re-parses only the files that actually changed. On a 300-chat store this cut a listing from ~43 ms to ~5 ms; the saving grows with the size of your history, because the old cost was proportional to the total bytes of every conversation you have ever had.
  • The index (.sessions/index.json) is derived, disposable state: it is reconciled against your files on every read, so a hand-edit, an external tool, or a crash mid-write all self-correct. Deleting it is always safe -- the next listing rebuilds it.
  • Pinned chats always sort first, then the most recently updated. That ordering now comes from the server, so the web UI and chatwalaau sessions list finally agree.
  • Typing in a rename box no longer re-renders every row in the list.

A denser, more legible sidebar (v0.106.0)

  • The Folders and Chats sections each collapse from their header, so you can fold one away and give the other the whole panel. Both start expanded, and the choice is remembered per device.
  • Rows are ~30% shorter (~57px to ~41px) while keeping both lines of text, so noticeably more chats fit on screen.
  • The msgs / imgs labels are now icons on the same line as the timestamp -- the row does not grow, and screen readers still hear "12 messages".
  • Times read as YYYY/MM/DD HH:mm in 24-hour form, the same on every machine regardless of the browser's language. (Previously an en-US machine and a ja-JP machine showed the same chat differently, and one of them with AM/PM.)

You choose the order models appear in (v0.106.0)

  • Drag to reorder chat offerings in the Model Settings screen. That order is exactly what the chat model selector shows, so you can put your most-used model first.
  • Offering cards collapse to a compact row (id, provider, model, default) and expand on click, so setting the order of many models is quick.
  • The default flag now means only "this model is preselected". It no longer forces that model to the top of the list. See BREAKING below.

The app no longer pretends an unreachable backend is fine (v0.106.0)

  • If the API server is not up yet, the app now shows a readiness screen with the attempt count and elapsed time, and gets out of the way the moment the backend answers. If it never answers, it says so plainly and stops, with a Retry button.
  • Previously, a failed startup check was reported internally as "signed in, everything is open", so the full chat UI rendered against a dead server: an empty chat list, no model selector, no settings icon, and sends that failed silently -- with nothing anywhere naming the real cause. That is fixed.
  • Once the backend has answered once, no polling of any kind happens. A healthy deployment sees no change at all.

Fixed (v0.105.1)

  • The Model Settings screen crashed in deployed builds with Uncaught ReferenceError: VAR is not defined. The help text used a template-literal trick to display a literal ${VAR} placeholder, which the production bundler folded into a real template literal. Development builds were unaffected -- only minified builds crashed.
  • The model catalog was baked into the Docker image. backend/model_offerings.jsonc is git-ignored but was not excluded from the Docker build context, so a local copy shipped inside the image and could be served instead of your configured path. Put the catalog on persistent storage (e.g. MODEL_OFFERINGS_FILE=/home/data/model_offerings.jsonc) so it survives redeploys.

Fixed (v0.106.0)

  • Saving Model Settings silently erased auth_profiles. The save sent only the offerings; because an absent auth_profiles is treated as empty and an empty block is omitted when writing, a hand-authored auth_profiles map was destroyed -- and any offering referencing it via auth_profile: then failed validation on the next load. The save now round-trips the block untouched.

>> BREAKING

No migration is required. Nothing on disk changes format, and no API response shape changes. But two things will look different immediately after upgrading:

>> BREAKING 1 -- The default model is no longer pinned to the top of the model selector

Until now, whichever offering carried default: true was hoisted to the top of the chat model dropdown, wherever it sat in model_offerings.jsonc. That hoist is removed -- the dropdown now shows models in the order they appear in the file, which is the order you can drag in Model Settings.

  • Affected: anyone whose default offering is not already first in model_offerings.jsonc. Their dropdown order changes on upgrade.
  • Unchanged: the default model is still the preselected model, and the model that answers a request is the same as before. Only its position in the list moves.
  • To restore the old look: drag the default model to position 1 in Model Settings -- which now does exactly what it says.

>> BREAKING 2 -- chatwalaau sessions list now returns pinned chats first

GET /api/sessions now guarantees its order server-side: pinned first, then most recently updated. Previously the server returned raw updated_at descending and only the web UI applied pinned-first, so the CLI and the web UI disagreed.

  • Affected: any script or integration that depends on the previous raw updated_at ordering of chatwalaau sessions list or GET /api/sessions.
  • Unchanged: the response shape. With no query parameters, GET /api/sessions still returns every session as a bare JSON array, exactly as before. The new limit / offset / folder_id parameters are optional and additive -- omit them and you get the pre-0.106.0 response byte-for-byte.

Not breaking, but new on disk

A new file appears: .sessions/index.json, a metadata cache that makes listing your chats fast. It is derived, disposable state -- deleting it is always safe, and it never appears as a chat.

Included in this release

This release includes implementation work from:

  • v0.105.1 through v0.106.0

Notes

  • Internal design management content and architecture control artifacts are intentionally omitted from this release note.
  • No new environment variable is introduced in this release.

Installation

See the repository README for setup and usage instructions.

Version

  • Release version: 0.106.0
  • Previous release: 0.105.0