Tema
v0.1.7
Data de lançamento: 8 de maio de 2026
Novas Funcionalidades
Armazenamento de Assets em S3
- Uma nova configuração opcional
ASSETS_STORAGE_MODE=s3permite que as lojas enviem uploads para um bucket compatível com S3 e os sirvam a partir de um CDN, em vez do diretório local padrãodata/files/ - Quando o modo S3 está ativo, cada imagem enviada é pré-gerada em larguras comuns (200/400/600/800/1200) como variantes WebP e armazenada junto do original, para que a loja possa servir imagens de tamanho correto sem conversão em tempo real
- Um novo limite opcional
ASSETS_MAX_BYTEScontrola o armazenamento cumulativo de ficheiros (tanto em modo local como S3), para que um fluxo de uploads descontrolado não dispare a fatura do bucket — os limites por upload (5 MB imagem / 50 MB vídeo) permanecem inalterados - Um script único
migrate-assets-to-s3.mjsé incluído na imagem Docker; executá-lo dentro de um contentor envia os ficheiros locais existentes para o bucket, reescreve as URLs guardadas para o CDN e pré-gera as variantes
Exportações CSV de Utilizadores e Encomendas
- A lista de Utilizadores tem um novo botão Exportar Utilizadores que descarrega a vista atual em CSV
- A lista de Encomendas tem um novo botão Exportar Encomendas que descarrega a vista atual em CSV
- Ambos os endpoints estão protegidos contra CSRF e têm rate limiting
Imagens Responsivas na Loja
- Cards de produto, páginas de produto, slides do slideshow, secções imagem-com-texto, mosaicos de coleções e outras imagens da loja agora são renderizados com
srcSetesizes, alinhados às larguras WebP pré-geradas (200/400/600/800/1200) - Telemóveis e tablets carregam a menor variante que cabe no seu viewport em vez de carregar sempre o asset de tamanho desktop, reduzindo o peso da página e melhorando os Core Web Vitals em ligações lentas
Telemetria de Erros
- Quando a Telemetria da Plataforma está ativada em Definições → Integrações, exceções no servidor e erros não tratados no cliente (
window.onerror, rejeições de promises não tratadas) são reportados anonimamente à equipa Capyshop como eventos$exception - Nenhum dado pessoal, informação de cliente ou detalhe da loja é encaminhado — o interruptor de telemetria existente controla todo o pipeline, e desligá-lo também interrompe o reporte de erros
Carregamento de Fontes do Construtor de Páginas
- Títulos e subtítulos de slideshow, títulos/subtítulos/corpo de imagem-com-texto, e fontes do corpo de secções de texto escolhidas no construtor de páginas são agora carregadas automaticamente com a página
- Anteriormente apenas a fonte global do tema era carregada, o que significava que as escolhas de fonte do admin nas secções da página inicial caíam silenciosamente na fonte padrão na primeira renderização
Localização do Checkout Stripe
- O Stripe Elements (o formulário de cartão integrado) agora é montado no idioma selecionado pelo cliente, para que rótulos de campos, mensagens de erro e o botão "Pagar" correspondam ao resto do checkout
Melhorias
- O carregamento de webfonts já não bloqueia a renderização — a loja renderiza imediatamente e a webfont entra assim que estiver carregada, eliminando o anterior "ecrã em branco até o Google Fonts responder"
- Target de build atualizado para browsers modernos (Chrome 111+, Edge 111+, Firefox 128+, Safari 16+) para que o bundle deixe de incluir polyfills ES6 que nenhum browser atual precisa
- Tamanhos refinados nos gráficos do dashboard, da visão geral de analytics e do funil de analytics para visualização mais clara
- O pipeline de release da imagem Docker passou para um workflow dedicado acionado por GitHub Releases, condicionado a uma execução de CI verde em
mainpara o mesmo commit — sem mais pushes de imagem ad-hoc
Correções de Segurança
- Todos os endpoints da API que alteram estado (POST/PATCH/PUT/DELETE) agora validam a
Origindo pedido contraTRUSTED_ORIGINSe rejeitam discrepâncias; apenas os webhooks Stripe ficam isentos, uma vez que se autenticam por assinatura em vez de cookie - O proxy do assistente IA (
/api/admin/chat,/api/admin/generate-text) e o endpoint de registo agora contabilizam todas as chamadas no rate limit — não apenas as falhadas — para defender contra esgotamento de API paga e abuso de criação de contas em massa