Next.js 16 App Router
O app é construído com Next.js usando App Router. Renderização de páginas, route handlers, redirects e server actions vivem dentro da mesma estrutura de framework.
Um pequeno encurtador de URL full-stack construído com Next.js App Router. Ele usa uma tela administrativa protegida por senha para criar e apagar links, armazena registros de slug em Redis, usa fallback em memória no desenvolvimento local e resolve requisições públicas em <code>/{slug}</code> por meio de uma rota de redirecionamento.
Ao vivo em: https://sugiro.to
As peças centrais que fazem o fluxo de links curtos com marca própria funcionar.
O app é construído com Next.js usando App Router. Renderização de páginas, route handlers, redirects e server actions vivem dentro da mesma estrutura de framework.
A interface principal é uma pequena UI administrativa em React para criar e apagar links curtos. Ela é propositalmente compacta e focada em uma única tarefa operacional, em vez de funcionar como um dashboard mais amplo.
O visual é feito com classes utilitárias do Tailwind e tokens compartilhados em app/globals.css. O resultado é uma interface escura, minimalista, com acentos em laranja e formulários leves.
Mutações como login, logout, criação e exclusão vivem em app/actions.ts, enquanto o redirecionamento público é tratado por um arquivo de rota dedicado, sem depender de um serviço de API separado.
Os registros de links passam pela abstração em lib/redis.ts. Em produção ela se conecta ao Redis via <code>ioredis</code>; no desenvolvimento local, pode cair para um Map em memória quando <code>REDIS_URL</code> não está definido.
A autenticação é propositalmente simples: a senha é comparada com ADMIN_TOKEN e depois persistida em um cookie HTTP-only usando helpers em lib/auth.ts.
O caminho de execução desde a tela administrativa até a resolução de um link curto.
A página principal em app/page.tsx chama o helper de autenticação antes de renderizar. Usuários não autenticados são redirecionados para a tela de login.
Os fluxos dos formulários estão conectados às server actions em app/actions.ts . Essas actions validam entrada, checam autenticação, geram slugs quando necessário e disparam revalidação de cache para a página administrativa.
Slugs customizados são validados com helpers em lib/slug.ts . Se nenhum slug é enviado, o app testa alguns candidatos aleatórios em base62 até encontrar um ainda não usado.
A camada de Redis salva cada registro, mantém um índice de slugs e devolve a lista ordenada por data de criação. A mesma interface também é usada pelo store em memória para trabalho local sem Redis.
Requisições para app/[slug]/route.ts fazem lookup do slug e emitem o redirect. Se o slug não existir, a rota devolve resposta 404.
O repositório é pequeno, mas cada pasta tem um papel bem específico.
app/page.tsx app/login/page.tsx app/[slug]/route.ts app/actions.ts lib/auth.ts lib/redis.ts lib/slug.ts
Este app é propositalmente mais estreito do que algo como Card Tracker. Ele não é um dashboard CRUD genérico nem um produto grande com múltiplas páginas. A arquitetura central é um pequeno fluxo administrativo autenticado combinado com um único endpoint público de redirect e uma abstração fina de armazenamento.
A persistência é simples e centrada em registros de slug.
Cada registro armazena o slug, a URL de destino e o momento de criação.
As chaves do Redis são separadas por slug e rastreadas por um índice ordenado.
A listagem usa esse índice, em vez de uma camada relacional de consultas.
Não há schema de banco, ORM ou sistema de migrações neste projeto.
Se REDIS_URL não estiver configurada, o app registra um aviso e usa um Map em memória.
Esse fallback simplifica bastante a configuração local, mas perde dados quando o processo reinicia.
A mesma interface de store é usada para Redis e memória, então o restante do app não precisa mudar.
Isso deixa o boot local especialmente leve.
A parte interessante do app é como ações administrativas e redirects públicos compartilham o mesmo código-base.
app/page.tsx + app/login/
O lado administrativo usa páginas renderizadas no servidor com checagem de auth, formulários simples e server actions para todas as mudanças de estado. Não existe uma camada de API cliente separada para os fluxos centrais.
app/[slug]/route.ts
O lado público é um route handler que recebe o slug, consulta a camada de armazenamento e redireciona para a URL de destino. Isso mantém o comportamento público extremamente pequeno e direto.
O fluxo local é propositalmente mínimo.
npm install npm run dev npm run build npm start
O projeto usa o ciclo padrão do Next.js: npm run dev para desenvolvimento local e npm run build para verificação de produção.
ADMIN_TOKEN é obrigatória para acessar a interface administrativa.
REDIS_URL é usada para persistência em Redis na produção e pode ser omitida no modo local em memória.
Node.js, npm e o toolchain padrão do Next.js bastam para rodar o projeto.
Não há provedor externo de auth, ORM ou sistema de jobs em segundo plano.
Short URL é uma pequena utility full-stack em Next.js construída em torno de server actions, auth por cookie, armazenamento de links em Redis e uma rota direta de redirect. A força dele não está na complexidade, mas no foco: um fluxo administrativo com marca própria, um endpoint público por slug e uma configuração local de atrito muito baixo.