V vitor.rocha
todos os projetos // projeto · go no navegador

LinkQ

O GitHub Pages não executa servidor — então o servidor virou WebAssembly: validação, códigos curtos, QR Code, DOM e tema, tudo escrito em Go e executado pelo navegador.

Banner do projeto LinkQ

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.