Software architect — backend and front-end.
Symfony and NestJS on one side, Vue, React and Angular on the other, and the C++ firmware at the far end of the house.
I design the shape of a system, then build it: bundles that do one job well,
apps that ship as a single Docker image, and a home that talks over MQTT.
Everything self-hosted, everything open source — and written up on smea.tech.
📝 The blog — smea.tech
Most of what is below ends up explained there: what the problem was, what broke on the way, and what I kept. Homelab, self-hosting, home automation and the projects of this page. Written in French, and the list above is pulled from the RSS feed every night.
🐘 Symfony & PHP — GollumSF
~24 Composer packages. Small bundles, no framework inside the framework.
A deliberately small REST layer for Symfony: request deserialization, validation and JSON responses, without dragging a whole API platform in.PHP Symfony REST
|
The companion piece: generates the API documentation straight from the controllers annotated for rest-bundle. Zero duplicated spec.PHP OpenAPI documentation
|
The most downloaded of the lot. Adds the missing TINYINT Doctrine type so small integers stop costing four bytes each.Doctrine DBAL MySQL
|
MJML shipped as a compiled binary through Composer — build responsive emails on a PHP server with no Node.js install anywhere near it.MJML email no-Node
|
Describe serialization groups where they belong — on the entity — in annotation or PHP 8 attribute flavour.Serializer attributes
|
Keeps both sides of a Doctrine association in sync automatically, so you stop writing the same addX()/removeX() boilerplate.Doctrine ORM
|
The rest of the toolbox — 18 more packages
| Package | What it does |
|---|---|
enum |
Enum implementation for PHP versions that had none |
uuid · doctrine-enum · doctrine-type |
Extra Doctrine types |
doctrine-arraypipe |
Pipe-friendly array handling for Doctrine results |
libsass-bundle |
libsass filter for Assetic |
url-tokenizer-bundle |
Signed, expiring URLs |
controller-action-extractor-bundle |
Resolve controller class + action from a Request or Route |
reflection-property-test |
Reflection helpers for unit tests |
email-bundle · cache-bundle · core-bundle · user-bundle |
The application plumbing |
manager · auth-rest-bundle |
Service managers and REST auth |
🔷 TypeScript & JavaScript — GollumJS
Decorators, DI and small runtime helpers — the pieces I kept rewriting until I packaged them.
Persistent, readable annotations on TypeScript classes — metadata that survives compilation and can be queried at runtime.TypeScript decorators metadata
|
A service container and dependency injector for TypeScript, built on the annotation layer above. Symfony habits, browser runtime.DI container TypeScript
|
@Stored turns a Vuex slice into an ordinary typed property, getter and setter generated for you.Vue Vuex decorators
|
Real two-way props for Vue: declare @InOut() once instead of pairing every prop with its own emit.Vue two-way binding
|
Also in the drawer
| Package | What it does |
|---|---|
gollumjs-log |
Overrides console.log while keeping the real file and line number |
GollumTS-Trait |
PHP-style traits for TypeScript |
GollumTS-ObjectType · GollumTS-Time |
Typed maps and time helpers |
proxy-array |
Observable arrays via Proxy |
emit-decorator-circular-loader |
Untangles circular decorator imports |
vue-babylonjs |
A ready-to-go 3D environment for Vue with Babylon.js |
design-system |
From designer tokens to ready-to-use frontend material |
systemjs-require |
require() for SystemJS |
🏠 Home automation & IoT — GollumDom
A house wired to MQTT: every appliance that speaks a proprietary API gets a bridge, every bridge gets a Home Assistant add-on.
My Home Assistant add-on repository — the single URL that installs every bridge below straight into your instance.Home Assistant add-ons Docker
|
A Node.js build of MQTT Explorer you can run on a server and open in a browser — no desktop install, works from anywhere on the LAN.Node.js MQTT self-hosted |
|
One bridge per stubborn vendor API, all publishing to the same broker: omv2mqtt — OpenMediaVault NAS aldes2mqtt — Aldes ventilation & heat pump synology_ds2mqtt — Synology DiskStation meteoagricole2mqtt — agricultural weather data enedisgateway2mqtt — French grid consumption |
The other half of home automation is a soldering iron and a compiler: IRRemoteWifi — an ESP Wi-Fi IR blaster in C++, with its own HTTP API and admin UI ir_remote_electrolux — the Electrolux hood protocol captured, decoded and re-emitted Arduino-IRremote — the IR library underneath, forked and kept in step tp-link-legacy-integration — keeps older TP-Link gear alive in HA ha_second_core — a second Home Assistant core, side by side lovelace-script-mod — custom scripts inside Lovelace cards |
Not libraries this time: finished products. A Docker image, a web interface, a README that assumes nothing — and, for most of them, a write-up on the blog explaining why it exists.
Claims the free games from Epic, Steam, GOG and Prime Gaming / Luna, twice a day, on its own. Node.js + Playwright in Docker, a Vue 3 interface for the offers and the history, and a built-in VNC that opens a real Chrome when a store needs a password and a 2FA code — then shuts itself back down to headless. Notifications to Discord, Telegram, ntfy or a webhook, including an unlock link that resumes the claim by itself.Node.js Playwright Vue 3 Docker→ the write-up |
Collects as many POP3 mailboxes as you like and forwards them into Gmail — by IMAP drop, through the Gmail API, or over plain SMTP. Written because Gmail's own "check mail from other accounts" is slow and silently gives up. Keeps sender, date, Message-ID, thread, attachments and even the DKIM signature intact, so it reads as a real redirection. NestJS + Vue 3, interface in six languages.NestJS TypeScript Vue 3 Docker
|
Resizing and format conversion on the fly, over HTTP: every variant is just an address — /photos/beach.jpg/_cover_320_320_80.webp. Built to sit behind a cache, so each variant is computed exactly once.Node.js WebP / AVIF amd64 · arm64 · armv7→ the write-up |
🌍 ip-info Node.js MaxMind self-hosted→ the write-up |
BetaSeries ships a Plex integration and nothing for Jellyfin. These templates bridge the gap through the official Webhook plugin alone — episodes and films marked as watched, no API key, no password, not a line of code to write.Jellyfin Handlebars webhook
|
A Manifest V3 browser extension that keeps several claude.ai accounts side by side and switches between them in one click. It snapshots the session cookies into a profile and labels it automatically with the account name and e-mail.MV3 Chrome / Firefox cookies
|
And the smaller pieces: auto-makefile — a self-documenting Makefile shared across projects (write-up) · docker-osm-proxy — a minimalist OpenStreetMap tile proxy · nginx-proxy — nginx configured entirely from environment variables · docker-certbot-ovh-cron — Certbot with the OVH DNS challenge, on a cron · gitlab-coverage — coverage badges for GitLab CI
Regenerated daily from the public GitHub API by scripts/generate.mjs. No private repository name or private activity is exposed.
⛏️ Minecraft — GollumTeam
Where it started, and where I learned to ship for people who file bug reports. A Minecraft mod team, in Java on Forge, from 2013 to 2016 — kept online, still forked.
The one that travelled furthest: pistons that extend well past one block, with the movement, the collisions and the redstone behaviour rewritten to match. Started in 2013 and still maintained eight years later.Java Forge redstone
|
Recruitable soldiers to garrison your castle — custom entities, their AI, their equipment and the whole hiring economy around them.Java entity AI gameplay
|
A well-loved furniture mod had been abandoned with only a decompiled build left. This is the clean re-implementation, plus a compatibility layer so existing worlds survived the switch.Java reverse engineering
|
The shared foundation under all of the above — registration, config, packets, structure generation — with its own tutorials. The same instinct as the Composer and npm packages further up this page, ten years earlier.Java library Forge
|
Also in the attic: RedoriSBuildingsAndDungeons — generated buildings and dungeons with loot · AtlanteanMillenaire · GollumAutoReplace — bulk block, item and tile-entity replacement · GravitationnalBlock · RenderCore — a coremod restoring the 1.7 rendering hooks lost in 1.8 · Custom-Steve-Server · and the solo tooling: custom block creator, ID changer, ID dumper
small packages · one job each · self-hosted first
open source by default · document at the source · make it reproducible
if a device speaks a proprietary API, it gets a bridge
GitHub · GollumSF · GollumJS · GollumDom · GollumTeam · smea.tech · Français





