Projects

What I've built

Three systems built solo end to end, three tools you can install today, and the junior work that taught me how. Each flagship has its own set of pages — architecture, decisions, timeline, and the problems that came out of it.

EduQate

2026 — ongoing

This is my day job. JoyPix's applications platform, built end to end from a short visual pitch. Organisations receive and review applications from the public: an applicant side, an operator side, and a platform-admin tier over both. Three web apps and a mobile app, nineteen domain modules over sixteen core concerns, five layers with every dependency pointing one way. It's live at eduqate.qa.

Domain modules
19
Client apps
4
Architectural layers
5
Services in the stack
10
Automated tests
7,000+
Problem write-ups
12
NestJSPrismaPostgreSQLpgBouncerRedisSocket.ioReact 19Vite+7
Open the case study
Client apps3 web SPAs · 1 React NativeShared packagestypes · api client · query hooks · 2 UI kitsDomain modules19 modules · ~21k linesCore concernsauth · policy · settings · outbox · storageInfrastructurePostgres · Redis · object storage · Rust image service2 knownviolationsoutbox dispatcher → notifications · auth → user record
Every arrow points down. The value isn't tidiness — it's that the blast radius of a change is readable off the diagram, which is what makes a verification ledger possible. The two dashed arrows are real violations I found by counting imports rather than trusting the picture.

Ferry

2026

An open-source peer-to-peer tool for developer teams, Apache-2.0. Every machine runs the same daemon — client and server at once — and a CLI, a VS Code extension and a Tauri desktop app all talk to it over a local socket. Seven Rust crates in one Cargo workspace, with the dependency direction enforced by the crate graph, so breaking it is a build error rather than something a reviewer has to catch. Two daemons run the full pipeline end to end: discovery, pairing, signed rosters, encrypted transfer, delivery.

Rust crates
7
Tests
350+ Rust
Surfaces
CLI · VS Code · Desktop
Generated bindings
37 types
Crypto primitives
4 audited
RustNoise XKSPAKE2ageed25519SQLitemDNSTauri+2
Open the case study
Ferry — the Send screen

OpenDerja_TN

2026 — ongoing

Twelve million people write this language every day and there's almost no proper record of it. Contributors write, correct and confirm Derja from their own region, and out of it comes a citable dataset, a lexicon, and a translator built on the corpus. Non-profit by design. The backend is done — a framework-free domain core, eleven NestJS modules, a 42-model schema, provider OAuth, a pg-boss job queue — and the project is opening up to contributors now instead of staying solo.

Data models
42
Test suites
59 · 302 tests
Backend modules
11
Regions modelled
4
Language planes
3
Next.jsNestJSFramework-free corePostgreSQLPrismapgBouncerpg-bosspg_trgm+3
Open the case study
Control planeTypeScriptbackendworkerscrapersbuiltData planeRustdeduptextexportauditmediadeliberately emptyIntelligencePythonnlpdeliberately emptyPromotion rule: measured, not guessed.Nothing in a request path may ever await inference.
A stage moves to Rust when it's measured to be a bottleneck at real corpus scale — not when it seems like it would be faster. The empty modules are pre-scaffolded seams so the move stays cheap. That they're still empty is the point, and it's written into the project's own ledger so a later session doesn't treat it as a gap to fill.

Job Scraper 02

2026 — ongoing

A FastAPI scraper and a Streamlit dashboard in two containers, driven by a REST API the UI just happens to call. Paste your CV and a few keywords, hit Start, and it searches multiple job sites and ranks each result 0–10 against you. I built it while job hunting and it found me the job. It's a real package on PyPI now, with a release pipeline that does more than tag a commit.

On PyPI
pip install job-scraper02
Version
v0.3.0
Tests
26 · CI runs the real app
Container images
3 (scraper · ui · all-in-one)
AI providers
3 + keyless Lite Mode
FastAPIStreamlitPlaywrightSQLitepandasGroq / Anthropic / GeminiDocker Composen8n (optional)+2
Open the case study
The scored job dashboard

Shipped & public

In design

Travel tracker

2026 — planning

Polarsteps is lovely and it throws your data away. This is the version for people who want the numbers: deep stats, raw exports, real route reconstruction. Personal use first — it goes public only if it proves out.

KotlinJetpack ComposeMaterial 3Mapbox SDKNestJSRustPostgreSQLPostGIS

Junior projects — where it started

Team builds and learning projects from 2023–2024. Not the work I'd want to be judged on now, but I've left it up — it's where I started.