2026-03-03 — Launch day
What shipped today
Eclectis went from a web app with no public face to a deployed, billable product at eclectis.io in a single session. The big push was M4 (Launch), which covered everything between “works locally” and “someone can sign up and pay.”
The landing page sets the tone — editorial intelligence aesthetic, dark navy with amber gold-foil accents, scroll-triggered reveals, dot-grid textures. Not a generic SaaS template. The page walks through the value prop (only see what matters), the three-step how-it-works, the four output surfaces (RSS, email briefings, podcast coming soon, read-later coming soon), differentiators, and pricing. Two tiers: Free ($0, BYOK) and Pro ($8/mo, we cover AI costs). Both CTAs route to signup.
Stripe billing is wired end-to-end. Checkout creates a subscription session, webhooks handle the full lifecycle (created, updated, canceled), and the Customer Portal lets Pro users manage their subscription. Feature gating is enforced both server-side and in the UI: free users get 10 feeds, 3 search terms, RSS output only. Email briefings are Pro-only with a clear upgrade prompt in settings. The webhook handler was hardened after QA — fail-safe defaults (unrecognized prices fall to free, not pro), DB error handling that returns 500 so Stripe retries, safe type extraction, and try/catch around all external API calls.
The session also landed four infrastructure issues via parallel grind agents: usage tracking for AI cost monitoring, PostHog analytics across all pages, Sentry error tracking with global error boundary, and SEO with OG image generation, structured data, sitemap, and robots.txt. The grind agents had isolation issues (shared working directory instead of proper worktrees) which required manual cherry-picking to untangle, but the work itself was solid.
Earlier in the session, the navigation was restructured based on product feedback — removed “Ideas” (Eclectis is about surfacing content, not generating ideas), reorganized into Reading/Sources/Publishing groups, and created a dedicated Publishing page for output management. The brand was moved from sidebar to header, and an optional right sidebar was added for future detail panels.
Completed
- #22 Landing page
- #23 Stripe billing (free + Pro tiers)
- #24 Usage tracking for Pro tier
- #25 PostHog analytics
- #26 Sentry error tracking
- #27 SEO + meta tags + OG images
Release progress
All four milestones are closed:
- M1: Foundation — 5/5
- M2: Scanning pipeline — 8/8
- M3: Web app — 9/9
- M4: Launch — 6/6
Total: 28 issues shipped across 4 milestones. No open milestones.
Carry-over
- Production env vars not yet configured:
SUPABASE_SERVICE_ROLE_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_PRO. The site is live but billing and webhook handlers won’t work until these are set. - Stripe webhook endpoint needs to be registered in the Stripe dashboard pointing to
https://www.eclectis.io/api/webhooks/stripe. - The billing migration (
20260303500001_add_stripe_billing_columns.sql) needs to be run against the production Supabase instance. - Sentry and PostHog env vars are optional but should be configured for production observability.
NEXT_PUBLIC_SITE_URLshould be verified ashttps://www.eclectis.ioin Vercel env vars.
Risks
- Grind agent isolation was fragile. Agents didn’t use proper worktrees and kept switching the main repo’s branch. Required manual cherry-picking to extract work. If using
/grindagain, need to ensure worktree isolation actually works or use a different parallelism strategy. - Sentry and PostHog packages were missing from the previous grind agents’ work — they created the config files but didn’t install the npm packages. Fixed by installing them in the Stripe billing PR. If there are other missing pieces from the grind, they’ll surface when those features are actually exercised.
- BYOK enforcement is UI-only. The
byokRequiredflag exists inplans.tsbut the engine doesn’t check it before running AI operations. A free user without an API key won’t crash, but they also won’t get scored content. This is a product gap, not a bug — the engine needs plan-aware gating.
Flags and watch-outs
- The Vercel project is named
eclectisunder thesynaxisorg. Domain iswww.eclectis.io. - The old “web” Vercel project was created during linking and may still exist — should clean up if so.
- The
web/.gitignorefile (Vercel-generated, contains.vercel) andtsconfig.tsbuildinfoare untracked. Should be committed.
Next session
- Production env vars — set Stripe keys, service role key, Sentry DSN, PostHog key in Vercel. Run the billing migration on production Supabase. Register Stripe webhook endpoint.
- Smoke test the full flow — sign up a test user, add feeds, trigger a scan, verify RSS output, attempt Pro upgrade via Stripe test mode.
- Create M5 — candidates: Google OAuth (#30), Passkey auth (#31), Admin area (#40), Engagement telemetry (#41), Expense tracking (#42), Icon design (#28). Prioritize based on what blocks real user adoption.
- Engine-side plan gating — add BYOK check in the engine so free users without an API key get a clear error rather than silent failure.
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.
Your process was built for a different speed
When work changes velocity, governance systems don't just fall behind. They become theater. And theater is worse than nothing—it gives you the feeling of control without any of the substance.
The difference between shipping and finishing
Shipping is mechanical. Finishing is a judgment call. And most organizations have quietly made it impossible to tell the difference.
Nothing is finished until you say it is
Continuous delivery removed the endings from work. That felt like progress. But without formal completion, you lose the ability to say what you actually accomplished — and more importantly, what you're done thinking about.