You do not need to be technical. We will create three free accounts, copy a few values, and check each part together. Start on Vercel Hobby and Supabase Free, with no custom domain required.
Free tiers have usage and eligibility limits. You can upgrade later; nothing in this guide requires a paid plan to get started.
Your starter stack$0 to start
GitHubYour copy of the codeFree
SupabaseAccounts, data & filesFree
VercelThe website & MCP endpointHobby
30–45minutes3accounts8checkpoints
First, choose your comfort level
You can do this with a guide beside you
Both paths create the same private Caboodle. The guided path is easiest: Codex checks the project, explains each screen in plain language, and waits at the moments where you need to sign in or approve a change.
Recommended
Use the setup skill
Best if words like migration, OAuth, or environment variable are new to you.
You can switch to the guided skill at any point. It will inspect what is already complete and continue from there.
Before you begin
Gather three free accounts
Open these in separate tabs. Use accounts you control, because each service will hold one part of your Caboodle.
GitHub — keeps your own copy of the Caboodle code.
Supabase — provides sign-in, the database, and private file storage.
Vercel — runs the website and gives it a secure web address.
What is an environment variable? Just a named setting. Vercel shows a box for the name and a box for its value. You will copy the names exactly; you do not need to write code.
1
About 2 minutes
Make your own copy of Caboodle
On GitHub, a copy is called a fork. It belongs to your account, so future changes are under your control.
Name it Caboodle. Choose the Free plan and a region near you.
Create a strong database password and save it in your password manager. You need it once in the next step. Do not place this password in Vercel.
Choose Create new project and wait until the project dashboard opens.
Open Settings → API Keys. Copy the Project URL and the Publishable key that begins with sb_publishable_.
Project URLhttps://your-project-ref.supabase.co
Publishable keysb_publishable_... — safe for this web app
Project referenceThe short text between https:// and .supabase.co
Database passwordKeep private; use only while preparing the database
Stop if you see “secret” or “service_role.” Caboodle does not need either key. The low-privilege publishable key is the correct one.
3
About 5–10 minutes
Prepare the database
Caboodle includes a small, ordered set of database setup files called migrations. Applying them creates the tables, roles, storage bucket, and security rules. The setup skill can do this for you and show you exactly what will change before it runs anything.
Easiest path: open the fork on your computer in Codex, load the setup skill, and say “Continue from the database step. My Supabase project is ready.” Codex will use the included files in order and pause before changing the remote database.
Show the manual command-line path
Open a terminal in your fork. These commands install the project’s tools, sign you in to Supabase, connect this folder to your project, and apply the included migrations.
cd production
npm install
npx supabase login
npx supabase link --project-ref YOUR_PROJECT_REF
npx supabase db push
Replace YOUR_PROJECT_REF with the short reference you saved. Your browser may open for Supabase sign-in. When asked for the database password, paste the one you saved. A successful final message says the linked project is up to date.
What this creates: private package tables, sign-in profiles, role-based access rules, audit records, full-text search, an OAuth audience hook, and a private caboodle-source storage bucket. It does not add sample users or publish anything.
4
About 8 minutes
Put your Caboodle on Vercel
Vercel turns the production folder into a secure website. Its free address is enough; a custom domain is optional.
But I do not know my Vercel address yet. That is normal. Pick the project name first—for example, my-caboodle—and Vercel normally offers https://my-caboodle.vercel.app. If the final address differs, update the two URL values after the first deploy and choose Redeploy.
Apply the variables to Production, Preview, and Development for the simplest setup.
Choose Deploy. When the celebration screen appears, open the provided .vercel.app address.
If the address differs from the one you entered, go to Project Settings → Environment Variables, correct NEXT_PUBLIC_APP_URL and MCP_RESOURCE_URI, then redeploy.
Skip these for now:RESEND_API_KEY and CABOODLE_EMAIL_FROM. They are only for optional branded invitation emails. Supabase still handles your account confirmation email on its own.
5
About 8 minutes
Tell Supabase where Caboodle lives
These settings make account confirmation and secure agent sign-in return to your website instead of somewhere else. Use the same Vercel address everywhere, with https:// and no trailing slash.
A. Website sign-in
In Supabase, open Authentication → URL Configuration.
Set Site URL to https://YOUR-VERCEL-NAME.vercel.app.
Add both https://YOUR-VERCEL-NAME.vercel.app/auth/callback and https://YOUR-VERCEL-NAME.vercel.app/oauth/consent to Redirect URLs, then save.
B. Modern signing keys
Open Project Settings → JWT Keys. Confirm the active signing key is asymmetric, such as ES256 or RS256.
If the page only shows a legacy shared secret, use Supabase’s Migrate JWT secret flow, then rotate to the new asymmetric standby key. New projects may already be set up correctly.
C. Agent sign-in (OAuth)
Open Authentication → OAuth Server and enable OAuth 2.1 server capabilities.
Set Authorization Path to /oauth/consent.
Enable Dynamic Client Registration so compatible MCP clients can connect. Keep user approval required.
Open Authentication → Hooks. For Custom Access Token, choose the Postgres function public.custom_access_token_hook and enable it.
D. Bind tokens to your Caboodle
In Supabase, open SQL Editor, choose New query, paste this, replace the address, and choose Run:
update public.oauth_resource_config
set resource_uri = 'https://YOUR-VERCEL-NAME.vercel.app/mcp'
where singleton;
A success message may say “Success. No rows returned.” That is expected for an update command.
6
About 3 minutes
Test the two important doors
First test the human door, then the agent door. If both open, the hard part is finished.
Open https://YOUR-VERCEL-NAME.vercel.app/signin, choose Create account, and use your email plus a password of at least eight characters.
Open Supabase’s confirmation email. The link should return to your Caboodle dashboard.
Open https://YOUR-VERCEL-NAME.vercel.app/.well-known/oauth-protected-resource/mcp. A small page of structured text should appear and include your /mcp address.
In Supabase, open Table Editor. You should see tables such as profiles, workspaces, and packages. You do not need to edit them.
You are live. Your Caboodle is now a real, private web app backed by your own Supabase project. GitHub holds the code, and future changes to your fork can deploy automatically through Vercel.
7
The payoff
Connect Codex or Claude Code
Your MCP address is always your Vercel address plus /mcp. Adding it to an agent should open a browser so you can sign in and approve access.
claude mcp add --transport http caboodle https://YOUR-VERCEL-NAME.vercel.app/mcp
After connection, ask the agent to search Caboodle or create a private package. Caboodle checks your account and role again on every operation, so sharing and revocation take effect without giving agents a master database key.
0 of 8 checkpoints completeSaved only in this browser.
The simple mental model
What talks to what?
Think of Caboodle as a front desk, a locked records room, and a trusted caller.
Your agentAsks to search, use, or manage a package.
VercelRuns Caboodle’s site, API, and /mcp front door.
SupabaseVerifies the person, role, data, and storage access.
GitHub is the source copy. Vercel reads the production folder from your fork. A future commit can trigger a fresh deployment.
No master key in the app. Caboodle uses the publishable key plus each signed-in user’s token. Supabase’s Row Level Security makes the final decision.
If something does not look right
Most problems are one copied value
The Vercel deployment failed
Open the deployment, then its build log. Confirm the Root Directory is exactly production. If the log names a missing NEXT_PUBLIC_... value, add all five environment variables under Project Settings, then redeploy.
The confirmation email returns to localhost
In Supabase, change Authentication → URL Configuration → Site URL to your exact https://...vercel.app address. Add the exact /auth/callback redirect URL, save, then request a new confirmation email.
Sign-in works, but the dashboard shows a database error
The migrations probably did not finish. Run npx supabase link --project-ref YOUR_PROJECT_REF and then npx supabase db push again from the production folder. It is safe to rerun: completed migrations are skipped.
The agent says OAuth discovery or registration failed
Confirm Authentication → OAuth Server is enabled.
Confirm Dynamic Client Registration is enabled.
Confirm Authorization Path is exactly /oauth/consent.
Open the /.well-known/oauth-protected-resource/mcp test address again.
The agent signs in, then receives “invalid token”
Confirm the active JWT key is ES256 or RS256.
Confirm the Custom Access Token hook is enabled and points to public.custom_access_token_hook.
Confirm the SQL resource URI, Vercel MCP_RESOURCE_URI, and the agent’s MCP URL are the exact same HTTPS address ending in /mcp.
Disconnect and reconnect the agent after correcting the values so it receives a fresh token.
I changed a Vercel setting, but nothing changed
Environment variable changes apply only to new deployments. Open Vercel → Deployments, use the menu on the latest deployment, and choose Redeploy.
Keep it small and free
What “$0 to start” means
The included architecture fits a personal or hobby-sized Caboodle without a dedicated server. Current plan rules can change, so check the linked plan pages before relying on exact limits.
Vercel Hobby
A free plan intended for personal projects, with automatic HTTPS and Git deployments. Keep Caboodle in your personal account for the Hobby path.
A free project includes a small Postgres database, authentication, and file storage. Free projects may pause after inactivity; return to the dashboard to restore one.
Optional costs: a custom domain, heavier traffic, larger storage, guaranteed uptime, or branded invitation email delivery. None is required to learn Caboodle, use it yourself, or connect your own agent.
Ready when you are
Let the setup skill keep your place
It recognizes completed checkpoints, explains what each service is doing, protects private values, and will not run the database or deployment changes without showing you first.