Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c63d9e2
Community extensions: a submitted list, linked from the docs
aneeshsathe Oct 10, 2026
75fb434
Merge community extension links
aneeshsathe Oct 10, 2026
9ebca36
Building docs: render the community extensions page before mdbook serve
aneeshsathe Oct 10, 2026
ebe05af
Read state needs the reading:state scope (studio 0.39)
aneeshsathe Oct 10, 2026
695aa85
Merge reading:state scope (studio 0.39)
aneeshsathe Oct 10, 2026
16a40d3
markdown-notes: several vaults, no default folder
aneeshsathe Oct 10, 2026
3365fca
Merge markdown-notes: several vaults, no silent default
aneeshsathe Oct 10, 2026
a17b22f
Reading slots in BXP, and the bundled reading-time and inspect extens…
aneeshsathe Oct 10, 2026
578f489
Lineage glyph, ⌘J view and ring show counts (studio lineage-glyph)
aneeshsathe Oct 10, 2026
3401800
Extensions: Turn off and Forget permissions in Manage, Turn off in th…
aneeshsathe Oct 10, 2026
a698d10
Macros run in the foldable side pane, not the whole window
aneeshsathe Oct 10, 2026
52cbebf
Merge turn off for extensions
aneeshsathe Oct 10, 2026
b3bbda9
Merge reading slots, reading-time and inspect
aneeshsathe Oct 10, 2026
b951789
Merge lineage glyph counts
aneeshsathe Oct 10, 2026
24d2b1e
Merge cross-post in the foldable browser pane
aneeshsathe Oct 10, 2026
3cd8724
Palette: Browse <vault> opens the vault it names
aneeshsathe Oct 10, 2026
00e1926
Import subscriptions from OPML, and export them
aneeshsathe Oct 10, 2026
15111ef
e2e: skip lineage counts before subscribing when the studio lacks lin…
aneeshsathe Oct 10, 2026
932d910
Tour and docs teach 0.10.0 and 0.11.0: new steps, sample extensions, …
aneeshsathe Oct 10, 2026
08d0b86
Merge branch 'extensions-ux' into worktree-agent-ae35ce58b437d330b
aneeshsathe Oct 10, 2026
ba733c7
Tour: the opml step on the Subscriptions screen's Import OPML… chip
aneeshsathe Oct 10, 2026
1d15774
Tour: keep the sample notes in the data folder, cleared at each start
aneeshsathe Oct 10, 2026
f80b371
Merge tour and docs for 0.11.0
aneeshsathe Oct 10, 2026
5bde869
Release 0.11.0
aneeshsathe Oct 10, 2026
9d0a769
Reading slots test: click Copy JSON once the sheet stops sliding (Win…
aneeshsathe Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions .github/ISSUE_TEMPLATE/extension-submission.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Submit a community extension
description: Ask for your Burrow extension to be listed on the Community extensions page.
title: "Community extension: "
labels: ["community-extension"]
body:
- type: markdown
attributes:
value: |
Prefer a pull request? Add an `[[extension]]` entry to `extensions/community.toml` instead (see "Submit your extension" on the Extensions page of the documentation).

**The Burrow maintainers don't review, verify, audit or endorse community extensions.** We check that the entry is well-formed, add it, and the listing says it is used at the reader's own risk. Don't put an email address or other personal data in this form.
- type: input
id: name
attributes:
label: Name
description: The `name` in your extension.toml. Lowercase kebab-case, at most 40 characters.
placeholder: wordcount
validations:
required: true
- type: input
id: title
attributes:
label: Title
description: A short human name, at most 60 characters.
placeholder: Word count
validations:
required: true
- type: input
id: description
attributes:
label: Description
description: One line of plain text, at most 160 characters.
placeholder: Shows the word count and reading time of the open draft.
validations:
required: true
- type: input
id: repo
attributes:
label: Source repository
description: An https:// link to the public source code.
placeholder: https://github.com/example/burrow-ext-wordcount
validations:
required: true
- type: input
id: homepage
attributes:
label: Homepage (optional)
placeholder: https://example.com/wordcount
- type: input
id: author
attributes:
label: Author
description: Your GitHub handle, without the @. Not an email address.
placeholder: example
validations:
required: true
- type: textarea
id: capabilities
attributes:
label: Capabilities
description: Exactly what your manifest's `capabilities` asks for, one per line (or "none").
placeholder: |
items.read
ui
validations:
required: true
- type: checkboxes
id: platforms
attributes:
label: Platforms
options:
- label: macOS
- label: Windows
- type: checkboxes
id: understood
attributes:
label: Before you submit
options:
- label: I wrote this extension, or I maintain it, and its source code is public.
required: true
- label: I understand the maintainers check the entry's format only, and that the listing can be removed if it's reported as malicious or misleading.
required: true
23 changes: 23 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/extension.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<!--
Listing a community extension. This template is for a pull request that adds
(or updates, or removes) one [[extension]] entry in extensions/community.toml.
Open it with ?template=extension.md on the compare URL.
-->

## Extension

- **Name:** <!-- e.g. wordcount -->
- **Source:** <!-- e.g. https://github.com/example/burrow-ext-wordcount -->

## Checklist

- [ ] This pull request changes only `extensions/community.toml`, and only one entry.
- [ ] The entry is in alphabetical order by `name`.
- [ ] `name` matches the `name` in my `extension.toml`.
- [ ] `capabilities` lists exactly what my manifest asks for.
- [ ] `repo` links to the extension's source code, which is public.
- [ ] `author` is my GitHub handle, and there's no email address anywhere in the entry.
- [ ] `python3 scripts/community-extensions.py check` passes.
- [ ] I understand that the Burrow maintainers check the entry's format only.
They don't review, verify, audit or endorse the extension, and the listing
says so. A listing can be removed if it's reported as malicious or misleading.
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ jobs:
with:
persist-credentials: false

# The community extension list: format only (valid TOML, required
# fields, names, https URLs, sorted). It never fetches or runs anything.
- name: Check the community extension list
run: python3 scripts/community-extensions.py check

# The pinned mdBook; fails on mdBook errors or broken links.
- name: Build the book
run: scripts/build-site.sh
2 changes: 2 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ on:
- "CHANGELOG.md"
- "scripts/build-site.sh"
- "scripts/site-linkcheck.py"
- "scripts/community-extensions.py"
- "extensions/community.toml"
- ".github/workflows/pages.yml"
workflow_dispatch:

Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@

# The documentation site build (mdbook build site)
/site/book/
# Made from extensions/community.toml by scripts/build-site.sh
/site/src/generated/community-extensions.md
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,25 @@ teaches something new in the tour, set the newest entry's `version` in

## [Unreleased]

## [0.11.0] - 2026-10-09

### Added

- **Turn an extension off.** Manage extensions (⇧⌘P › Manage extensions…) has **Turn off** for any extension that's on, whatever state it's in. It stops the extension and keeps what you allowed, so Turn on brings it back as it was. **Forget permissions** turns it off and clears what you allowed, so the next Turn on asks again. The consent sheet gains **⌘⌫ turn off**, so you can back out the moment you see what an extension asks for.
- **Several notes folders.** markdown-notes can open any number of folders (Obsidian vaults, say). The Notes tab in the notes drawer has a chip for each folder, plus **Add folder…** and **Remove from Burrow** (which only removes the folder from Burrow and never touches your files), and remembers the folder you were in. Settings › Notes folders lists them, and you can add several at once. ⌘K's notes chip searches every folder. In the config they are `vault=` for the first and `vault-<label>=` for each one after.
- **Reading time and Inspect**, two bundled extensions ported from Blygger Studio 0.39, both off until you turn them on. **reading-time** puts an estimated reading time at the end of each post's byline in the Stream and the Reader ("· 4 min"; hover for the word count), counted the way the studio counts. **inspect** adds a ⋯ chip to each post you read, with an Inspect sheet showing the record Burrow holds (ids, versions, references, hashes) and its JSON with the bodies left out, with Copy JSON.
- **Extensions can add to what you read.** Two new slots in the extension protocol, behind the `reading.read` permission: a short marker at the end of each post's byline, and rows in a post's ⋯ sheet. See [Extensions](https://aneeshsathe.github.io/blygger-desktop/extensions.html).
- **Import and export subscriptions as OPML.** Blyg › Import Subscriptions from OPML… (or Import OPML… on the Subscriptions screen) reads an export from another feed reader, lists its feeds with the ones you already follow marked, and subscribes your blyg to the ones you tick, at a steady pace, filing them in an **Imported feeds** folder in the Reader, with a summary and Retry for any that fail. Imported feeds stay out of your public blogroll. Blyg › Export Subscriptions as OPML… saves all of them. `blygger +import-opml` and `+export-opml` do the same from a terminal.
- **Community extensions.** The docs now list extensions other people have made, from `extensions/community.toml`; submit yours with a pull request or the issue form. Burrow's maintainers don't review or vouch for them: an extension runs with your user's rights, so read its source and use it at your own risk.

### Changed

- **The lineage glyph shows counts.** Beside the kinds, the glyph shows how many posts a post draws on and how many known here draw on it ("2 · 3"). The ⌘J view and the action ring show the same numbers, by kind. On a blyg that runs the studio's lineage-glyph extension, Burrow uses the blyg's own counts; elsewhere it works them out from what it holds, using the same rules. Opening a post from ⌘J marks it read, as opening it from the list does.
- **Read state needs the `reading:state` permission** (Blygger Studio 0.39 moved marking posts read and unread there). Burrow now asks for it. **After updating, sign in again once** (Burrow › Disconnect…, then Sign in with browser, and allow every permission) so read marks sync between your Macs. Until then they're kept on this Mac and wait to be sent, and everything else syncs as usual. Studios before 0.39 are unaffected.
- **Cross-posting stays beside your work.** A cross-post run opens the browser in the usual foldable side pane, not over the whole window, and its Preview and Post sheets sit beside the page so you can see it. Fold the pane mid-run and the run carries on ("macro running · show pane" in the status bar). The pane unfolds itself before Burrow types into the page.
- **The tour teaches what's new.** After an update, "Show me what's new" starts at the first step for that release (NEW IN 0.11.0), and the tour now walks through extensions, Turn off, notes folders, reading time and inspect, OPML import, ⌘N, ✂ Clip and cross-post, on sample data, without changing your config. It also covers what 0.10.0 added, which its tour skipped.
- **markdown-notes no longer assumes `~/Notes`.** With no folder chosen it asks only to show messages, and the Notes tab offers **Choose a folder…**, so the consent sheet only ever names folders you picked. A config with `vault=` works as before.

## [0.10.0] - 2026-10-09

### Added
Expand Down
35 changes: 28 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[workspace]
resolver = "3"
members = ["crates/blyg-core", "crates/blyg-ai", "crates/blyg-render", "crates/blyg-ext", "crates/blyg-ext-notes", "crates/blyg-ext-crosspost", "crates/blyg-app"]
members = ["crates/blyg-core", "crates/blyg-ai", "crates/blyg-render", "crates/blyg-ext", "crates/blyg-ext-notes", "crates/blyg-ext-crosspost", "crates/blyg-ext-reading-time", "crates/blyg-ext-inspect", "crates/blyg-app"]

[workspace.package]
edition = "2024"
version = "0.10.0"
version = "0.11.0"
license = "MIT"
description = "A fast, local-first macOS studio for Blygger blogs"
# Placeholder repo; set it with scripts/set-repo.sh (see packaging/config.env).
Expand Down
3 changes: 3 additions & 0 deletions crates/blyg-app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ blyg-ai = { path = "../blyg-ai" }
blyg-ext = { path = "../blyg-ext" }
blyg-ext-notes = { path = "../blyg-ext-notes" }
blyg-ext-crosspost = { path = "../blyg-ext-crosspost" }
# --- reading slots --- (reading-time and inspect, `blygger +ext <name>`)
blyg-ext-reading-time = { path = "../blyg-ext-reading-time" }
blyg-ext-inspect = { path = "../blyg-ext-inspect" }
# gpui-kit pins the matching GPUI snapshot (gpui-pre 0.3.6) plus gpui-base /
# gpui-component 0.6.6. We use gpui-base's unstyled textarea and draw the rest.
gpui-kit = { version = "=0.6.6", default-features = false }
Expand Down
10 changes: 7 additions & 3 deletions crates/blyg-app/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2088,6 +2088,7 @@ impl Render for MainView {
.children(self.render_sheet(&ui_font, &body_font, cx))
.children(self.render_ai_overlay(&ui_font, &body_font, cx)) // --- AI ---
.children(self.render_ext_overlay(&ui_font, cx)) // --- extensions ---
.children(self.render_slots_sheet(&ui_font, cx)) // --- reading slots ---
.children(self.render_reading_sheet(cx)) // --- reading & versions ---
.children(profile_overlay) // --- profiles ---
.children(self.render_toast())
Expand Down Expand Up @@ -2659,6 +2660,7 @@ impl MainView {
.children(screen.to_read.map(|t| div().id("to-read").child(t)))
.children(self.render_server_notice())
.children(self.render_ext_notice(cx)) // --- extensions ---
.children(self.render_macro_status(cx)) // --- browser macros ---
.children(self.render_update_notice(cx)) // --- auto-update ---
.children(self.render_ai_status()) // --- AI ---
.child(
Expand Down Expand Up @@ -3089,12 +3091,13 @@ impl MainView {
let explain = match way {
ConnectWay::Browser => {
"Burrow opens your blyg's studio in your browser. Sign in there and \
allow Burrow; it gets renewable access with all four permissions, \
allow Burrow; it gets renewable access with every permission, \
kept in your macOS Keychain. Needs blygger-studio 0.28 or later."
}
ConnectWay::Token => {
"Make a token in your blyg's Studio → More → Client access: choose REST \
API and all four permissions (read, draft, publish, manage). It lasts \
API and every permission (read, draft, publish, manage, and reading:state \
where offered). It lasts \
30 days. A server with Burrow's extensions can use its owner token \
here instead. Either is kept in your macOS Keychain."
}
Expand Down Expand Up @@ -3289,7 +3292,8 @@ impl MainView {
.absolute()
.top(px(TITLEBAR_H))
.left_0()
.right_0()
// --- browser macros --- beside the side pane, not over it
.right(self.macro_sheet_right().unwrap_or(px(0.)))
.flex()
.justify_center()
.child(
Expand Down
Loading
Loading