shiki (私記)
← Full changelog

shiki v0.9.6

Released 2026-09-20.

Share: X Bluesky Reddit Hacker News WhatsApp Telegram Email
shiki v0.9.6, running in a terminal

Added

  • The default (terminal-inherit) theme's selected-row highlight now adapts to the terminal's own color scheme instead of a fixed ANSI darkgray that could be invisible against one palette and drown out the row's accent text on another (on Ghostty's *Aether* it resolved to #ad2222 on #4b515b, ~1.15:1). selection accepts a new "auto" value — a 20%-alpha blend of the theme's fg over its bg, precomputed because SGR has no alpha — which default now uses; since both its fg/bg slots are "reset", the app queries the terminal's real fg/bg over OSC 10/11 once at startup (/dev/tty, 120 ms budget, late replies drained so they can't leak in as keystrokes) and falls back to the previous fixed gray when the terminal doesn't answer (tmux without passthrough, non-VT consoles, Windows). Selected-row text on that theme now uses fg instead of accent, which is readable on a band derived from fg by construction. Every hex palette keeps its own hand-picked selection untouched, and an explicit theme.overrides.selection still wins.

Changed

  • The capture pipeline now lives once in shiki-core::capture — the CLI, the in-TUI daemon and the browser-extension native host each carried near-identical private copies of with_source/build_capture_request/capture_into_new_note/capture_into_templated/ capture_into_daily (88–97% identical bodies). LastCapture moved to shiki-core alongside it (Config::default_last_capture_path stays in shiki-config), and tilde expansion (process::expand_home), YAML scalar rendering (query::yaml_value_to_string) and pid/port-file parsing each have a single implementation now.
  • Preview images render off the UI thread: chafa runs on background threads with a width-keyed cache, showing the icon+alt fallback until the art arrives instead of blocking the next frame.
  • The footer's revision count walks git history on a background thread (same std::thread + mpsc shape as sync/self-update), instead of a full revwalk per selected note on the UI thread.

Fixed

  • shiki capture from the browser extension now actually finds the running TUI daemon: the native host parsed the port file ("{port} {pid}") as a bare number, so the parse always failed and every capture silently fell back to a direct write. Parsing is shared and tested against the real two-token format now.
  • Editing config.toml can no longer truncate it: a failed read used to open an empty editor buffer, and saving then overwrote the real file — an unreadable config now aborts the edit with a status message instead.
  • A failed notebook listing no longer looks like "no notebooks configured": store.list() and per-folder listing errors are surfaced as status messages, and a failed per-note git status folds into the existing status_error the footer/git panel render.
  • Commits/merges no longer panic on an invalid system clock — the Signature::now fallback propagates as a normal error.
  • The native host's list_tags/search/recent return {"ok": false, "error": …} instead of a successful empty list when the notebook walk fails (e.g. a locked encrypted notebook).
  • Whisper model downloads are verified fail-closed: the model's sha256/size are read from Hugging Face's git-lfs pointer and checked before install; --model values are restricted to a bare ggml-*.bin filename (no path traversal).
  • Release page for v0.9.3 added (it had been skipped by the release-automation fallback), plus the regenerated sitemap.xml/feed.xml.

Security

  • Updated rustls 0.23.43 → 0.23.45 (transitive via reqwest/self_update) to clear RUSTSEC-2026-0285 — TLS 1.3 handshake messages incorrectly accepted across encryption-level boundaries (medium). Its aws-lc-rs/rustls-webpki transitive deps moved with it.
  • Verified whisper model downloads (sha256) instead of renaming an unchecked 148 MB download into place.

CI

  • --locked on check/test/clippy (the lockfile is committed on purpose), explicit contents: read permissions on the desktop/nix workflows, and desktop builds fall back to an unsigned build when the Tauri signing secrets aren't available (which made every Dependabot PR red).
← v0.9.5 All releases No newer release →