Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
333 commits
Select commit Hold shift + click to select a range
6b825b4
feat(core): StatuslineInstaller wrapper install/uninstall (temp-injec…
efim0v Jun 12, 2026
6a7e860
feat(core): UsageReader capture snapshots + AppState monitor install/…
efim0v Jun 12, 2026
4f5afd6
feat(core): OAuthUsageClient behind injectable fetcher (opt-in, cache…
efim0v Jun 12, 2026
a30685b
feat(app): usage presentation models + AccountsScreen bars/root-dir/m…
efim0v Jun 12, 2026
ed44218
fix(phase-c): address task 8 spec review
efim0v Jun 12, 2026
a2b265b
feat(app): per-session usage cards + model/effort pickers + relaunch-…
efim0v Jun 12, 2026
8f875e4
feat(app): aggregate remaining capacity + header chip + menu-bar title
efim0v Jun 12, 2026
f0e79d0
feat(app): richer workspace rows with aggregate tokens/cost + active …
efim0v Jun 12, 2026
8e548ea
test(snapshot): usage scene + fixture usage data; Phase C suite green
efim0v Jun 12, 2026
14b44e5
fix(core): per-account statusline wrapper so usage monitoring isolate…
efim0v Jun 12, 2026
a4bdae4
fix(app): use AppKit NSStatusItem instead of SwiftUI MenuBarExtra
efim0v Jun 12, 2026
1afb9cf
fix(app): visible menu-bar icon + instant open foundation
efim0v Jun 13, 2026
4cdeb09
feat(app): usage dashboard + two-tab shell + project session previews
efim0v Jun 13, 2026
65d9d07
test: raise coverage — render harness, dashboard/sessions/backend tests
efim0v Jun 13, 2026
76aee7f
test: render every scene's live branch (Picker/Menu/Charts/glass)
efim0v Jun 13, 2026
be301e0
test: logic-layer coverage gate ≥95% + documented policy
efim0v Jun 13, 2026
6505305
fix(app): panel resizes in place (no jump) + adversarial-review fixes
efim0v Jun 13, 2026
8b81aa1
fix(usage): shell-quote the statusline command — limits were all zero
efim0v Jun 13, 2026
995ff85
fix(usage): parse numeric (epoch) resets_at, not just ISO strings
efim0v Jun 13, 2026
4346d52
feat(charts): single column + scope switcher; drop unreliable Usage Rate
efim0v Jun 13, 2026
1881f0c
ui: 7 dashboard/graph/sessions/accounts refinements
efim0v Jun 13, 2026
da71911
ui(charts): narrow the Charts window (~half) + compact shared header/…
efim0v Jun 13, 2026
8db3a0e
fix(app): real session statuses, legible narrow Charts, overall-limit…
efim0v Jun 13, 2026
6fb7356
feat(usage): fetch limits from Anthropic's OAuth usage API for accoun…
efim0v Jun 13, 2026
82094ca
feat(app): permanent side-by-side Charts window; remove the Charts tab
efim0v Jun 13, 2026
5710910
ui: soften corners 15% (panel 11.5 / card 6.9 / field 5.75)
efim0v Jun 13, 2026
00188e1
ui: Liquid Glass window + gray content cards; add Weekly Sonnet + 5h …
efim0v Jun 14, 2026
139baf4
fix+ui: live status from process table, per-project counts, accent ca…
efim0v Jun 14, 2026
809bb30
ui: darker/rounder/borderless substrates, wide daily bars, full effor…
efim0v Jun 14, 2026
a3bb528
ui: swap windows (Charts fixed-right, Projects left), simpler nav ani…
efim0v Jun 14, 2026
ddd04f5
feat(sessions): live→Go redirect vs closed→Resume; per-project accent…
efim0v Jun 14, 2026
8a9af1f
sessions: CPU-based running detection, Terminal.app focus fallback; r…
efim0v Jun 14, 2026
04a1961
fix(cmux): "Go" failed for every session — hook parser read the wrong…
efim0v Jun 14, 2026
31cac79
fix(sessions): address review — fresh-session detection, locale-safe …
efim0v Jun 14, 2026
5510a63
M1: standardize window substrate — fixed transparent NSVisualEffectVi…
efim0v Jun 14, 2026
10d6efe
M2: single source of truth for session liveness — Claude tab no longe…
efim0v Jun 14, 2026
4a103e8
M3: per-project model/effort in settings + launch sheet (open-target/…
efim0v Jun 14, 2026
fcf322b
M4: per-commit file changes in the graph; revert substrate to transpa…
efim0v Jun 14, 2026
9f73f0d
M5: Codebase Stats tab — line/language stats, gitignore-aware scan, g…
efim0v Jun 14, 2026
998e2e5
M1 (glass): clear, constant Liquid Glass via NSGlassEffectView — fixe…
efim0v Jun 14, 2026
80d561c
M6: restyle to the new accent palette (blue primary / pink negative /…
efim0v Jun 14, 2026
2ae4d4f
fix(stats): add Dart + 9 languages, Ruby column-0 blocks, gitignore b…
efim0v Jun 14, 2026
7d28d93
fix(ui): constant Liquid Glass — .regular substrate, no fullscreen re…
efim0v Jun 14, 2026
8fce53f
feat(charts): multi-colour daily-usage bars (brand heat ramp)
efim0v Jun 14, 2026
f1a0984
feat(stats): re-architect code-stats onto git as source of truth
efim0v Jun 14, 2026
75b7cd1
feat(stats): interactive Stats view — Code/Data split, delta triangle…
efim0v Jun 14, 2026
4c5cbed
feat(stats): separate Settings page with a file tree + working folder…
efim0v Jun 14, 2026
579550d
feat(stats): per-repo branch switcher on the Stats tab
efim0v Jun 14, 2026
f059dda
feat(stats): honest classified deltas + per-day churn histogram + umb…
efim0v Jun 14, 2026
ae8e47a
feat(stats): Lines over time = cumulative stacked-by-repo; deltas = N…
efim0v Jun 14, 2026
1c6746d
feat(app): merge the two panels into ONE window (projects | divider |…
efim0v Jun 14, 2026
d35def1
feat(stats): inline per-category deltas, thin language bars + metric …
efim0v Jun 14, 2026
b37699b
feat(app): 3-row project header (name+settings / tabs / collapsible s…
efim0v Jun 14, 2026
cd86668
chore(stats): final sweep — remove dead code from the reworks, fix de…
efim0v Jun 14, 2026
c9de46c
ui: darken the content cards (white 0.16→0.10) per request
efim0v Jun 15, 2026
1f2b2ba
fix: persistent footer + content fill, search hide-on-scroll, Overall…
efim0v Jun 15, 2026
1f9e4ba
feat: subagent-aware status (group CPU) + Apple-26 grouped blocks + v…
efim0v Jun 15, 2026
3c4ef4d
fix: New-Claude launch sheet (M3) + clean renamed-file paths in graph…
efim0v Jun 15, 2026
f7457c6
fix(crash): remove crashing SwiftUI Liquid Glass; charts/footer = nat…
efim0v Jun 15, 2026
de62870
fix(keychain): cache the OAuth token per launch — stop repeated start…
efim0v Jun 15, 2026
577fac5
fix(crash): eliminate the SwiftUI Material recursion on project open …
efim0v Jun 15, 2026
d29ae10
fix(crash): make route changes instant — animating them recursed the …
efim0v Jun 15, 2026
962d297
test: GROVE_SMOKE_OPEN_PROJECT seam — verifies open-a-project doesn't…
efim0v Jun 15, 2026
272f76f
ui: tighten charts padding + align blocks + symmetric project-row insets
efim0v Jun 15, 2026
8f85a19
ui: floating "Usage" H1 for the charts column, baseline-aligned with …
efim0v Jun 15, 2026
e4a74b3
fix(crash): drop withAnimation on the charts toggle (latent glass-rec…
efim0v Jun 15, 2026
1a34402
fix(liveness): one canonical id-or-cwd join on every surface + mergeL…
efim0v Jun 15, 2026
c558a5a
fix(graph): merge-commit file list + whole-path renames in the expand…
efim0v Jun 15, 2026
9f0480d
fix(gitignore): honor git's parent-exclusion rule (no re-include unde…
efim0v Jun 15, 2026
14e349b
chore: remove dead DashboardScreen.columnWidth (superseded by ChartsS…
efim0v Jun 15, 2026
1e878b4
feat(M1): selectable NSVisualEffectView substrate behind a flag (Liqu…
efim0v Jun 15, 2026
952caa7
fix(app): open-project crash + window/menu-bar robustness; menu-bar w…
efim0v Jun 15, 2026
1d65447
perf(app): move per-render .claude.json reads off-main; no keychain r…
efim0v Jun 15, 2026
42435fe
fix(app): cap window at the usage-panel height; remove "Usage" header…
efim0v Jun 15, 2026
6c74333
fix(app): bump bundle id to grove3 for a clean menu-bar slot
efim0v Jun 15, 2026
6c7eb42
feat(stats): Lines/Code/Data metric selector on the over-time chart
efim0v Jun 16, 2026
ca04e2a
feat(core): shared accountKey() helper; ClaudeCredentials reuses it
efim0v Jul 7, 2026
3b4a939
refactor(core): drop now-unused sha256Hex after accountKey extraction
efim0v Jul 7, 2026
c3642df
feat(core): TranscriptMirrorSettings config (enabled/maxDays/maxMB)
efim0v Jul 7, 2026
6e85139
feat(core): TranscriptMirror link step — hardlink mirror of live tran…
efim0v Jul 7, 2026
0dc2af0
feat(core): TranscriptMirror auto-restore + inode-drift re-link
efim0v Jul 7, 2026
ac89336
feat(core): TranscriptMirror retention — age-gate + size cap over mir…
efim0v Jul 7, 2026
92feeda
feat(core): TranscriptMirror purge; cover cross-volume + multi-account
efim0v Jul 7, 2026
ea4b2a3
feat(app): reconcile transcript mirror on the 90s tick; purgeTranscri…
efim0v Jul 7, 2026
1f5c0ae
feat(app): transcript-mirror settings UI + session badge + Purge action
efim0v Jul 7, 2026
d43a388
fix(core): skip shared-store symlinked cwd in reconcile; strengthen s…
efim0v Jul 7, 2026
0622d54
fix(stats): branch dropdown now changes headline LOC by scanning the …
efim0v Jul 9, 2026
ee8b8c8
perf(stats): replace per-file git cat-file with single --batch process
efim0v Jul 9, 2026
baf24c5
perf(stats): memoize stackedRepoSeries + repoCells to O(1) on hover
efim0v Jul 9, 2026
e65d754
fix(stats): isolate BranchSwitcher struct + debounce branch rescan so…
efim0v Jul 9, 2026
10d9fdd
feat(core): add allRecentSessions — disk-wide session scanner with no…
efim0v Jul 9, 2026
a4aaaeb
feat(app): add externalSessionsByProject + otherSessions attribution …
efim0v Jul 9, 2026
8ee94ed
feat(sessions): surface external + other sessions with dedup and resu…
efim0v Jul 9, 2026
d58da30
feat(sessions): adoptSession + Share button for external/other-accoun…
efim0v Jul 9, 2026
2e28417
fix(adopt): C1 data-loss + I1 main-actor FS in adoptSession
efim0v Jul 9, 2026
f785c4b
feat(migration): pure JSON merge/repoint helpers for cross-account se…
efim0v Jul 9, 2026
30be1b6
layout(sessions): re-proportion columns; 2-line status + session cell…
efim0v Jul 9, 2026
bd254c4
feat(migration): Phase 4A2 — copySessionData filesystem copy for cros…
efim0v Jul 9, 2026
b393a84
feat(migration): Phase 4A3 — config + plugins migration (B/C/D + orch…
efim0v Jul 9, 2026
f308007
feat(sessions): Phase 4A4 — wire SessionMigration into AppState + "Mi…
efim0v Jul 9, 2026
cc8b7da
feat(workspaces): add Share + Migrate actions to session rows on Work…
efim0v Jul 9, 2026
3fbb00f
fix(migrate): dedup installed_plugins records by (version,installPath…
efim0v Jul 9, 2026
342429c
feat(dashboard): Phase 5B — ledger cost fallback + em-dash for absent…
efim0v Jul 12, 2026
1213db8
feat(usage): Phase 5A — auto-install statusline for every account + w…
efim0v Jul 12, 2026
ba076cb
feat(dashboard): add model-driven 3rd progress bar for active model's…
efim0v Jul 12, 2026
ccd1156
feat(stats): Phase 5D — Tokens per 100 net lines cumulative chart
efim0v Jul 12, 2026
814b0ad
fix(monitoring): three post-review fixes — disabled-flag, off-main re…
efim0v Jul 12, 2026
b1f0777
fix(oauth): parse limits[] for model-scoped weekly bar + enable OAuth…
efim0v Jul 12, 2026
a93bba4
fix(oauth): honour the access token's own expiry; drop cached token o…
efim0v Sep 16, 2026
a729702
build: Xcode-toolchain env + xctest runner for an unaccepted license;…
efim0v Sep 16, 2026
e8168cc
build(brow): add BrowKit, BrowApp and BrowKitTests targets
efim0v Sep 16, 2026
25e511e
test(oauth): pin backoffCap behaviour (implementation lands with the …
efim0v Sep 16, 2026
b6ad205
feat(oauth): retry once on 401/403, injectable backoffCap, fetch-stam…
efim0v Sep 16, 2026
9029812
feat(core): AccountDirectory — discover config dirs, dedupe by organi…
efim0v Sep 16, 2026
20f48f6
feat(core): TokenKeeper — refresh idle tokens via claude doctor, -p f…
efim0v Sep 16, 2026
269609c
docs: Brow section
efim0v Sep 16, 2026
b407c7e
build(test): count a skipped test as a pass
efim0v Sep 16, 2026
983ecd1
fix(core): TokenKeeper — live path, real causes, no blind -p, circuit…
efim0v Sep 16, 2026
fdddb9d
fix(core): label an account with the dir it is fetched with; stop re-…
efim0v Sep 16, 2026
f71d1b9
fix(oauth): let a client omit the claude-code User-Agent
efim0v Sep 16, 2026
aa4e44a
fix(core): a token seen fresh clears its circuit breaker
efim0v Sep 16, 2026
1e92ab0
fix(core): ProcessRunner — bounded drain; a grandchild holding stdout…
efim0v Sep 17, 2026
62435ea
fix(core): ProcessRunner — a truncated tail costs a character, not th…
efim0v Sep 17, 2026
577ded8
fix(core): cache a nil credential read for 10 min so a denied Keychai…
efim0v Sep 17, 2026
79e9e8f
fix(core): TokenKeeper — offline and could-not-attempt do not consume…
efim0v Sep 17, 2026
d30d12f
fix(core): TokenKeeper — only a landed refresh re-arms the 401 floor …
efim0v Sep 17, 2026
8f8196d
feat(brow): the strip is the notch — two placements, flared corners, …
efim0v Sep 17, 2026
cba3c1f
fix(brow): the final review's 14 findings — ⟳ stays live, -p stays sh…
efim0v Sep 17, 2026
b38ed3c
fix(brow): pace to the endpoint's real rate limit, weld the strip to …
efim0v Sep 17, 2026
46a7b8c
feat(brow): copy/terminal buttons in the panel, the outline grows out…
efim0v Sep 17, 2026
35b0fa1
feat(brow): close animation, hide-the-ears toggle, one bucket picture…
efim0v Sep 17, 2026
6fd74b8
feat(brow): a month of weekly resets and renewals under the accounts
efim0v Sep 17, 2026
0ef292e
fix(brow): no Keychain dialog Brow did not ask for; a withheld item i…
efim0v Sep 18, 2026
b4a6906
fix(brow): read credentials the way Claude Code does — through the se…
efim0v Sep 18, 2026
058ba58
wip: transcript mirror, session cards, prebuilt hooks — work in progr…
efim0v Sep 18, 2026
9892236
refactor(grove): drop per-account limits and daily usage — Grove is s…
efim0v Sep 18, 2026
9a92682
fix(grove): a leftover transcript mirror under a shared workspace is …
efim0v Sep 18, 2026
c0e61f6
fix(grove): an account with no prior statusline comes out of the laun…
efim0v Sep 18, 2026
beaf917
fix(grove): sibling workspaces forked from a moving base no longer re…
efim0v Sep 18, 2026
7176da6
fix(grove): a gitflow integration branch ahead of origin/HEAD is the …
efim0v Sep 18, 2026
d6fad0e
fix(grove): worktrees parked inside a workspace get their own fold, n…
efim0v Sep 18, 2026
54b5a1c
feat(grove): accounts are named by their email, and Brow's sign-in fo…
efim0v Sep 18, 2026
ff729ec
fix(grove): one login is one account; a fresh folder launches signed …
efim0v Sep 18, 2026
6047512
feat(grove): the menu-bar item is a tree
efim0v Sep 18, 2026
9088b43
feat(migration): hot migration — a session moves into an account that…
efim0v Sep 18, 2026
aa11228
docs: Grove and Brow — two related utilities, one package
efim0v Sep 18, 2026
47ca080
fix(brow): the default account's token is refreshed in the Keychain i…
efim0v Sep 19, 2026
6bb2796
docs: rewrite the README, add screenshots and a license
efim0v Oct 4, 2026
ca3b805
docs: fix the storage diagram
efim0v Oct 4, 2026
95a367e
docs: say what Grove is in the first line
efim0v Oct 4, 2026
6c781ff
docs: add an Install section with the prebuilt download
efim0v Oct 5, 2026
6ed5c84
Relicense under the GNU GPL v3
efim0v Oct 5, 2026
b10950a
docs: add a changelog
efim0v Oct 13, 2026
2a7ab0e
docs: add contributing and security guides, issue forms and a code of…
efim0v Oct 13, 2026
cd6a996
ci: build and test on macOS 26, in debug and release
efim0v Oct 13, 2026
74dee7c
feat(cli): grove --version, and doctor exits 1 when git or claude can…
efim0v Oct 13, 2026
91f5a09
docs: README accuracy pass: cmux recommended, mirror retention, unins…
efim0v Oct 13, 2026
f18dfb5
docs: landing page in site/, deployed to GitHub Pages
efim0v Oct 13, 2026
0ca5666
build: test.sh stops on a failed build; coverage.sh finds Swift 6.4's…
efim0v Oct 13, 2026
918d78f
fix(core): usage and profile requests go through an ephemeral session
efim0v Oct 13, 2026
4594a80
docs: Russian and Simplified Chinese READMEs with a language switcher
efim0v Oct 13, 2026
64046bb
docs: bring the changelog up to date
efim0v Oct 13, 2026
00f0eb0
docs(site): a plainer landing page, flat icons and a paper social image
efim0v Oct 13, 2026
6bf7789
docs(site): structured data, a sitemap date, a 404 page and IndexNow
efim0v Oct 13, 2026
3cb492c
docs(site): say multi-repo, compare with claude --worktree, answer qu…
efim0v Oct 13, 2026
ea03648
docs(site): guides to multi-repo Claude Code and to moving a session …
efim0v Oct 13, 2026
b22db31
docs(site): Russian and Simplified Chinese landing pages
efim0v Oct 13, 2026
fdb6651
docs: link the website from each README; the unlink snippet pastes in…
efim0v Oct 13, 2026
5350b6d
release: 0.2.1
efim0v Oct 13, 2026
9ef30cc
fix(grove): forking from a branch only origin has puts the worktree o…
efim0v Oct 13, 2026
f1da00a
fix(grove): Resume as… refuses a session that is still running as a p…
efim0v Oct 13, 2026
8a1e099
fix(core): write settings.json and .claude.json through HotJSONFile
efim0v Oct 13, 2026
fbe03ba
release: 0.2.2
efim0v Oct 13, 2026
6593262
docs(site): version 0.2.2
efim0v Oct 13, 2026
1824b2e
docs: use a.efimov@mizzle.studio as the contact email
efim0v Oct 14, 2026
018410b
docs: move the website to efimov.page
efim0v Oct 14, 2026
528b841
site: add Cloudflare Web Analytics
efim0v Oct 14, 2026
3b24f60
build: bring Grove's code and history into Brow
efim0v Oct 17, 2026
50feba6
build: build GroveCore and the Grove targets from this repository
efim0v Oct 17, 2026
08709d8
test: keep the test suite out of the real home folder
efim0v Oct 17, 2026
2ec99ad
ci: one workflow for the whole package
efim0v Oct 17, 2026
57e1406
fix: build without warnings again
efim0v Oct 17, 2026
7e8e186
fix(core): the transcript mirror keeps only what Claude Code keeps
efim0v Oct 17, 2026
4e633a0
fix(core): the shared-store check knows Claude Code's own folders
efim0v Oct 17, 2026
de0c972
fix(grove): launch no longer re-creates a deleted account folder
efim0v Oct 17, 2026
6aee527
fix(core): the Keychain read gives up after ten seconds
efim0v Oct 17, 2026
7096178
fix(grove): model pickers offer Claude Code's aliases
efim0v Oct 17, 2026
f1bf963
refactor(grove): the menu-bar panel can live inside another app
efim0v Oct 17, 2026
2b3c06a
feat: Workspaces starts only when it is set up
efim0v Oct 17, 2026
5bf8604
feat: Brow hosts the Workspaces panel in the menu bar
efim0v Oct 17, 2026
d62ac84
feat: the notch and Workspaces open each other
efim0v Oct 17, 2026
13986a3
feat: one Settings window
efim0v Oct 17, 2026
9656d0b
feat: account pickers show each account's limits
efim0v Oct 17, 2026
7045f46
feat: Workspaces launches use Brow's router and claude path
efim0v Oct 17, 2026
fca443a
feat(cli): brow, with grove kept as another name
efim0v Oct 17, 2026
7823d3a
build: one version, one Info.plist, release script
efim0v Oct 17, 2026
9bbe65e
fix: Settings shows every Workspaces account
efim0v Oct 17, 2026
117342e
chore: license header on every source file
efim0v Oct 17, 2026
ccc6514
docs: one app
efim0v Oct 17, 2026
a456548
release: 0.4.0
efim0v Oct 17, 2026
bd463a7
fix(core): a shared workspace's transcripts follow every account's re…
efim0v Oct 17, 2026
e4c68ec
fix(core): project settings count toward Claude Code's retention
efim0v Oct 17, 2026
ca981c7
fix: the safety net puts a transcript back only when you ask
efim0v Oct 17, 2026
223630b
fix: Migrate's fallback copy follows the same retention
efim0v Oct 17, 2026
ad1deb0
docs: the safety net restores only on request, and says what it reads
efim0v Oct 17, 2026
60e8014
fix: Workspaces notices Grove.app starting or quitting while Brow runs
efim0v Oct 17, 2026
8f1394b
fix: a captured status line can be given back with Workspaces off
efim0v Oct 17, 2026
3477e7d
fix: the notch can be turned off, and draws no empty pill without a n…
efim0v Oct 17, 2026
3e321b5
docs(site): Grove is now part of Brow
efim0v Oct 17, 2026
6c79888
build: release.sh lists every step of publishing a release
efim0v Oct 17, 2026
36fb01d
perf(core): a transcript's known cwd is not looked up again
efim0v Oct 17, 2026
c5dcd7c
docs: the capture switch in the changelog, and the test count
efim0v Oct 17, 2026
13ca382
docs: re-render Settings > Workspaces with the safety net's Restore list
efim0v Oct 17, 2026
883b76a
refactor: remove Grove.app's entry point, which nothing calls
efim0v Oct 17, 2026
3006cbb
fix: the engine captures no status line unasked, whoever hosts it
efim0v Oct 17, 2026
0fa25af
fix: Workspaces runs in one copy of Brow at a time
efim0v Oct 17, 2026
3fbd6cc
fix: Settings says why a Workspaces change did not take
efim0v Oct 17, 2026
96cbdf0
fix: a project added from the introduction waits while Workspaces is …
efim0v Oct 17, 2026
6c92f34
fix: a Workspaces account whose folder is gone can be removed
efim0v Oct 17, 2026
fcd952b
fix: Workspaces names accounts and plans as the notch does
efim0v Oct 17, 2026
1b7bf5e
fix: Settings › Workspaces says what is true for this setup
efim0v Oct 17, 2026
47e6d34
fix: the cmux error and the status-line wrapper say Brow, not Grove
efim0v Oct 17, 2026
5ae2f52
docs: Coming from Grove says what the notch does with Grove's accounts
efim0v Oct 17, 2026
4c154e2
refactor: the launch command knows the default account by the cards' …
efim0v Oct 17, 2026
befc3cd
test: one set of demo accounts for every README screenshot
efim0v Oct 17, 2026
35253df
docs: re-render the README screenshots on one set of demo accounts
efim0v Oct 17, 2026
d0d6cc3
docs: the READMEs count about 1,350 tests
efim0v Oct 17, 2026
084866a
docs: the engine's lock file stays, empty, and needs no clean-up
efim0v Oct 17, 2026
bdaa6bf
test: the online seed is checked against the answer start() read
efim0v Oct 17, 2026
4798d71
fix: the capture switch changes no file while Grove's config can't be…
efim0v Oct 17, 2026
e10a4e7
fix: with Workspaces off, Settings waits for Grove.app before changin…
efim0v Oct 17, 2026
a243755
fix: a failure in Settings shows under the account it concerns
efim0v Oct 17, 2026
d995c25
fix: two Workspaces accounts the notch shows as one keep apart by name
efim0v Oct 17, 2026
750aa90
docs: off, Workspaces still runs a status line it captured
efim0v Oct 17, 2026
d2fab62
test: the README's Settings › Workspaces render is a Grove setup
efim0v Oct 17, 2026
86b2465
docs: re-render Settings › Workspaces with the words for a Grove setup
efim0v Oct 17, 2026
c719fcc
feat: Glim, a pet by the notch that eats your limits
efim0v Oct 18, 2026
409580c
docs: coverage.sh and COVERAGE.md say what the BrowKit line measures
efim0v Oct 18, 2026
723a3fc
build: release binaries carry no paths of the machine that built them
efim0v Oct 18, 2026
5318468
docs: the README screenshots hang from a cream desktop
efim0v Oct 18, 2026
3f0e871
docs(site): version 0.4.0 and a section about Glim
efim0v Oct 18, 2026
b316e73
docs(site): Workspaces in full, with the brow command-line tool
efim0v Oct 18, 2026
181bfc2
docs(site): the multi-repo and move-session guides move to Brow
efim0v Oct 18, 2026
27b5f38
docs(site): breadcrumbs and TechArticle data for the accounts guide
efim0v Oct 18, 2026
3446a77
app: a cream icon, the colour of Glim
efim0v Oct 18, 2026
1cd9d99
docs(site): Brow's mark and buttons are cream
efim0v Oct 18, 2026
c3da606
docs: the README's loops and pictures show Glim
efim0v Oct 18, 2026
7e8deeb
docs(site): the loops, the notch and Settings show 0.4.0 with Glim
efim0v Oct 18, 2026
edfd4bd
release: 0.4.0 is dated the day it ships
efim0v Oct 18, 2026
2614d7b
fix(pet): a burst of writes is one prompt however late its events arrive
efim0v Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
59 changes: 51 additions & 8 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,38 @@
name: Bug report
description: Something in Brow does not work the way it should.
description: Something in Brow or the brow command-line tool does not work the way it should.
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for reporting a bug. With a notch app, the Mac, the display and the accounts matter as much as the steps, so the form asks for each.
Thanks for reporting a bug. With a notch and menu-bar app, the Mac, the display and the accounts matter as much as the steps, so the form asks for each.

- Questions and setup help: [Discussions → Q&A](https://github.com/efim0v/brow/discussions/categories/q-a).
- Security problems: never here. See [SECURITY.md](https://github.com/efim0v/brow/blob/main/SECURITY.md).
- Never paste a token, a Keychain item or a `.credentials.json` file. The panel shows account names or emails; blur them in screenshots if you prefer.
- **"cmux unavailable" while cmux is running** has a known cause and fix in [troubleshooting](https://github.com/efim0v/brow/blob/main/docs/troubleshooting.md).
- Never paste a token, a Keychain item or a `.credentials.json` file. Logs and command output can contain account emails, project paths and repository names: look through what you paste, and blur screenshots if you prefer.

- type: dropdown
id: component
attributes:
label: Which part of Brow
multiple: true
options:
- "Notch and limits: the readouts, the panel, limit warnings, copy my week"
- "Accounts and sign-in: adding an account, Sign in again, browser profiles, Keychain access"
- "Workspaces and sessions: projects, workspaces, Resume as…, Migrate to…, Share, Graph, Stats"
- Transcript safety net
- Settings
- brow command-line tool
- Something else
validations:
required: true

- type: textarea
id: what-happened
attributes:
label: What happened
description: What you did, what you expected, and what Brow did instead. A screenshot or screen recording of the notch, the panel or Settings helps a lot.
description: What you did, what you expected, and what Brow did instead. A screenshot or screen recording of the notch, the panel, Workspaces or Settings helps a lot.
validations:
required: true

Expand All @@ -31,8 +48,8 @@ body:
id: brow-version
attributes:
label: Brow version
description: "Run `plutil -extract CFBundleShortVersionString raw /Applications/Brow.app/Contents/Info.plist`. For a build of your own, give the commit."
placeholder: "0.2.0"
description: "Run `plutil -extract CFBundleShortVersionString raw /Applications/Brow.app/Contents/Info.plist`, or read it at the bottom of the Workspaces panel. For a build of your own, give the commit."
placeholder: "0.4.0"
validations:
required: true

Expand Down Expand Up @@ -96,6 +113,20 @@ body:
validations:
required: true

- type: input
id: cmux-version
attributes:
label: cmux version
description: "For Workspaces problems: run `cmux --version` in a cmux terminal. Leave it empty if you don't use cmux."
placeholder: cmux 0.x

- type: textarea
id: doctor
attributes:
label: Output of brow doctor --json
description: "For Workspaces problems, if you have the command-line tool (`brow-cli.zip` from the release, or `brew install efim0v/tap/brow-cli`): paste what `brow doctor --json` prints (`grove doctor --json` with the older tool). It shows the git, Claude Code and cmux that Brow finds."
render: json

- type: markdown
attributes:
value: |
Expand All @@ -113,7 +144,9 @@ body:
log show --last 1h --info --style compact --predicate 'subsystem == "dev.artemefimov.brow"'
```

The log names account folders and organization IDs. Look it over and remove anything you would rather not post.
The log names account folders, project folders and organization IDs. Look it over and remove anything you would rather not post.

For cmux problems a probe report helps most. Run `open -nW /Applications/Brow.app --args --cmux-probe /tmp/cmux-probe.txt` and attach `/tmp/cmux-probe.txt` ([more on the probe](https://github.com/efim0v/brow/blob/main/docs/troubleshooting.md#cmux-diagnostic-probe)). The probe opens and closes a test workspace in cmux, and the report lists your environment variables, so remove secrets before you attach it.

- type: textarea
id: log
Expand All @@ -126,4 +159,14 @@ body:
id: context
attributes:
label: Anything else
description: "Did it start after an update of Brow, Claude Code or macOS? Do you also use Grove? Which browser opens the account profiles? Is the `claude -p` fallback on (Settings → Accounts)?"
description: "Did it start after an update of Brow, Claude Code or macOS? Is Grove.app still installed or running? Which browser opens the account profiles? Is the `claude -p` fallback on (Settings → Accounts)? For Workspaces: how your repositories are laid out (how many, side by side or nested)."

- type: checkboxes
id: checks
attributes:
label: Before you submit
options:
- label: I searched the existing issues for this problem.
required: true
- label: I removed tokens, emails and private paths from what I pasted.
required: true
6 changes: 3 additions & 3 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ contact_links:
- name: Question or setup help
url: https://github.com/efim0v/brow/discussions/categories/q-a
about: Ask how something works, or get help getting Brow running.
- name: Grove (workspaces and sessions)
url: https://github.com/efim0v/grove/issues
about: Brow's companion app has its own issue tracker.
- name: Report a security vulnerability
url: https://github.com/efim0v/brow/security/advisories/new
about: Report it privately here, never in a public issue.
- name: Claude Code
url: https://github.com/anthropics/claude-code/issues
about: Problems with Claude Code itself go to Anthropic's repository.
15 changes: 14 additions & 1 deletion .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,20 @@ body:
- type: markdown
attributes:
value: |
Brow shows the limits of every Claude Code account in the notch and signs each account in with one click. Ideas about workspaces, worktrees or moving sessions between accounts belong to [Grove](https://github.com/efim0v/grove). To talk an idea through before filing it, use [Discussions → Ideas](https://github.com/efim0v/brow/discussions/categories/ideas).
Brow shows the limits of every Claude Code account in the notch, signs each account in with one click, and runs parallel Claude Code sessions in workspaces of git worktrees (Workspaces, in the menu bar). To talk an idea through before filing it, use [Discussions → Ideas](https://github.com/efim0v/brow/discussions/categories/ideas).

- type: dropdown
id: component
attributes:
label: Which part of Brow
options:
- Notch and limits
- Accounts and sign-in
- Workspaces and sessions
- brow command-line tool
- Something else
validations:
required: true

- type: textarea
id: problem
Expand Down
8 changes: 7 additions & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@

<!-- Commands you ran. For a visible change: the Mac model, and a screenshot or recording. -->

- [ ] `swift build` and `swift test` pass
- [ ] `Scripts/test-in-empty-home.sh` passes (the whole suite, with the home folder pointed at an empty one)
- [ ] `Scripts/test-in-empty-home.sh -c release` passes
- [ ] Tests added or updated for changed behaviour
- [ ] UI change: screenshots attached (`swift run BrowApp --snapshot <dir>` renders the Workspaces screens)
- [ ] README or `docs/` updated where behaviour changed

## Worth flagging

- [ ] No token is logged, written to disk or sent anywhere but Anthropic's usage and profile endpoints
- [ ] Changes what Brow writes to Claude Code's files, and the README's "What Brow does on your machine" is updated to match
37 changes: 26 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
# Package.swift targets macOS 26 with swift-tools-version 6.2, but Swift 6.2.4
# cannot compile BrowKit, so this relies on the image's newer default Xcode.
runs-on: macos-26
timeout-minutes: 20
timeout-minutes: 45
steps:
- uses: actions/checkout@v7
with:
Expand All @@ -30,18 +30,33 @@ jobs:
- name: Show versions
run: |
sw_vers
xcode-select --print-path
xcodebuild -version
swift --version

# Package.resolved is git-ignored, so every run resolves grove afresh;
# the tree shows which version it got.
- name: Resolve dependencies
run: |
swift package resolve
swift package show-dependencies
# The package has no dependencies: GroveCore, GroveAppKit, BrowKit, the app
# and the command-line tool all build from this repository. A clean build of
# every target that fails on any warning the script does not list.
- name: Build with no new warnings
run: Scripts/check-warnings.sh

# HOME and CFFIXED_USER_HOME point at an empty folder; the script fails if the
# suite leaves Brow's or Grove's data, or Claude Code's folders, in it.
- name: Test in an empty home folder
run: Scripts/test-in-empty-home.sh

- name: Build
run: swift build
# Release builds are optimized (-O). ScanWorktreeCollectionTests covers a
# release-only miscompile (see WorkspaceService.collectWorktrees).
- name: Test (release)
run: Scripts/test-in-empty-home.sh -c release

- name: Test
run: swift test
- name: Build the app and the tool
run: |
Scripts/build-brow.sh
codesign --verify --deep --strict --verbose=2 dist/Brow.app
dist/brow --version

# Every .swift, .sh and .py file starts with the SPDX licence line and the
# copyright line.
- name: Licence headers
run: Scripts/check-headers.sh
39 changes: 38 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.4.0] - 2026-10-18

Grove is now part of Brow. Its Workspaces engine — workspaces of git worktrees across several repositories, the Claude Code sessions in them and moving sessions between accounts — runs inside Brow, merged into this repository with its history. Grove's own changelog is in [`docs/history/grove-changelog.md`](docs/history/grove-changelog.md). The notch also gets a pet that eats what your accounts use.

### Added

- **Workspaces**, in the menu bar: Grove's panel — projects, workspaces, sessions, Resume as…, Migrate to…, Share, the commit graph and the code statistics — on Liquid Glass, behind Brow's mark, the notch with two dots. It is off until you use it: for someone who never used Grove nothing of it runs, and nothing is read or written for it. It turns on by itself for someone who did, with their projects, accounts and settings ([what changes](README.md#coming-from-grove)).
- While Grove.app is running, Workspaces waits and offers Quit Grove, so the two never write the same files. It also runs in one copy of Brow at a time: a second install or a development build waits while another copy runs it.
- The notch panel gets a Workspaces button, which also opens Workspaces when macOS hides the menu-bar item behind the notch. Opening Brow again from Finder or Spotlight shows Workspaces while it is on, and Settings otherwise. Brow's menu gets Show Workspaces.
- Every account picker in Workspaces — the launch sheet, Resume as…, Migrate to…, the Accounts screen — shows that account's 5-hour and weekly use as the notch reads it. Workspaces names each account as the notch does, by the name given in Settings → Accounts, and writes its plan the same way (Max 20x).
- One Settings window with four tabs. General gains Show Workspaces in the menu bar. Each card in Accounts gains a Workspaces section: Share sessions, Capture the status line, and the account's default model and effort; a Workspaces account with no card of its own, such as a second folder of the same login, gets a section after the cards, and one whose folder is gone can be removed from Workspaces there. Workspaces holds the projects, the workspace folder, the transcript safety net and the panel material. About has the version, the licence and the credits.
- The command-line tool is `brow`, with `grove` as a second name, so scripts written for Grove's tool keep working unchanged. `brow --version` prints Brow's version. It ships as `brow-cli.zip`.
- The model pickers offer Claude Code's aliases (`opus`, `sonnet`, `haiku`), pinned versions, and Other… for any model id.
- Settings → General → Show Brow in the notch. Off, Brow draws nothing at the top of the screen and no panel opens there, for someone who uses Brow for Workspaces only. Limit warnings still arrive, and opening Brow again shows Workspaces or Settings.
- **Glim, a pet that eats your limits.** A small creature lives in the black beside the notch, below it, or in the pill, and eats what your accounts use: when the 5-hour number goes up, it takes a bite, drawn as a bead of light that leaves the number untouched. Hours at the Mac without Claude Code make it hungry; it never gets hungry while you are away, and its light is its hunger meter. When the 5-hour limit is used up it falls asleep full until the window resets; when the weekly limit is used up it hibernates in its den behind the camera until the weekly reset. It perks up when a prompt is written to an account's `history.jsonl`, which Brow asks macOS to watch and never reads. Hover the notch and it hops into a new first row of the panel, with its state, its last meal and a hunger meter; a click on it boops it. It draws only while someone can see it, follows Reduce Motion, Reduce Transparency and Increase Contrast, and keeps its state in `~/Library/Application Support/Brow/pet.json`. On by default; Settings → General → **Show the pet** turns it off, and with Show Brow in the notch off there is no pet at all.

### Changed

- Capturing an account's status line is a choice per account. Grove installed its wrapper into every account's `settings.json` at launch; Brow installs it only where you turn capture on, and keeps it where Grove already had it. Claude Code keeps running the wrapper while Workspaces is off, so Settings → Accounts keeps the switch that gives the status line back, whether Workspaces is on or off.
- The transcript safety net is off for a setup Brow creates; a Grove setup keeps its setting.
- The transcript safety net no longer puts a transcript back by itself. The transcripts that vanish are listed in Settings → Workspaces, newest first, with Restore: a period passed to `claude --settings` cannot be read from outside, so only you can tell a transcript deleted by accident from one cleaned up on purpose.
- Sessions Workspaces starts use Brow's own browser router and Settings → General → Path to claude.
- Brow's settings decode field by field: a value that cannot be read costs that one setting instead of all of them, and the file as it was is kept as `config.json.bak` ([#7](https://github.com/efim0v/brow/issues/7)).
- One log subsystem, `dev.artemefimov.brow`, for the whole app.

### Fixed

- The transcript safety net no longer brings back, or keeps, transcripts Claude Code's own retention deleted. It restored every mirrored transcript under 90 days old; it now reads `cleanupPeriodDays` from your organization's managed settings, server-managed settings, the account's settings and the project settings of every folder the account's sessions ran in, takes the shortest — for a workspace shared between accounts, the shortest of all of theirs — and keeps nothing past it. Migrate to… follows the same rule when it falls back on the safety net's copy ([efim0v/grove#6](https://github.com/efim0v/grove/issues/6)).
- Opening Accounts no longer shows a red "unknown session store" banner for the folders Claude Code itself writes ([efim0v/grove#7](https://github.com/efim0v/grove/issues/7)).
- Launch no longer re-creates an account folder you deleted ([efim0v/grove#12](https://github.com/efim0v/grove/issues/12)).
- Reading a token through the `security` tool gives up after ten seconds, as it was meant to ([efim0v/grove#9](https://github.com/efim0v/grove/issues/9)).
- The model pickers no longer miss new models ([efim0v/grove#10](https://github.com/efim0v/grove/issues/10)).
- The launch-at-login toggle can no longer show on while it is off, and says when macOS is waiting for your approval ([#8](https://github.com/efim0v/brow/issues/8)).
- The build has no compiler warnings again ([efim0v/grove#11](https://github.com/efim0v/grove/issues/11)).
- With Show readouts next to the notch off, a display without a notch no longer shows an empty black pill: nothing is drawn until the pointer reaches the top centre, as the setting says.

## [0.3.1] - 2026-10-15

### Fixed
Expand Down Expand Up @@ -77,7 +113,8 @@ First public release: the usage and rate limits of every Claude Code account, in
- Background token refresh for idle accounts. If it stops working, Brow falls back to a tiny `claude -p` request, which spends a little limit and starts that account's 5-hour window. The fallback is on by default; turn it off in Settings → Accounts.
- A prebuilt `Brow.zip` for macOS 26 or later on Apple silicon, signed ad hoc and not notarized, with `SHA256SUMS.txt` to verify it.

[Unreleased]: https://github.com/efim0v/brow/compare/0.3.1...HEAD
[Unreleased]: https://github.com/efim0v/brow/compare/0.4.0...HEAD
[0.4.0]: https://github.com/efim0v/brow/compare/0.3.1...0.4.0
[0.3.1]: https://github.com/efim0v/brow/compare/0.3.0...0.3.1
[0.3.0]: https://github.com/efim0v/brow/compare/0.2.3...0.3.0
[0.2.3]: https://github.com/efim0v/brow/compare/0.2.2...0.2.3
Expand Down
Loading
Loading