Frente do site da BigLearn, consultora portuguesa de inteligência artificial. HTML, CSS e JavaScript escritos à mão, sem framework, sem passo de build e sem dependências externas em execução.
Publico-o porque as decisões técnicas por trás dele são discutíveis — e vale a pena discuti-las.
Não há React, não há jQuery, não há Tailwind, não há CDN. Nenhum npm install, nenhum
node_modules, nenhum passo de compilação. O que está no repositório é o que o servidor envia.
Três razões, por ordem de peso:
Cadeia de fornecimento. Cada script carregado de um CDN é código de terceiros a correr no domínio do cliente, com acesso ao DOM e aos formulários. Para um site que recolhe contactos, essa superfície não se justifica.
Longevidade. Um site institucional é para durar anos sem manutenção. Ferramentas de build apodrecem — a versão do Node muda, o bundler é abandonado, a configuração deixa de correr. HTML servido directamente não apodrece.
Renderização. Conteúdo que só existe depois de correr JavaScript é lido de forma pouco fiável por crawlers, e cada vez mais por agentes que fazem fetch em tempo real. Aqui o HTML chega completo.
O custo é real e assumido: sem componentes, há repetição entre páginas. O cabeçalho e o rodapé são
injectados por header.js e footer.js para limitar isso, mas não é o mesmo que um sistema de
templates. Para um site de cinco páginas, compensa. Para cinquenta, não compensaria.
São 21 blocos de JSON-LD distribuídos pelas páginas — não o grafo por omissão de um plugin, mas declarações escolhidas.
| Página | Blocos | Tipos principais |
|---|---|---|
index.html |
9 | WebSite, Organization, LocalBusiness, Service ×3, FAQPage, BreadcrumbList |
| Cada página de serviço | 4 | Service, FAQPage, BreadcrumbList, WebPage |
O que lá está e porquê:
LocalBusinesscomPostalAddress,telephoneeOpeningHoursSpecification— diz a uma máquina o que a empresa é, onde está e quando atende. É a diferença entre ser um sítio com texto e ser uma entidade resolvível.FAQPagecom pares pergunta-resposta reais — a forma canónica de preparar conteúdo para motores de resposta. Não é decoração: é o conteúdo pré-formatado na estrutura que um motor quer levantar.SpeakableSpecification— marca que partes fazem sentido lidas em voz alta por um assistente.sameAsa apontar para o perfil da empresa, consistente em todas as páginas. UmsameAsinconsistente divide o sinal de entidade em vez de o somar; foi um bug real neste site e está corrigido.
A tese: a camada de canalização — sitemaps, canonicals, redirects — é onde toda a gente gasta esforço, ou onde o CMS trata do assunto sozinho. A camada semântica, a que diz a uma máquina o que a entidade é, é a que quase toda a gente negligencia. É também a mais barata e a que mais pesa para motores de resposta.
gdpr.js carrega antes de tudo o resto, incluindo qualquer tag de analytics, e implementa
Consent Mode v2. Nada de rastreio dispara sem consentimento explícito. A ordem importa: um banner
de consentimento que carrega depois das tags é decorativo.
Português europeu como língua declarada, com o inglês a acompanhar nos pontos onde um visitante internacional decide — títulos de secção, chamadas para acção, mensagens de formulário. Sem selector de idioma nem duplicação de páginas, o que seria desproporcionado para esta dimensão.
WebP com fallback JPEG via <picture>, loading="lazy" fora do primeiro ecrã e loading="eager"
no herói. Sem biblioteca de lazy-loading: o atributo nativo chega.
O backend PHP dos formulários. Trata do envio SMTP, da limitação de pedidos por IP e da
validação. Fica de fora porque publicar lógica de servidor de um site em produção não acrescenta
nada a quem lê e acrescenta superfície a quem não devia. O action dos formulários está
neutralizado nesta cópia.
A marcação antispam. Removida deliberadamente, com o sítio assinalado por comentário. Um honeypot só funciona enquanto o nome do campo não for conhecido — publicá-lo seria entregá-lo.
Configuração de servidor, redirects e logs. Não pertencem a uma cópia pública.
O histórico deste repositório começa na publicação, não no desenvolvimento — o site é anterior e foi construído fora de controlo de versões. Os commits aqui organizam a publicação por temas, não reconstroem uma cronologia que não existiu.
Código sob MIT. Textos, imagens e marca BigLearn são propriedade da BigLearn Lda. e não estão abrangidos — usa os padrões, não o conteúdo.
BigLearn Lda. — consultoria de IA, automação de processos e transformação digital, em Portugal. biglearn.pt