# Byggde en databasdriven generator för CV, referenser, portfolio och personliga brev i Python — 41 moduler, 10 580 rader — som renderar sex utdataformat från en SQLite‑källa med 23 tabeller, sammanställd av en idempotent pipeline i 19 steg.

juli 2026

**Situation.** Ett CV, ett referensblad, en portfölj och ett personligt brev är samma fakta ordnade på fyra sätt, och att hålla dem som fyra dokument innebär att varje rättelse görs fyra gånger och till slut inte görs alls. Tre språk multiplicerar det med tre. Problemet är inte att ett dokument är fel; det är att två dokument säger emot varandra och att ingenting säger vilket som är aktuellt.

**Uppgift.** En enda faktakälla måste producera varje dokument, på varje språk och i varje format, där ordningen bestäms av kod snarare än av den som senast redigerade en fil.

**Handling.** Källan är en SQLite‑databas med tjugotre tabeller — resultat, titlar, företag, regioner, kategorier, tjänster, profiler, referenser, sammanfattningar — som byggs upp av en pipeline i nitton steg som går från en tom fil till en komplett databas med ett enda kommando. Stegen är ordnade och vart och ett är skrivet så att det kan upprepas säkert, så att pipelinen kan köras mot en befintlig databas utan att någon rad dubbleras. Fyrtioen Python‑moduler på sammanlagt 10 580 rader renderar sex utdataformat från den: HTML, PDF i två varianter, ren text, Markdown och JSON, genom sex Jinja‑mallar och åtta stilmallar. Beroendena vid körning hölls till exakt två, en mallmotor och en PDF‑renderare, med argumentet att en dokumentgenerator som inte går att installera om fem år inte har bevarat någonting. Målgruppsanpassning är ett fullvärdigt begrepp i systemet snarare än en manuell redigering: en profil väljer vilka resultat som visas och i vilken ordning, så ett dokument riktat till en viss sorts läsare är en databasfråga snarare än en kopia.

**Resultat.** Sex format, tre språk och fem teman kommer ur en enda databas, och en rättad mening rättas en gång. Kostnaden är att systemet nu är det enda sättet att ta fram ett dokument — det finns inte längre någon fil att öppna och redigera i all hast, och att lägga till ett språk innebär att lägga till det överallt innan något alls går att bygga.

---

- Roll: Python‑ingenjör
- Kategorier: [Lösningsarkitektur](https://software.engineer.company/sv/categories/solution-architecture/), [Backendutveckling](https://software.engineer.company/sv/categories/backend/), [Fullstackutveckling](https://software.engineer.company/sv/categories/full-stack/), [Databaser](https://software.engineer.company/sv/categories/databases/), [SQL](https://software.engineer.company/sv/categories/sql/), [Automatisering och CI/CD](https://software.engineer.company/sv/categories/automation/), [Python](https://software.engineer.company/sv/categories/python/), [Internationalisering](https://software.engineer.company/sv/categories/i18n/)
- Tjänster: [Plattforms- och lösningsarkitektur](https://software.engineer.company/sv/services/platform-architecture/), [Backend- och API‑utveckling](https://software.engineer.company/sv/services/backend-development/), [Fullstackutveckling av produkter](https://software.engineer.company/sv/services/full-stack-development/), [Internationalisering och lokalisering](https://software.engineer.company/sv/services/i18n-localization/), [Databasdesign och datamodellering](https://software.engineer.company/sv/services/database-design/)

<https://software.engineer.company/sv/portfolio/built-a-database-driven-cv-and-portfolio-generator-144/>
