← Story
Chapter 3March 2024 — April 2026

SiccaDev, and the tools I built for myself

In March 2024 I co-founded a small studio called SiccaDev in Le Kef and became the person responsible for whether the technical side worked. Over about eighteen months we delivered for more than ten clients — architecture, backends, cloud infrastructure, VPS deployments, database work, CI/CD, containers.

This is the stretch of my history with the fewest public repositories and the most shipped software, because client work is private, and I'm not going to pretend otherwise to make a GitHub graph look busier. If there's a visible gap in my timeline between 2024 and 2026, that gap is a company.

What SiccaDev actually taught me isn't on a résumé line. It's that the job is roughly 20% "what's the right data model" and 80% "the client said in a meeting, once, in passing, that they might want X eventually — is that a real requirement?" You learn to translate offhand sentences into architecture commitments, then go back and check your translation with the person who said it, before it gets expensive to be wrong. It's the single most useful non-technical skill I have, and it came entirely from client work.

Also: the habits started here. One enforceable place per rule. Deployments that can roll themselves back. Write down why you did the weird thing, because in six months the weird thing will look like a mistake and you'll "fix" it. Those aren't things I read in a book. They're scar tissue from small companies with real deadlines.

Doha, and a run of small sharp things

Late 2025 I moved to Doha for an operations-support role at a mobility company — support work on assigned tasks in a live production environment. Useful, and not the interesting part of this chapter.

The interesting part is that around then I started shipping small tools for myself, in public, and the drum-kit sentence came back.

Job Scraper 02 exists because I was checking ten job boards every morning and I hated it. It scrapes listings and scores each one against your CV with an LLM. Two containers — a FastAPI scraper and a Streamlit dashboard — with pause, resume and stop controls over HTTP, because a scrape is a long-running job and long-running jobs deserve buttons. The design decision I'll defend to anyone: it runs with no API key at all. If you don't give it a Groq or Anthropic or Gemini key, it drops to keyword matching and still works. A tool that demands a paid credential before it'll even show you what it does is a tool nobody tries. It's on PyPI now, with a proper Trusted Publisher release pipeline, because if I'm going to do a thing I'd like to do the boring parts too.

The WhatsApp Automation Tool exists because the official WhatsApp Business API is priced for companies, not for one person messaging their own leads. So instead of an API, it runs an actual Chromium browser inside a Docker container, on a virtual display, exposed over noVNC so a human can watch it and take over. GUI virtualisation as an API substitute. It's a slightly cursed idea and I'm fond of it. The README contains this line, which I left in on purpose: "don't exceed 100 messages per day otherwise your WhatsApp account will be banned. Mine got banned after 40 messages sent in one day." That's me telling on myself in a public repo, and I think that instinct — say the true thing even when it's the unflattering thing — is the reason this whole website exists.

LangChain's deepagents CLI got a small contribution from me in February 2026 — thirty lines. The /tokens command showed your usage but not what it was usage of, so I added the active model's name and its full context window. The number now has a denominator. It went through review, picked up unit tests, got merged and shipped in a release. Thirty lines. I'm not going to inflate it into "contributor to LangChain." It's a merged PR to a CLI I use, and that's a nice thing to be able to say exactly.

Fira Sys is the one with a story. It's a restaurant management system — POS, inventory across locations, purchase orders, analytics, and invoice scanning that reads a supplier PDF with OCR and pulls the line items out with an LLM. It started life as a Rust desktop application and got completely rebuilt as a React/Node web app when the operational reality turned out to need multi-location, multi-user access that a desktop binary wasn't going to give gracefully. It was built for a real client. The engagement ended. So I open-sourced it, in the state it was in, with a README that says plainly it has rough edges — because the alternative is someone finding those edges themselves and feeling lied to.

That's the whole run: small, public, honest, built because I wanted the thing. It's also the on-ramp to the part of my career that this website mostly exists to document.