Vibe Board
Persistent memory and task board for Claude Code. 14 tools spanning projects, tasks, sessions, and activity logs β backed by Firestore, runs on the free tier. Handoff notes survive context compaction; the next session reads the last handoff and picks up where you stopped.
Installation
npx vibe-boardAsk AI about Vibe Board
Powered by Claude Β· Grounded in docs
I know everything about Vibe Board. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
vibe board - a chatgpt app prototype
This is a social based planner/todo ChatGPT App built on Cloudflare Workers and Durable Objects. It adapts the official examples from the OpenAI Apps SDK repository. If you don't know what ChatGPT Apps are, start here: App Developer Guidelines.
Social interaction coming inside ChatGPT!
Architecture
Codebase basically split into two primary parts which can be considered as backend and frontend:
-
mcp-server/(backend) β A Cloudflare Worker that implements the Model Context Protocol (MCP) using the official MCP TypeScript library and the CloudflareagentsSDK. It registers the tools, coordinates tool execution, and persists state through a Durable Object defined inmcp-server/store.ts. Durable objects are "stateful serverless" magic utilising SQLite. If you don't know what a great thing Durable Objects are start here: Durable Objects or watch this if you want to nerdmaxing: https://www.youtube.com/watch?v=C5-741uQPVU&t=314s -
src/β The UI package rendered by ChatGPT. It is a React/Tailwind frontend that is compiled into hashed HTML/JS/CSS assets and served by the Worker.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Cloudflare Worker (mcp-server) β
β β’ @modelcontextprotocol/sdk + @cloudflare/agents β
β β’ Durable Object store (state, history, logs) β
β β’ Serves the widget template and handles tool calls β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β (Structured content + widget HTML)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ChatGPT UI Package (src) β
β β’ React + Vite + Tailwind β
β β’ Compiled template delivered via MCP widget metadata β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Requirements
Install and configure the following before working with the app:
- Node.js v20 or later (matches Wrangler's Node compatibility and the toolchain assumptions).
- pnpm (bundled with Node.js) or another package manager of your choice. The repo ships with an
pnpmlockfile. - Wrangler CLI v4.42 or later (
npm install -g wrangler). You need a Cloudflare account to run or deploy the Worker but should be fine for local dev. - Optional (local UI preview): Vite (
npm run dev:widget) if you prefer to run the widget in a browser outside ChatGPT. Note that this apps local Vite server is not working very well right now - TODO.
Getting Started
-
Install dependencies
pnpm install -
Build the widget assets
pnpm build:widgetThis compiles the React UI in
src/and regeneratesmcp-server/widget-manifest.tswith hashed HTML/JS/CSS assets. -
Run the Worker locally
pnpm devWrangler serves the Worker, Durable Object, and widget assets on
http://localhost:8787. -
Testing in ChatGPT
To add the app to ChatGPT, enable developer mode, and click Create.
ChatGPT Connectors require a publicly reachable URL, so you cannot paste
http://localhost:8787(the default Workers port) directly into the configuration. You can use Cloudflare'scloudflaredtunnel client to expose your local server or other alternatives.-
Install
cloudflaredfor your platform from the cloudflare/cloudflared GitHub releases. -
Start your local MCP server so it is listening on
http://localhost:8787. -
In a separate terminal, run:
cloudflared tunnel --url http://localhost:8787The command creates a temporary Quick Tunnel and prints a
https://<random>.trycloudflare.comURL that proxies requests to your local service. -
Copy that URL into ChatGPT > Settings > Connectors when adding your app.
For longer-lived tunnels (so the URL stays stable), authenticate with Cloudflare (
cloudflared tunnel login) and create a named tunnel before runningcloudflared tunnel run <NAME>. -
-
After a change in UI: run pnpm build:widget, delete the connector from your profile and reconnect. this is the only solution to caching as of now. see known limitations at the bottom.
-
After a change with registered tools: click refresh in settings after clicking the app you've registered which should fetch new tools
-
(Optional)Admin UI
pnpm run dev:adminthis is a simple admin dashboard attemp that runs at
http://localhost:5174for rapid UI iteration.
Deploying to Cloudflare
- This should be straightforward with wrangler deploy and figuring out the commands and I'll update here after I get to deploy this.
Deep Down
mcp-server/index.tsβ Main Worker entry. Routes requests to the MCP server, serves the widget template, and proxies Durable Object operations.mcp-server/types.tsβ Shared types covering board columns, tasks, and durable state.mcp-server/store.tsβ Durable Object implementation backing todo state, logs, and history.mcp-server/config.tsβ Imports the latest widget manifest, exposes metadata consumed by MCP tooling, and defines tool strings.scripts/build-widget.mtsβ Vite-based build script (inspired by OpenAIβsbuild-all.mts) that produces the widget assets and manifest.src/todo/index.tsxβ React component shown inside the ChatGPT widget. Handles board rendering, activity feeds, and UI interactions.
Development Notes
- The Worker sets
nodejs_compatin Wrangler, so Node APIs (e.g.,crypto,fsduring build) are available. - Durable Objects require migrations;
wrangler.jsoncdefines the initial migration tagv1for theTodoStoreclass. Modify this file andwrangler migrationsif you change the schema. - MCP tool registration and structured content responses live in
mcp-server/index.ts. Customize or add tools there if you expand beyond todo features. usemcp-server/config.tsfor string literals. - Widget metadata (
BASE_WIDGET_META) automatically references the latest hashed template and version, so ChatGPT always receives the correct assets afterpnpm run build:widget.
Contribution:
This repository more of an example and probably going to evolve with OpenAI's update to the official SDK. If you want to contribute feel free to open an issue and suggest your changes before opening a pull request.
Known limitations:
-
Cloudflare mcp server places JSON-RPC request payloads into the cf-mcp-message HTTP header when bridging WebSocket connections to Durable Objects with JSON stringtify. This causes failures when message includes emojis as LLM's tend to send. I've created a pull request in the agents library with the fix and will update agents library version when it's merged.
-
Caching makes constant development challenging. this is addressed here and openai team replied with plans to bring hot reloading. I'll update the repo once that's done, monkey patches i've tried didn't work.
-
Friend graph is a dummy data, I haven't tried setting up OAuth2 yet given others couldn't make it work yet and I'd like to focus on what I can do right now. Real social interaction inside chatgpt coming soon!
