Mujammil
Taking new workStart a build

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
Architecture
streamsrenders liveon failureexportwebhookFlask factoryapp + provider layerReact 19chat + editorSSE streamtoken by tokenAWS BedrockprimaryOpenAIfallbackPlaywrightserver-side PDFPostgreSQLdocuments, usersRazorpaysigned webhooks

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.