Blog Article

How to Deploy a Full SaaS in One Day Using CLIs and Claude Code

A CLI-first workflow for taking a SaaS from empty repo to live Stripe payments with GitHub, Convex, Vercel, Stripe, and Claude Code.

One day. That's how long it took yesterday to go from an empty GitHub repo to a live invoicing app with Google sign-in and working Stripe payments.

This isn't a prototype. This is a real production deployment with OAuth, a Convex database, Vercel hosting, and a payment processor all wired together. And I did almost none of it by hand.

Watch the full 45-minute walkthrough, then read the breakdown below:

Why CLI-First Deployment Changes Everything

A few years ago, deploying a full-stack app meant jumping between browser tabs. Create a repo in GitHub's UI. Provision a database in a dashboard. Click into a settings panel to add environment variables. Sign in to five different OAuth flows.

That whole workflow is dead. Every major platform now ships a command-line tool:

  • GitHub CLI - repos, commits, and push
  • Convex CLI - database init and production deploys
  • Vercel CLI - deploys, env vars, log streaming
  • Stripe CLI - account auth and key propagation (brand new, shipped two days before filming)

When each CLI is authenticated on your machine, your LLM agent can use all of them. You describe the outcome. The agent executes the commands. That's the entire shift, and it changes everything about how fast you can ship.

Step 1: Create the GitHub Repo

This is the only step I did in a browser, and you don't even need to. Log into GitHub, create a new repo, make it private (unless it's open source), and grab the remote URL.

Then paste the URL into Claude Code and say "connect our project to this repo and push main." If you've never used the GitHub CLI, don't be intimidated. Tell your agent you'd like to configure it, and it will walk you through the OAuth flow step by step.

Your agent is an executive assistant for the terminal. Treat it like one.

Step 2: Initialize Convex Straight to Production

For a first build, there's no reason to maintain two databases. Staging matters when you have paying customers you can't afford to break. For a demo or MVP, one production database is fine.

I said: "Initialize Convex for me. We're going straight to production."

Claude popped a browser OAuth flow, I logged into Convex, and the database schema started generating in parallel with everything else. Zero dashboard clicks.

Step 3: Deploy to Vercel and Debug via Logs

First deploy returned a 500 at runtime. Old me would have spent 45 minutes digging through logs.

Here's what I actually did:

  1. Opened Vercel's log page
  2. Screenshotted the error
  3. Dragged the screenshot into the terminal
  4. Asked Claude what was happening

"Missing environmental variables." Then: "Use the Vercel CLI to add all the env vars you need. Hands off as possible."

Claude ran vercel env add for every missing variable and redeployed. Done in under two minutes.

Gotcha to know: Vercel's built-in Convex integration silently grabbed one of my other databases on the first deploy. Always verify your env vars post-deploy.

Step 4: Wire Up Google OAuth Through Convex

I wanted Google sign-in instead of email/password. Normally this means bouncing between Google Cloud Console and your backend, pasting client IDs and redirect URIs.

Instead: I went to console.cloud.google.com, started creating the OAuth client ID, and screenshotted the form. Dragged it into the terminal. Claude told me exactly what to paste into every field. Within a minute the keys were synced into Convex.

Claude also flagged: "You just pasted a live secret in chat. Rotate it." Good housekeeping by default.

Step 5: Connect Stripe With the New CLI

This one surprised me. Stripe just shipped an official CLI two days before I filmed. I pasted the docs link into my prompt, which is a habit worth stealing: when you're using a tool that shipped recently, don't assume your LLM knows the latest syntax. Feed it the docs.

Claude pulled the curl install command straight from Stripe's GitHub, ran the browser OAuth flow, verified the keys had the right permissions for invoice creation, and wired them into Convex and Vercel. I tested a payment with 4242 4242 4242 4242.

Voila. Charged from Clear Mud LLC. The invoice showed up in Stripe. From zero to working payments: about 15 minutes.

Why This Matters: One Day From Idea to Paying Customer

I started this build as a throwaway demo. Halfway through, I realized the invoicing app was better than how I currently send invoices to my own clients. So I'm keeping it.

That's the real shift. The friction to ship is basically zero now. You don't need a product idea and a market analysis. You need a mildly annoying problem in your own workflow, a free afternoon, and an LLM that can drive your terminal.

If five to ten other people have the same problem, you have a product. It's not a hundred thousand dollars a month. But it's somewhere to start.

Subscribe and Build Along

If you want more practical, CLI-first tutorials like this one, subscribe to the Clearmud newsletter. I ship one new build every week, with the exact prompts and commands I used.

And if you want to see the full walkthrough with live debugging and all the mid-build decisions, watch the video here.

Clear mud, and clarity matters.

- Marcelo, Clearmud

🎥 Full video: https://youtube.com/watch?v=m1GmK4NG5ww