From Local Script to Multi-Tenant SaaS: The JobMiner Story
Every SaaS starts somewhere. JobMiner began as JobHuntingCRM — a local Flask app with SQLite that I built for my own job search. It worked so well that I decided to turn it into a proper multi-tenant SaaS platform.
The Evolution
Phase 1: JobHuntingCRM — A local Python Flask app with Gemini AI integration. It analyzed job descriptions against my profile, generated compatibility scores, and produced tailored resumes and cover letters. SQLite for data, Docker for portability.
Phase 2: JobMiner SaaS — Rewritten from scratch with TanStack Start, Supabase (PostgreSQL + RLS + Auth + Storage), and Gemini AI with 4-model fallback. Google OAuth for authentication, React PDF for document generation, and company intelligence scraping.
Architecture Decisions
- Row-Level Security — Supabase RLS policies ensure tenant isolation without application-level middleware
- AI Fallback Chain — If Gemini Pro fails, the system falls back to Gemini Flash, then to a cached response, ensuring 99.9% uptime for AI features
- Automated QA — Full Robot Framework Browser test suite covering every critical flow
The lesson: start simple, validate the need, then invest in the architecture. JobHuntingCRM proved the concept in days; JobMiner took weeks to build properly.
Built with: TanStack Start, Supabase, PostgreSQL, Gemini API, React PDF, Vercel
Erick Guedes
AI · SaaS · Sales Engineering · Solutions Consulting. Turning complex processes into scalable solutions.