Blip 2.1.0 — war room
Ten expert-lens reviewers swept the repo after the DHH retweet; 114
findings, the clear ones fixed here, the rest on the roadmap.
Fixed — correctness
- Attachment-cache eviction had silently never run since 1.9.4 (a missing
statSyncimport threw inside the LRU). 500 MB cap is real again. - A DM thread admitted that person's messages from group chats.
- Catch-up fetches could exceed Bun's default 1 MB
spawnSyncbuffer and
fail sticky; all bridge calls now allow 64 MB. - A timed-out
imsg(Mac asleep behind a live ssh mux) read as a bridge
bug; it now reads as "Mac asleep" and greys the icon. - Bridge errors show the last stderr line (Python puts the cause last),
not "Traceback (most recent call last):". state.jsonis fsync'd before rename (a power cut no longer resets every
read mark). Cache temp names carry entropy (no EEXIST after pid reuse).- Link cards:
$nulltitles, URLs with(…)(Wikipedia), and userinfo
host-spoofing handled. Inline-reply snippets respect Recently Deleted. - macOS 12 and earlier:
imsgno longer dies on the missing
Recently-Deleted table. - Avatar initials for whitespace-only names; non-ASCII attachment names
survive sanitizing; sent files keep their extension. wait_for_copymatches only attachment rows newer than the send
(same-name re-sends no longer confuse it); a send whose copy was never
observed is kept in~/.blip/sentinstead of deleted an hour later.
Fixed — security / privacy
- File-send captions no longer appear in any process's argv
(--caption-stdin). A cut ssh stream can no longer deliver a truncated
file (--file-bytes Nis enforced on the Mac). - Cache file extensions follow the gated MIME type, not the sender's
filename (xdg-opendispatches on extension). tcc-checkremoved from the confined key's allowlist.blip-setupno longersourcesbridge.conf, no longer echoes a message
body into the terminal, guards theauthorized_keysappend with a
newline, keeps a hand-setautomation=on re-run, drops the ssh master
before re-checking grants, and names a missing Xcode CLT instead of
misdiagnosing Full Disk Access.install.shfails loudly on the CLT stub.- Consent banner prints only on a TTY (recipients no longer reach journald).
- A real phone number and email were removed from a public test fixture.
- Transient bridge failures no longer write a 7-day "no photo" marker.
Changed
- Users' dashes are sent as typed (
--keep-dasheseverywhere). xdg-openand the window-state writer run detached (a blocking handler
or a mid-write hide could swallow later clicks / the hidden state).- IPC
composerefuses when the popout is closed. - The shim's offline message includes the ssh reason.
sync-bridge.shstages upstream copies beside locally-modified tools
instead of overwriting them.- Tests are isolated from the developer's real caches (
bunfig.toml
preload setsXDG_CACHE_HOME).