Skip to content
View CristianSG2's full-sized avatar

Block or report CristianSG2

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
CristianSG2/README.md

👋 Hi, I'm Cristian

Typing SVG

🌐 cristiansg.dev  ·  Profile Views


🛠️ Tech Stack

PHP Laravel Blade React TypeScript Java Spring Boot Vue PostgreSQL JavaScript HTML5 CSS3 Sass Git Docker DDEV Vite Leaflet Vercel Railway


🚀 Projects

📚 ReadOn

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

Repo Live Demo

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

💰 Ledgr

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)

Repo Live Demo

Highlights:

  • JWT authentication — userId always 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

📅 Efeméride Diaria

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)

Repo Live Demo

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

🗺️ rutameteo

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

Repo Live Demo

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

⛽ SurtiGo

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

Repo Live Demo

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

📊 GitHub Stats

Cristian's GitHub stats Top Languages

GitHub Streak


🌍 About Me

  • 🎓 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

🤝 Connect

Portfolio LinkedIn Email

Pinned Loading

  1. ReadOn ReadOn Public

    Personal book-tracking app — Laravel 11 · Blade · PostgreSQL · Vite (SCSS) · DDEV/Docker

    PHP