2026-03-19 — Prakta
What shipped today
Production deployment is live at www.prakta.io. The bulk of today’s session was spent polishing the last mile: branded email templates, admin features, blog integration, and getting the production environment running.
Production deployment. The main blocker was a Vercel project mismatch — the domain www.prakta.io was assigned to a prakta project while env vars and code had been deployed to a separate web project (created when linking from the web/ subdirectory). Fixed by relinking to the correct project, pushing all 10 environment variables (Supabase, Anthropic, Stripe, Brevo, App URL), and redeploying from the monorepo root. The site now returns 200.
Admin, blog, and polish. Earlier sessions today shipped the admin nav section (#109), blog pages pulling from paulwelty.com RSS filtered by “prakta” category (#98), self-assessment settings with config lever mapping (#103), task prereqs with AI guessing (#94, #95), and various security hardening (Stripe idempotency #87, webhook error handling #88, input validation #85). The logo (#91) uses a combined P symbol + “Prakta” wordmark in the warm editorial palette.
Supabase auth config. Updated site URL to https://www.prakta.io and set explicit redirect URLs (no wildcards — Supabase rejects them in prod). Six branded email templates (confirm, reset, magic link, invite, change email, reauthentication) were generated and opened in BBEdit for manual paste into the Supabase dashboard.
Completed
- #111 — Fix production 500 error on www.prakta.io
- #109 — Create admin nav section
- #103 — Self-assessment settings questions
- #98 — Implement blog page like Authexis
- #97 — Remove blog link from footer until content exists
- #96 — Build list of use cases
- #95 — Prereqs and hard-to-start guess on task review
- #94 — Add prereqs to task parsing
- #91 — Create logo
- #88 — Error handling for Stripe webhook
- #87 — Idempotency key for Stripe checkout
- #85 — Validate task source parameter
- #84 — Track deliberate minutes for EOD
- #83 — Fix hardcoded empty string origin in Stripe routes
Release progress
March 2026: 0 open / 0 closed (milestone exists but no issues assigned)
Carry-over
- #101 — Branded email templates: 6 templates in BBEdit, waiting for Paul to paste into Supabase dashboard. Cannot be automated.
- Orphan
webVercel project: should be deleted from Vercel dashboard to avoid confusion. - Google OAuth: needs manual Google Cloud Console setup + Supabase config.
- Stripe products/prices: need to be created in Stripe dashboard and price IDs updated.
Risks
- No test coverage. 48+ issues shipped with zero tests. First real user will be the integration test.
- Stripe price IDs likely placeholders. STRIPE_PRICE_MONTHLY and STRIPE_PRICE_ANNUAL env vars are set but may point to test/placeholder products.
- Rate limiter is in-memory (#86). Won’t work correctly on Vercel serverless — each invocation gets a fresh instance. Backlogged.
Flags and watch-outs
- Deploy from monorepo root, not
web/. The Vercel project root directory is set toweb/in project settings. web/.vercelremoved. Only/Users/paul/Projects/prakta/.vercelshould exist, pointing tosynaxis/prakta.- buttonVariants server/client split — shadcn
add --overwriteclobbers it. Restorebutton-variants.tsafter any shadcn update. - Port 3006 for local dev, always.
Next session
- Have Paul paste email templates into Supabase dashboard (#101)
- Delete orphan
webproject from Vercel dashboard - Test the full production flow: signup → onboarding → tasks → sequencing → wrap-up
- Configure Google OAuth (Google Cloud Console + Supabase)
- Create Stripe products/prices and update env vars
- Start writing tests — at minimum, API route smoke tests
- Check open issues (#86 rate limiter, #108 BCC emails) for prioritization
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
The last mile is all the miles
Building the product is the fun part. Deploying it, configuring auth, pasting email templates into dashboards, rotating leaked API keys — that's where the work actually lives.
The day we shipped two products and the agents got bored
112 issues across 12 projects. Two new products went from nothing to code-complete MVP in single sessions. And the most interesting signal wasn't the speed — it was the scout that came back empty-handed.
The org chart your agents need
The AI community is reinventing organizational design from scratch — badly. Agencies figured this out decades ago. Competencies, not clients. Briefs, not prompts. Lateral communication, not hub-and-spoke. The answers are already there.