Skip to content
This repository was archived by the owner on Oct 18, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Pages

# Publishes site/ to https://efim0v.github.io/grove/. The repository's Pages
# Publishes site/ to https://efimov.page/grove/. The repository's Pages
# source must be set to "GitHub Actions" (Settings → Pages).
on:
push:
Expand Down Expand Up @@ -53,7 +53,7 @@ jobs:
continue-on-error: true
env:
KEY: 936194525e90ed123a03aad1d30dc935 # public by design; same value as site/<KEY>.txt
BASE: https://efim0v.github.io/grove/
BASE: https://efimov.page/grove/
BEFORE: ${{ github.event.before }}
EVENT: ${{ github.event_name }}
run: |
Expand All @@ -77,7 +77,7 @@ jobs:
[ "$(curl -s -o /dev/null -w '%{http_code}' "$BASE$KEY.txt")" = 200 ] && break
sleep 10
done
body="{\"host\":\"efim0v.github.io\",\"key\":\"$KEY\",\"keyLocation\":\"$BASE$KEY.txt\",\"urlList\":[${urls%,}]}"
body="{\"host\":\"efimov.page\",\"key\":\"$KEY\",\"keyLocation\":\"$BASE$KEY.txt\",\"urlList\":[${urls%,}]}"
echo "$body"
curl -sS -X POST 'https://api.indexnow.org/indexnow' \
-H 'Content-Type: application/json; charset=utf-8' \
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@ jobs:
persist-credentials: false

- name: Check tags, JSON-LD and the sitemap
run: python3 Scripts/check_seo.py site https://efim0v.github.io/grove/
run: python3 Scripts/check_seo.py site https://efimov.page/grove/
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
English · [Русский](README.ru.md) · [简体中文](README.zh-CN.md)

Website: [efim0v.github.io/grove](https://efim0v.github.io/grove/)
Website: [efimov.page/grove](https://efimov.page/grove/)

# Grove — multi-repo git-worktree workspaces for parallel Claude Code sessions

Expand Down
2 changes: 1 addition & 1 deletion README.ru.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[English](README.md) · Русский · [简体中文](README.zh-CN.md)

Сайт: [efim0v.github.io/grove/ru](https://efim0v.github.io/grove/ru/)
Сайт: [efimov.page/grove/ru](https://efimov.page/grove/ru/)

> Это перевод [английского README](README.md). Английская версия основная и может быть новее перевода; если тексты расходятся, ориентируйтесь на неё.

Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[English](README.md) · [Русский](README.ru.md) · 简体中文

网站:[efim0v.github.io/grove/zh-cn](https://efim0v.github.io/grove/zh-cn/)
网站:[efimov.page/grove/zh-cn](https://efimov.page/grove/zh-cn/)

> 本文是[英文 README](README.md) 的译文。英文版可能比译文更新,两者不一致时以英文版为准。

Expand Down
2 changes: 1 addition & 1 deletion Scripts/check_seo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""Check the SEO head of every page in site/ (stdlib only).

Usage: python3 check_seo.py <site-dir> <base-url>
Example: python3 check_seo.py site https://efim0v.github.io/brow/
Example: python3 check_seo.py site https://efimov.page/brow/
"""
import json
import pathlib
Expand Down
50 changes: 25 additions & 25 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; object-src 'none'; base-uri 'self'; form-action 'none'">
<title>Grove: parallel Claude Code sessions in multi-repo worktrees</title>
<meta name="description" content="Run parallel Claude Code sessions on a multi-repo project: each feature gets a git worktree of each repo on one branch. Free macOS menu-bar app and CLI.">
<link rel="canonical" href="https://efim0v.github.io/grove/">
<link rel="alternate" hreflang="en" href="https://efim0v.github.io/grove/">
<link rel="alternate" hreflang="ru" href="https://efim0v.github.io/grove/ru/">
<link rel="alternate" hreflang="zh-Hans" href="https://efim0v.github.io/grove/zh-cn/">
<link rel="alternate" hreflang="x-default" href="https://efim0v.github.io/grove/">
<link rel="canonical" href="https://efimov.page/grove/">
<link rel="alternate" hreflang="en" href="https://efimov.page/grove/">
<link rel="alternate" hreflang="ru" href="https://efimov.page/grove/ru/">
<link rel="alternate" hreflang="zh-Hans" href="https://efimov.page/grove/zh-cn/">
<link rel="alternate" hreflang="x-default" href="https://efimov.page/grove/">
<meta name="robots" content="max-image-preview:large">
<meta name="author" content="Artem Efimov">
<meta name="color-scheme" content="light dark">
Expand All @@ -23,8 +23,8 @@
<meta property="og:site_name" content="Grove">
<meta property="og:title" content="Grove: parallel Claude Code sessions in multi-repo worktrees">
<meta property="og:description" content="A macOS menu-bar app and CLI: one directory per feature with a git worktree of each of your repositories, Claude Code sessions across accounts, and moving a session from one account to another.">
<meta property="og:url" content="https://efim0v.github.io/grove/">
<meta property="og:image" content="https://efim0v.github.io/grove/og.png">
<meta property="og:url" content="https://efimov.page/grove/">
<meta property="og:image" content="https://efimov.page/grove/og.png">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="1280">
<meta property="og:image:height" content="640">
Expand All @@ -35,7 +35,7 @@
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Grove: parallel Claude Code sessions in multi-repo worktrees">
<meta name="twitter:description" content="A macOS menu-bar app and CLI: one directory per feature with a git worktree of each of your repositories, Claude Code sessions across accounts, and moving a session from one account to another.">
<meta name="twitter:image" content="https://efim0v.github.io/grove/og.png">
<meta name="twitter:image" content="https://efimov.page/grove/og.png">
<meta name="twitter:image:alt" content="Grove: git-worktree workspaces for parallel Claude Code sessions, next to a screenshot of its Workspaces screen.">

<script type="application/ld+json">
Expand All @@ -44,10 +44,10 @@
"@graph": [
{
"@type": "SoftwareApplication",
"@id": "https://efim0v.github.io/grove/#app",
"@id": "https://efimov.page/grove/#app",
"name": "Grove",
"description": "A macOS menu-bar app and command-line tool for parallel Claude Code sessions across multiple repositories: every feature of a multi-repo project gets its own workspace, one directory holding a git worktree of each repository you pick, all on the same branch. It also keeps Claude Code sessions in view across projects and accounts, and moves a session from one Claude account to another.",
"url": "https://efim0v.github.io/grove/",
"url": "https://efimov.page/grove/",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "macOS 26 or later",
"processorRequirements": "Apple silicon (arm64)",
Expand All @@ -59,13 +59,13 @@
"isAccessibleForFree": true,
"license": "https://www.gnu.org/licenses/gpl-3.0.html",
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
"image": "https://efim0v.github.io/grove/img/grove-workspaces.webp",
"image": "https://efimov.page/grove/img/grove-workspaces.webp",
"screenshot": [
{ "@type": "ImageObject", "url": "https://efim0v.github.io/grove/img/grove-workspaces.webp", "width": 1200, "height": 1520,
{ "@type": "ImageObject", "url": "https://efimov.page/grove/img/grove-workspaces.webp", "width": 1200, "height": 1520,
"caption": "Grove’s Workspaces screen for a project called acme-shop: five workspaces in a tree, one opened to show worktrees of web-client and api-server on feat/checkout-redesign and the two Claude Code sessions in it" },
{ "@type": "ImageObject", "url": "https://efim0v.github.io/grove/img/grove-new-workspace.webp", "width": 1080, "height": 722,
{ "@type": "ImageObject", "url": "https://efimov.page/grove/img/grove-new-workspace.webp", "width": 1080, "height": 722,
"caption": "The New Workspace form: the branch feat/loyalty-points from the template feat/{name} and five repositories, each with its own base branch" },
{ "@type": "ImageObject", "url": "https://efim0v.github.io/grove/img/grove-accounts.webp", "width": 1120, "height": 1362,
{ "@type": "ImageObject", "url": "https://efimov.page/grove/img/grove-accounts.webp", "width": 1120, "height": 1362,
"caption": "The Accounts screen: the personal account, marked canonical, with its sessions, and below it the work account, marked shared" }
],
"featureList": [
Expand All @@ -77,33 +77,33 @@
"Commit graph and code statistics across repositories",
"The grove command-line tool: scan, workspaces, sessions, create, graph and doctor, each with --json"
],
"author": { "@id": "https://efim0v.github.io/#person" },
"author": { "@id": "https://efimov.page/#person" },
"sameAs": ["https://github.com/efim0v/grove"]
},
{
"@type": "SoftwareSourceCode",
"@id": "https://efim0v.github.io/grove/#source",
"@id": "https://efimov.page/grove/#source",
"name": "Grove source code",
"codeRepository": "https://github.com/efim0v/grove",
"programmingLanguage": "Swift",
"license": "https://www.gnu.org/licenses/gpl-3.0.html",
"author": { "@id": "https://efim0v.github.io/#person" },
"targetProduct": { "@id": "https://efim0v.github.io/grove/#app" }
"author": { "@id": "https://efimov.page/#person" },
"targetProduct": { "@id": "https://efimov.page/grove/#app" }
},
{
"@type": "Person",
"@id": "https://efim0v.github.io/#person",
"@id": "https://efimov.page/#person",
"name": "Artem Efimov",
"url": "https://github.com/efim0v",
"sameAs": ["https://github.com/efim0v"]
},
{
"@type": "WebPage",
"@id": "https://efim0v.github.io/grove/#webpage",
"url": "https://efim0v.github.io/grove/",
"@id": "https://efimov.page/grove/#webpage",
"url": "https://efimov.page/grove/",
"name": "Grove: parallel Claude Code sessions in multi-repo worktrees",
"inLanguage": "en",
"about": { "@id": "https://efim0v.github.io/grove/#app" }
"about": { "@id": "https://efimov.page/grove/#app" }
}
]
}
Expand Down Expand Up @@ -744,7 +744,7 @@ <h2 id="requirements-title">What you need</h2>
<tr><th scope="row"><a href="https://claude.com/claude-code">Claude Code</a> and git</th><td></td></tr>
<tr><th scope="row">cmux (recommended) or Terminal.app</th><td>For the sessions</td></tr>
<tr><th scope="row">An account signed in at the default <code>~/.claude</code></th><td>For <strong>Resume as…</strong> across accounts and for the transcript mirror</td></tr>
<tr><th scope="row">Optional: <a href="https://efim0v.github.io/brow/">Brow — Claude Code usage limits in the MacBook notch</a></th><td>When it is installed, Grove passes Brow’s browser router to the sessions it launches, so a sign-in opens in that account’s own browser profile.</td></tr>
<tr><th scope="row">Optional: <a href="https://efimov.page/brow/">Brow — Claude Code usage limits in the MacBook notch</a></th><td>When it is installed, Grove passes Brow’s browser router to the sessions it launches, so a sign-in opens in that account’s own browser profile.</td></tr>
</tbody>
</table>
<div class="prose">
Expand Down Expand Up @@ -862,7 +862,7 @@ <h2 id="privacy-title">What Grove changes on your Mac</h2>
<div class="prose">
<h2 id="brow-title" class="companion"><img src="brow-mark.svg" width="20" height="20" alt=""><span>Brow shows which account has room</span></h2>
<p>Brow lives in the MacBook notch and shows the usage limits of every Claude account you have. Grove moves work between accounts; Brow tells you which account has room. Each runs on its own, and they are built to be used together. Brow’s guide explains how to <a href="/brow/multiple-claude-accounts/">use multiple Claude Code accounts on one Mac</a>.</p>
<p><a href="https://efim0v.github.io/brow/">Brow — Claude Code usage limits in the MacBook notch</a> · <a href="https://github.com/efim0v/brow">Brow on GitHub</a></p>
<p><a href="https://efimov.page/brow/">Brow — Claude Code usage limits in the MacBook notch</a> · <a href="https://github.com/efim0v/brow">Brow on GitHub</a></p>
</div>
</div>
</section>
Expand All @@ -877,7 +877,7 @@ <h2 id="brow-title" class="companion"><img src="brow-mark.svg" width="20" height
<li><a href="https://github.com/efim0v/grove/issues">Issues</a></li>
<li><a href="https://github.com/efim0v/grove/discussions">Discussions</a></li>
<li><a href="https://github.com/efim0v/grove/blob/main/LICENSE">License: GPL-3.0</a></li>
<li><a href="https://efim0v.github.io/brow/">Brow</a></li>
<li><a href="https://efimov.page/brow/">Brow</a></li>
</ul>
<nav class="lang" aria-label="Language">
<a href="/grove/" hreflang="en" lang="en" aria-current="page">English</a>
Expand Down
20 changes: 10 additions & 10 deletions site/move-session-to-another-account/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self'; style-src 'unsafe-inline'; script-src 'none'; object-src 'none'; base-uri 'self'; form-action 'none'">
<title>Continue a Claude Code session on another account – Grove</title>
<meta name="description" content="Each Claude Code account has its own CLAUDE_CONFIG_DIR folder. Continue a session under another account with Resume as…, Migrate to… or Share in Grove.">
<link rel="canonical" href="https://efim0v.github.io/grove/move-session-to-another-account/">
<link rel="canonical" href="https://efimov.page/grove/move-session-to-another-account/">
<meta name="robots" content="max-image-preview:large">
<meta name="author" content="Artem Efimov">
<meta name="color-scheme" content="light dark">
Expand All @@ -18,10 +18,10 @@
<meta property="og:type" content="article">
<meta property="og:site_name" content="Grove">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://efim0v.github.io/grove/move-session-to-another-account/">
<meta property="og:url" content="https://efimov.page/grove/move-session-to-another-account/">
<meta property="og:title" content="Continue a Claude Code session on another account – Grove">
<meta property="og:description" content="Each Claude Code account has its own CLAUDE_CONFIG_DIR folder. Continue a session under another account with Resume as…, Migrate to… or Share in Grove.">
<meta property="og:image" content="https://efim0v.github.io/grove/og.png">
<meta property="og:image" content="https://efimov.page/grove/og.png">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="1280">
<meta property="og:image:height" content="640">
Expand All @@ -30,7 +30,7 @@
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Continue a Claude Code session on another account – Grove">
<meta name="twitter:description" content="Each Claude Code account has its own CLAUDE_CONFIG_DIR folder. Continue a session under another account with Resume as…, Migrate to… or Share in Grove.">
<meta name="twitter:image" content="https://efim0v.github.io/grove/og.png">
<meta name="twitter:image" content="https://efimov.page/grove/og.png">
<meta name="twitter:image:alt" content="Grove: git-worktree workspaces for parallel Claude Code sessions, next to a screenshot of its Workspaces screen.">

<script type="application/ld+json">
Expand All @@ -39,14 +39,14 @@
"@type": "Article",
"headline": "Continue a Claude Code session on another account",
"description": "Each Claude Code account has its own CLAUDE_CONFIG_DIR folder. Continue a session under another account with Resume as…, Migrate to… or Share in Grove.",
"url": "https://efim0v.github.io/grove/move-session-to-another-account/",
"mainEntityOfPage": "https://efim0v.github.io/grove/move-session-to-another-account/",
"url": "https://efimov.page/grove/move-session-to-another-account/",
"mainEntityOfPage": "https://efimov.page/grove/move-session-to-another-account/",
"inLanguage": "en",
"datePublished": "2026-10-13",
"dateModified": "2026-10-13",
"image": ["https://efim0v.github.io/grove/img/grove-accounts.webp"],
"image": ["https://efimov.page/grove/img/grove-accounts.webp"],
"author": { "@type": "Person", "name": "Artem Efimov", "url": "https://github.com/efim0v" },
"about": { "@id": "https://efim0v.github.io/grove/#app" }
"about": { "@id": "https://efimov.page/grove/#app" }
}
</script>

Expand Down Expand Up @@ -339,7 +339,7 @@ <h2 id="one-writer-title">One writer per session</h2>

<section id="brow" aria-labelledby="brow-title">
<h2 id="brow-title">Pair it with Brow</h2>
<p>Grove leaves usage limits to its companion app, <a href="https://efim0v.github.io/brow/">Brow — Claude Code usage limits in the MacBook notch</a>. For each account, Brow shows the 5-hour limit, the weekly limit and any model-specific weekly limit, with the time until each resets. Brow tells you which account has room; Grove moves the session there.</p>
<p>Grove leaves usage limits to its companion app, <a href="https://efimov.page/brow/">Brow — Claude Code usage limits in the MacBook notch</a>. For each account, Brow shows the 5-hour limit, the weekly limit and any model-specific weekly limit, with the time until each resets. Brow tells you which account has room; Grove moves the session there.</p>
<p>When Brow is installed, Grove passes Brow’s browser router to every session it starts, as <code>BROWSER=…</code>. If a session asks you to sign in again, the page opens in that account’s own browser profile. Separate profiles need Chrome, Chromium, Brave or Edge.</p>
</section>

Expand Down Expand Up @@ -381,7 +381,7 @@ <h3 id="undo-linking">How do I undo linking?</h3>
<li><a href="https://github.com/efim0v/grove">Source code</a></li>
<li><a href="https://github.com/efim0v/grove/releases">Releases</a></li>
<li><a href="https://github.com/efim0v/grove/issues">Issues</a></li>
<li><a href="https://efim0v.github.io/brow/">Brow</a></li>
<li><a href="https://efimov.page/brow/">Brow</a></li>
</ul>
<p>Grove is made by <a href="https://github.com/efim0v">Artem Efimov</a>. It is an independent tool, not affiliated with or endorsed by Anthropic. Screenshots show made-up demo data.</p>
</div>
Expand Down
Loading
Loading