Skip to content

Release 0.11.0: extensions UX, notes vaults, reading slots, lineage counts - #44

Merged
aneeshsathe merged 25 commits into
mainfrom
extensions-ux
Oct 10, 2026
Merged

aneeshsathe merged 25 commits into
mainfrom
extensions-ux

Conversation

@aneeshsathe

@aneeshsathe aneeshsathe commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

Release 0.11.0: extension UX, notes vaults, reading slots, lineage counts, and studio 0.39 read state.

  • Community extensions: people submit a link with a PR to extensions/community.toml, or with the issue form. CI checks the format, and the docs build renders a "Community extensions" page with a prominent at-your-own-risk notice (the maintainers don't review or verify these extensions). The list starts empty.
  • Turn off / Forget permissions in Manage extensions; "Don't turn on" in the consent sheet
  • markdown-notes: several vaults, no silent ~/Notes default, a vault switcher in the drawer, folder management in Settings
  • reading:state scope (studio 0.39.0); old tokens keep read ops queued and prompt a re-sign-in
  • BXP reading slots + bundled reading-time and inspect extensions (ports of the studio's)
  • Cross-post macro runs in the foldable browser side pane, not full-window
  • Lineage glyph, ⌘J and ring show counts (studio lineage-glyph dc632c5), from the node's route when it's served
  • OPML import/export of subscriptions (File menu + +import-opml / +export-opml)
  • Tour + docs for 0.11.0 (and the 0.10.0 features the tour never taught)
  • CHANGELOG + version 0.11.0

🤖 Generated with Claude Code

aneeshsathe and others added 16 commits October 9, 2026 21:00
extensions/community.toml lists third-party extensions (none yet). The
docs build renders it into a Community extensions page with a plain
use-at-your-own-risk disclaimer; CI checks the file's format only.
Submissions come as a pull request (template) or an issue form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Studio 0.39 moved markRead, markUnread and both batch read-state ops
from owner:manage to a new, provisionally named scope, reading:state.

- oauth: READ_STATE_SCOPE is the one place the name is spelled (a macro
  feeds SCOPE, OWNER_SCOPES and the manual-token wording). The browser
  sign-in asks only for the scopes the studio lists in scopes_supported,
  so an older studio isn't sent a scope it would refuse.
- sync: a 403 on a read-state write no longer drops the ops. They stay
  queued and are skipped for the rest of the session, new marks keep
  queueing, and the rest of the outbox syncs. One notice per session
  names the missing scope and says to sign in again (or make a new
  token). The next sign-in sends what waited. There's no retry loop.
- e2e: the harness mints tokens with reading:state (falling back to the
  four scopes on an older studio). New tests: a four-scope token is
  refused, its read stays queued, and a later credential sends it; and
  signing in again with a kept 0.10 client grants reading:state.
- Docs, sign-in copy and the getting-started page name the scope and
  note that the name is provisional.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each vault is its own library: vault=<folder> stays the first (existing
configs read as before), vault-<label>=<folder> adds more (kebab keys, so
the config check accepts them and "later line wins" never drops one).
The manifest asks for fs:<folder> per vault and only ui with none; a vault
without its grant refuses while the others work.

Drawer: a vault switcher (chips, Add folder…, Remove from Burrow), an
empty state with Choose a folder…, needs-permission state with Allow…;
the chosen vault is remembered in state.json (notes_vault). The quote
picker searches every vault. Settings › Notes folders lists them with
Remove and adds several at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions

Ports blygger-studio 0.39.0's entryByline / entryActions slots to BXP
(extension/entry.byline, extension/entry.action, behind reading.read) and
ships its two default extensions as bundled, opt-in Burrow extensions:
reading-time ("· 4 min" on each reading byline, the word count on hover)
and inspect (an ⋯ row showing the record Burrow holds, bodies elided).
Markers are asked off the main thread and cached by entry and version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The user decided on 2026-10-09 that the lineage glyph may show counts,
since the data is available. SPEC rule 1 gets a narrow, dated exception for
the glyph, the ⌘J view and the ring only.

- blyg-core/lineage.rs: the lineage-glyph extension's contract types
  (vendored from blygger-studio dc632c5, PR #53) and a port of its
  counting rules over what this Mac holds (lineage::Local).
- api/lineage.rs: GET /api/ext/lineage-glyph/summaries and /lineage;
  a 404 means "not enabled", silently, remembered for six hours.
- store/lineage.rs: lineage_cache (summaries by reading entry key, graphs
  by query, 30 s fresh) and meta lineage_glyph.
- Backend: additive lineage_summaries / lineage_graph (+ cached_*).
- App: the glyph draws "up · down" next to the kinds; ⌘J shows the
  count each way and on the list headings, and is built from the node's
  graph when served; the ring shows how many of each kind already exist.
  Opening a post from ⌘J goes through open_reading, so it's marked read.
- Tests: core unit tests mirroring the studio's lineage tests, store tests
  on SQLite, GPUI tests, and an e2e against a real local studio.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e consent sheet

Manage extensions gets Turn off for every enabled extension, in any state
(running, failed, waiting for permission, not installed). It removes the
extension's `extension` line(s) with the comment-preserving write-back,
keeping its extension-allow and extension-setting lines so Turn on brings
it back as it was. Forget permissions also removes its extension-allow
lines. The consent sheet gets a ⌘⌫ Turn off next to Allow / Not now, so an
extension can be backed out of from the sheet that shows its folder. Any
pending question or status-bar notice for it goes away, and a toast says
"<name> turned off".

disable_changes() in extensions/mod.rs builds the config changes. The host
already stopped a child whose extension line went away on reload; a new
host test pins that down, including one waiting out a crash backoff.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A macro run (cross-post to Substack Notes) forced the browser pane to
OpenMode::Full, and its Preview and Post sheets hid the web view while
they were up. Now a run opens (or reuses) the ordinary side pane; the
sheets sit beside it over the app's content so the page stays in view;
the pane can be folded mid-run (esc, x, Shift-Cmd-B) without stopping
the run (the web view is parked off-screen, a status-bar mark unfolds
it); it unfolds itself before typing and for the Post sheet; and it goes
back to how it was when the run ends, unless the user toggled it or the
page still matters (click Post yourself, a failure, stopped after Post).
"Open <site>" for signing in uses the side pane too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aneeshsathe aneeshsathe changed the title Extensions UX: turn off, notes vaults, reading slots, community list Release 0.11.0: extensions UX, notes vaults, reading slots, lineage counts Oct 10, 2026
aneeshsathe and others added 9 commits October 9, 2026 23:00
Blyg > Import Subscriptions from OPML... (and Import OPML... on the
Subscriptions screen) reads another reader's export with one lenient
parser (opml::outlines, now also behind profile::parse_opml: nested
folders, entities, BOM/UTF-16/Windows-1252, 5 MB / 2,000 feeds), shows
a preview sheet with ticks and "already following", then subscribes
each ticked feed with POST /api/subscriptions {url, confirm:true}, two at
a time and at most 30 a minute, waiting out 429 Retry-After. 201 is
added and filed in the local Reader folder "Imported feeds", 409 already
following (left where it's filed), 422 not a feed with the server's
reason. Cancellable, with a summary and Retry failed.

Blyg > Export Subscriptions as OPML... saves OPML 2.0 of every
subscription in the studio's blogroll.opml shape. CLI: blygger
+import-opml <file> [--dry-run] and +export-opml <file>.

Tests: parser fixtures in five readers' styles, pacing/429/cancel, the
folder on real SQLite, GPUI sheet tests, and an e2e against a real
local studio (201/409/422, filing, blogroll, export, the CLI).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eage-glyph

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a what's-new guard

The 0.10.0 card started at the old reading-notes step and no step taught a
0.10.0 feature. Every step now names the release it teaches (since), and
whats_new's tests hold each entry from 0.10.0 on to start at the first of
its own steps, and fail for an x.y.0 with no entry.

New steps: new (⌘N), slots (reading-time, inspect), opml (caption only),
notes-library (several folders), clip (✂ Clip), cross-post (fold mid-run),
extensions (⇧⌘P), manage (Turn off, Forget permissions), consent (⌘⌫).
Edited: create (the toolbar's New is ⌘N), lineage and ring (counts),
notes (its Notes tab), browser (⌘-click).

The tour parks the user's extension host and runs the bundled
markdown-notes, reading-time and inspect over invented notes in a temp
folder; nothing in the tour writes the config file. Docs: extensions,
notes and browser, reading, FAQ (sign in again for reading:state, OPML),
getting started, SPEC.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After merging OPML import: the opml step rings the Subscriptions header,
and in the tour Import OPML… opens the preview of a sample export (one
feed already followed, two new) instead of a file picker. What's new and
the FAQ name Blyg › Import Subscriptions from OPML…. The tour's
unallowed sample folder is Shelf, after Garden, as the step asks for
Garden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A tour the app quit during left its temporary folder behind. The sample
now lives in <data dir>/tour-sample/, deleted when the tour ends and
cleared when the next one starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dows CI)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aneeshsathe
aneeshsathe merged commit 309dedb into main Oct 10, 2026
3 checks passed
@aneeshsathe
aneeshsathe deleted the extensions-ux branch October 10, 2026 06:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant