Skip to content
View Smeagolworms4's full-sized avatar

Organizations

@GollumTeam @SmeagolMediacenterTeam @GollumJS @GollumSF @GollumJS-Archive @Teambuddio @redorigames @GollumDom

Block or report Smeagolworms4

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Smeagolworms4/README.md
Damien Duboeuf — software architect, backend and front-end

Followers GollumSF GollumJS GollumDom GollumTeam Blog

🇫🇷 Cette page en français

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

Latest posts on 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.

→ Read smea.tech · RSS


~/ Toolbox

Stack: PHP, Symfony, Doctrine, TypeScript, Vue, React, Node, Docker, Nginx, MQTT, Home Assistant, ESPHome, Arduino, Raspberry Pi

🐘 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
Docker pulls

🌉 The *2mqtt family

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

📡 Firmware & integrations C++

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

📦 Self-hosted apps

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

🖼️ image-resizer Docker pulls

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 Docker pulls

Everything an IP address can tell you — country, city, coordinates, timezone, network, AS. The lookup is a local file read from MaxMind data: nothing about your visitors leaves the machine, and the only rate limit is yours.

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


📊 GitHub pulse

Public GitHub statistics for Smeagolworms4

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


$ cat PRINCIPLES

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

Pinned Loading

  1. GollumSF/core-bundle GollumSF/core-bundle Public

    PHP 1

  2. GollumSF/email-bundle GollumSF/email-bundle Public

    PHP 1

  3. GollumJS/GollumJS-Component GollumJS/GollumJS-Component Public

    JavaScript

  4. GollumJS/gollumjs-log GollumJS/gollumjs-log Public

    Override console.log but keep file and line number.

    JavaScript

  5. GollumJS-Archive/GollumJS GollumJS-Archive/GollumJS Public

    JavaScript 2