GabrielSignorini

Full Stack Engineer

I build web software, front end first, and I write games for fun.

I work in TypeScript across React, Next.js, Node.js and PostgreSQL, remotely from Cascavel, Brazil.

Work

Every order on its own label.

ExpedL is my biggest project so far: a Windows app that turns Shopee's shipping labels into PDFs for a 4×6 thermal printer, one whole order to a label, without a single label leaving the computer.

ExpedL's main window in the dark theme. On the left, a batch of 51 orders with tracking code, order ID, routing, pages and status, under filters that count orders with alerts, duplicates, orders already shipped and orders with 3 or more pages. On the right, order #006, with 3 pages, and the items read from its checklist. At the bottom, 38 orders to ship, 49 labels, and the Generate PDF button.
The main window with a synthetic batch. The interface is in Portuguese.

A friend prints the shipping labels at a company that sells on Shopee. Each order is two pages, a label and a checklist, printed two to a 4×6 sheet, so one sheet carries one order. When a checklist spills onto a third page, every label after it prints stuck to the order before. ExpedL gives every order an even number of pages, with a blank after an odd one, and builds each 4×6 label itself, so it prints at 100% with nothing to set up. It also keeps an encrypted history, so an order that already went out doesn't print twice.

Shopee's files hold no text, only one bitmap per page, so there is no ZPL library underneath. A small interpreter accepts a closed list of commands and rejects anything else instead of printing a wrong label, and the PDF writer is my own too. Barcodes are redrawn with whole-dot bars, so the 44-digit invoice barcode still reads on the reduced page: 50 of 50 in a digital reader, against 0 of 50 from the free converter it replaces. Order IDs, routing and items come from the OCR built into Windows, and the app never opens a network connection.

Before

With ExpedL

Order A runs to three pages. Before, every sheet after it carries the end of one order and the start of the next. With a blank page after A, order B starts a sheet of its own.
Version
1.0.0, released 28 Sep 2026
Runs on
Windows 10 and 11, 64-bit. One 62 MB .exe, no admin rights
Built with
C#, .NET 10, WPF and the Windows OCR
Tests
482 automated, run in CI on a clean Windows machine
Size
About 25,000 lines of C# and XAML, written in two days
Network
None. No account, no cloud, no telemetry

Commercial · licensed per computer · trial key by email

A 3D engine that draws in text.

CP437-Engine renders scenes with coloured light, shadows and traced reflections, using only text characters. There is no rendering library: projection, clipping, the z-buffer and analytic ray tracing are all written by hand, and the last pass runs on the GPU with WebGPU and a CRT effect. It began as synth-ascii-wallpaper, an outrun wallpaper drawn entirely in ASCII.

A toolkit for everyday TypeScript.

import { clamp, toNumber, Random } from "@gabreusi/hyrax";clamp(5, 10, 0); // 5: bounds in either ordertoNumber("abc"); // 0, never NaNconst dm = new Random("hailtotheking");dm.roll("1d20+5"); // attack: same every rundm.roll("4d6kh3"); // ability score: best 3 of 4
@gabreusi/hyrax
Anywhere: numbers, strings, Random, debounce, retry and timeout, with no DOM and no React. About 6.5 kB compressed
@gabreusi/hyrax/dom
Browsers: listeners, clicks outside, keys, storage, the clipboard, scroll lock, CSS values. About 2.2 kB
@gabreusi/hyrax/react
Hooks, Portal and hx for React 18 and 19. About 3.5 kB

Hyrax is a TypeScript toolkit with no runtime dependencies, and every function in it follows two rules. It takes its input in every shape that input really comes in, and types each shape exactly: the common case gets a short call, like clamp(v, max) next to clamp(v, min, max), and the return type lists every value that can come back, fallbacks included. And it has an answer for every input its types allow. Bounds work in either order, an empty range gives a neutral result where other code would give NaN, a null target does nothing, and code that needs a browser falls back quietly on the server.

Hyrax throws in one case only: a configuration no correct program can write, such as random.boolean(50) when a chance goes from 0 to 1. Bad data and a missing browser happen at run time, and the caller can't always prevent them. A bad configuration is a bug, and hiding a bug is worse than reporting it. Nothing runs at import, and a CI check breaks the build if the core ever reaches for window or document. A seed gives the same numbers in every runtime and changes them only in a major version. Every example in the docs is type-checked against the package on npm, and the ones for the core also run, so a stale answer fails the build.

Personal project · 1.0.0-rc.1 on npm · MIT

npm install @gabreusi/hyrax

Smaller projects

  • NEJS

    Experiment in drawing an NES-style platformer in plain JavaScript on a canvas, with a sprite editor and debug view.

    JavaScript / pushed 20 Sep 2026

    SourceLive

  • vod-metadata

    Look up the metadata of a Twitch VOD from its URL. React front end for vod-metadata-api.

    CSS / pushed 20 Sep 2026

    SourceLive

  • vod-metadata-api

    Small Express API that fetches Twitch video data, keeping the Twitch credentials on the server.

    TypeScript / pushed 20 Sep 2026

    Source

  • ProficiencySurge

    Vintage Story mod where skills level up through use. Only the shovel so far.

    C# / pushed 20 Sep 2026

    Source

  • 100prisoners

    Simulation of the 100 prisoners problem in TypeScript, using the loop-following strategy.

    TypeScript / pushed 20 Sep 2026

    Source

Every repository is on GitHub.

All repositories

Background

Front-end Engineer

Maker · Oct 2023 to Jan 2026

Co-owned the internal framework behind the seven modules of ConecteMe, a retail integration platform. Most of two years went into rendering performance and state handling.

Independent Developer

Jan 2026 to present

Built and run an online store for a family retail business, front to back, sized to what a small business can pay.

Download CV (PDF)

What I work with

Languages
TypeScript / JavaScript / SQL
TypeScript from the framework layer to the API.
Front-end
React / Next.js / Tailwind CSS / Internal design system and framework work
Two years of it inside a framework that seven modules share.
Testing
Jest
Unit tests for the functions I wrote at Maker.
Back-end and data
Node.js / Express / PostgreSQL / Prisma / Redis / REST APIs
Infrastructure
Vercel / Fly.io / Cloudflare / Docker / Git
Where the online store runs, front to back.

Latest

  1. Post

    What I did this weekend: turning a label complaint into an app

    A friend told me the Shopee shipping labels he prints at work kept coming out misaligned. Over four days I turned that complaint into ExpedL, a Windows app that fixes it and does a few things more. This is how it went, including the parts I still haven't proven.

    15 min read / devlog / dotnet / expedl / shopee / wpf

  2. Post

    Hello World!

    After three years working as a developer, I decided to open a personal space to share my work and my projects. Here I can also talk about myself, my hobbies and my thoughts. I am very happy with this new project, and I hope you like it too!

    1 min read / meta / personal

  3. Photo

    Pixel art I made for a commission! That's how I discovered that painting dolphins is very hard....

A role, a team, or an idea?

Write to me about any of them. I answer from Cascavel, in Brazil.

Remote, contractor based in Brazil.
Cascavel, Paraná (UTC-3), overlapping with US business hours.

Tell me about the role, the team, or the idea.

Your details are used only to reply to you. They are not shared.