Streams suggestions token by token and renders PDFs on the server, because the browser could not be trusted with either.
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.
Two things were genuinely hard, and neither was the AI call. Client-side PDF generation produced a different document in every browser, so the file a recruiter opened was not the file the candidate approved. And generating a whole resume section through an LLM takes several seconds, which reads as a broken app no matter how good the output is.
Playwright drives a headless browser on the backend, so every export is identical regardless of what the user is running. Document rendering is not something to delegate to a client you do not control.
The chat streams the model's response token by token, with Nginx tuned to stop buffering it. Total generation time did not change; the experience of it changed entirely.
AWS Bedrock and OpenAI sit behind a single provider abstraction, so a model deprecation or an outage at either becomes a config change rather than an incident.
Strict CORS, rate limiting, and webhook signature validation on the Razorpay integration — all checked before deploy rather than after the first incident.
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.
Tell us what you are running and what hurts. One of the two people who built this answers, within one working day.
Start a project