About
Who I am
I'm a software developer at JoyPix in Doha, the only person on their applications platform. Before that I co-founded a small studio in Tunisia and did operations work at a ride-hailing company. Outside the job I build open-source tools in Rust and Python. This page is the rest: what I'm working on, what working alone changes, and how to reach me.
Right now
Updated 4 September 2026A standing answer to “what are you working on?”, kept current by hand rather than inferred from commit activity.
JoyPix — the platform, day to day
My actual job. Three web apps, a mobile app and the infrastructure under them, as the only developer on it. Live at eduqate.qa.
Ferry — heading for release
The peer-to-peer transfer daemon goes public. Eight Rust crates, a CLI, a VS Code extension and a desktop app, all talking to one local daemon. No server anywhere.
OpenDerja_TN
The open corpus for Tunisian Derja — building the contributor surface on top of the backend and the task engine.
A travel tracker for data people
A Polarsteps alternative built around what Polarsteps won't do: editable GPS tracks, snap-to-road route reconstruction, real CSV/JSON exports, region-visited as a first-class stat. Learning Kotlin from scratch for it.
The layer under the app
LFCS and Cisco CCNA — Linux sysadmin and network fundamentals — ahead of running my own dedicated server. Plus the iSAQB software-architecture certification, to sharpen how I write up the architecture work I already do.
On working alone
Owning a system end to end on your own isn't the same as being one developer on a team. Nobody catches a bad call before it ships, and there's no second mental model to check yours against. That's why error monitoring, schema-drift checks in CI and regression tests for bugs I've already hit stopped being optional. They do some of the work a second pair of eyes would do just by noticing things in passing.
Facts
Languages
Based
Doha, Qatar — originally Le Kef, Tunisia. 4 years building.
How this site is built
One of my own rules is: generate the shared vocabulary, never transcribe it. Two hand-maintained copies of anything will drift, silently. So this site is generated from the dev log rather than copied out of it.
The pipeline
The source of truth is an Obsidian vault — one folder per project, each with a timeline, a decisions record, a running problem log, and a set of technique notes.
A build step reads that vault and:
- copies the technique notes into the site, resolving the vault's wikilinks into real links
- splits each project's problem log into one page per problem, pulling the date out of each entry
- applies a sanitization pass to the one project under client confidentiality — no product name, no sector, no vendor names — while keeping every technical detail
A CI check fails the build if the committed content ever drifts from the vault. The site can be deployed without the vault present; the generated content is self-contained and committed.
The stack
- Next.js App Router, statically generated — every page is HTML at build time, which is what the log-heavy content wants
- Design system ported from my previous portfolio: a dark navy ground, a cyan accent, Space Grotesk for text and JetBrains Mono for anything that's data
- Markdown rendered with remark; frontmatter parsed with gray-matter
- No CMS, no database, no client-side data fetching for content
What's deliberately missing
A generated CV PDF, and not much else. The contact form is one serverless function that emails me and auto-acknowledges the sender through Resend — no database. Every note, problem and story chapter has a French counterpart.