Discord here
Turn your meeting transcripts into a Wiki for your company.
Hi ! We're the founders behind BasaltAI, and when we started using OpenClaw in March 26, it changed the way we work.
Something truly unlocked this for us: creating a company brain that maps out every meeting, every customer, every product and people, giving Claw or Claude Code unlimited context to answer our questions.
We quickly realised that Claude knew our company better than we did, and became more proficient at coding, GTM and any day to day task.
So we decided to open-source this.
Five commands. Under 2 minutes. Your scattered transcripts become a structured, linked, browsable company wiki β all local markdown files, no cloud, lives locally on your machine.
Fork it. Improve it. Make it yours.
*Built by the Basalt team.
npm install -g garden-mdRequires Node.js 18+ and an API key from any supported AI provider.
garden init # set up AI provider + wiki structure
garden connect # connect Grain, Granola, Fireflies, or any service
garden sync # pull your transcripts
garden tend # process everything β linked wiki pages
garden open # browse your wiki at localhost:4242
garden watch # auto-sync + tend every 30 min (set it and forget it)Connect your data sources. When you run 'garden sync' it will send all new transcripts to the "wildland". Run 'garden tend' to organise the data and add it to your wiki. That's it. Keep that garden clean and organized !
$ garden connect
π Connect a data source
? Which service do you want to connect?
β― Grain β Meeting recordings & transcripts from Grain
Granola β Meeting notes & transcripts from Granola
Fireflies β Meeting transcripts & summaries from Fireflies.ai
Other β connect any service with an API
? API key for Grain: grain_pat_***
β Connected to Grain
419 items in wildland
$ garden tend
πΏ Tending 419 items...
β Extracted 847 entities
β Created 312 People pages
β Created 89 Company pages
β Created 67 Product pages
β Generated HTML wiki
β Wiki updated. Run `garden open` to browse.
garden-md reads your meeting transcripts and builds a company knowledge base from them:
- Syncs transcripts from Grain, Granola, Fireflies, or any API-based service
- Extracts entities β people, companies, products/tools β across all your documents
- Links mentions as standard markdown links (no content rewriting, no summaries)
- Creates stub pages that grow over time as more documents reference them
- Renders a Wikipedia-style HTML wiki with sidebar navigation, search, and backlinks
- Commits changes to git automatically (optional)
- Rewrite or summarize your content (transcripts stay verbatim)
- Store data in the cloud (everything is local markdown files)
- Require a subscription (BYOK β bring your own AI key)
- Need a database (it's just folders of
.mdfiles)
| Service | Type | Status |
|---|---|---|
| Grain | Meeting recordings & transcripts | β Tested |
| Granola | Meeting notes & transcripts | β Built |
| Fireflies.ai | Meeting transcripts & summaries | β Built |
| Other | Any service with an API | LLM-generated with review |
Built-in connectors use pre-built, tested scripts β no AI code generation. For services not in the list, choose "Other" and provide the service name + API docs URL. The AI will generate a connector script and show it for your review before running.
| Command | Description |
|---|---|
garden init |
Interactive setup β pick AI provider, configure wiki location, enable git |
garden connect |
Connect a data source from the picker (Grain, Granola, Fireflies, Other) |
garden connect --repair |
Fix a broken connector (works even if setup failed mid-way) |
garden sync |
Run all connectors now |
garden sync --schedule |
Set up cron for automatic sync |
garden tend |
Process wildland β wiki with entity linking |
garden open |
Generate HTML wiki + open in browser |
garden config |
Update AI provider, API key, schedule |
garden add <folder> |
Add a wiki folder |
garden remove <folder> |
Remove a wiki folder |
garden rename <a> <b> |
Rename a wiki folder |
garden list |
Show wiki folders with page counts |
garden watch |
Auto-sync + tend on a loop β set it and forget it |
garden watch --interval 15 |
Custom interval (default: 30 min) |
garden watch --once |
Run one sync+tend cycle and exit |
garden uninstall |
Remove config + cron entries (wiki files are kept) |
Don't want to run sync and tend manually? Use watch:
garden watch # sync + tend every 30 minutes
garden watch --interval 15 # every 15 minutes
garden watch --once # one cycle, then exit (great for cron/CI)It runs immediately on start, then loops. If there are no new transcripts, it skips the tend step. Ctrl+C to stop.
Set it and forget it: Start garden watch in a tmux/screen session or as a systemd service, and your wiki stays up to date automatically β every new meeting flows in, gets processed, and your AI agents get smarter without you touching anything.
βββββββββββββββ βββββββββββββ ββββββββββββ ββββββββββββ
β Grain / ββββββΆβ Wildland ββββββΆβ Wiki ββββββΆβ HTML β
β Granola / βsync β (staging) βtend β (linked βopen β (browse) β
β Fireflies β β raw .md β β .md) β β β
βββββββββββββββ βββββββββββββ ββββββββββββ ββββββββββββ
- Reads raw documents from the wildland (staging area)
- Sends content to your AI provider for entity extraction
- Identifies people, companies, and products/tools
- Inserts standard markdown links into the original text (no content changes)
- Creates stub pages for new entities with backlinks
- Updates the Index.md with folder-grouped navigation
- Generates a Wikipedia-style HTML wiki with sidebar, search, and backlinks
- Auto-commits to git (if enabled)
~/.garden/
βββ config.yaml # AI provider, paths, schedule
βββ connectors/ # Sync scripts + API keys
βββ grain.mjs
βββ grain.key
~/wiki/ # Your wiki (configurable path)
βββ Index.md # Root index with recent activity
βββ .garden-meta.json # Display name metadata sidecar
βββ Meetings/
β βββ Index.md # Auto-generated folder index with descriptions
β βββ weekly-standup.md # Linked transcript with entity references
β βββ investor-call.md
βββ People/
β βββ Index.md
β βββ sarah-chen.md # Enriched stub: role, context, backlinks
β βββ michael-seibel.md
βββ Companies/
βββ Index.md
βββ acme-corp.md # Enriched stub: relationship, relevance
βββ bland-ai.md
~/wiki-wildland/ # Raw synced transcripts (staging area)
~/wiki-html/ # Generated HTML wiki (served by garden open)
Default folders: Meetings, People, Companies. Add more with garden add Products, garden add Decisions, etc.
| Provider | Model | Notes |
|---|---|---|
| Anthropic | Claude Sonnet | Recommended β best entity extraction |
| OpenAI | GPT-4o | Good alternative |
| Gemini Pro | Works well | |
| Ollama | Any local model | Free, private, slower |
| Claude CLI | claude --print | Uses your Claude Code subscription |
During garden init, providers are auto-detected based on what's installed on your machine. Pick from an arrow-key menu β no typing required.
- API keys are stored in
~/.garden/config.yamlwith0600permissions (owner-only) - Connector keys are stored as separate
.keyfiles with0600permissions - No shell injection β all subprocess calls use
execFileSyncwith argument arrays - LLM-generated connectors (for "Other" services) require explicit review before execution
- Prompt injection defense β entity extraction prompts include guards against malicious transcript content
- No data leaves your machine except API calls to your chosen AI provider
- API keys are stored in plaintext (no keychain integration yet)
- Connector API keys are encrypted only by filesystem permissions
- Prompt injection mitigation is defense-in-depth, not foolproof
garden-md isn't just for humans browsing a wiki. The real power is that your AI agents get company memory.
AI agents are smart but amnesiac. Every session starts blank. Ask Claude, ChatGPT, or any coding agent "who did we meet with last week?" β nothing. "What did we decide about pricing?" β nothing. They have zero institutional knowledge about your company, your people, your decisions.
Meanwhile, all that context sits locked inside meeting recordings nobody re-watches.
garden-md turns those recordings into structured markdown that agents can read natively:
~/wiki/
βββ People/sarah-chen.md β agent knows who Sarah is
βββ Companies/acme-corp.md β agent knows the Acme deal context
βββ Meetings/standup-04-01.md β agent knows what was discussed
βββ Products/agentphone.md β agent knows what you're building
Markdown is the universal agent context format. Every major AI tool β Claude Code, Cursor, Windsurf, GPT β reads .md files natively. No plugins, no integrations, no API calls. Just files on disk.
During setup, garden-md detects which AI coding agents you have and wires them automatically:
| Agent | Config file | Auto-wired |
|---|---|---|
| Claude Code | ~/.claude/CLAUDE.md |
β |
| OpenAI Codex | ~/AGENTS.md |
β |
| OpenClaw | ~/.openclaw/workspace/MEMORY.md + AGENTS.md |
β |
| Cursor | ~/.cursorrules |
β |
| Windsurf | ~/.windsurfrules |
β |
The wired instructions tell the agent: "Before answering questions about people, companies, or meetings β read the relevant wiki page first." Not a vague pointer. Explicit behavior: asked about Sarah? Read People/sarah-chen.md. Drafting an email? Check recent Meetings/ for context.
garden uninstall cleanly removes the section from all four files.
Any other agent with file access β The wiki is just folders of markdown. Point any agent at ~/wiki/ and it gains your company's institutional memory. No plugins, no integrations.
Without garden-md:
You: "Draft an email to Sarah about the Stripe migration"
Agent: "Who is Sarah? What Stripe migration?"
With garden-md:
You: "Draft an email to Sarah about the Stripe migration"
Agent: *reads People/sarah-chen.md β knows she's on the product team*
*reads Meetings/standup-04-01.md β knows Stripe migration is 70% done, blocked on webhook verification*
*reads People/james-rodriguez.md β knows James is already helping*
"Here's the email, referencing the webhook blocker James is fixing..."
The agent doesn't hallucinate names, doesn't guess at context, doesn't ask you to explain your own company. It just knows β because garden-md gave it memory.
Every garden sync && garden tend makes your agents smarter. New meetings add new people, new decisions, new context. Entity pages accumulate backlinks across meetings β your agent can trace "every meeting where Acme Corp was discussed" or "every decision made in Q2" without you curating anything.
It's not RAG. It's not a vector database. It's just well-organized markdown files that agents already know how to read.
Q: Does it modify my transcripts?
No. tend only adds markdown links like [Alice](../People/alice.md). The original text is preserved.
Q: Can I use it without a meeting tool?
Yes. Drop any .md file into the wildland directory and run garden tend.
Q: How much does the AI cost per run? Roughly $0.01β0.05 per transcript with Claude Sonnet. A full run on 400+ transcripts costs ~$5-10.
Q: Can I self-host everything? Yes. Use Ollama as your provider β fully local, no API calls, free.
Q: What if I switch meeting tools?
Run garden connect again to add a new connector. Old data stays in the wiki.
PRs welcome. The codebase is TypeScript, ~1800 lines across 11 commands.
git clone https://github.com/fdefitte/garden-md
cd garden-md
npm install
npx tsc # build
node dist/cli.js # run locallyMIT