Skip to content
View cateim's full-sized avatar
🏠
Working from home
🏠
Working from home

Block or report cateim

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.

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
cateim/README.md

Self-Labs

Gustavo Cateim

selflabs.org store Vitória, ES, Brazil

A one person lab, with uptime.


I build firmware for Bitcoin hardware wallets, management systems for the Brazilian public sector, and infrastructure that runs on hardware I own. All of it under Self-Labs, which is a laboratory, not a company: the "self" is literal. Self-hosted, self-custody, done by hand.

No managed database without a reason. No deploy that depends on someone logging into a server. No private key inside a machine that talks to the internet.

When something broke in production, it is written in the repository that it broke, with a date and a file reference. That is traceability, not modesty.

What is actually running

System What it solves Notable detail
Wallet Store Bitcoin only store, no payment processor in the middle Watch only xpub, every address derived locally. Refuses to boot if the configured keys derive an unexpected address. Buyer data erased 72h after delivery.
ALFERES Personnel, leave and health management for a military police unit Around 500 people inside, in daily use
Jade DIY Turns off the shelf ESP32 boards into a working Blockstream Jade Signed firmware, web flasher, battery and touch logic for four different boards
Radar de Promo Price tracking that pings when a deal is real TypeScript, self-hosted, no affiliate noise
cups Latest OpenPrinting CUPS for Debian and Ubuntu Built from official source because the distro packages were years behind
selflabs.org The lab's landing page Astro, bilingual, Cloudflare Workers. Numbers on it come from the GitHub API, never typed by hand

Upstream

Pull requests accepted in 8 repositories owned by 7 different people, plus write access to somebody else's project.

Project What I sent
Blockstream/Jade Five pull requests accepted into the official firmware of the Jade hardware wallet: swapped buttons on TTGO and USB JTAG on Waveshare S3 (#260), Windows connectivity and USB detection (#268), battery stability and power logic across T-Display, T-Display S3 and Waveshare S3 (#270, #271), and releasing the touch handles before deleting the i2c bus (#307)
oroderico/origo Write access to someone else's repository, where I fix bugs. It generates a BIP39 seed from human thrown dice, built after roughly 88 million dollars left Coldcard wallets through a build flag that lowered entropy unnoticed for five years
akitaonrails/ai-memory Native Windows hook command with no shell spawn, hook merging instead of overwriting third party hooks, JSON output to kill debug spam
akitaonrails/FrankMD Multi arch amd64 and arm64 Docker publishing, tag normalisation, version in the About dialog
RobHofmann/HomeAssistant-GreeClimateComponent Brazilian Portuguese translation
albaintor/homeassistant_electrolux_status Two fixes on appliance status handling
ayghri/i-have-adhd Raised the SessionStart hook timeout so the always on mode is not silently dropped under load

Recurring theme: I run Windows and ARM64, which is exactly where most projects quietly break.

The Jade pull requests show as closed rather than merged because the maintainers land the changes through their own branch. The fixes are in the shipped firmware.

How everything ships

push to master
      |
      v
  CI: tests, typecheck, image build on a NATIVE arm64 runner (never QEMU)
      |
      v
  webhook -> Portainer stack pulls the repo
      |
      v
  Orange Pi 5 / Ampere VPS

No manual step, no SSH at two in the morning, same path in every project. The deploy job fails loud on any HTTP status outside 2xx, so a broken redeploy never looks like a green build.

Written down because it broke

  • The dev server died on every Vite re optimisation. EPERM ... rmdir node_modules\.vite\deps, then a libuv assertion. Cause: 345 of 345 directories in the checkout carried the Windows ReadOnly attribute, and Node's rmdir returns EPERM on those. Documented in self-labs/self-labs CLAUDE.md.
  • An animated trace where the dot vanished at 79% of the band. The trace scrolled and the head ran, so what you saw was the difference between two speeds, and that difference is always a whole multiple of 120 units while a browser window is any width at all. Fixed by removing the shape, not by patching the symptom.

Stack

Layer
Firmware C ESP-IDF ESP32 / S3
Web TypeScript Node.js Astro Vanilla JS PHP Python C#
Data PostgreSQL SQLite
Infra Docker Portainer Cloudflare Workers Cloudflare Tunnel Caddy GitHub Actions Forgejo
Hardware Orange Pi 5 Ampere VPS OpenWrt Home Assistant

Elsewhere

selflabs.org · store.selflabs.org · @self-labs · @gucateim · contato@selflabs.org

Pinned Loading

  1. jade-diy jade-diy Public

    Repositório do projeto Jade Wallet DIY 🛠️💡🚀

    Batchfile 4

  2. Jade Jade Public

    Forked from Blockstream/Jade

    Jade hardware wallet

    C 1

  3. DIY DIY Public

    Repositório de projetos DIY para resolver problemas reais com tecnologia de baixo custo. Sem frescura, só solução. 🛠️💡🚀

    HTML 1

  4. git-commands git-commands Public

    Git Commands 🛠

  5. Blockstream/Jade Blockstream/Jade Public

    Jade hardware wallet

    C 487 123

  6. jadediyflasher jadediyflasher Public

    Forked from Blockstream/jadediyflasher

    A webpage to flash DIY devices into Jade

    TypeScript