"Fácil é seguir o fluxo, difícil é ir contra a maré."
Um blog de reflexões provocativas desenvolvido com Jekyll, focado em desafiar o senso comum e promover o pensamento crítico através de textos que funcionam como espelhos e confrontos internos.
- Sobre o Projeto
- Características Técnicas
- Tecnologias
- Instalação
- Estrutura do Projeto
- Sistema Modular Avançado
- Otimizações de Performance
- SEO e Analytics Avançados
- Sistema de Conteúdo
- Deploy
- Contribuição
- Licença
O Contramaré é mais que um blog — é um ponto de resistência intelectual. Nasce da inquietação com comportamentos normalizados que revelam imaturidade, falta de autorresponsabilidade e comodismo.
- Provocar reflexões
- Desafiar a preguiça intelectual
- Combater a transferência covarde da culpa
- Promover o autocontrole como força, não fraqueza
- Não oferecemos respostas fáceis nem caminhos suaves
- Não escrevemos para agradar, mas para transformar
- Buscamos o desconforto que liberta e o incômodo que eleva
- Sistema modular otimizado com Jekyll Hooks para máxima performance
- Carregamento condicional de CSS/JS baseado em layout e front matter
- Filtragem automática de conteúdo com pre-computação durante build
- URLs amigáveis com Latin Slugify customizado
- Estrutura de permalinks baseada em categorias
- Design responsivo com Bootstrap 5.3.6
- Tipografia elegante com Google Fonts (Comfortaa)
- Interface limpa focada na experiência de leitura
- Navegação intuitiva com sistema de categorias ativas
- Preload de recursos críticos para performance visual
- SEO técnico completo com jekyll-seo-tag + meta tags customizadas
- Schema.org markup avançado (Organization, WebSite, SearchAction, Article)
- Meta tags geográficas para targeting brasileiro
- Rich snippets otimizados para redes sociais
- Sitemap automático, feed RSS e redirects
- Compressão SASS e otimização de imagens automática
- Jekyll 4.4.1 - Gerador de sites estáticos
- Ruby - Linguagem base
- Liquid - Template engine
- Kramdown - Processador Markdown com GFM
- Rouge - Syntax highlighting
- Bootstrap 5.3.6 - Framework CSS responsivo
- Bootstrap Icons 1.11.3 - Biblioteca de ícones
- Google Fonts (Comfortaa) - Tipografia principal
- Material Icons - Ícones complementares
- CSS customizado modular com carregamento condicional
- JavaScript vanilla otimizado para interações
- jekyll-seo-tag - SEO automático avançado
- jekyll-sitemap - Geração automática de sitemap
- jekyll-feed - Feed RSS otimizado
- jekyll-redirect-from - Sistema de redirecionamentos
- jekyll-compress-images - Otimização automática de imagens (fork customizado)
- feature_filter.rb - Sistema modular com Jekyll Hooks (10-20x mais rápido)
- latin_slugify.rb - URLs amigáveis com caracteres latinos
- Google Analytics 4 (G-RQ21K77JYG) - Análise de tráfego
- Microsoft Clarity - Heatmaps e gravações de sessão
- Google Search Console - Monitoramento SEO
# Ruby (versão 2.7 ou superior)
ruby --version
# Bundler
gem install bundler
# Git
git --version- Clone o repositório
git clone https://github.com/neylonsantos/contramare.git
cd contramare- Instale as dependências
bundle install- Execute o servidor de desenvolvimento
bundle exec jekyll serve- Acesse o site
http://localhost:4000
# Desenvolvimento com drafts
bundle exec jekyll serve --drafts
# Build para produção
bundle exec jekyll build
# Build com perfil de performance
bundle exec jekyll build --profile
# Limpeza de cache
bundle exec jekyll cleancontramare/
├── 📄 Configuração
│ ├── _config.yml # Configurações principais
│ ├── Gemfile # Dependências Ruby
│ └── robots.txt # Diretivas para crawlers
│
├── 🏗️ Estrutura Jekyll
│ ├── _includes/ # Componentes reutilizáveis
│ │ ├── head.html # Meta tags e SEO
│ │ ├── header.html # Navegação principal
│ │ ├── footer.html # Rodapé
│ │ ├── apresentation.html # Apresentação da home
│ │ ├── last_publications.html # Posts recentes
│ │ ├── post_details.html # Detalhes do post
│ │ └── content_unavailable.html # Página de indisponível
│ │
│ ├── _layouts/ # Templates de página
│ │ ├── default.html # Layout base
│ │ └── post.html # Posts individuais
│ │
│ ├── _posts/ # Conteúdo do blog
│ │ └── _template-post-seo.md # Template para novos posts
│ │
│ ├── _data/ # Dados estruturados
│ │ └── seo.yml # Configurações de SEO
│ │
│ └── _plugins/ # Plugins customizados
│ ├── feature_filter.rb # Sistema de funcionalidades modulares
│ ├── latin_slugify.rb # URLs amigáveis
│ └── README_FEATURE_FILTER.md # Documentação do plugin
│
├── 🎨 Assets
│ ├── assets/css/ # Estilos CSS modulares
│ │ ├── style.scss # Arquivo SASS principal (gera style.css)
│ │ ├── index.css # Página inicial
│ │ ├── post.css # Posts individuais
│ │ ├── blog.css # Página do blog
│ │ ├── about.css # Página sobre
│ │ ├── contact.css # Página de contato
│ │ └── tags.css # Página de tags
│ │
│ ├── assets/js/ # JavaScript customizado
│ │ ├── addons.js # Funcionalidades gerais
│ │ ├── contact.js # Página de contato
│ │ └── post-enhancements.js # Melhorias para posts
│ │
│ ├── assets/base/ # Logos e imagens base
│ └── assets/uploads/ # Upload de conteúdo
│
├── 📄 Páginas
│ ├── pages/ # Páginas estáticas
│ │ ├── about.html # Sobre/Manifesto
│ │ ├── blog.html # Lista de posts
│ │ └── contact.html # Contato
│ ├── index.html # Página inicial
│ └── 404.html # Página de erro
│
└── 📚 Documentação
└── README.md # Este arquivo
O Contramaré possui um sistema modular revolucionário que utiliza Jekyll Hooks para ativar/desativar funcionalidades inteiras com performance 10-20x superior ao sistema convencional.
# Controle de funcionalidades
features:
blog_page: true # Página do blog
contact_page: true # Página de contato
about_page: true # Página sobre
# Mapeamento categoria → funcionalidade
category_feature_map:
"Blog": "blog_page"
"Sobre": "about_page"
"Reflexões": "blog_page"O sistema utiliza Jekyll Hooks no evento site:post_read para máxima performance:
- Durante o build (1x apenas): Plugin processa todos os posts
- Pre-computa categorias ativas usando
Setpara O(1) lookup - Filtra posts uma única vez baseado nas features
- Armazena dados pre-computados em
site.data - Templates acessam dados sem processamento adicional
<!-- Posts já filtrados (recomendado) -->
{% for post in site.data.filtered_posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
<!-- Categorias ativas -->
{{ site.data.active_categories | join: ", " }}
<!-- Estatísticas -->
{% assign stats = feature_stats %}
Posts ativos: {{ stats.active_posts }}/{{ stats.total_posts }}- ✅ Link aparece no menu de navegação
- ✅ Posts visíveis em todas as listas
- ✅ Páginas funcionam normalmente
- ✅ Posts acessíveis individualmente
- ❌ Link removido do menu
- ❌ Posts ocultos em listas e filtros
- ❌ Páginas mostram "conteúdo indisponível"
- ❌ Posts individuais com mensagem de indisponibilidade
✅ Performance 10-20x superior - zero overhead de runtime ✅ Escalabilidade constante - O(1) para qualquer número de posts ✅ Logs informativos durante build com estatísticas ✅ Retrocompatibilidade total com código existente ✅ Desenvolvimento incremental de funcionalidades ✅ Deploy seletivo de features sem impacto
O site implementa carregamento de CSS ultra-otimizado baseado em contexto:
// CSS Global (sempre carregado)
style.css # Compilado via SASS com compressão<!-- CSS por Layout (carregamento automático) -->
{% if page.layout == 'post' %}
<link rel="stylesheet" href="/assets/css/post.css">
<link rel="stylesheet" href="/assets/css/tags.css">
{% endif %}# CSS Customizado por Página (front matter)
---
layout: default
custom_css:
- "/assets/css/animations.css"
- "/assets/css/special-features.css"
custom_js:
- "/assets/js/interactive-elements.js"
---<!-- Preload estratégico implementado -->
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Comfortaa" as="style">
<link rel="preload" href="/assets/base/contramare-icon.png" as="image">
<link rel="preload" href="/assets/css/style.css" as="style">
<!-- Preconnect para CDNs -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://cdn.jsdelivr.net">- 🚀 Compressão SASS automática (
style: compressed) - 🖼️ Otimização de imagens automática via plugin customizado
- 📱 Recursos críticos preloadados para LCP otimizado
- 🔒 Headers de segurança (X-Frame-Options, X-XSS-Protection, etc.)
- ⚡ CDN Bootstrap 5.3.6 com integridade verificada
- 🎯 JavaScript com defer para non-blocking loading
- 📊 Analytics otimizados (GA4 + Clarity) com carregamento assíncrono
# _config.yml - Configurações de performance
sass:
style: compressed
# Headers de segurança
webrick:
headers:
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
# Otimização de imagens
compress_images:
images_path: "assets/**/*.{gif,png,jpg,jpeg,svg}"✅ jekyll-seo-tag + meta tags customizadas avançadas ✅ Schema.org markup completo (Organization, WebSite, SearchAction, Article) ✅ Meta tags geográficas para targeting brasileiro (geo.region, geo.country) ✅ Robots e Googlebot com diretrizes específicas ✅ Canonical URLs automáticos ✅ Sitemap.xml e Feed RSS otimizados
✅ Open Graph e Twitter Cards otimizados ✅ Article markup com author, published_time, section e tags ✅ Structured data para SearchAction (busca no site) ✅ Publisher information completa
# SEO Configuration Data
default_image: "/assets/base/contramare-icon.png"
organization:
name: "Contramaré"
url: "https://contramare.com.br"
logo: "/assets/base/contramare-icon.png"
same_as:
- "https://x.com/contramare_blog"
- "https://instagram.com/contramare_blog"
author:
name: "Neylon Santos"
bio: "I'm a christian, software engineer, writer, and creator."
social:
x: "https://x.com/neylonxyz"
github: "https://github.com/neylonssantos"
# Configurações por categoria
categories:
Reflexões:
description: "Artigos provocativos que desafiam o senso comum."
color: "#2c3e50"// WebSite + SearchAction
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://contramare.com.br",
"potentialAction": {
"@type": "SearchAction",
"target": "https://contramare.com.br/search?q={search_term_string}"
}
}// Implementação otimizada GA4
gtag('config', 'G-RQ21K77JYG');// Heatmaps e gravações de sessão
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
// ID: spvfnlcybw---
layout: post
title: "Título otimizado para SEO (máximo 60 caracteres)"
description: "Meta descrição atrativa de 150-160 caracteres"
date: 2025-01-15 07:00:00 -0300
image: '/assets/uploads/posts/slug-do-post/featured.jpg'
categories: [Reflexões]
tags: [tag1, tag2, tag3, tag4] # máximo 5 tags
author: Neylon Santos
keywords: "palavra-chave-principal, secundária"
reading_time: 5 # tempo estimado em minutos
featured: true # destaque
---# _config.yml
permalink: /:latin_slugified_categories/:slug/
# Exemplo de URL gerada:
# https://contramare.com.br/reflexoes/voce-ainda-nao-me-viu-com-raiva/O template inclui checklist completo para posts:
- 📏 Título: máx 60 chars com palavra-chave
- 📄 Descrição: 150-160 chars persuasiva
- 🖼️ Imagem: 1200x630px otimizada
- 🏷️ Tags: máx 5 relevantes
- 📊 Estrutura: H2/H3, parágrafos curtos, listas
- 🔗 Links internos: mínimo 2 por post
- 📈 Call-to-action: engajamento natural
Artigos provocativos que funcionam como espelhos e confrontos internos:
- Mediocridade emocional - questionar padrões de comportamento
- Transferência de responsabilidade - combater vitimismo
- Preguiça intelectual - estimular pensamento crítico
- Crescimento através do desconforto - abraçar o que incomoda
_posts/
├── _template-post-seo.md # Template com checklist SEO completo
├── YYYY-MM-DD-titulo-do-post.markdown
└── ...
assets/uploads/posts/
├── YYYY-MM-DD-titulo-do-post/
│ ├── featured.jpg # Imagem destacada (1200x630px)
│ └── [outras-imagens.jpg] # Imagens do conteúdo
└── ...
# Use o template SEO otimizado
cp _posts/_template-post-seo.md _posts/$(date +%Y-%m-%d)-titulo-do-post.markdown
# Crie pasta para assets do post
mkdir -p assets/uploads/posts/$(date +%Y-%m-%d)-titulo-do-post/---
layout: post
title: "Título Otimizado (máx 60 chars)"
description: "Meta descrição atrativa (150-160 chars)"
date: 2025-01-15 07:00:00 -0300
image: '/assets/uploads/posts/slug-do-post/featured.jpg'
categories: [Reflexões]
tags: [comportamento, disciplina, atemporal]
author: Neylon Santos
keywords: "palavra-chave-principal, secundária"
reading_time: 5
featured: true
---# Teste com drafts
bundle exec jekyll serve --drafts
# Build com profiling
bundle exec jekyll build --profile
# Limpeza de cache
bundle exec jekyll cleanO sistema modular permite controle granular do conteúdo:
# _config.yml
features:
blog_page: true # Posts da categoria "Blog"
about_page: true # Conteúdo sobre o projeto
category_feature_map:
"Reflexões": "blog_page" # Posts de reflexão
"Blog": "blog_page" # Posts gerais
"Sobre": "about_page" # Páginas institucionais- ✅ SEO otimizado - título, descrição, tags
- ✅ Estrutura clara - H2/H3, parágrafos curtos
- ✅ Imagens otimizadas - 1200x630px para social
- ✅ Links internos - conexões entre posts
- ✅ Call-to-action - engajamento natural
- ✅ Revisão completa - ortografia e fluidez
# _config.yml
url: "https://contramare.com.br"
baseurl: ""
domain: contramare.com.br
google_analytics: G-RQ21K77JYGO site é automaticamente publicado a cada push:
git add .
git commit -m "Novo post: Título do Post"
git push origin master- Fork o repositório
- Crie uma branch para sua feature (
git checkout -b feature/nova-funcionalidade) - Commit suas mudanças (
git commit -m 'Adiciona nova funcionalidade') - Push para a branch (
git push origin feature/nova-funcionalidade) - Abra um Pull Request
- ✅ Mantenha o padrão de código existente
- ✅ Teste localmente antes de submeter
- ✅ Documente novas funcionalidades
- ✅ Siga as convenções de nomenclatura
- ✅ Otimize para performance e SEO
Use as Issues do GitHub para:
- 🐛 Reportar bugs
- 💡 Sugerir melhorias
- ❓ Fazer perguntas
- 🚀 Propor novas funcionalidades
Este projeto está sob a Licença MIT. Veja o arquivo LICENSE para detalhes.
Neylon Santos "I'm a christian, software engineer, writer, and creator."
- 🌐 Site: contramare.com.br
- 📧 Email: contato@contramare.com.br
- 💼 GitHub: @neylonssantos
- 🐦 X (Twitter): @neylonxyz
- 📘 Instagram: @contramare_blog
"Não tenho todas as respostas. Mas tenho muitas perguntas. E acredito que, quando bem feitas, elas têm o poder de transformar."
Ser Contramaré é ter coragem de olhar para si com sinceridade. É entender que crescer dói — e que isso é bom. É saber que maturidade não se alcança com likes, mas com confronto interno.
Questionar é o primeiro passo. Mudar é a jornada.
