How to Contribute to Rowboatlabs/Rowboat: A Complete Developer's Guide
To contribute to rowboatlabs/rowboat, fork the repository, install dependencies using pnpm in the apps/x workspace, run npm run dev to start the Electron development environment, and submit pull requests with conventional commit messages targeting the main branch.
Rowboat is an open-source AI coworker project that helps users manage emails, calendars, and notes through a local knowledge graph. Contributing to rowboatlabs/rowboat involves working with a TypeScript monorepo containing an Electron desktop application, Next.js web dashboards, a Python SDK, and Model Context Protocol (MCP) integrations.
Understanding the Rowboat Monorepo Architecture
The repository is organized as a monorepo containing multiple applications and shared packages. Understanding this structure is essential before contributing to rowboatlabs/rowboat.
Core Applications and Products
| Product | Path | Tech Stack | Purpose |
|---|---|---|---|
| Electron Desktop App | apps/x |
Electron 39, React 19, Vite, Tailwind, TypeScript, esbuild | The main AI coworker interface that runs locally, connects to email/calendar, and maintains the knowledge graph |
| Web Dashboard | apps/rowboat & apps/rowboatx |
Next.js 14, React 19, Tailwind, TypeScript | Web interface for exploring and editing the Markdown-based knowledge graph |
| CLI | apps/cli |
Node.js, TypeScript, Ink (TUI) | Command-line interface for automation and debugging |
| Python SDK | apps/python-sdk |
Python 3.12, Pydantic | External scripts integration with Rowboat's local API |
| Experimental Tools | apps/experimental/* |
Varies (Python, Node) | MCP connectors and simulation prototypes |
Shared Workspace Packages
All shared logic lives in two workspace packages under apps/x/packages:
-
@x/shared(apps/x/packages/shared): Contains utilities, type definitions, and IPC helpers. Defines the data model inmodels.ts, IPC patterns inipc.ts, logging, and workspace management. -
@x/core(apps/x/packages/core): Implements business logic including AI agents, scheduling, LLM step events, and the Model Context Protocol bridge.
Both packages must be compiled before running the Electron app using npm run deps in the workspace root.
Setting Up Your Development Environment
Follow these steps to configure your local environment for contributing to rowboatlabs/rowboat.
Fork and Clone the Repository
Start by forking the repository on GitHub, then clone your fork locally:
git clone https://github.com/your-username/rowboat.git
cd rowboat
Install Dependencies and Build Shared Packages
The project uses pnpm for package management. Navigate to the Electron workspace and install dependencies:
cd apps/x
pnpm install
Build the shared packages that the applications depend on:
npm run deps
This compiles @x/shared and @x/core so they can be imported by the main process, preload, and renderer.
Launch the Development Server
Start the full development environment with hot-reloading:
npm run dev
This command runs npm run deps and starts the Electron application concurrently. The renderer process is served at http://localhost:5173, and the main process waits for it before launching the window.
Key Contribution Areas
When contributing to rowboatlabs/rowboat, you can focus on several distinct domains based on your expertise.
UI Components and Electron Renderer
The React-based UI lives in apps/x/apps/renderer/src. This is where you can:
- Fix UI bugs in components
- Implement new dashboard views
- Improve the knowledge graph visualization
The renderer communicates with the main process through the preload bridge exposed at window.rowboat. For example, fetching data from the main process:
// apps/x/apps/renderer/src/App.tsx
import { useEffect, useState } from 'react';
const App = () => {
const [graph, setGraph] = useState<string>('');
useEffect(() => {
// window.rowboat is exposed by the preload script
window.rowboat?.invoke('getGraph').then(setGraph);
}, []);
return <pre>{graph}</pre>;
};
export default App;
AI Agents and MCP Tools
To extend Rowboat's capabilities, you can add new Model Context Protocol tools in apps/x/packages/shared/src/mcp.ts or create new agent behaviors in apps/x/packages/core/src/agent.ts.
Here's how to register a new MCP tool:
// apps/x/packages/shared/src/mcp.ts
export interface Tool {
name: string;
description: string;
execute: (input: any) => Promise<any>;
}
export const registerTool = (tool: Tool) => {
// Store tool in a global registry used by agents
toolRegistry[tool.name] = tool;
};
Example implementation of a Slack integration tool:
// apps/x/packages/shared/src/tools/slack.ts
import { registerTool } from '../mcp';
import fetch from 'node-fetch';
registerTool({
name: 'slack.postMessage',
description: 'Post a message to a Slack channel',
async execute({ channel, text }) {
const res = await fetch(`https://slack.com/api/chat.postMessage`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SLACK_TOKEN}` },
body: JSON.stringify({ channel, text })
});
return res.json();
}
});
Python SDK Enhancements
The Python SDK in apps/python-sdk allows external scripts to interact with Rowboat's local API. You can extend the client functionality in apps/python-sdk/src/rowboat/client.py:
from rowboat import RowboatClient
client = RowboatClient(vault_path="~/.rowboat/vault")
note = client.get_note("meeting-2024-02-19.md")
print(note.content)
Documentation Improvements
Documentation is located in apps/docs (MDX files) and the top-level README.md. Clear documentation is crucial for helping others contribute to rowboatlabs/rowboat.
Code Standards and Testing
Maintaining code quality is essential when contributing to rowboatlabs/rowboat.
Linting and Type Checking
Before submitting changes, run the linting and type-checking commands:
npm run lint # ESLint across the workspace
pnpm -r run build # TypeScript compile for all packages
These commands ensure that your changes meet the project's coding standards and compile without errors.
Conventional Commits and Pull Request Process
Follow these guidelines when submitting your contribution:
- Use conventional commit messages (e.g.,
feat: add Slack MCP connector,fix: resolve memory leak in agent scheduler,docs: update API reference) - Target the
mainbranch with your pull request - Include a concise description explaining what changed and why
- Link related issues using GitHub's closing keywords (e.g., "Closes #123")
- Ensure CI passes – the repository uses GitHub Actions (
.github/workflows/*) to verify builds, linting, and tests
Summary
- Rowboat is a monorepo containing an Electron desktop app, Next.js web dashboards, a Python SDK, and MCP integrations located in
apps/x,apps/rowboat, andapps/python-sdk - Shared packages
@x/sharedand@x/coreinapps/x/packagescontain the data models, IPC helpers, and AI agent logic that power the application - Development setup requires
pnpm installinapps/x, runningnpm run depsto build shared packages, andnpm run devto start the Electron app with hot-reloading - Contribution areas include React UI components in
apps/x/apps/renderer, MCP tools inapps/x/packages/shared/src/mcp.ts, Python SDK extensions inapps/python-sdk, and documentation inapps/docs - Quality standards require running
npm run lintandpnpm -r run buildbefore submitting PRs with conventional commit messages targeting themainbranch
Frequently Asked Questions
What is the fastest way to start contributing to rowboatlabs/rowboat?
The fastest path is to fork the repository, clone it locally, navigate to apps/x, run pnpm install followed by npm run deps to compile the shared packages, then execute npm run dev to launch the Electron development environment. Once running, you can modify React components in apps/x/apps/renderer/src or add MCP tools in apps/x/packages/shared/src and see changes immediately via hot-reloading.
How do I add a new integration tool to Rowboat?
To add a new Model Context Protocol (MCP) tool, create a new TypeScript file in apps/x/packages/shared/src/tools/ (following the pattern in mcp.ts), implement the Tool interface with name, description, and execute properties, then register it using the registerTool function. The tool becomes available to agents defined in apps/x/packages/core/src/agent.ts and can invoke external APIs or local resources as needed.
What testing and linting steps are required before submitting a pull request?
Before submitting a PR, you must run npm run lint to execute ESLint across the workspace and pnpm -r run build to ensure all TypeScript packages compile without errors. These commands verify that your changes meet the project's code quality standards. Additionally, ensure your commit messages follow the conventional commits format (e.g., feat:, fix:, docs:) and that your PR targets the main branch with a clear description linking any related issues.
Can I contribute to Rowboat using Python instead of TypeScript?
Yes, you can contribute Python code through the apps/python-sdk directory, which provides a Python interface to Rowboat's local API. You can extend the RowboatClient class in apps/python-sdk/src/rowboat/client.py to add new methods for interacting with the knowledge graph vault or local services. Additionally, experimental tools in apps/experimental/* often use Python for MCP connectors and simulation runners, providing another avenue for Python contributions.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →