The Blog
The Blog é uma aplicação web de blog desenvolvida com Next.js (App Router), React 19 e Tailwind CSS v4, com persistência em PostgreSQL serverless via Neon e Drizzle ORM. A área pública exibe posts escritos em Markdown com renderização segura (react-markdown + rehype-sanitize), enquanto o painel administrativo oferece CRUD completo de posts com editor Markdown integrado (@uiw/react-md-editor) e upload de imagens de capa processadas com sharp e armazenadas no Cloudinary.
A autenticação do painel admin é stateless, baseada em tokens JWT (jose) gravados em cookies httpOnly e verificados pelo middleware do Next.js antes de qualquer renderização de rota protegida. A arquitetura segue um modelo monolítico em camadas — Server Actions, Repository Pattern e queries cacheadas com revalidação por tag — sem a necessidade de uma API REST separada.
The Blog é uma aplicação web de blog full-stack desenvolvida com Next.js (App Router), React 19 e Tailwind CSS v4, com persistência em PostgreSQL serverless via Neon e Drizzle ORM. A área pública exibe posts escritos em Markdown com renderização segura por meio de react-markdown, rehype-sanitize e remark-gfm, destacando o post mais recente e apresentando a listagem completa dos publicados. O painel administrativo oferece CRUD completo de posts com editor Markdown integrado (@uiw/react-md-editor), upload de imagens de capa processadas localmente com sharp (redimensionamento para 800px em PNG) e armazenamento na nuvem via SDK do Cloudinary.
A autenticação do painel admin é stateless, baseada em tokens JWT assinados com jose e gravados em cookies httpOnly, verificados pelo middleware.ts do Next.js antes de qualquer renderização de rota em /admin/*. As credenciais de acesso são gerenciadas exclusivamente via variáveis de ambiente, com a senha armazenada comohash bcrypt (bcryptjs) em Base64. A arquitetura segue um modelo monolítico emcamadas — Server Actions para mutações, Repository Pattern (PostRepository →DrizzlePostRepository) para desacoplamento da camada de dados, e queries públicase administrativas cacheadas com revalidação por tag após cada operação de escrita.Validações de entrada são feitas com Zod, e o projeto utiliza TypeScript strict emtodo o codebase, com alias de importação @/* apontando para src/.







