kody is an experimental personal assistant platform built on Cloudflare
Workers and the Model Context Protocol (MCP). It ships a Remix UI, Worker-based
request routing, chat-agent plumbing, and OAuth-protected MCP endpoints. The
current direction favors a compact MCP surface with powerful search and Code
Mode execute flows over a large static tool catalog.
This project is intentionally single-user right now and is being built for
me@kentcdodds.com. The repo was generated from the
epicflare starter.
The repo is organized as an Nx monorepo, with shared modules in
packages/shared (@kody-internal/shared), the main app worker under
packages/worker, and mock Workers under packages/mock-servers/*.
Quick Start
npx create-epicflare
This will clone the template, install dependencies, run the guided setup, and start the dev server.
See
docs/contributing/getting-started.md
for the full setup paths and expectations. Contributors and agents should start
with AGENTS.md for repo-specific guidance.
If you are trying to understand what this repository is for, start with
docs/contributing/project-intent.md.
Tech Stack
| Layer | Technology |
|---|---|
| Runtime | Cloudflare Workers |
| UI Framework | Remix 3 (alpha) |
| Package Manager | npm |
| Workspace | Nx + npm workspaces |
| Database | Cloudflare D1 |
| Session/OAuth | Cloudflare KV |
| MCP State | Durable Objects |
| E2E Testing | Playwright |
| Bundler | esbuild |
Current Scope
- Personal assistant experiment, not a multi-tenant SaaS product
- MCP-first architecture intended to work across compatible AI agent hosts
- Compact MCP surface area preferred over a large static tool inventory
- ChatGPT is a likely primary host target, while keeping the server usable from other MCP hosts where practical
How It Works
Request → packages/worker/src/index.ts
│
├─→ OAuth handlers
├─→ MCP endpoints
├─→ Static assets (`packages/worker/public/`)
└─→ Server router → Remix components
packages/worker/src/index.tsis the entrypoint for Cloudflare Workers- OAuth requests are handled first, then MCP requests, then static assets
- Non-asset requests fall through to the server handler and router
- Client assets are bundled into
packages/worker/public/and served via theASSETSbinding
Documentation
| Document | Description |
|---|---|
docs/contributing/getting-started.md | Setup, environment variables, deploy |
docs/contributing/environment-variables.md | Adding new env vars |
docs/contributing/cloudflare-offerings.md | Optional Cloudflare integrations |
docs/contributing/project-intent.md | Scope, goals, and non-goals |
docs/contributing/index.md | Developing and extending Kody |
docs/use/index.md | Using Kody over MCP |
docs/contributing/setup.md | Local development and verification |
<div align="center"> <sub>Built with ❤️ by <a href="https://epicweb.dev">Epic Web</a></sub> </div>