Skip to content
Renan Spatin
Projects

2024

Agapeon

agapeon.io

SaaS product with web, mobile app, custom .NET backend, Stripe billing, and applied AI. Built and operated solo, from zero to production.

Role
Technical co-founder · Solo engineer
Year
2024
Stack
React 19ViteTypeScriptTailwind CSSSupabaseCapacitor.NET 9 / C#ASP.NET CoreEF CorePostgreSQLStripeResend
agapeon.io
Agapeon — agapeon.io

§ 02 highlights

  1. 01ASP.NET Core 9 + EF Core + PostgreSQL + Serilog on the backend; React 19 + Vite + Supabase SDK on the web; hybrid mobile via Capacitor.
  2. 02Stripe for recurring billing, Resend for transactional email, and Google GenAI for in-product AI features.
  3. 03Infra on Heroku (API) + Cloudflare Pages (web), Docker Compose locally — continuous delivery without a DevOps team.

§ 03 case

01

Context

Agapeon is a SaaS product where I'm technical co-founder and solo engineer. From day 0 to production — zero to paying customer — without a team. The most important day-0 decision was choosing a stack that a senior engineer could sustain end-to-end, including web, mobile, backend, payments, AI integrations, and infra. Avoid hype, avoid unnecessary sophistication, prefer technologies I already know deeply in production.

02

End-to-end architecture

ASP.NET Core 9 backend with Entity Framework Core on PostgreSQL, in Clean Architecture. Serilog for structured logs, FluentValidation for input contracts, BCrypt for password hashing, JWT + Supabase Auth as a second layer. React 19 frontend with Vite and Tailwind, TanStack Query for data cache, Zustand for local state. Mobile app via Capacitor, sharing 100% of the TypeScript code with the web. Everything in a single repository with Docker Compose locally, one source of truth per domain.

03

Payments and revenue

Stripe.net integration for recurring billing, including trials, upgrades/downgrades, webhook reconciliation with idempotency, and a subscription state machine that doesn't rely on Stripe as the source of truth. Webhook events are stored, replicated locally, and reconciled asynchronously — the app keeps working even during Stripe degradation. The billing layer is isolated from the product domain; swapping providers (e.g., MercadoPago for LatAm) would be contained to the adapter.

04

AI in the product, not in the pitch

Integration with Google GenAI for specific features inside the product flow — not a generic chatbot. The model API is consumed via a service layer with rate limiting, semantic-content caching, and a manual-mode fallback when the provider degrades. Costs monitored per user. The challenge wasn't making the call — it was designing exactly where the model adds value in the flow without becoming a gadget, and how to measure whether it's making a difference.

05

Shipping and solo operation

Backend deployed on Heroku (.NET dyno via buildpack), frontend on Cloudflare Pages with Vite build, managed PostgreSQL. The entire CI/CD pipeline in a single config. Transactional email via Resend (do-not-reply + critical notifications). The product is live today with 65+ commits signed solo, operating without a DevOps team — the stack choice was validated by surviving day-to-day without incidents forcing rollback.