Apps I build, ship and keep running.

Four products I designed and wrote end to end, each live and in daily use. Every one runs as its own Docker Compose stack on a home server, reached through a Cloudflare Tunnel and Traefik, with secrets in AWS Parameter Store. Swipe through the screenshots; they were taken from demo accounts this week.

Event listing for Málaga: flamenco, rock and tribute shows with dates and venues
Event page with poster, date, venue, price, ticket button, share buttons and an alert box
Stand-up comedy landing page listing 144 events in Málaga
Home page with topic links, search filters and event cards

EventosLocales.net

Public product · Spanish and English · own domain, SEO and analytics

What's on in Málaga province, in one place. Every day a worker pulls events from theatres, clubs, town-hall agendas, Fever and Ticketmaster, works out which listings are the same show, groups a run of dates into one event, and tracks when tickets go on sale or sell out.

  • Cross-source de-duplication by venue, date and fuzzy title, plus a daily merge job
  • Server-rendered SEO heads, schema.org events and a sitemap for a React SPA
  • Alerts, venue and artist follows, calendar files and per-event traffic stats
Backend
Python 3 · FastAPI · SQLAlchemy 2 async · Alembic
Data
PostgreSQL 16 + PostGIS · Redis
Ingest
Source connectors · Playwright · worker
Frontend
React · Vite · TypeScript · nginx SSI
Ops
Docker · Traefik · Cloudflare · Umami
Visit eventoslocales.net
Dashboard with games, score, accuracy, a daily challenge and a skills radar chart
Game review with board, move list annotated with mistakes and best moves, and the mistakes panel
Analysis page ranking mistake patterns such as hanging pieces, missed tactics and forks
Training page with a puzzle taken from one of the player's own games

ChessHelper

Chess coach for chess.com and Lichess players · web + iPhone

Connect your chess.com or Lichess account and every game you finish gets analysed by Stockfish. ChessHelper labels each mistake (hanging piece, missed fork, endgame technique), shows where you lose games by phase, clock and opening, and turns your own blunders into puzzles.

  • Background engine worker analysing thousands of games per profile
  • Rule-based study plan and tilt detection, with no guesswork from the AI
  • Coaching reports written by Gemini from the engine's numbers, in four coach voices
Backend
Python 3 · FastAPI · SQLAlchemy 2 · Alembic
Engine
Stockfish worker · python-chess
AI
Google Gemini (coaching reports)
Frontend
React 19 · Vite · TypeScript · Tailwind 4
Mobile
SwiftUI iPhone app
Data
PostgreSQL 16
Open ChessHelper
Today screen with the next Push, Pull or Legs workout, a four-week streak and recent sessions
Progress screen with streak, total volume, weekly volume chart and muscle balance chart
Generated hypertrophy plan listing exercises with sets, reps and rest
Exercise library with illustrations, muscle groups and equipment

GymHelper

Gym tracker · web, iOS and Android

A training log built around a real exercise library and a recommender that writes your plan from your goal, experience, schedule and equipment. It keeps what you planned apart from what you actually lifted, so progress, records and streaks reflect real sessions.

  • Deterministic recommender from curated movement patterns, no AI needed
  • Optional AI coach (Gemini) that answers from your own plan and history
  • Whoop recovery data and health-metric webhooks feed the dashboard
Backend
Python 3 · FastAPI async · SQLAlchemy 2 · Alembic
AI
Google Gemini (coach, opt-in)
Frontend
React 19 · Vite · TypeScript · Tailwind 4
Mobile
Capacitor + native iOS and Android
Data
PostgreSQL 16
Open GymHelper
Home screen with today's practice plan, the next chord to learn and songs you can play
Song finder showing songs playable with the chords the user knows, with difficulty levels
Chords page suggesting F, A, Dm and Bm by how many songs each unlocks, and an English to Spanish chord name quiz
Strumming trainer with patterns, a beat lane, tempo slider and chord cycle settings

GuitarHelper

Practice companion for beginners · installable web app

The chords you know decide everything else: which songs you can play today, how hard each one is, which chord to learn next and what goes into tomorrow's practice plan. Songs come from the top charts or are imported from Ultimate Guitar and LaCuerda.

  • Next chord ranked by how many of your songs it unlocks
  • Tuner, metronome, strumming trainer and one-minute changes, all offline
  • Deliberately no AI: every suggestion is explainable from your chords
Backend
Python 3 · FastAPI · SQLAlchemy 2 · Alembic
Frontend
React 19 · Vite · TypeScript · Tailwind 4
Audio
Web Audio API (tuner, metronome, strums)
Delivery
PWA with offline practice tools
Data
PostgreSQL 16
Open GuitarHelper

Smaller projects

Earlier apps on the same server. Smaller in scope, same setup: one Compose stack each, behind Traefik.

  • HabitTracker screenshot

    HabitTracker

    Streaks, activity heatmaps and habit packs. A PWA that also ships as a mobile app.

    FastAPI · PostgreSQL · React · Capacitor

  • TimeHelper screenshot

    TimeHelper

    Time tracking with a running timer, journaling and dashboards of where the hours go.

    FastAPI · PostgreSQL · React 19 · Supabase Auth

  • FinalTodoList screenshot

    FinalTodoList

    Real-time shared to-do lists with Pomodoro timers and offline support, one codebase for web, iOS and Android.

    FastAPI + WebSockets · PostgreSQL · React Native + Expo

  • Vault expense manager screenshot

    Vault

    Multi-account, multi-currency finance manager with open-banking sync and net-worth dashboards.

    FastAPI · PostgreSQL · React + TS · Open Banking API

Need something like this for your business?

I build custom web apps, data pipelines and AI agents, from first sketch to running in production.

Fit

Click the image or use + to zoom in