Skip to content

round-sh/round

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

round.sh — the founder's private command center for a raise: local-first, agent-native, MIT
round.sh — a local-first fundraising OS: investor pipeline, cap table, growth planner, and data room, with an agent that proposes and you approve

round.sh

The founder's private command center for a raise — local-first, agent-native.

Track investors, draft outreach in your own voice, model the cap table, and keep a data room — with a Claude agent that proposes changes and never writes silently. It all runs on your machine, against a SQLite file you own.

Quickstart · What you get · How it works · Connectors · FAQ · Docs

Next.js + Electron + round CLI · per-workspace SQLite (Drizzle) · MIT licensed · local-first


Two principles

Everything in round.sh follows from these:

  • Your raise, your machine. Investors, contacts, meetings, objections, cap table, and data room live in one local SQLite file inside a git-backed folder you own. Nothing about your raise leaves your laptop unless you connect a service and approve what flows in.
  • The agent proposes, you approve. A Claude agent drafts outreach, syncs meeting notes, pulls signals, and suggests CRM updates — but every change lands in an approval queue you review first. It never writes silently.

Running in 2 minutes

pnpm install
pnpm dev            # Next.js on http://localhost:3000

Open http://localhost:3000. On first run you land on /welcome to create a workspace — a folder that holds your round.db, company profile, investor notes, and data room. That's it; the app is now running against a local database that is yours.

From there, the header setup checklist (the rocket icon) tracks what's left and auto-checks it off:

  1. Connect keys — paste them in Settings → Connectors (no file editing). ANTHROPIC_API_KEY and EXA_API_KEY unlock the most; everything else is optional. See .env.example.
  2. Company profile — your one-liner, stage, sector (Settings → Company), and your founder voice (Settings → Voice & tone), saved to company/voice.md so drafts sound like you.
  3. Round + growth — fill in round details, use of funds, and founders so the Round (cap table) and Growth (gap-to-goal planner) sections render.
  4. Add investors — paste a CSV or a list of names on the investors page, or from the CLI:
pnpm round status                          # read commands print immediately
pnpm round investors import investors.csv  # write commands record a proposal you approve

Desktop app: with pnpm dev already running, start Electron with pnpm desktop:dev (it attaches to your dev server). Package an installer with pnpm desktop:dist.

Full walkthrough: GETTING_STARTED.md.


Why round.sh

Running a raise means living in five spreadsheets, three inboxes, a notes app, and your own head. The pipeline goes stale, follow-ups slip, the cap table lives in a tab you're afraid to touch, and every "smart" fundraising tool wants your investor list on its servers.

round.sh keeps all of it in one place — on your laptop. A Claude agent works alongside you: it drafts outreach, syncs meeting notes, pulls signals, and proposes CRM updates — but every change lands in an approval queue you review first.

Built for: early-stage founders actively raising who already build with Claude. Not for: multi-user fund/back-office workflows or a hosted SaaS CRM — this is a single-founder, local-first, fork-it-yourself tool. Sending, uploading, and sharing are deliberately not automated, so you stay in the loop on everything that leaves your hands.


What you get

Area What it does
CRM · app/(app)/crm, lib/crm Investor pipeline, contacts, meetings, objections, outreach drafts, stages
Round · app/(app)/round, lib/round Cap table — scenarios, dilution, use of funds
Growth · app/(app)/growth Gap-to-goal planner — gap banner, milestone ladder, trajectory chart, "how to get there"
Engage · app/(app)/engage X/Twitter engage feed + per-investor feeds, read-only
Files / data room · app/(app)/files Diligence materials by section, with data-room readiness checks
Agent layer · lib/agent Propose → approve → apply → log. Every agent edit is a reviewable proposal
Workspace · lib/workspace Multi-workspace lifecycle, git-backed undo, file scaffolding, a generated CLAUDE.md
CLI · cli/ round status, round investors …, round granola sync, and more

Architecture overview: docs/architecture/overview.md · local-first performance notes: docs/architecture/perf-local-first.md.


How it works

round.sh is local-first by construction, and the agent never edits your raise behind your back.

flowchart LR
    A[Agent / CLI / sync] -->|proposes| B[Approval queue<br/>agentActions]
    B -->|you approve| C[Apply to round.db]
    C -->|recorded| D[Activity log + git history]
    B -.->|you reject| A
Loading
  • A fresh workspace ships a generated CLAUDE.md so Claude Code (run claude in the folder — optional, with its own Anthropic sign-in) already understands your raise, plus .claude/skills like prep, debrief, outreach, next-moves, path-to-close, and red-team.
  • A PreToolUse hook (round hook pretooluse) intercepts agent file edits, and structured writes go through lib/agent/proposals.ts into the agentActions table — reviewed in Approvals.

The CLI safety model, in four tiers:

Tier Examples Behavior
Read status, investors list, dataroom status Print immediately
Write investors add/import, meeting create, outreach draft Record a pending proposal unless you pass --yes
Sync granola sync, calcom sync, matcap sync Read-only network pulls; results still propose
Refused by design delete, send, upload, share Always refused — these never happen automatically

Connectors

All keys are optional and feature-gate their own surface. Set them in Settings → Connectors (stored at ~/.round/keys.json, overridable via $ROUND_CONFIG_DIR, never committed) or in .env.local.

Connector Key Powers
Anthropic ANTHROPIC_API_KEY Outreach drafting, talking points, signal digests, fit synthesis
Exa EXA_API_KEY Investor research, web signals, enrichment
X (Twitter) X_API_BEARER_TOKEN Engage feed + per-investor feeds (read-only)
Granola GRANOLA_API_KEY Meeting-notes sync → proposed meetings (round granola sync)
Cal.com CALCOM_API_KEY Booking sync → proposed meetings (round calcom sync)
MatCap MATCAP_API_KEY Advisor-intro pipeline (round matcap sync)
Gmail / Google Calendar Agent-side, managed by Claude in a session (no app-stored key)

Without ANTHROPIC_API_KEY, the synthesis features (digests, talking points, fit) degrade gracefully to fetch-and-list rather than failing — so the app is useful before you connect anything.


Make it your own

round.sh is MIT licensed and meant to be forked. Keep the name or rebrand it:

pnpm fork-setup     # interactive: app name, bundle id, git author

Or edit branding live in Settings → Branding (display name, tagline, logo). Full list of customization points: docs/forking.md.


FAQ

Is my fundraise data sent anywhere?

No. Your investors, contacts, meetings, cap table, and data room live in a per-workspace round.db SQLite file inside a git-backed folder you own (default ./workspaces, git-ignored). Data only leaves your machine when you connect a service (e.g. Anthropic, Exa) and approve what flows in. Keys live in ~/.round/keys.json or .env.local — neither is ever committed.

How is this different from a spreadsheet or a hosted CRM?

A spreadsheet doesn't draft your outreach, sync your meeting notes, or model your cap table — and a hosted CRM puts your investor list on someone else's servers. round.sh gives you both: an agent that proposes real work and a local-first store you own. Every agent change goes through an approval queue, and it's MIT-licensed so you can fork and rebrand it.


Development

pnpm dev            # web app on http://localhost:3000
pnpm test           # Vitest suite (pnpm test:watch to watch)
pnpm lint           # eslint
pnpm round <args>   # the CLI against the active workspace

Exa investor discovery scripts

# preview by default, --write to persist rows
pnpm exa:discover -- --query "Pre-seed B2B SaaS funds NYC" --count 25
pnpm exa:discover -- --query "Pre-seed B2B SaaS funds NYC" --count 25 --write

The shared Exa client is lib/exa/client.ts; MCP servers for coding agents are registered in .mcp.json. Your real data lives outside the repo (your workspace folder, default ./workspaces, git-ignored) and your keys live in .env.local / ~/.round — neither is ever committed.


Docs & next steps

Not a professional service

round.sh helps you think about and run your raise — an elevated way to organize your pipeline, model the cap table, and stay on top of every follow-up. It is not a professional service, and nothing in it is legal, financial, tax, accounting, or securities advice.

Raising capital carries real legal and regulatory weight. For the decisions that matter, bring in the right people — a startup attorney, an accountant, and any licensed advisors your raise calls for. round.sh is here to support how you run your raise; it is not a substitute for the professionals who support you.


License

MIT. Your raise, your data, your fork.

About

No description, website, or topics provided.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages