JK
Projekty
JK
>ŁADOWANIE // ŁADOWANIE
INICJALIZACJA WIDOKU
Zbudowane i zaprojektowane przezJK
JK
>ŁADOWANIE // PROJECT DETAILS
PARSING ARCHITECTURE, DIAGRAMS & API ENDPOINTS
Powrót do projektów
Demo na żywoZobacz na GitHubie
Generator CV w LaTeX
Ukończonoreacttypescriptvitetailwindgogindocker

Generator CV w LaTeX

Narzędzie do tworzenia CV zorientowane na prywatność, generujące zoptymalizowane pod kątem ATS pliki LaTeX.

Problem i rozwiązanie

Tradycyjne generatory przechowują poufne dane w chmurze i generują pliki PDF odrzucane przez filtry ATS.

Funkcje

  • 9 dopracowanych szablonów LaTeX pod kątem systemów ATS
  • Lokalne przechowywanie danych w przeglądarce
  • Podgląd na żywo z natychmiastową kompilacją w Go
  • Ścisłe przestrzeganie formatu jednej strony A4
  • Eksport do kodu źródłowego LaTeX oraz pliku PDF

Stos technologiczny

TechnologiaWersjaCelDlaczego wybrano
React19UI frameworkLatest concurrent features, lazy loading
TypeScript~6.0Type safetyPrevents runtime errors on complex resume data model
Vite8.xBuild tool & dev serverFast HMR, native ESM, code splitting via glob imports
Tailwind CSSv4Utility-first stylingRapid UI development, consistent design tokens
Zustand5.xState managementMinimal boilerplate, built-in persist middleware
@dnd-kitcore 6, sortable 10Drag-and-dropAccessible, performant sortable lists
Go1.25+Backend runtimeFast startup, small binaries, excellent concurrency
Gin1.12HTTP frameworkHigh performance, middleware ecosystem
Tectonic0.16.9LaTeX→PDF compilerSelf-contained, no TeX distribution needed
Docker—ContainerizationReproducible builds, production parity
SQLitemodernc.org/sqlite 1.54Stats persistenceNo CGO dependency, cross-compilation
Sentry10.xError tracking & monitoringSession replay, performance monitoring, feedback widget

Architektura

React 19 SPA

Zustand Store

localStorage

Live HTML Preview

LaTeX Generator

9 Template Engine

Gin Server

:8080

Rate Limiter

API Key Auth

Compile Handler

Tectonic

SQLite Stats

Prometheus

Grafana

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Frontend (React SPA)

  • React 19 SPA with Zustand state management
  • 9 pluggable template strategy pattern (config + preview + LaTeX generator)
  • Live A4 page simulation with zoom and pagination
  • WebSocket-based real-time compilation streaming
  • Vite 8 with code splitting via import.meta.glob

Backend (Go Microservice)

  • Go/Gin HTTP server with single concern: LaTeX compilation
  • Tectonic subprocess management with --untrusted sandboxing
  • Per-IP token bucket rate limiting (5 rps, burst 10)
  • API key authentication on compile endpoints
  • SQLite for aggregate visit/download statistics

Infrastructure

  • Docker Compose orchestration (backend + Prometheus + Grafana)
  • Multi-stage Docker builds (golang → alpine + tectonic)
  • Vercel deployment for frontend, Render for backend
  • Prometheus metrics with Grafana dashboards

Struktura projektu

backend
cmd
server
main.goGin server setup, routes, middleware
internal
compiler
handlers
middleware
websocket
frontend
src
components
editor
preview
hooks
stores
templates

Punkty końcowe API

Go Backend (port 8080)

MetodaTrasaCel
POST/api/compileCompile LaTeX to PDF (HTTP)
GET/api/compile/wsWebSocket compile with progress streaming
POST/api/stats/visitRecord page visit
POST/api/stats/downloadRecord PDF download
GET/api/statsGet aggregate stats
GET/api/healthHealth check (Tectonic + DB status)
GET/metricsPrometheus metrics

Projekt bazy danych

stats

2 cols
keyPK
TEXT
value
INTEGER
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

stats

KolumnaTypUwagi
keyPKTEXTCounter name: 'visits' or 'downloads'
valueINTEGERCounter 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.

Kluczowe decyzje projektowe

Frontend-First Architecture

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

Tectonic for LaTeX Compilation

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

Zustand over Redux/Context

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

WebSocket for Compile Streaming

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

Strategy Pattern for Templates

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

SQLite for Stats Only

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

Testy

None configured•0 testów jednostkowych

Co jest testowane

    Brakujące pokrycie

    • Unit tests for escapeLatex, generateLatex functions
    • Unit tests for template rendering and LaTeX generation
    • Integration tests for compile handler
    • Integration tests for WebSocket compilation flow
    • E2E tests for critical user flows (edit → preview → export)

    Kluczowe wyzwania

    • LaTeX compilation timeout (Tectonic can take 60+ seconds for complex documents)
    • Profile image size in request body increasing payload and compilation time
    • localStorage quota limits (~5MB) for saved resume versions
    • Multi-page PDF warning — preview is approximate, actual PDF may differ
    • Concurrent compilation on single-container deployment

    Kluczowe wnioski

    • Strategy pattern for pluggable template architecture
    • WebSocket streaming for real-time compilation progress
    • LaTeX escaping with null-byte placeholders to prevent double-escaping
    • Multi-page preview simulation with section-aware pagination
    • Frontend-first architecture trade-offs (privacy vs. no cloud sync)