How I shipped Lander's MVP in three weeks (build log)
What it took to go from `cdk init` to live customer deploys: the AWS architecture, the cost model that delivered 70% margins, and the Claude builder pivot that wasted a week.I'm a high-school senior in Venice, CA. Three weeks ago I started building Lander, a Vercel-style deploy platform that runs on real per-customer AWS Fargate. Today there are paying customers on the platform. This is the build log.
Week 1: AWS plumbing
I spent the first week on the boring infrastructure: cdk init, then a stack per customer with VPC, Fargate task, ALB target group, ACM cert, and a Route53 record. The trick was getting the per-customer ALB to share an ALB pool. Provisioning a fresh ALB per customer takes 4-6 minutes and adds $18/mo of fixed cost. With pooled ALBs (10 envs per ALB), provisioning drops to under 60 seconds and the amortized cost is $2.50/site.
The biggest unforced error: I built a separate MCP server for the Claude integration. Two days of work that I deleted in week 3.
Week 2: control plane + auth
Next.js 16 + Auth.js + Drizzle on Neon. Auth.js v5 has decent Google OAuth but the docs are sparse. Getting magic-link redirects to work right took a full afternoon.
The real grunt work was the deploy pipeline. CodeBuild clones the repo, runs docker build, pushes to ECR, then updates the Fargate task definition. Each step has its own failure mode. A typical Next.js deploy: 4-6 minutes, with the docker build dominating.
For static sites I added a fast-path: detect "no Dockerfile + has index.html" and ship to S3+CloudFront instead. ~$0.50/month per site vs $9/month for Fargate. 30x cost difference matters when 60% of sign-ups end up being static.
Week 3: the Claude pivot
Originally Lander had an MCP server. The thesis: dev opens Claude Desktop, types "deploy this," Claude calls Lander's MCP tools to provision and deploy.
It mostly worked. The problem: it was a bad product. Claude's MCP UX requires the user to find the MCP URL, paste it into a JSON config, restart their client, then remember to mention Lander by name in their prompt. Three points of friction for what should be one button.
I deleted the MCP code and replaced it with an in-app builder: two-pane chat + live preview, click any element on the preview to ask Claude to edit it. Sonnet 4.6 model. Code lands as a PR in the customer's GitHub repo so they own it.
This is the bet: AI-assisted deploys aren't a separate product, they're a feature of the deploy platform itself.
Cost model that hits 70% margin
The hard part of pricing Fargate-backed plans: each dynamic site costs ~$2.70/mo for a Fargate Spot task plus $2.50 for amortized ALB plus bandwidth. To hit 70% gross margin, the price per dynamic site has to be ~$15 minimum.
Lander's structure:
- Free: 3 static sites. $0. Cost is ~$1.50 per customer (CloudFront + S3). 0% margin (loss-leader).
- Hobby ($25): 1 dynamic + unlimited static + 50 GB bandwidth. Cost ~$11. 56% margin at typical usage.
- Pro ($75): 1 dynamic + 20 Claude turns + 300 GB. Cost ~$18 (Claude is $0.05/turn × 20 = $1). 76% margin.
- Team ($200): 2 dynamic + 75 turns + 1 TB + SSO. Cost ~$42. 79% margin.
What's next
Next two weeks:
- Multi-region Fargate (us-east-1, eu-west-1) on Team tier
- Preview deploys per-PR
- Postgres provisioning UI (currently env-var flag)
- Stripe metered billing for Claude turn overage
Today's MRR: $70. Goal by end of May: $1,000. The path is the deploy guides + comparison content + Show HN.
If you've shipped anything to AWS by hand and thought "this should be one button," try Lander. Free plan is permanent, no card required.