JK
>ŁADOWANIE // ŁADOWANIE
INICJALIZACJA WIDOKU
Narzędzie do tworzenia CV zorientowane na prywatność, generujące zoptymalizowane pod kątem ATS pliki LaTeX.
Tradycyjne generatory przechowują poufne dane w chmurze i generują pliki PDF odrzucane przez filtry ATS.
| Technologia | Wersja | Cel | Dlaczego wybrano |
|---|---|---|---|
| React | 19 | UI framework | Latest concurrent features, lazy loading |
| TypeScript | ~6.0 | Type safety | Prevents runtime errors on complex resume data model |
| Vite | 8.x | Build tool & dev server | Fast HMR, native ESM, code splitting via glob imports |
| Tailwind CSS | v4 | Utility-first styling | Rapid UI development, consistent design tokens |
| Zustand | 5.x | State management | Minimal boilerplate, built-in persist middleware |
| @dnd-kit | core 6, sortable 10 | Drag-and-drop | Accessible, performant sortable lists |
| Go | 1.25+ | Backend runtime | Fast startup, small binaries, excellent concurrency |
| Gin | 1.12 | HTTP framework | High performance, middleware ecosystem |
| Tectonic | 0.16.9 | LaTeX→PDF compiler | Self-contained, no TeX distribution needed |
| Docker | — | Containerization | Reproducible builds, production parity |
| SQLite | modernc.org/sqlite 1.54 | Stats persistence | No CGO dependency, cross-compilation |
| Sentry | 10.x | Error tracking & monitoring | Session replay, performance monitoring, feedback widget |
| Metoda | Trasa | Cel |
|---|---|---|
| POST | /api/compile | Compile LaTeX to PDF (HTTP) |
| GET | /api/compile/ws | WebSocket compile with progress streaming |
| POST | /api/stats/visit | Record page visit |
| POST | /api/stats/download | Record PDF download |
| GET | /api/stats | Get aggregate stats |
| GET | /api/health | Health check (Tectonic + DB status) |
| GET | /metrics | Prometheus metrics |
| Kolumna | Typ | Uwagi |
|---|---|---|
| keyPK | TEXT | Counter name: 'visits' or 'downloads' |
| value | INTEGER | Counter value, default 0 |
Single table with 2 key-value rows. WAL mode enabled. Used only for aggregate visit/download statistics — no user data stored.
No relationships. Single table with 2 counter rows.
Decyzja: All resume data, editing, preview, and LaTeX generation happen in the browser
Dlaczego: Privacy-first: all data stays in browser with localStorage persistence
Korzyści: Zero server costs for editing, user privacy, offline-capable editing
Kompromisy: No cloud sync, no cross-device access, localStorage size limits
Decyzja: Use Tectonic instead of pdflatex or other TeX distributions
Dlaczego: Self-contained binary, no TeX distribution needed on the server
Korzyści: Simple Docker image, reproducible builds
Kompromisy: Slower than pdflatex for complex documents
Decyzja: Use Zustand for state management with built-in persist middleware
Dlaczego: Minimal boilerplate, built-in localStorage persistence
Korzyści: Simple state management, easy persistence
Kompromisy: Less ecosystem than Redux
Decyzja: Use WebSocket instead of HTTP polling for PDF compilation
Dlaczego: Real-time progress feedback improves UX during 5-60s compilation
Korzyści: User sees compilation stages (validating → writing → compiling → done)
Kompromisy: More complex than HTTP polling
Decyzja: Each template implements a Template interface with config, Preview, and generateLatex
Dlaczego: Multiple visual styles with shared data model
Korzyści: Extensible, each template self-contained, lazy-loadable via import.meta.glob
Kompromisy: Code duplication across templates
Decyzja: Use SQLite for aggregate visit/download counters only
Dlaczego: Zero-config embedded DB adequate for 2 counter rows
Korzyści: No external database dependency, simple deployment
Kompromisy: Write contention under concurrent access