JK
>CARGANDO // CARGANDO
INICIALIZANDO VISTA
Creador de currículums enfocado en la privacidad que produce documentos LaTeX optimizados para ATS con plantillas modulares y compilación en tiempo real.
Las herramientas convencionales almacenan datos sensibles en la nube y generan PDFs mal formateados que fallan en los filtros ATS. Esta solución garantiza privacidad local y salida LaTeX de precisión milimétrica.
| Tecnología | Versión | Propósito | Por qué se eligió |
|---|---|---|---|
| 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 |
| Método | Ruta | Propósito |
|---|---|---|
| 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 |
| Columna | Tipo | Notas |
|---|---|---|
| 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.
Decisión: All resume data, editing, preview, and LaTeX generation happen in the browser
Motivo: Privacy-first: all data stays in browser with localStorage persistence
Beneficios: Zero server costs for editing, user privacy, offline-capable editing
Compensaciones: No cloud sync, no cross-device access, localStorage size limits
Decisión: Use Tectonic instead of pdflatex or other TeX distributions
Motivo: Self-contained binary, no TeX distribution needed on the server
Beneficios: Simple Docker image, reproducible builds
Compensaciones: Slower than pdflatex for complex documents
Decisión: Use Zustand for state management with built-in persist middleware
Motivo: Minimal boilerplate, built-in localStorage persistence
Beneficios: Simple state management, easy persistence
Compensaciones: Less ecosystem than Redux
Decisión: Use WebSocket instead of HTTP polling for PDF compilation
Motivo: Real-time progress feedback improves UX during 5-60s compilation
Beneficios: User sees compilation stages (validating → writing → compiling → done)
Compensaciones: More complex than HTTP polling
Decisión: Each template implements a Template interface with config, Preview, and generateLatex
Motivo: Multiple visual styles with shared data model
Beneficios: Extensible, each template self-contained, lazy-loadable via import.meta.glob
Compensaciones: Code duplication across templates
Decisión: Use SQLite for aggregate visit/download counters only
Motivo: Zero-config embedded DB adequate for 2 counter rows
Beneficios: No external database dependency, simple deployment
Compensaciones: Write contention under concurrent access