← Back to home

Project archive

Recent work,
no shortcuts.

Seven case studies told from the inside: what the problem was, what I decided and what I learned. The numbers come from the code, not from wishful thinking.

01 / Index

All the projects.

Ordered by the work I want to be asked to do: applied AI and automation, then backend, and underneath it the ground everything runs on.

7 of 7 projects visible.

AI and automation

02

Live subtitles, offline

It listens to Japanese from the microphone or from the PC's audio and paints the translation onto a floating window that can be kept on top of everything. Whisper Small quantised to INT8 on CPU and a second model for the final step: not one byte of audio leaves the machine.

Pythonfaster-whisperCTranslate2PySide6100 % local
0requests to the cloud2target languages4 sper segment
↗
AI and automation

03

Browse, classify and cover a country

Three tools that pass the baton to each other: one goes through the web guided by a model that runs at home and hands the mouse back to the human when a CAPTCHA appears; another turns public profiles in two sectors into leads, each sector with its own exclusion rules; the third covers Spain with a grid laid over the official Nomenclátor, always sending the same query.

PythonPlaywrightOllamaPlaces APISQLite
20,900lines0paid AI APIs2sectors
↗
AI and automation

04

Six AI agents playing against each other

A board game with too many rules that ended up being a test bench: a local model drives every seat through a JSON contract, four comparable strategies in runs of a hundred rounds, and a bypass that keeps playing with heuristics if the model goes down.

PythontkinterOllamaJSONno dependencies
3,959lines174methods4strategies
↗
Full-stack

05

Web, APK and server to coordinate game sessions

The shared calendar of a role-playing group: availability by time slot, polls that turn into a session and recurring reminders scheduled on the phone itself. The backend works out which slot suits the whole group and stores every date in UTC while showing it in each table's own zone. It installs on any machine with Docker and depends on no outside service.

Java 21Spring BootReactCapacitorFlywayDocker
37endpoints11entitiesUTCzone per table
↗
Infrastructure

06

The AI server everything else uses

A 125-billion-parameter model served on a server of my own through an OpenAI-compatible API, with no token meter. The CRM, the scrapers and the RAG demo all talk to it by changing one environment variable.

DockerGGUFOpenAI-compatible APIReverse proxy
125 Bparameters5projects that consume it
↗
Infrastructure

07

The data store of a video production company

Shared editing in DaVinci Resolve on top of a data server of our own. The case that explains why the cloud stops being cheap when the volume never comes down, and why the codec is filtered out before downloading.

Network storageDaVinci ResolveH.264 · AACCost per volume
1080pdownload ceiling0figures published
↗

Even more things, without a case study.

Small tools that I use or have used and that show craft rather than architecture. Each one is shown in a line; if one of them interests you, I open it up in detail.

  • PDF compressor Desktop

    The forty-megabyte PDF that an administration portal refuses to accept, and the refusal to upload it to a third-party website. It searches through eleven pairs of resolution and quality over two Ghostscript profiles, measures each attempt in a temporary file and stops as soon as one of them fits; if none fits, it delivers the smallest one achieved and says so. When the machine does not have Ghostscript, it downloads it and installs it in the user's folder, without administrator rights.

    PythonGhostscriptPyInstaller
  • Shift reader Extension

    It goes through tabs, scrolls, follows the pagination and closes the session when it finishes. A Manifest V3 life cycle properly resolved: alarms, reinjection and fencing by execution identifier.

    JavaScriptManifest V3
  • Ask my notes RAG

    Local vector index with Qdrant in embedded mode and BGE-M3 embeddings over a small model from Ollama. Five hundred and thirty-two lines of Python in eleven clean modules: chunking with overlap anchored to sentence boundaries, a persistent index, and an honest warning about the real limitation of local Qdrant, which does not allow two processes at a time over the same store.

    PythonQdrantRAG
  • Batch downloader Utility

    A file of links, two independent scripts in Python. Before touching the network it checks that FFmpeg is on the PATH and exits with code 2 if it is not; each link is captured separately, so one broken link does not bring down the whole run and the summary says how many went through and how many did not. The output name is trimmed by bytes and cleaned up for Windows, and the list accepts comments.

    Pythonyt-dlpFFmpeg
  • Single-sheet Tetris Demo

    One single file, four hundred and fifty-four lines of Canvas 2D. A bag of seven pieces shuffled with Fisher-Yates, a hold with a swap limited to one per piece, a ghost piece calculated by projecting the collision, and the official scoring and level system: [0, 100, 300, 500, 800] per lines, a level every ten, gravity from 800 to 80 milliseconds. The loop moves with delta time, not with fixed frames, so it runs the same at 60 as at 144 hertz.

    JavaScriptCanvas