{"id":50405960,"url":"https://github.com/khou/gardenkit","last_synced_at":"2026-05-31T01:30:54.877Z","repository":{"id":355337049,"uuid":"1227699317","full_name":"khou/gardenkit","owner":"khou","description":"Claude Code hooks + skills for a self-maintaining second brain in plain markdown.","archived":false,"fork":false,"pushed_at":"2026-05-12T03:42:24.000Z","size":110,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-12T05:35:27.015Z","etag":null,"topics":["ai-agents","claude-code","claude-hooks","claude-skills","digital-garden","knowledge-management","markdown","obsidian","pkm","second-brain"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/khou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T03:28:14.000Z","updated_at":"2026-05-12T03:42:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/khou/gardenkit","commit_stats":null,"previous_names":["khou/gardenkit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/khou/gardenkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khou%2Fgardenkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khou%2Fgardenkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khou%2Fgardenkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khou%2Fgardenkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/khou","download_url":"https://codeload.github.com/khou/gardenkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khou%2Fgardenkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33716338,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude-code","claude-hooks","claude-skills","digital-garden","knowledge-management","markdown","obsidian","pkm","second-brain"],"created_at":"2026-05-31T01:30:54.300Z","updated_at":"2026-05-31T01:30:54.872Z","avatar_url":"https://github.com/khou.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gardenkit\n\nAn LLM-tended second brain. Plain markdown vault, atomic notes, wiki-links, Obsidian-readable, agent-maintained.\n\nInspired by [Andrej Karpathy](https://x.com/karpathy)'s thinking on LLM-tended notes.\n\nThis repo is the **framework**: skills, scripts, templates, install. Your actual notes live in a separate (private) vault repo that this scaffolds.\n\n## Philosophy\n\nA second brain works when:\n1. **Capture is explicit but cheap**: you say \"capture X\" and it's in. Nothing gets written without you asking.\n2. **Recall is automatic**: relevant past notes surface when you start a session, without asking.\n3. **Maintenance is unattended**: an agent files, links, dedupes, and summarizes on a schedule. You never organize manually.\n\nThe vault is plain markdown so Obsidian renders the graph and you stay portable forever.\n\n## Architecture\n\n```\n                     ┌──────────────────┐\n                     │  ~/garden (vault) │  ← private repo, your data\n                     │   markdown +     │\n                     │   wiki-links     │\n                     └────────┬─────────┘\n                              │ read/write\n        ┌─────────────────────┼─────────────────────┐\n        │                     │                     │\n   ┌────▼────┐         ┌──────▼──────┐       ┌──────▼──────┐\n   │ Obsidian│         │ Claude Code │       │  gardener   │\n   │  (you)  │         │   / Cursor  │       │ (scheduled) │\n   └─────────┘         └─────────────┘       └─────────────┘\n                          ↑       ↑                ↑\n                    skills/hooks  rules     Desktop Routine\n                                            or cron + API key\n```\n\n- **Capture** is explicit only: ask the agent to \"capture X\" in a session and `garden-capture` drops it in `inbox/`. Nothing else writes to `inbox/`.\n- **Recall** runs at session start; injects relevant notes into Claude's context automatically.\n- **Gardener** runs on a schedule. Each pass files inbox content into atomic notes, links them, dedupes, summarizes, and commits + pushes.\n- **Bootstrap** (optional, one-shot): when you explicitly invoke it, `garden-bootstrap` surveys what's connected (Gmail/Drive/Slack/etc.), proposes a plan, asks you to confirm, and seeds the vault from those sources. It never runs unattended — you choose when (or whether) to run it.\n\nThe gardener writes only to `~/garden/` (your private vault) and its git remote. It does **not** reach out to external services on its own, and does **not** scrape your past Claude Code or Cursor sessions. The only paths that write to the vault are your explicit `garden-capture` invocations and your explicit `garden-bootstrap` runs.\n\nSee [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the long version.\n\n## Install\n\n```bash\ngit clone https://github.com/\u003cyou\u003e/gardenkit.git ~/github/gardenkit\ncd ~/github/gardenkit\n./install.sh\n```\n\nThe installer is idempotent. It will:\n\n1. Create `~/garden/` (your private vault) if missing, seeded from `templates/`. On re-run, top up missing meta files from the latest templates without overwriting your customizations (`cp -n`).\n2. Initialize git in `~/garden/` if not already.\n3. Symlink `skills/garden-*` and `skills/gardener` into `~/.claude/skills/`, and mirror them as `.mdc` rules under `~/garden/.cursor/rules/` for Cursor.\n4. Wire `SessionStart` hooks so vault context loads when a session starts:\n   - Claude: `SessionStart` in `~/.claude/settings.json`.\n   - Cursor (1.7+): `sessionStart` in `~/.cursor/hooks.json` (user-global). Same `scripts/session-start.sh`; the script auto-detects Cursor via `$CURSOR_VERSION` and emits the JSON Cursor expects. See [docs/CURSOR.md](docs/CURSOR.md).\n   No `SessionEnd` / `PreCompact` hook is wired. Capture is explicit-only.\n5. Make `scripts/*.sh` executable.\n6. Ask which scheduling path you want — Claude Code Desktop Local Routine (default, free with subscription) or cron + `ANTHROPIC_API_KEY` (Cursor-only / no-Desktop, API-billed) — and print the appropriate setup instructions.\n7. Print next steps. If your existing meta files differ from the latest templates, the installer prints a heads-up; the gardener reconciles content drift on its next run.\n\nIt will **not** overwrite existing files in your vault or remove anything.\n\n## Next steps after install\n\n1. **Fill `~/garden/meta/user.md`** by asking Claude or Cursor to interview you (15 questions).\n2. **Bootstrap your voice profile.** Ask Claude or Cursor to \"init my voice from Slack\" (invokes the `garden-voice` skill). Pulls your sent messages, synthesizes patterns into `meta/voice.md`. Loaded on-demand whenever the agent drafts in your voice.\n3. **(Optional) Seed the vault from connected sources.** If you want to pre-populate the vault with people, projects, and decisions from Gmail/Drive/Slack/etc., ask the agent to \"init my garden from connected sources\" (invokes `garden-bootstrap`). It surveys what's there, proposes a plan, and only pulls what you confirm. One-shot — never runs unattended. You can re-invoke it as `refresh` later to top up.\n4. **Push your vault to a private GitHub repo:**\n   ```bash\n   cd ~/garden\n   git remote add origin git@github.com:\u003cyou\u003e/garden.git\n   git push -u origin main\n   ```\n5. **Schedule the gardener.** Two paths — pick what fits in [docs/SCHEDULING.md](docs/SCHEDULING.md):\n   - **Default**: a Claude Code Desktop Local Routine, every 4 hours, free with your Pro/Max subscription. Ask Claude in any Desktop session to \"set up the gardener routine\" and approve the dialog.\n   - **Fallback**: cron + `ANTHROPIC_API_KEY` for Cursor-only users, or Claude users who don't want Desktop pinned open. Note: API keys bill against your API account, which is separate from Pro/Max — the subscription does **not** include API credits.\n\n   Cursor specifics: [docs/CURSOR.md](docs/CURSOR.md).\n\n## Layout\n\n```\ngardenkit/\n├── README.md                    ← this file\n├── install.sh                   ← idempotent installer\n├── skills/\n│   ├── garden-capture/SKILL.md   ← drop a thought into inbox/\n│   ├── garden-recall/SKILL.md    ← search the vault, surface notes\n│   ├── garden-voice/SKILL.md     ← derive voice profile from your real messages\n│   ├── garden-bootstrap/SKILL.md ← optional one-shot seed from connected sources (you invoke; never scheduled)\n│   └── gardener/SKILL.md         ← scheduled maintenance\n├── scripts/\n│   ├── session-start.sh         ← SessionStart hook (Claude plain text; Cursor JSON via $CURSOR_VERSION auto-detect)\n│   └── gardener-run.sh          ← Cron fallback runner (requires ANTHROPIC_API_KEY)\n├── templates/                   ← seed files copied into a fresh vault\n│   ├── 00-index.md\n│   ├── README.md\n│   ├── scheduled-task-gardener.md ← canonical prompt body for the scheduled gardener (shared by Desktop Routine and cron paths)\n│   ├── meta/{user,soul,gardener-rules,derived-taxonomies,migration-state}.md\n│   └── projects/EXAMPLE.md\n└── docs/\n    ├── ARCHITECTURE.md          ← the design and reasoning\n    ├── SCHEDULING.md            ← Desktop Local Routine (default), cron fallback, cloud option\n    └── CURSOR.md                ← Cursor install + scheduling notes\n```\n\n## License\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhou%2Fgardenkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkhou%2Fgardenkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhou%2Fgardenkit/lists"}