Watchtower
A media-monitoring platform for institutional clients. Saved searches, shared alerts, folders, deduplication — over an archive that only ever grows. PHP, MySQL, Redis, Elasticsearch.
Full stack, mostly the back. I build systems that read the web all day — crawlers that keep going, extraction that survives the page changing, and search over an archive that never stops growing. Lately, models that have to cite the document they answered from.
A media-monitoring platform for institutional clients. Saved searches, shared alerts, folders, deduplication — over an archive that only ever grows. PHP, MySQL, Redis, Elasticsearch.
Moving a live PHP 7.4 product to Python, endpoint by endpoint, with nobody logged out. No big-bang cutover, no parallel truth. The legacy is still in production, and that is the point.
Semantic search and question answering over the archive. Embeddings, vector search, and an assistant held to citing the document it answered from. Elasticsearch, FastAPI, LangChain.
A fleet of crawlers and pluggable extractors: RSS where it exists, full text where it does not, and sites that would rather not be read. Scheduled, throttled, restartable. Python, Docker.
Newsletters written by a model and shaped by editorial rules — scoped per folder, per theme, per client, and sent on a schedule nobody has to remember. FastAPI, OpenAI, Mistral.
21 spines — drag them around
The handle came from a shell prompt and never left. Everything here runs on somebody else's machines anyway — servers in a rack, pages that belong to other people, archives that grow whether or not anyone is watching.
seeded from today's date — same level for everyone, until midnight
hello, friend.
you have been here —. you picked up— — and never opened it. you hovered the address — times.
i am going to make this easy.
None of this left your browser. There was no request, no cookie, no id — the numbers were counted in this tab and are gone the moment you close it. The only thing this page ever wanted was the line below.
hey@mowglissh.dev