Colophon
How This Site is Made
A colophon is a traditional publishing term for “how this thing was created.” Here’s mine.
TL;DR 🚀
Constant Thinking is built with a privacy-first, simplicity and performance focus using modern static site generation:
- Generator/CMS: Zola (Rust-based, fast)
- Styling: Tailwind CSS with custom components
- Interactivity: Minimal Alpine.js where needed
- Infrastructure/Hosting: Serverless infrastructure on AWS, as Code (CDK)
- Analytics: Simple, custom privacy-focused (no cookies, no tracking)
- Content: Markdown with manual curation
Core Principles: Privacy-first, simple, optimized, content-focused experience, and sustainable web practices. No cookies, no client-side tracking, just useful, fast, accessible content.
History 📚
This blog has been through some changes since 2010:
- 2004: My very first blog article was on Sun’s employee blogging platform, running on Apache Webroller
- 2010: Launched as a Drupal-based blog - the early days of exploring running my own content management system
- 2017: Rearchitected to static generation with a custom AWS Lambda/Step Functions distributed static site generator on S3/CloudFront
- 2022: Migrated to Pelican, an open-source Python static site generator (still Amazon S3/Amazon CloudFront)
- 2025: Current iteration with Zola - Rust-based performance with modern tooling
Each iteration taught me something new about web performance, content management, and the balance between complexity and maintainability.
Technical Architecture 🏗️
For developers who want to know what’s under the hood
Static Site Generation
Zola handles the heavy lifting — a Rust-based static site generator that’s both powerful and incredibly fast. Key features:
- Content organization with sections and taxonomies
- CommonMark Markdown with TOML front matter
- Tera templates for layouts
- Built-in syntax highlighting and RSS generation
- Single binary deployment (no dependency hell)
Styling & Design
Tailwind CSS provides the utility-first CSS foundation:
- PostCSS processing pipeline with development/production configurations
- Custom components for cards, prose content, and responsive layouts
- Design tokens for consistent colors and spacing
- Source maps in development, minification in production
- CSS purging to keep bundle sizes minimal
JavaScript Philosophy
Minimal JavaScript with Alpine.js for targeted interactivity:
- Self-hosted dependencies (no CDN for privacy/control)
- Mobile menu functionality with mobile-first design
- Enhanced search with elasticlunr and keyboard navigation
- Privacy-focused video embedding with click-to-play
- No heavy frameworks or build systems for client-side JS
Content Management
Flat-file approach with multiple content types:
- Posts: Long-form articles (
/posts/YYYY-MM-DD-slug/
) - Links: External content with commentary (
/links/YYYY-MM-DD-slug/
) - Notes: Quick thoughts and TIL content (
/notes/YYYY-MM-DD-slug/
) - Pages: Static content like this colophon (
/page-name/
)
All content is manually curated in Markdown with structured front matter. This gives me fine-grained control over presentation while keeping the authoring experience enjoyable.
Infrastructure & Deployment
AWS-native architecture with Infrastructure as Code:
- AWS Cloud Development Kit (CDK) for infrastructure management
- Amazon S3 for static asset hosting
- Amazon CloudFront for global CDN with custom security headers
- Amazon Route 53 for DNS management
- AWS Certificate Manager for SSL/TLS
- Staging and production environment separation
- Build validation with minify-html for HTML minification, Stylelint for CSS validation, HTML5 Validator for HTML5 validation, and lychee for link checking
Analytics & Privacy
Custom privacy-focused analytics system:
- Server-side only (CloudFront logs + custom processing)
- No cookies, no client-side tracking, no personal data collection
- Weekly aggregated reports with visitor and page view metrics
- Chart.js for clean data visualization
- Fully compliant with privacy regulations
IndieWeb Integration
Modern IndieWeb standards for social interaction:
- Webmention for cross-site interactions
- Microformats 2 for semantic markup
- POSSE (Publish Own Site, Syndicate Elsewhere) workflow
- RSS 2.0/Atom feeds for syndication
Development Tools & Workflow 🛠️
Writing & Development
Zed.dev is my primary editor for both writing and development:
- AI-assisted coding with integrated large language models
- Blazingly fast UI
- Markdown support for content creation
- Remote editing capabilities
- Rust-based editor
AI Collaboration
I believe in transparent AI collaboration and actively work with Claude and other large language models in various forms:
- Zed’s AI Agent: Powered by Claude (either through Anthropic’s API or Amazon Bedrock’s) for in-editor development help
- Claude.ai Web App: For complex problem-solving and architectural decisions
- Claude Code and Amazon Q Developer CLI: For agent-driven development workflows
- Content Collaboration: Claude helps with research, structure, and technical writing
This isn’t about replacing human creativity, but augmenting it. AI helps me focus on the interesting problems while handling repetitive tasks and providing helpful and different perspectives on technical challenges.
Build System
Make-based build system with comprehensive validation:
- Content validation and link checking
- HTML minification for production
- Image optimization with responsive variants
- Automated deployment to staging and production
- Integration testing before going live
Design Philosophy 🎨
Typography
- Headers: System fonts optimized for readability across platforms
- Body: Carefully selected font stack with fallbacks
- Code: Monospace fonts with syntax highlighting via Zola’s built-in support
Performance
Every technical decision prioritizes speed and accessibility:
- Static file delivery leverages AWS’s Cloud experience and CDN
- Minimal JavaScript reduces parsing and execution overhead
- Responsive images with proper sizing and modern formats
- Critical CSS inlined, non-critical CSS loaded asynchronously
Privacy by Design
- No cookies: Site functions fully without any cookies
- No client-side tracking: All analytics happen server-side
- No external dependencies: Self-hosted fonts and scripts where possible
- Transparent data handling: This colophon and privacy page explain everything
Why These Choices? 🤔
Static Generation: Fast, secure, and resilient. Static files can handle any traffic securely and efficiently.
Rust-based Tools: Zola and Zed both prioritize performance and reliability. The Rust ecosystem’s focus on safety and speed aligns with my values. Also, I’d like to learn more Rust in the future.
Privacy-First: I don’t like cookies and I imagine neither do you. As a European citizen, I also value privacy a lot.
Manual Curation: Automated content pipelines can introduce quality issues. Manual curation ensures every post meets my standards.
Infrastructure as Code: AWS CDK lets me version control and test infrastructure changes, making deployments predictable and reversible.
This colophon was written in June 2025 and reflects the current state of the blog. Like the site itself, it will evolve as new tools and techniques emerge. For questions about implementation details, feel free to reach out.