YazbirDilekçe
A Turkish petition writer that turns a few plain sentences into a correctly formatted official letter — Claude writes the prose, and a Rails API enforces the bureaucratic form Turkish offices expect.
Visit www.yazbirdilekce.com- Role
- Solo — product, design, frontend, backend, ops
- Frontend
- Nuxt 4 · Vue 3 · TypeScript · Bulma on Vercel
- Backend
- Rails 8 API-only · PostgreSQL · Puma
- AI
- Claude Haiku 4.5 with strict JSON output
- Export
- PDF (pdfmake, embedded fonts) · Word (docx)
- Deploy
- Kamal 2 to DigitalOcean · managed Postgres
The problem
Turkish officialdom expects a very specific register and layout for a "resmî dilekçe" — a formal petition — and almost nobody is taught how to write one. People know what they want to say; they don't know how to say it so an institution will take it seriously.
YazbirDilekçe closes that gap. You pick a category — municipal, rent, resignation, consumer complaint, school, objection — describe your situation in everyday Turkish, and get back a respectful, correctly structured petition you can edit, copy, or download.
Claude writes the prose; the server owns the form
The language generation runs on Claude Haiku 4.5, but the model deliberately does not get the last word on structure. It returns strict JSON — two to four body paragraphs plus a closing line — and is told never to invent facts, dates, names or addresses, and never to rename the institution the petition is addressed to.
Everything that has a single correct form, the server computes deterministically rather than trusting the model: the date, the addressee block, and the closing salutation (the petition picks the right honorific depending on whether it's addressed to a government body or a private company). The JSON parser is intentionally forgiving — it copes with code fences and stray prose and falls back gracefully — so a slightly off response still produces a usable letter.
Getting Turkish right
Turkish has rules that trip up naive code. Uppercasing is locale-sensitive — a lowercase "i" must become "İ", not "I" — so the addressee line is upper-cased with Turkic casing rather than the default. The address block also needs the correct dative suffix grammatically attached to the institution name, which the server adds based on how the name ends.
The app also tells the user what's missing. When the description lacks a fact the petition needs — a street name, a date, an order number — the model flags it, and a short checklist of documents to attach is suggested per category. The petition is only as good as the facts behind it, and the tool nudges the user toward a complete one.
Export and the rest of the stack
The finished petition exports as a print-ready PDF (built with pdfmake, with the display fonts embedded so it looks identical everywhere) or as a Word document (built with docx, referencing system fonts so Turkish characters always render). Anonymous users keep their history in the browser; signed-in users get it stored server-side.
Under the hood: a Rails 8 API on PostgreSQL, JWT auth, IP-based rate limiting, and a per-user monthly quota plus a hard daily spend ceiling on the AI. Every generation — anonymous or not, success or failure — is logged with a hashed IP (never the raw address), token counts and latency, so cost and abuse can be reviewed without storing anyone's personal data. It ships to DigitalOcean with Kamal 2.