barrydo
barrydo

A single-user task manager you own end-to-end: a mobile-first PWA for yourself, plus an MCP server so your AI agents and chat tools can create, read, and manage your tasks and projects directly.
One Cloudflare Worker serves everything — the PWA, the REST API, and the MCP endpoint — backed by one D1 SQLite database. One API key is the only auth (it's just you). Runs entirely on Cloudflare's free tier.
┌────────────────────────────────────────────┐
│ Cloudflare Worker (free tier) │
│ ├── / PWA (installable) │
│ ├── /api/* REST (used by the PWA) │
│ └── /mcp MCP server (14 tools) │
│ └── D1 SQLite (tasks, projects) │
└────────────────────────────────────────────┘
▲ ▲
your phone/desktop your agents (agentIDE,
(PWA, key = login) Chatbarry, any MCP client)Features
Tasks: title + description, High/Medium/Low/None priority, date-only due dates, stable numbered refs (
T12in inbox,P3-T12inside project 3) that are never reusedProjects: create/edit/delete; deleting a project moves its tasks to the inbox
Home page: everything on one page — inbox + every project as an accordion group, collapsible with state remembered per device, 2-tab nav (Home / History)
Drag & drop (touch-capable): reorder tasks and projects, drag tasks between groups, drag onto the project strip to move; dragging over a collapsed group expands it live. Project names must be unique (case-insensitive) — duplicates are rejected
Optimistic UI: task creation and completion render instantly — no waiting on the network, no accidental double-creates
History: soft delete only — completed and deleted tasks are kept forever with status and timestamps, restorable with one tap
MCP: all 14 operations exposed as tools (streamable HTTP, stateless) — wire it into any MCP client with a URL + bearer header; connection details with copy buttons live in the app under Settings → MCP
Single key auth: one
API_KEYsecret gates the PWA, REST, and MCP. No accounts.Light: vanilla JS/CSS (Atlassian-flavoured design tokens), no framework, no build step
Quick start (one script)
Prerequisites: a free Cloudflare account,
Node 18+ (v20+ recommended), npm, and git.
git clone https://github.com/kingfisherfox/barrydo && cd barrydo
npm install
./setup.shsetup.sh will:
Open Cloudflare login in your browser (if not already logged in)
Ask for a worker name (default
barrydo; pick anything unique to you)Create the D1 database and wire its id into
wrangler.jsoncApply database migrations
Generate a strong API key and store it as a Worker secret
Deploy, then print your URL, your API key, and a ready-to-paste MCP config
Save the printed key — it is your password for the web app and your agents' credential in one. It is not shown anywhere else at setup time, cannot be changed inside the app, and cannot be recovered if lost (you'd generate a new one — see below).
Your API key is your password
The single API_KEY secret does double duty:
Web app login: opening the PWA asks for the key once per device — that is the login screen (no usernames, no registration, it's just you)
Agents / API clients: the same value in the
Authorization: Bearer …header for MCP and REST
Because it's stored as a Cloudflare Worker secret, it is never editable from inside the app — by design. Inside the app you can view it (Settings → MCP, to copy when wiring a new tool), but changing it is a CLI operation.
Changing / rotating the key
No redeploy is needed — a secret update takes effect immediately:
openssl rand -base64 32 | tr -d '/+=' | head -c 40 # or any strong string
npx wrangler secret put API_KEY # paste the new keyAfter rotating: the old key stops working instantly. Re-enter the new key in the PWA (Settings → Account → Sign out, then unlock), and update the header in any connected agents. Nothing else changes — tasks and history are untouched.
Lost the key? Same command — rotate to a new one and log back in.
Manual setup (if you prefer)
npm install
npx wrangler login # browser auth
cp wrangler.template.jsonc wrangler.jsonc # your local config (gitignored)
npx wrangler d1 create barrydo # note the database_id
# put that id into wrangler.jsonc → d1_databases[0].database_id
npx wrangler d1 migrations apply barrydo --remote # create tables
openssl rand -base64 32 | tr -d '/+=' | head -c 40 # generate your API key
echo "YOUR_KEY" | npx wrangler secret put API_KEY
npx wrangler deploy # → https://<name>.<subdomain>.workers.devUse it
Open the deployed URL, enter your API key — that's the whole login
Install as an app: iOS Share → Add to Home Screen; Android/desktop → install prompt
Wire agents: Settings → MCP inside the app shows the endpoint, the
Authorization: Bearer …header, and a copy-ready JSON config for MCP clients
Local development
echo "API_KEY=anything-local" > .dev.vars
npm run migrate:local # local D1
npm run dev # http://localhost:8787
npm run types # tsc --noEmit.dev.vars is gitignored — put a throwaway key in it, never your production one.
Costs
Free tier, comfortably: Workers free = 100k requests/day, D1 free = 5M row reads / 100k row writes per day, Workers Assets = free. A personal todo list uses a rounding error of these budgets. No paid plan needed.
Security model
One shared secret (
API_KEY): your web-app login and your agents' bearer token — constant-time-compared (SHA-256 digests) on every/api/*and/mcprequestThe key lives only in Cloudflare's secret store (and wherever you save it); it is not editable in-app, only rotatable via the CLI
HTTPS everywhere (workers.dev), CORS on
/mcpfor browser-based MCP clientsNo user accounts, no PII, no telemetry; soft deletes only — your history is yours
The repo contains no secrets and no account-specific config: keys live in Cloudflare's secret store, and
wrangler.jsonc(your deployment ids) is generated from the trackedwrangler.template.jsoncand gitignored
Docs
docs/api-surface.md— REST endpoints + all 14 MCP tools and ref conventionsdocs/schema.md— D1 schema and invariantsdocs/CODE_INDEX.md— repository map.pi/— agent rules, constraints, and architecture decision records
License
MIT — see LICENSE.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kingfisherfox/barrydo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server