App.nicchon.com
Vitrine pessoal de mini-apps com agregador em 3 camadas: embutidos no monorepo, sub-deploys de outros repos, e links externos via MySQL. Painel admin no nicchon.com gerencia o que muda; o resto vive em Git.
Antes era um agregador PHP que varria o filesystem do servidor e listava qualquer pasta como link — bagunçado, sem identidade visual, sem distinção entre projeto, configuração e rascunho. Reformulei em 2026 como sistema com 3 tipos de 'coisa' explícitos: mini-apps embutidos (no monorepo), sub-deploys (outros repos entregam direto em /app.nicchon.com/{slug}/) e links externos (cadastrados via painel admin no MySQL). 22 mini-apps históricos consolidados, identidade visual portada de nicchon.com, e redirect 301 do antigo projetos.nicchon.com preservando paths.
- PHP 8 (sem framework)
- MySQL 8
- HTML + CSS + JS
- Apache .htaccess
- GitHub Actions (FTP deploy)
- Hostgator (shared hosting)
- Crimson Pro + Inter + JetBrains Mono
- Três tipos de 'coisa' explícitos cada um com seu fluxo de cadastro: mini-app embutido (manifest.json + push), sub-deploy (external-manifests/{slug}.json no monorepo), link externo (painel admin com CRUD MySQL). Single source of truth por tipo.
- Discovery automática de órfãos: projects.php varre o filesystem do servidor e detecta pastas sem manifest declarado, marcando com badge vermelha 'Sem manifest' + header X-App-Orphans. Impossível esquecer de declarar um sub-deploy novo.
- Dark mode com paleta consistente com nicchon.com/painel. Toggle via SVG inline + CSS show/hide (sem flash de ícone vazio), CSP-compliant (sem inline onclick — addEventListener no DOMContentLoaded).
- Anti-FOUC: script inline no <head> aplica data-theme antes do CSS carregar, lendo localStorage. Mesma chave 'app-theme' compartilhada entre agregador e mini-apps PHP individuais — tema viaja com o usuário.
- Workflow GitHub Actions com dangerous-clean-slate desligado: preserva sub-deploys de outros repos (arthur/ WordPress, convite-naty/ Next.js) durante o deploy do monorepo. Cada repo tem autonomia, só declarar manifesto se quiser aparecer no agregador.
- Painel admin de links externos no nicchon.com/painel/app-links.php (não no app.nicchon.com): reusa autenticação, sessão e PDO existentes. Não duplica infra de admin.
- CSP script-src 'self' bloqueava inline onclick — bug invisível (browser falhava silencioso). Solução: addEventListener no DOMContentLoaded em todos os pontos.
- FTP mirror do servidor antigo travava com SSL EOF a cada N requests — solução: retry agressivo com reconnect por pasta + skip de WordPress pesado (wp-includes, wp-admin).
- Renomear ~300 arquivos pra kebab-case num filesystem Windows case-insensitive — solução: git config core.ignorecase false + rename em 2 steps quando precisava trocar caps.
- Recuperar CSS dos 3 calculadores florestais do backup tar.gz após achatamento da hierarquia Cálculo/ na reorganização (os 3 referenciavam um ../css/style.css que tinha sido apagado).