AI SaaS/ResumeBar/2026live
Resume Bar
An AI resume builder that streams its suggestions token by token and renders its PDFs on the server, because the browser could not be trusted with either.
RoleFull stack: architecture, AI pipeline, payments, securityTimeline3 months
- Type
- Public AI SaaS
- Built in
- 3 months
- AI providers
- Bedrock + OpenAI
- Pre-deploy audit
- 18 points
The provider abstraction is the whole point. Bedrock and OpenAI are interchangeable behind it, and PDF rendering was pulled off the client entirely, because a browser you do not control is not a rendering engine.
The brief
Job seekers spend their time fighting layout instead of writing content, and get rejected by applicant tracking systems without ever learning why. The product had to do both jobs: draft the content with a model, and produce a file that parses.
What was actually hard
Two things were genuinely hard, and neither was the AI call. First, client-side PDF generation was a lie. html2pdf.js produced a different document in every browser, so the file a recruiter opened was not the file the candidate approved. Second, generating a whole resume section through an LLM takes several seconds, which reads as a broken app no matter how good the output is.
Decisions
What I decided,
and why.
- 01
PDF rendering moved to the server, on a real browser
Playwright drives a headless browser on the backend, so every export is byte-identical regardless of what the user is running. Document rendering is not something to delegate to a client you do not control.
- 02
Server-Sent Events instead of a loading spinner
The chat streams the model's response token by token, with Nginx tuned to stop buffering it. The total generation time did not change; the experience of it did entirely. Perceived performance is performance.
- 03
Two AI providers behind one interface
AWS Bedrock and OpenAI sit behind a single provider abstraction. A model deprecation or an outage at either becomes a config change rather than an incident. That is the difference between a demo and a product people pay for.
- 04
An 18-point audit before it went near production
Strict CORS, rate limiting, and webhook signature validation on the Razorpay integration, all checked off before deploy rather than after the first incident.
Where it stands
Live and taking payments. Exports are identical across browsers, and the AI chat responds visibly within a second rather than after a multi-second wait.
Built with
- React 19
- Python · Flask
- AWS Bedrock
- OpenAI
- Playwright
- PostgreSQL
- Razorpay
- Tailwind
Need one of these,
under your name?
Most of what I build reaches the end client with somebody else's logo on it. If that is the arrangement you want, say so in the first message.