🌐 cristiansg.dev ·
A personal book-tracking web app inspired by Letterboxd — built to log, rate and review books with a focus on clean UX and maintainable architecture.
Stack: Laravel 11 · Blade · PostgreSQL · SCSS + Vite · DDEV / Docker
Highlights:
- Manual authentication (login, register, logout) with CSRF, session regeneration & login throttling
- Google Books API integration with language-prioritized search (Spanish first, English second) and cover filtering
- Reading states (Wishlist, Reading, Read, Abandoned), half-star ratings (0.5–5) and reviews
- All actions (save, rate, review, delete) handled inline via fetch — zero page reloads
- Toast notification system for consistent feedback across the entire app
- Skeleton loader with shimmer animation on book covers, respecting the active theme
- Catppuccin Mocha / Latte dual theme system with persistent toggle and zero flash on load
- Profile stats page (
/me) with reading metrics and rating averages - Structured Git workflow: feature branches → develop → main, Conventional Commits
- 16 feature tests (auth, reading logs, profile) — PHPUnit with SQLite in-memory
A full-stack personal finance tracker — manage transactions, monthly budgets and recurring income/expenses, with a dashboard to visualize spending habits.
Stack: React 18 · TypeScript · Vite (frontend) · Spring Boot 3 · Java 21 · PostgreSQL · Flyway (backend) · Railway (deploy)
Highlights:
- JWT authentication —
userIdalways extracted from the token, never trusted from the request body - Monthly budgets with color-coded alerts based on percentage consumed
- Recurring income/expenses with automatic lazy generation on a monthly basis
- Dashboard with charts and stats built from real transaction data
- Showcase account pre-populated with realistic example data for demo purposes
- 71 tests total: 50 backend (JUnit 5, Mockito, MockMvc) + 21 frontend (Vitest, Testing Library)
- Deployed on Railway with a custom domain
A daily guessing game (Wordle-style) where you try to figure out the year of real historical events, with a photo and a text hint.
Stack: React 18 · TypeScript · Vite · Node (daily job) · GitHub Actions (cron)
Highlights:
- Automated daily cron job querying the Wikipedia API, filtered by relevance (pageviews) and image quality
- Years masked in the hint text to avoid spoiling the answer
- No database — data served as static JSON, generated by GitHub Actions
- Game state, streak and record persisted in localStorage
- Tested with Vitest
A web app to check weather conditions along a driving route — no backend, no API keys, no sign-up required.
Stack: Vue 3 · Vite · Leaflet.js · SCSS · Open-Meteo API · OSRM API
Highlights:
- Real road routing with accurate arrival times using OSRM Table API
- Per-segment weather forecast: temperature, rain, wind, visibility and weather icon
- Address autocomplete with support for streets and points of interest
- Reverse geocoding — real locality names for each route segment
A nearby fuel price and EV charging point comparator — geolocation, interactive map, dynamic filters, and a serverless proxy to work around a public data source that blocks CORS.
Stack: Vue 3 · Vite · TypeScript · Leaflet.js · Vercel Functions · Nominatim API
Highlights:
- Fuel prices (MITECO public API) and EV charging points (DGT DATEX2 feed) in the same map, switchable via a fuel/electric mode toggle
- Serverless proxy (Vercel Function) built after discovering the DGT endpoint blocks CORS for any origin but its own — streams and parses an 86 MB DATEX2 XML feed server-side into a compact JSON response
- Dynamic filters (fuel type, brand, connector type, power output) computed live from whatever stations fall inside the current search radius — never hardcoded
- Bidirectional map/list sync, "search this area" on manual pan (Google Maps-style), and geolocation with graceful fallback to address search
- Favorites persisted in localStorage, keyed by entity type to avoid id collisions between fuel stations and charging points
- Catppuccin Mocha/Latte theming with system preference detection and persisted override
- 🎓 Graduated in Web Application Development (DAW)
- 💼 Full-stack experience across PHP/Laravel and React/TypeScript, with production deployments on Railway and Vercel
- 🌱 Continuously improving through personal projects and real-world practice
- 💡 Open to remote web development opportunities
- ✨ Always eager to learn new technologies and stacks



