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.

github.com/piurizza/cerebrum

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.

github.com/piurizza/master-companion

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.

github.com/piurizza/gazzetta-newsletter

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.

github.com/piurizza/gdaf