Skip to content

Blip 2.1.0 — war room

Choose a tag to compare

@nixfred nixfred released this 02 Sep 00:16
· 68 commits to main since this release

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
    statSync import 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 spawnSync buffer 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.json is 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: $null titles, URLs with (…) (Wikipedia), and userinfo
    host-spoofing handled. Inline-reply snippets respect Recently Deleted.
  • macOS 12 and earlier: imsg no 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_copy matches 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/sent instead 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 N is enforced on the Mac).
  • Cache file extensions follow the gated MIME type, not the sender's
    filename (xdg-open dispatches on extension).
  • tcc-check removed from the confined key's allowlist.
  • blip-setup no longer sources bridge.conf, no longer echoes a message
    body into the terminal, guards the authorized_keys append with a
    newline, keeps a hand-set automation= on re-run, drops the ssh master
    before re-checking grants, and names a missing Xcode CLT instead of
    misdiagnosing Full Disk Access. install.sh fails 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-dashes everywhere).
  • xdg-open and the window-state writer run detached (a blocking handler
    or a mid-write hide could swallow later clicks / the hidden state).
  • IPC compose refuses when the popout is closed.
  • The shim's offline message includes the ssh reason.
  • sync-bridge.sh stages upstream copies beside locally-modified tools
    instead of overwriting them.
  • Tests are isolated from the developer's real caches (bunfig.toml
    preload sets XDG_CACHE_HOME).