GabrielSignorini

Desenvolvedor Full Stack

Programo software para a web e jogos por diversão.

Trabalho com TypeScript em React, Next.js, Node.js e PostgreSQL, de forma remota.

Projetos

Cada pedido na sua etiqueta.

O ExpedL é o meu maior projeto até hoje: um app para Windows que transforma as etiquetas de envio da Shopee em PDF para a impressora térmica 4×6, um pedido inteiro por etiqueta, sem que nenhuma etiqueta saia do computador.

Janela principal do ExpedL no tema escuro. À esquerda, um lote de 51 pedidos com rastreio, ID do pedido, roteamento, páginas e situação, sob filtros que contam pedidos com alerta, duplicados, já expedidos e com 3 ou mais páginas. À direita, o pedido #006, com 3 páginas, e os itens lidos do checklist. Embaixo, 38 pedidos a expedir, 49 etiquetas e o botão Gerar PDF.
A janela principal com um lote sintético.

Um amigo imprime as etiquetas de envio numa empresa que vende na Shopee. Cada pedido tem duas páginas, a etiqueta e o checklist, impressas duas por folha 4×6, então cada folha leva um pedido. Quando um checklist passa para uma terceira página, toda etiqueta depois dele sai grudada no pedido anterior. O ExpedL dá a todo pedido um número par de páginas, com uma página em branco depois de um ímpar, e monta ele mesmo cada etiqueta 4×6, que sai a 100% sem configurar nada. Ele também guarda um histórico cifrado, para que um pedido já expedido não saia duas vezes.

Os arquivos da Shopee não têm texto, só uma imagem por página, então não há biblioteca de ZPL por baixo. Um interpretador pequeno aceita uma lista fechada de comandos e rejeita o resto em vez de imprimir uma etiqueta errada, e o gerador de PDF também é meu. Os códigos de barras são redesenhados com barras de pontos inteiros, e o código de 44 dígitos da NF-e continua legível na página reduzida: 50 de 50 num leitor digital, contra 0 de 50 no conversor gratuito que ele substitui. O ID do pedido, o roteamento e os itens vêm do OCR do próprio Windows, e o app nunca abre uma conexão de rede.

Antes

Com o ExpedL

O pedido A tem três páginas. Antes, toda folha depois dele leva o fim de um pedido e o começo do seguinte. Com uma página em branco depois de A, o pedido B começa numa folha só dele.
Versão
1.0.0, lançada em 28/09/2026
Roda em
Windows 10 e 11, 64 bits. Um .exe de 62 MB, sem administrador
Feito com
C#, .NET 10, WPF e o OCR do Windows
Testes
482 automáticos, rodados no CI numa máquina Windows limpa
Tamanho
Cerca de 25.000 linhas de C# e XAML, escritas em dois dias
Rede
Nenhuma. Sem conta, sem nuvem, sem telemetria

Comercial · licença por computador · chave de teste por e-mail

Um motor 3D que desenha com texto.

A CP437-Engine renderiza cenas com luz colorida, sombras e reflexos traçados, usando apenas caracteres de texto. Não há biblioteca de renderização: projeção, recorte, z-buffer e ray tracing analítico foram escritos à mão, e a última etapa roda na GPU, com WebGPU e um efeito de CRT. Ele começou como o synth-ascii-wallpaper, um papel de parede no estilo outrun desenhado inteiramente em ASCII.

Um kit de ferramentas para o TypeScript do dia a dia.

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
Em qualquer lugar: números, strings, Random, debounce, retry e timeout, sem DOM e sem React. Cerca de 6,5 kB comprimido
@gabreusi/hyrax/dom
Navegadores: listeners, cliques fora, teclas, storage, área de transferência, trava de rolagem, valores CSS. Cerca de 2,2 kB
@gabreusi/hyrax/react
Hooks, Portal e hx para React 18 e 19. Cerca de 3,5 kB

O Hyrax é um kit de ferramentas para TypeScript sem nenhuma dependência em tempo de execução, e toda função dele segue duas regras. Ela aceita a entrada em todos os formatos em que essa entrada realmente chega e tipa cada formato com exatidão: o caso comum tem uma chamada curta, como clamp(v, max) ao lado de clamp(v, min, max), e o tipo de retorno lista todo valor que pode voltar, fallbacks incluídos. E ela tem uma resposta para toda entrada que os tipos permitem. Os limites funcionam em qualquer ordem, um intervalo vazio dá um resultado neutro onde outro código daria NaN, um alvo null não faz nada, e o código que precisa de navegador cai num fallback silencioso no servidor.

O Hyrax só lança erro em um caso: uma configuração que nenhum programa correto escreveria, como random.boolean(50) quando uma chance vai de 0 a 1. Dados ruins e a falta de um navegador acontecem em tempo de execução, e quem chama nem sempre consegue evitar. Uma configuração ruim é um bug, e esconder um bug é pior do que avisar. Nada roda na importação, e uma checagem de CI derruba o build se o núcleo algum dia usar window ou document. Uma semente gera os mesmos números em qualquer runtime e só os muda numa versão major. Todo exemplo da documentação tem os tipos verificados contra o pacote do npm, e os do núcleo também rodam, então uma resposta desatualizada derruba o build.

Projeto pessoal · 1.0.0-rc.1 no npm · MIT

npm install @gabreusi/hyrax

Projetos menores

  • NEJS

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

    JavaScript / último push em 20 de set. de 2026

    Código-fonteAo vivo

  • vod-metadata

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

    CSS / último push em 20 de set. de 2026

    Código-fonteAo vivo

  • vod-metadata-api

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

    TypeScript / último push em 20 de set. de 2026

    Código-fonte

  • ProficiencySurge

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

    C# / último push em 20 de set. de 2026

    Código-fonte

  • 100prisoners

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

    TypeScript / último push em 20 de set. de 2026

    Código-fonte

Todos os repositórios estão no GitHub.

Todos os repositórios

Trajetória

Engenheiro Front-end

Maker · out. 2023 a jan. 2026

Co-responsável pelo framework interno por trás dos sete módulos do ConecteMe, uma plataforma de integração para o varejo. A maior parte de dois anos foi dedicada a desempenho de renderização e gerenciamento de estado.

Desenvolvedor Independente

jan. 2026 até hoje

Construí e mantenho uma loja online de varejo, do front-end ao back-end, dimensionada para o que uma pequena empresa consegue pagar.

Baixar currículo (PDF, em inglês)

Com o que eu trabalho

Linguagens
TypeScript / JavaScript / SQL
TypeScript da camada do framework até a API.
Front-end
React / Next.js / Tailwind CSS / Design system interno e trabalho em framework
Dois anos disso dentro de um framework compartilhado por sete módulos.
Testes
Jest
Testes unitários das funções.
Back-end e dados
Node.js / Express / PostgreSQL / Prisma / Redis / APIs REST
Infraestrutura
Vercel / Fly.io / Cloudflare / Docker / Git

Recentes

  1. Post

    O que fiz esse fim de semana: uma reclamação que virou app

    Um amigo me contou que as etiquetas da Shopee que ele imprime no trabalho viviam saindo desalinhadas. Em quatro dias, transformei essa reclamação no ExpedL, um app para Windows que resolve isso e faz mais algumas coisas. Aqui está como foi, inclusive o que ainda não testei.

    15 min de leitura / devlog / dotnet / expedl / shopee / wpf

  2. Post

    Olá mundo!

    Após três anos trabalhando como desenvolvedor, decidi criar um espaço pessoal para compartilhar meu trabalho e meus projetos. Aqui também posso falar sobre mim, meus hobbies e meus pensamentos. Estou muito feliz com este novo projeto e espero que vocês gostem!

    1 min de leitura / meta / personal

  3. Foto

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

Uma vaga ou uma ideia?

Escreva para mim.

Remoto, como prestador de serviços (PJ)
Cascavel, Paraná (UTC-3)

Conte sobre a ideia.

Seus dados são usados apenas para responder a você. Não são compartilhados.