Skip to content

docs: landing page in site/, deployed to GitHub Pages - #19

Merged
efim0v merged 3 commits into
mainfrom
site/landing
Oct 13, 2026
Merged

efim0v merged 3 commits into
mainfrom
site/landing

Conversation

@efim0v

@efim0v efim0v commented Oct 13, 2026

Copy link
Copy Markdown
Owner

What and why

Grove has no page of its own outside GitHub, and the repository's homepage field points at Brow. This adds a one-page site for https://efim0v.github.io/grove/ and the workflow that publishes it.

  • site/index.html: one static page with inline CSS and a few lines of inline JavaScript for the copy buttons; without JavaScript the commands are still there to select. The page loads nothing from other sites (no fonts, scripts, analytics or trackers), and a Content-Security-Policy meta tag keeps it that way. Light and dark follow the system setting.
  • What it says, all of it checked against the code and the README:
    • workspaces: one directory per feature with a worktree of each repository on one branch; base branches, stacking, seed files, post-create hooks, per-project defaults; how this differs from Claude Code's own --worktree;
    • sessions across projects and accounts; Resume as…, Migrate to…, Share, and the rule that a session never gets two writers;
    • Graph, Stats and the grove command-line tool;
    • install: the Homebrew cask and the grove-cli formula, the release zip with a checksum command, and the first launch (Open Anyway), including why the Homebrew install needs that step too;
    • requirements: macOS 26 or later, Apple silicon, Claude Code and git, cmux recommended and Terminal.app supported (with which buttons go through the launch sheet), an account at ~/.claude, Brow optional;
    • what Grove changes on disk: the status-line wrapper, account linking, what Migrate to… merges into the target account, the transcript mirror (it restores transcripts that Claude Code's cleanupPeriodDays cleanup deletes, until they are 90 days old), the onboarding flag, Grove's own files, what it doesn't do, and how to undo all of it.
  • site/img/: WebP copies of the eight screenshots in docs/screenshots (4.4 MB of PNG become 435 KB). Four are cut to their top part and fade out at the bottom. The page says that the screenshots show made-up demo data. Only the first screenshot loads up front; the rest load lazily.
  • SEO: title, description, canonical URL, Open Graph and Twitter tags with an absolute og:image, JSON-LD SoftwareApplication, sitemap.xml and robots.txt. The text names no version, so a new release doesn't make it stale.
  • site/og.png and docs/social-preview.png: the same 1280×640 PNG (375 KB), rendered with headless Chrome from an HTML template with the app icon and the real Workspaces screenshot. GitHub takes a PNG, JPG or GIF under 1 MB as a repository's social preview.
  • .github/workflows/pages.yml: GitHub's static-site Pages workflow on the current major versions: actions/checkout@v7, actions/configure-pages@v6, actions/upload-pages-artifact@v5, actions/deploy-pages@v5. It runs on pushes to main that change site/** or the workflow, and from the Actions tab.

Where the facts come from

Code references are to b10950a.

  • Workspaces.
    • Creation, start points, seed files, hooks: WorkspaceService.swift:389-548.
    • feat/{name} and ~/Workspaces/{project}: Config.swift:42, 256.
    • The base branch from origin/HEAD: GitService.swift:156-210.
    • Age, uncommitted changes and sessions per workspace: TreeModel.swift:36-62.
    • Graph actions: GraphScreen.swift:261-279.
  • Sessions and launching.
    • Running, waiting, closed: ProjectSessionRows.swift:12-16. The Sessions tab lists live sessions first, then the rest by recency: SessionRows.swift:138-139, 238-252.
    • Go on the Projects screen (cmux, then Terminal.app by tty): AppState.swift:733-770.
    • The launch sheet: LaunchConfigSheet.swift:21-47, LaunchRequest.swift:4-8, starting on cmux at AppState.swift:786.
    • The Terminal.app launch: AppState.swift:813-841, TerminalFocus.swift:41-56.
    • What opens the sheet: WorkspaceRowCard.swift:266-274, 405-445, SessionsScreen.swift:165-182. Add & log in opens cmux: AccountsScreen.swift:453-480.
  • Accounts.
    • Linking and the refusal of a second writer: AppState.swift:890-915, 1018-1038, 1096-1170.
    • Migrate: AppState.swift:945-985, SessionMigration.swift:145-165, 270-282, 482-514, docs/grove-and-brow.md:79-91.
  • On disk.
    • The status-line wrapper: StatuslineInstaller.swift:21-23, 67, 81-90, 178-199; installed at launch (GroveMenuBarApp.swift:96, AppState.swift:1338-1371); Stop restores it (AccountsScreen.swift:154, AppState.swift:1318-1327).
    • Linking: SharedSessionStore.swift:23, 55-101, 206-232; the Link to shared store button at AccountsScreen.swift:237; Share links the account too (AppState.swift:1062-1091, through ensureLinkedForResume at 1018-1038).
    • The mirror: TranscriptMirror.swift:44, 85-149, 167-187, defaults Config.swift:129, off switch AppState.swift:924-937 and GlobalSettingsScreen.swift:49, 71-90, Purge SessionsScreen.swift:28-33, 159.
    • The onboarding flag: ClaudeService.swift:777-802, called at AppState.swift:645, 830.
    • Grove's own files: AppState.swift:207-211, 1220-1224, 1378-1382.
  • What Grove doesn't do. No Grove target references ClaudeCredentials, TokenKeeper or the OAuth clients. The only URL requests in the package are in those Brow-only clients. The git subcommands Grove runs are all local; none of them fetches, pulls or pushes.
  • The CLI: Sources/grove-cli/main.swift:64-72, 211, 287-329.
  • Requirements: Package.swift:6, Scripts/build-app.sh:45-46 (LSMinimumSystemVersion 26.0), and the README's download line and Requirements section.
  • Other sources, read on 2026-10-13:

How I checked it

  • I rendered the page in headless Chrome at 1280 px and 390 px, in light and in dark, and went through every section. At 390 px the page doesn't scroll sideways; long commands scroll inside their own boxes.
  • A script checked the page:
    • one h1 and no skipped heading levels;
    • unique ids, and a target for every # link;
    • alt, and width/height that match the file, on every image;
    • no external scripts or stylesheets;
    • all the meta tags above, with an absolute og:image;
    • JSON-LD that parses.
  • Text and background colors have a contrast of at least 4.5:1 in both themes (WCAG AA).
  • With clipboard access granted, the copy button copied the exact command and announced it to screen readers. Without JavaScript the buttons stay hidden.
  • shasum -a 256 -c --ignore-missing SHA256SUMS.txt reports OK for the files that are there and skips the others (shasum 6.02 on macOS). Without --ignore-missing it fails when only Grove.zip was downloaded.
  • actionlint passes on the workflow. The workflow itself has not run yet.
  • The image files carry no metadata.

Before and after merging

  • Pages has to build from GitHub Actions, or configure-pages fails. It already does: GET /repos/efim0v/grove/pages reports build_type: workflow and https://efim0v.github.io/grove/.
  • The Homebrew commands need efim0v/homebrew-tap with the grove cask and the grove-cli formula. They use fully qualified names, which Homebrew's tap trust accepts without a separate brew trust step: "Installing a fully qualified formula or cask name trusts only that item" (https://docs.brew.sh/Tap-Trust).
  • After the first deployment, set the repository homepage to https://efim0v.github.io/grove/, and upload docs/social-preview.png under Settings → Social preview. GitHub has no API for the social preview.
  • Crawlers read robots.txt only at the root of a host, so /grove/robots.txt and its Sitemap: line have no effect. To get the sitemap read, submit https://efim0v.github.io/grove/sitemap.xml in Google Search Console, or serve a root robots.txt from an efim0v.github.io repository.

One page about Grove: workspaces built from git worktrees across several
repositories, sessions across accounts and moving a session between them,
the command-line tool, install (Homebrew, the release zip, the first launch
past Gatekeeper), requirements, and what Grove changes on disk, the
transcript mirror included. The screenshots are WebP copies of
docs/screenshots, four of them cut to their top part.

Canonical URL, Open Graph and Twitter tags, JSON-LD, sitemap.xml and
robots.txt are for https://efim0v.github.io/grove/. The page loads nothing
from other sites. docs/social-preview.png is the same 1280x640 image as
site/og.png, for the repository's social preview.
Runs on pushes to main that change site/ or this workflow, and by hand.
Needs the Pages source set to GitHub Actions in the repository settings.
The landing page gave two ways an account gets linked. Sharing one of its
sessions is a third: Share links the account through the same code as a
cross-account resume. The Sessions tab lists live sessions first and sorts
only the rest by recency, so its caption no longer says newest first.
@efim0v
efim0v merged commit f18dfb5 into main Oct 13, 2026
1 check passed
@efim0v
efim0v deleted the site/landing branch October 13, 2026 02:34
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