{"id":27730049,"url":"https://github.com/rowboatlabs/rowboat","last_synced_at":"2026-10-27T20:20:14.222Z","repository":{"id":275131510,"uuid":"916009087","full_name":"rowboatlabs/rowboat","owner":"rowboatlabs","description":"AI coworker with memory and collaboration","archived":false,"fork":false,"pushed_at":"2026-10-20T07:52:39.000Z","size":129227,"stargazers_count":18041,"open_issues_count":206,"forks_count":1802,"subscribers_count":99,"default_branch":"main","last_synced_at":"2026-10-20T20:46:28.063Z","etag":null,"topics":["agents","agents-sdk","ai","ai-agents","ai-agents-automation","chatgpt","claude-code","claude-cowork","generative-ai","llm","multiagent","opeani","open-source","orchestration","productivity"],"latest_commit_sha":null,"homepage":"https://www.rowboatlabs.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rowboatlabs.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,"accessibility":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":"CLAUDE.md","gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2025-01-13T09:30:40.000Z","updated_at":"2026-10-20T19:28:37.000Z","dependencies_parsed_at":"2026-10-20T20:36:45.646Z","dependency_job_id":null,"html_url":"https://github.com/rowboatlabs/rowboat","commit_stats":null,"previous_names":["rowboatlabs/rowboat"],"tags_count":184,"template":false,"template_full_name":null,"purl":"pkg:github/rowboatlabs/rowboat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rowboatlabs%2Frowboat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rowboatlabs%2Frowboat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rowboatlabs%2Frowboat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rowboatlabs%2Frowboat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rowboatlabs","download_url":"https://codeload.github.com/rowboatlabs/rowboat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rowboatlabs%2Frowboat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":345082042,"owners_count":38477967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-22T02:00:06.372Z","response_time":122,"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":["agents","agents-sdk","ai","ai-agents","ai-agents-automation","chatgpt","claude-code","claude-cowork","generative-ai","llm","multiagent","opeani","open-source","orchestration","productivity"],"created_at":"2025-04-28T05:02:13.275Z","updated_at":"2026-10-22T20:14:26.832Z","avatar_url":"https://github.com/rowboatlabs.png","language":"TypeScript","funding_links":[],"categories":["智能体 Agents","Personal Assistants","TypeScript","🤖 AI Coding CLI Agents \u0026 SWE Systems","AI开源项目","HarmonyOS","NLP","Repos","Machine Learning and AI","💼 AI ასისტენტები და ბიზნეს-აგენტები","📚 Tools","🤖 AI \u0026 Machine Learning","AI Agent Frameworks \u0026 SDKs","2. Libraries \u0026 Frameworks","🧠 AI Applications \u0026 Platforms","AI Agents","AI \u0026 LLM","🏆 القائمة الكاملة Top 200","Agent SDK / framework"],"sub_categories":["AI Agent","Windows Manager","LLM and Inference","🌟 What You'll Find Here:","Multi-Agent Collaboration Systems","Python","Tools","Agent Frameworks and Runtimes","Agents \u0026 Orchestration"],"readme":"\u003ca href=\"https://www.youtube.com/watch?v=5AWoGo-L16I\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n  \u003cimg width=\"1339\" height=\"607\" alt=\"rowboat-github-2\" src=\"assets/readme-dark/hero-video.png\" /\u003e\n\u003c/a\u003e\n\n\u003ch5 align=\"center\"\u003e\n\n\u003ch1 align=\"center\"\u003eRowboat\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\u003cb\u003eOpen-source personal AI assistant with built-in docs, whiteboard and email. Works solo or with your team.\u003c/b\u003e\u003c/p\u003e\n\n\u003cp align=\"center\" style=\"display: flex; justify-content: center; gap: 20px; align-items: center;\"\u003e\n  \u003ca href=\"https://trendshift.io/repositories/13609\" target=\"blank\"\u003e\n    \u003cimg src=\"https://trendshift.io/api/badge/repositories/13609\" alt=\"rowboatlabs/rowboat | Trendshift\" width=\"250\" height=\"55\"/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.rowboatlabs.com/\" target=\"_blank\" rel=\"noopener\"\u003e\n    \u003cimg alt=\"Website\" src=\"https://img.shields.io/badge/Website-10b981?labelColor=10b981\u0026logo=window\u0026logoColor=white\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://discord.gg/wajrgmJQ6b\" target=\"_blank\" rel=\"noopener\"\u003e\n    \u003cimg alt=\"Discord\" src=\"https://img.shields.io/badge/Discord-5865F2?logo=discord\u0026logoColor=white\u0026labelColor=5865F2\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://x.com/intent/user?screen_name=rowboatlabshq\" target=\"_blank\" rel=\"noopener\"\u003e\n    \u003cimg alt=\"Twitter\" src=\"https://img.shields.io/twitter/follow/rowboatlabshq?style=social\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.ycombinator.com\" target=\"_blank\" rel=\"noopener\"\u003e\n    \u003cimg alt=\"Y Combinator\" src=\"https://img.shields.io/badge/Y%20Combinator-S24-orange\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/readme/README.zh-CN.md\"\u003e简体中文\u003c/a\u003e · \u003ca href=\"docs/readme/README.ja.md\"\u003e日本語\u003c/a\u003e · \u003ca href=\"docs/readme/README.ko.md\"\u003e한국어\u003c/a\u003e · \u003ca href=\"docs/readme/README.es.md\"\u003eEspañol\u003c/a\u003e · \u003ca href=\"docs/readme/README.fr.md\"\u003eFrançais\u003c/a\u003e · \u003ca href=\"docs/readme/README.pt.md\"\u003ePortuguês\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c/h5\u003e\n\nRowboat indexes your work into a living knowledge graph and uses that to get work done on your machine. It includes work surfaces for collaborating with AI: email client, notes, browser, code mode, meeting note taker, and workspaces for different projects.\n\n\nDownload latest for Mac/Windows/Linux: [Download](https://www.rowboatlabs.com/downloads)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.youtube.com/watch?v=et5yQABJ3xI\"\u003e\n\u003cimg width=\"800\" height=\"450\" alt=\"Rowboat Apps to Code demo\" src=\"apps/x/demo.gif\" /\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.youtube.com/watch?v=et5yQABJ3xI\"\u003e Demo - apps to code \u003c/a\u003e · \u003ca href=\"https://www.youtube.com/watch?v=7xTpciZCfpw\"\u003e Demo - knowledge graph\u003c/a\u003e\n\u003c/p\u003e\n\n\n⭐ If you find Rowboat useful, please star the repo. It helps more people find it.\n\n---\n## Overview\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eBrain\u003c/h3\u003e\nRowboat indexes email, meetings, slack and assistant conversations into a living Obsidian-style backlinked knowledge graph.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1502\" height=\"939\" alt=\"Brain graph screenshot\" src=\"assets/readme-dark/brain.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eEmail\u003c/h3\u003e\nThe built-in email client sorts emails into important and everything else. Rowboat automatically drafts responses for important email using all the work context.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"948\" alt=\"Email screenshot\" src=\"assets/readme-dark/email.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eBackground agents\u003c/h3\u003e\nYou can set up background agents that run on events like new email or on schedule like every day at 8am. They can connect to tools, search the web, use the browser and write code using Claude Code or Codex.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"951\" alt=\"Background agents screenshot\" src=\"assets/readme-dark/background-agents.png\" /\u003e\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eBuilt-in Browser\u003c/h3\u003e\nRowboat includes a browser that lets you and assistant collaborate on web tasks. Because it's isolated from your main browser, you can log in only to the accounts that you want the assistant to access.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"948\" alt=\"Browser screenshot\" src=\"assets/readme-dark/browser.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eMeeting Notes\u003c/h3\u003e\nA local meeting note-taker that taps into mic \u0026 speaker, produces live transcript and summarizes the meeting in a markdown file and updates the knowledge graph.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"947\" alt=\"Meeting notes screenshot\" src=\"assets/readme-dark/meeting-notes.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eCode Mode\u003c/h3\u003e\nCode mode lets you spin up parallel coding agents with Claude Code or Codex, and have Rowboat drive them with all the work context where needed.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"949\" alt=\"Code mode screenshot\" src=\"assets/readme-dark/code-mode.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eApps\u003c/h3\u003e\nYou can build your own work surfaces inside Rowboat — they get access to all the tools and integrations, and you can share them with other people.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"949\" alt=\"Apps screenshot\" src=\"assets/readme-dark/apps.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eIntegrations\u003c/h3\u003e\nIncludes one-click integrations to most popular products.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg width=\"1512\" height=\"948\" alt=\"Integrations screenshot\" src=\"assets/readme-dark/integrations.png\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n---\n\n## Spaces: the multiplayer part\n\nEveryone on the team runs their own Rowboat on their own machine, with their own memory of their work and their own model keys. A **Space** is where you come together: a place to talk, share files and whiteboards, and get work done. Type `@rowboat` in a Space and your Rowboat works with your context on your machine, then brings the result back to the room as you.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eOne Space. All your people. And their assistants.\u003c/h3\u003e\nA Space is a channel plus a shared folder. Messages, threads, DMs, reactions, polls, scheduled messages, and \u003ccode\u003e@mentions\u003c/code\u003e on one side; markdown files rendered as a wiki, uploads, and whiteboards on the other. Conversations, ideas, knowledge and the work itself, finally in the same place.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg alt=\"A Space: the Referral Program channel with a shared whiteboard and three teammates' cursors\" src=\"assets/readme-spaces/spaces-room.jpg\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eAsk your own Rowboat\u003c/h3\u003e\n\u003ccode\u003e@rowboat what is missing?\u003c/code\u003e wakes \u003cb\u003eyour\u003c/b\u003e Rowboat on \u003cb\u003eyour\u003c/b\u003e machine. It gathers context from your Brain, email, meetings and notes, none of which ever leave your computer, and posts the answer back to the Space as \"You (via Rowboat)\". Every teammate gets the same: their own agent, their own context, one shared room.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg alt=\"John asks @rowboat what is missing; John's Rowboat answers and adds a safeguard to the shared board\" src=\"assets/readme-spaces/spaces-ask-your-own.jpg\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eMake something together\u003c/h3\u003e\nDraw on a shared whiteboard with live cursors. Write docs as markdown with full history, diffs and restore. Open decks and documents in place. Agents use the very same files: an agent's edit lands on everyone's canvas within one event round-trip, and concurrent edits merge line by line instead of overwriting each other.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg alt=\"Sarah asks @rowboat to turn the board into a proposal; Sarah's Rowboat creates the Referral proposal file\" src=\"assets/readme-spaces/spaces-idea-to-proposal.jpg\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"40%\" valign=\"middle\"\u003e\n\u003ch3\u003eFrom review to result\u003c/h3\u003e\n\u003ccode\u003e@rowboat implement the proposal\u003c/code\u003e hands the work to Claude Code or Codex on that teammate's machine, with the Space's files as context. The changes come back to the thread ready for review.\n\u003c/td\u003e\n\u003ctd width=\"60%\"\u003e\n\u003cimg alt=\"Sam asks @rowboat to implement the proposal; Sam's Rowboat reports the safeguard implemented with changes ready for review\" src=\"assets/readme-spaces/spaces-review-to-result.jpg\" /\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### How it fits together\n\nEach person's Rowboat is a full local assistant. The Space lives on a small server called **Harbor**. The only thing that crosses the line between the two is what you (or your agent, acting as you) chose to post.\n\n```mermaid\nflowchart LR\n  subgraph J[\"John's machine\"]\n    JR[\"John's Rowboat\u003cbr/\u003eBrain · email · notes · code\"]\n  end\n  subgraph S[\"Sarah's machine\"]\n    SR[\"Sarah's Rowboat\u003cbr/\u003eBrain · email · notes · code\"]\n  end\n  subgraph M[\"Sam's machine\"]\n    MR[\"Sam's Rowboat\u003cbr/\u003eBrain · email · notes · code\"]\n  end\n  H[(\"Harbor\u003cbr/\u003ethe Space: messages, files, whiteboards\")]\n  JR \u003c-- \"only what gets posted\" --\u003e H\n  SR \u003c--\u003e H\n  MR \u003c--\u003e H\n```\n\nHarbor has one core and three doors: HTTP, a live WebSocket, and an MCP server. Rowboat's own agent gets **no privileged path**. It reaches the Space through the same MCP door any other agent would use, so anything Rowboat can do in a Space, your own agent can do too (see [Bring any agent](#bring-any-agent-to-a-space)).\n\n### What the room sees\n\nWhen you address your Rowboat in a thread, the whole room saw the ask, so the receipt is a reaction on your message, not a stream of chatter:\n\n| Reaction | Meaning |\n|---|---|\n| 👀 | Your Rowboat picked it up and is working. The room also sees a live \"Rowboat is working\" chip. |\n| ✅ | Done. When the outcome speaks for itself (a file edited, a thread titled, a message pinned), that is all you get. A reply is posted only when the ask wanted an answer. |\n| ❗ | It needs you: a decision, a confirmation, or something it could only explain with private detail. It asks in your own chat, which only you can see, never in the room. |\n\nEverything an agent writes is attributed to its person, \"Name (via Rowboat)\", and stays in history like any other message.\n\n### Privacy rules your Rowboat follows in a Space\n\nEverything it posts lands in front of the team. Everything it reads might be private to you. So:\n\n- **Read only what the task needs.** \"Message Harsh\" needs a member id, not the HR directory.\n- **Answer only what was asked.** What it saw in your files, DMs, email or notes along the way does not go into the reply.\n- **Private crosses to shared only on request, and as a summary.** \"Add my meeting notes to the roadmap\" writes what the room needs from them, never the notes themselves. It never pastes emails, chats or DM content into a Space.\n- **A receipt says what it did, not what it read.**\n\n### Get a Space\n\n- **Create a server.** In the app, open Spaces and choose *Create a server*. Sign in with your Rowboat account (Google or Microsoft) and you get a hosted server with your first Space. Add teammates with *Copy invite link*.\n- **Join a server.** Paste the invite link someone sent you. Invites bind your sign-in to a membership; a server can restrict joins to an email domain.\n- **Self-host.** Harbor is open source and lives in this repo. See [Run your own Harbor](#run-your-own-harbor).\n\nYou can belong to several servers at once, and a server can be just you: your notes to self live in a one-member DM.\n\n---\n\n## Installation\n\n**Download latest for Mac/Windows/Linux:** [Download](https://www.rowboatlabs.com/downloads)\n\n**All release files:**   https://github.com/rowboatlabs/rowboat/releases/latest\n\n### Google setup\nTo connect Google services (Gmail, Calendar, and Drive), follow [Google setup](https://github.com/rowboatlabs/rowboat/blob/main/google-setup.md).\n\n### Voice input\nTo enable voice input and voice notes (optional), add a Deepgram API key in `~/.rowboat/config/deepgram.json`\n\n### Voice output\n\nTo enable voice output (optional), add an ElevenLabs API key in `~/.rowboat/config/elevenlabs.json`\n\n### Web search\n\nTo use Exa research search (optional), add the Exa API key in `~/.rowboat/config/exa-search.json`\n\n### External tools\n\nTo enable external tools (optional), you can add any MCP server or use Composio tools by adding an API key in `~/.rowboat/config/composio.json`\n\nAll API key files use the same format:\n```\n{\n  \"apiKey\": \"\u003ckey\u003e\"\n}\n```\n\n\n## How it’s different\n\nMost AI tools reconstruct context on demand by searching transcripts or documents.\n\nRowboat maintains **long-lived knowledge** instead:\n- context accumulates over time\n- relationships are explicit and inspectable\n- notes are editable by you, not hidden inside a model\n- everything lives on your machine as plain Markdown\n\nThe result is memory that compounds, rather than retrieval that starts cold every time.\n\n## Bring your own model\n\nRowboat works with the model setup you prefer:\n- **Local models** via Ollama or LM Studio\n- **Hosted models** (bring your own API key/provider)\n- Swap models anytime — your data stays in your local Markdown vault\n\n## Extend Rowboat with tools (MCP)\n\nRowboat can connect to external tools and services via **Model Context Protocol (MCP)**.\nThat means you can plug in (for example) search, databases, CRMs, support tools, and automations - or your own internal tools.\n\nExamples: Exa (web search), Twitter/X, ElevenLabs (voice), Slack, Linear/Jira, GitHub, and more.\n\n### Example: Parallel web search\n\n[Parallel Search MCP](https://docs.parallel.ai/integrations/mcp/search-mcp) provides `web_search` and `web_fetch` for public web search and page extraction without a Parallel account or API key. Free access is rate limited.\n\nOpen **Settings → MCP Servers**, add the `parallel` entry to your existing `mcpServers` object, and click **Save**. Keep any other server entries. If no servers are configured, use:\n\n```json\n{\n  \"mcpServers\": {\n    \"parallel\": {\n      \"url\": \"https://search.parallel.ai/mcp\"\n    }\n  }\n}\n```\n\nThis connects through Rowboat's existing Streamable HTTP client. Ask Rowboat to list the tools on the `parallel` server, then try: \"Use Parallel to find the official MCP documentation.\"\n\nOnce configured, Rowboat can invoke these tools during its work, subject to your MCP tool permissions. Queries, requested URLs, and any supplied objectives or context are sent to Parallel. This setup leaves Exa and other configured providers unchanged. To remove it, delete the `parallel` entry in **Settings → MCP Servers** and save.\n\n## Local-first by design\n\n- All personal data is stored locally as plain Markdown\n- No proprietary formats or hosted lock-in\n- You can inspect, edit, back up, or delete everything at any time\n\n---\n\n## Run your own Harbor\n\nHarbor is the Spaces server. It is open source, in this repo at [`apps/harbor`](apps/harbor), and it is what Rowboat's hosted servers run. One process serves one org or many, on top of Postgres.\n\n**Try it locally in a minute.** The dev entry boots a seeded single-org Harbor (a small team and a \"Roadboard\" space) in memory on port 4272, with dev tokens instead of real sign-in:\n\n```bash\ncd apps/harbor\npnpm install \u0026\u0026 pnpm build\ncd packages/server \u0026\u0026 pnpm dev\n```\n\nIn the app, open the Spaces dialog, choose *Add a dev server*, and point it at `http://localhost:4272` with one of the seeded member ids. Or talk to it directly: every route in `/v1/*`, the live stream at `/v1/live`, and the agent door at `/mcp`. Set `DATABASE_URL` to make it durable.\n\n**Deploy it for a team.** The [Dockerfile](apps/harbor/Dockerfile) builds the deployment image. Orgs are served by hostname under your apex domain (`\u003cslug\u003e.\u003cAPEX_DOMAIN\u003e`), sign-in is OpenID Connect against an issuer you pin, and new members only ever arrive by accepting an invite.\n\n| Variable | What it does |\n|---|---|\n| `HARBOR_MODE=deployment` | Multi-org mode: resolve the org from the request host. |\n| `DATABASE_URL` | Postgres. Schema is a versioned, append-only migration ladder. |\n| `APEX_DOMAIN` | Orgs live at `\u003cslug\u003e.\u003cAPEX_DOMAIN\u003e`; the apex itself serves create-org and my-orgs. |\n| `AUTH_ISSUER` | The OIDC issuer whose tokens are trusted (JWKS-verified). Without it Harbor falls back to dev tokens, which must never be exposed publicly. |\n| `AUTH_PUBLISHABLE_KEY` | Enables the login/consent page (social sign-in only; Harbor never sees a credential). |\n| `HARBOR_ALLOWED_DOMAINS` | Comma-separated email domains allowed to accept invites (single-org mode). |\n| `BLOBS_DIR` or `BLOBS_S3_BUCKET` | Where uploads go: local disk, or any S3-compatible bucket (`BLOBS_S3_ENDPOINT`, `BLOBS_S3_REGION`). |\n| `PORT` | Defaults to 4272. |\n\nThe wire contract between Harbor and everything that talks to it is the `@rowboat/spaces-protocol` package; [`apps/harbor/CONTRACT.md`](apps/harbor/CONTRACT.md) is its narrative, including the merge semantics, the invite ceremony, and what is deliberately still v0. Expect breaking changes while we dogfood.\n\n## Bring any agent to a Space\n\nEvery org exposes an MCP server at `https://\u003corg address\u003e/mcp` (streamable HTTP). It is the exact surface Rowboat's own agent uses: read and post messages, react, open DMs, create and manage threads, read files, propose changes with a base version, upload attachments, search, catch up on activity, mint invites. Whatever connects authenticates as a member and everything it does is attributed to that member, \"Name (via \u003cagent name\u003e)\".\n\nWith Claude Code, for example:\n\n```bash\nclaude mcp add --transport http my-team https://\u003corg address\u003e/mcp\n```\n\nHarbor publishes OAuth protected-resource metadata, so any MCP client that speaks OAuth 2.1 finds the sign-in flow on its own. Sign in as yourself and the agent works as you; sign in as a member you created for it and it has a seat of its own.\n\n\n## What's in this repo\n\n- [`apps/x`](apps/x): the desktop app (Electron), the headless `rowboat-server`, and a Spaces-only mobile client\n- [`apps/harbor`](apps/harbor): the Spaces server and the `@rowboat/spaces-protocol` contract\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n[Discord](https://discord.gg/wajrgmJQ6b) · [Twitter](https://x.com/intent/user?screen_name=rowboatlabshq)\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frowboatlabs%2Frowboat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frowboatlabs%2Frowboat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frowboatlabs%2Frowboat/lists"}