Nov 2024 — Jun 2025
Doulevo
An AI-powered résumé builder on Next.js and the Vercel AI SDK. The trick was a custom templating system that let cheap, low-powered models produce genuinely beautiful résumés — the same models that choke if you ask them to write HTML directly. My first real LLM product.
- Next.js
- Vercel AI SDK
- TypeScript
- Supabase
- Stripe
What it was
Doulevo was an AI-powered résumé builder: feed it your background and it would generate a polished, professionally designed résumé. It was built on Next.js and Vercel’s AI SDK, with Supabase behind it and Stripe for billing. It was my first real product built on top of an LLM.
The name comes from δουλεύω — Greek for “I work” — which felt about right for a tool whose whole job was helping you land your next one.
The interesting part
The obvious way to build this — ask the model to write the résumé’s HTML and CSS — falls apart on cheap models. Give a low-powered model a blank canvas and it chokes: not enough context or reasoning to produce something that isn’t broken or ugly. But I wanted the cheap models — they were what kept the service affordable to run in the first place.
So I never let the model near the layout. Instead, I described the entire résumé — typography, color scheme, multi-column layout, and every kind of section (experience, education, skills, projects, and so on) — as one big, deeply nested Zod schema. The model’s only job was to fill that schema in; its field descriptions doubled as the instructions, so the whole interaction was “fill in the blanks.” Structured data came out, never markup.
Rendering was a custom suite of React components that consumed that structured output and turned it into an actual, good-looking résumé — real color schemes, interesting layouts, considered typography — all the design work the model could never be trusted with. And because that schema was the single source of truth, the AI wasn’t the only way in: users could customize everything by hand through an editor, and a live preview of the résumé sat right alongside the chat, updating in place as the agent made its edits.
The upshot: a small, cheap model producing résumés that looked like a designer had made them.
Why it’s gone
I wired up Stripe and ran a free tier so people could try it before paying — and that turned out to be the mistake. Even limited free-tier access to the AI added up, and as usage grew the inference bill grew faster than the conversions. It was costing me real money to give the product away, so I eventually took it down.
What it taught me
Doulevo was my first foray into building on an LLM, and nearly every constraint I ran into — context limits, coaxing reliable structure out of a model, keeping inference cheap — turned out to be foundational. It’s the direct ancestor of the far more sophisticated LLM work I do now at Farsight AI, where taming model output and wrangling complex AI state is the day job.