Visão geral
O LinkQ encurta URLs e gera o QR Code de cada link, com histórico e cópia rápida. A particularidade está em onde o código roda: o projeto é Go compilado para WebAssembly, e os únicos JavaScripts da página são a ponte oficial do Go e um carregador de poucas linhas.
O problema
Hospedagem estática não executa nada no servidor — um encurtador tradicional, com API e banco, está fora de questão no GitHub Pages. A pergunta do projeto era: dá para manter toda a lógica em Go mesmo assim, com testes de verdade e sem reescrever o núcleo em JavaScript?
A solução
O Go é compilado com GOOS=js GOARCH=wasm e o binário vira um arquivo estático que o navegador executa. A lógica de negócio — validação e normalização de URLs, recusa de esquemas perigosos como javascript: e data:, geração de códigos curtos e o serviço de links — vive em pacotes puros, sem tocar o navegador. A persistência usa localStorage atrás de uma interface de repositório injetável, e o QR Code é gerado pela biblioteca go-qrcode vendorizada.
Funcionalidades
- Encurtamento com código curto único e histórico local
- QR Code de cada link, com download em PNG
- Validação que recusa esquemas perigosos (javascript:, data:, file:)
- Redirecionamento do link curto sem poluir o histórico do navegador
- Tema claro/escuro e interface controlada inteiramente pelo Go
- 18 testes em Go nativo, rodando sem navegador
Arquitetura
A separação é imposta pelo compilador: os pacotes de lógica não importam syscall/js e são testáveis com go test comum; os que tocam o navegador (DOM, storage, UI) carregam a build tag js && wasm e nem entram na compilação nativa. O serviço recebe o repositório por interface — trocar o localStorage por um backend de verdade seria alterar um arquivo.
Screenshots




Desafios & aprendizados
O custo do caminho é explícito: o binário carrega o runtime do Go inteiro e pesa 3,7 MB (1 MB comprimido) — a documentação do projeto discute esse trade-off abertamente. Os QR Codes gerados foram verificados por decodificação real em múltiplas escalas, e o link curto funciona em cinco formas diferentes de hospedar a página, da raiz do Pages a subcaminhos.