Let's build something.
A self-hosted second brain: notes are plain markdown files on disk, cross-referenced with standard markdown links, with a visual graph of how they connect. No lock-in, the vault is just a folder.
- plain-markdown vault backed by a SQLite index that can always be rebuilt from disk
- graph view and backlinks to see how notes connect
- full-text search with SQLite FTS5 and bm25 ranking
- three clients: a React web app, an installable PWA with offline reading, and a Tauri desktop app for Linux
- auth with accounts, JWT sessions, and personal API tokens
- CI pipeline running ruff, pylint, mypy --strict, pytest, biome, tsc, and vitest on every PR
Built with Python, FastAPI, SQLite, React, TypeScript, Tauri, and Docker Compose.
A local LLM companion for tabletop RPG game masters. Point it at your game's manual and ask about rules, NPCs, or world-building: it runs entirely on your machine and answers from the manual, not from generic fantasy knowledge.
- synthetic roster chunks: "which classes are there?" has no single passage that answers it, so lists scattered across the manual are collected into dedicated chunks at index time
- page references: mention "page 112" and that page is pulled into the context next to the semantic matches
- strict grounding: the model answers only from retrieved excerpts, says so when the manual is silent, and flags concepts borrowed from other games
- PDF cleanup pipeline for real-world manuals: front matter, indexes, running headers, and watermarks stripped before chunking
- game-agnostic: every system, language, and cleanup rule lives in a YAML config
Built with Python 3.12, llama.cpp, sentence-transformers, FAISS, and Streamlit.
A card game built from scratch: game engine, simulations, balancing, and a web server for playtesting. Instead of manually tweaking numbers until things "feel right," RL agents play thousands of games and the math tells you what's balanced.
- custom game engine supporting 2 to 5 players
- self-play RL agents that learn strategy through millions of simulated games
- multi-phase tuning pipeline: 2,000+ configurations narrowed down to a single champion
- composite balance scoring across win fairness, entropy, player influence, and game stretch
- web server for live playtesting with the tuned configuration
Built with Python, PostgreSQL, and a lot of patience.
An automated pipeline that aggregates Italian public contest listings from multiple official sources and delivers a filtered newsletter via email.
- multi-source retrieval from official government feeds and APIs (e.g. Gazzetta Ufficiale, InPA)
- fuzzy keyword matching using Levenshtein distance to filter relevant contests across all sources
- domain-driven design with independent retriever packages, shared pipeline kernel, and dependency injection
- Gmail API integration for automated email delivery with results grouped by source
- CI pipeline running ruff, mypy, and pytest on every PR
Built with Python 3.13, feedparser, requests, and marshmallow-dataclass.
A web framework for searching, downloading, and analyzing satellite imagery. Born as a Master's thesis, then hardened with security fixes, modern tooling, and proper test coverage.
- satellite imagery search via the Planet API (PlanetScope Ortho Visual), filtered by GeoJSON area of interest and date range
- map lab for viewing downloaded TIFF rasters as PNG with coordinate metadata reprojected to WGS84
- OpenStreetMap integration loading vector data into DuckDB for spatial queries
- full auth flow with email verification, password recovery, CSRF protection, and secure hashing
- CI pipeline running ruff, mypy, and pytest on every PR
Built with Python 3.12, Flask, PostgreSQL, GDAL, Docker Compose, and Alembic.