Estudo de Caso

Website SCBorbense

2026 · Website de Clube & PainelVer site ao vivo ↗

O website oficial do Sport Clube Borbense — o clube de futebol de Borba, fundado em 1945 — e o painel de administração de onde o clube o gere: jogos e classificações dos nove escalões, fichas de jogo, plantel, notícias, app nativa e notificações push, sobre uma stack que não custa nada ao clube.

Website SCBorbense

O problema

O Sport Clube Borbense não tinha uma verdadeira casa na web. Jogos, resultados e notícias viviam espalhados pelas redes sociais — bom para chegar aos seguidores, mas invisível para quem procura o clube e impossível de consultar como registo da época.

A restrição mais difícil era a manutenção. Um clube local não tem programadores nem orçamento, por isso o que eu construísse tinha de ser editável por voluntários, no telemóvel, minutos depois do apito final — e tinha de continuar a ficar bem quando ninguém preenchesse alguma coisa.

Decisões-chave

01

De um CMS alugado para um painel do clube

A primeira versão usava o Notion como backend de conteúdo. Pôs o clube online depressa, mas o tecto chegou cedo: sem cargos, sem registo de quem fez o quê, sem forma de validar o que alguém escrevia numa tabela. O site corre agora sobre Supabase Postgres com um painel que construí em admin.scborbense.com — contas com cargos, registo de atividade em cada escrita, e formulários que percebem mesmo o que é um jogo.

02

A base de dados não confia em ninguém

A aplicação é o único cliente. Todas as tabelas têm row-level security activa e forçada com zero políticas, e a chave pública não dá acesso a coisa nenhuma; a chave de serviço é exclusivamente do servidor, num módulo que rebenta a build se algum componente de cliente lhe tocar. A autorização é reverificada a cada pedido — é isso que faz desactivar uma conta ter efeito no clique seguinte, e não no login seguinte.

03

Tudo opcional, e nada imprime um traço

Os jogadores da formação são inscritos antes de se decidir onde jogam, e uma ficha de jogo é preenchida no telemóvel com metade dos minutos em falta. Por isso todos os campos são opcionais e os vazios são omitidos em vez de mostrarem um travessão — uma ficha meia preenchida é o estado esperado, não um defeito. A idade é derivada da data de nascimento e nunca guardada, e a data fica só no painel, porque o plantel inclui menores.

04

Classificação importada por semana, nunca escrita à mão

A fonte oficial da federação bane o acesso automático logo ao primeiro pedido, por isso a tabela é importada do zerozero.pt por um cron às segundas e validada antes de gravar: número de equipas dentro do razoável, o Borbense presente na tabela, e jogos iguais a vitórias mais empates mais derrotas. Uma importação falhada mantém a tabela da semana anterior com a data à vista, em vez de publicar uma errada — uma tabela que contradiz os resultados do próprio clube é pior do que tabela nenhuma.

05

Um clube, várias portas de entrada

Web Push no site, uma PWA instalável, e uma app nativa em Expo com preferências de notificação por tipo — notícias, jogos, golos. Os posts do clube são importados do Facebook por cron e deduplicados pelo id do post, por isso a página de notícias mantém-se sozinha. Uma loja Shopify com a identidade do site — as mesmas tipografias, o mesmo azul e amarelo — está feita à espera do equipamento e do merchandising do clube.

06

O site pode fechar sem apagar a luz

O estado do site (Online / Manutenção / Contagem Decrescente) é lido do Vercel Edge Config a cada pedido em vez da base de dados, para o interruptor não custar uma query numa visita normal. Com o site fechado, a homepage continua a responder 200 com conteúdo real e indexável para o domínio poder entrar no índice do Google; todos os outros caminhos são 503 e noindex. O HTML é o mesmo para pessoas e para robôs.

Tecnologias

Next.jsTypeScriptSupabaseVercel

Next.js 16 App Router e TypeScript na Vercel, Supabase Postgres e Auth, Upstash Redis para subscrições push e rate limiting, Vercel Edge Config e Blob, Cloudflare Turnstile, Web Push por VAPID, Sentry para erros, e uma loja Shopify (Dawn) para a loja do clube.

O resultado

O clube gere o seu próprio site. Os voluntários publicam notícias, resultados, fichas de jogo e alterações no plantel a partir do telemóvel; a classificação actualiza-se sozinha todas as segundas de manhã; os adeptos recebem uma notificação quando o resultado muda. Nove escalões com jogos, plantéis e classificações, fichas de jogador completas, a história do clube desde 1945 — e uma factura mensal de zero.

09
Escalões com jogos, plantéis e classificação
0€
Custo mensal de funcionamento para o clube
1945
História do clube online

Em produção

Página de jogos do SCBorbense
Jogos e resultados, organizados por escalão.
Ficha de jogador do SCBorbense
A ficha mostra o que o clube preencheu, e mais nada.
Página do plantel do SCBorbense
O plantel sénior, com filtros por posição.
Projeto seguinteScanBite →

Contacto

Vamos construir algo juntos.

Tens um projeto em mente ou queres só dizer olá? A minha caixa de entrada está sempre aberta — costumo responder no próprio dia.

Disponível para estágios & freelance