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.
Own product
01
Lead-generation SaaS with local AI
An outbound CRM built from scratch for an events business: a portfolio of companies, campaigns with sender warm-up, real delivery through a webhook and segmentation by industry with a model that never leaves the house. Multi-tenant from the ground up, with five roles and permissions per entity.
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
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.
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.
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.
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.
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
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.