Brennan's IndieWeb blog built with Eleventy. Essays, poetry, and musings on writing, technology, and the human experience. https://brennan.day
  • CSS 39.6%
  • JavaScript 29.6%
  • Nunjucks 20.1%
  • Shell 9%
  • XSLT 1.2%
  • Other 0.5%
Find a file
2026-04-05 19:52:59 -06:00
dotfiles fix: remove poetry collection and redirect to external poetry site 2026-03-15 20:31:56 -11:00
gemini feat: add Gemini protocol support with conversion tools, guides, and gemtext versions of key pages 2026-02-18 00:25:38 -11:00
netlify fix: standardize automatic commit messages to follow project style 2026-02-25 21:58:45 -11:00
scripts fix: standardize automatic commit messages to follow project style 2026-02-25 21:58:45 -11:00
src feat: add Websites for a Free Palestine webring to sidebar 2026-04-05 19:52:59 -06:00
.eleventy.js feat: add XSL stylesheet for human-readable RSS feed display with copy-to-clipboard functionality 2026-03-28 04:12:06 -06:00
.env.example feat: implement GitLab API integration for Micropub post commits 2026-01-07 04:43:16 -07:00
.gitignore feat: add new essay on incel culture's mainstream infiltration through memes and slang with featured image 2026-03-30 15:45:19 -11:00
.gitlab-ci.yml feat: disable Neocities deployment pipeline and switch to placeholder test job 2026-03-18 19:33:37 -11:00
Brennan Kenneth Brown.json fix: correct GitHub username in profile JSON and add progressive enhancement for JavaScript-dependent features 2026-01-12 00:20:22 -11:00
brennan-day.txt fix: replace GNU icon with file-contract icon for AGPL license and update Sunday Site link to Nightfall City House with moon icon 2026-02-16 21:15:20 -07:00
CHANGELOG.md docs: update CHANGELOG and CONTRIBUTING with commit conventions and recent project history 2026-03-03 08:12:40 -07:00
CONTRIBUTING.md docs: update CHANGELOG and CONTRIBUTING with commit conventions and recent project history 2026-03-03 08:12:40 -07:00
dotfiles.zip feat: add automatic sleep hang recovery with GPG agent restart and DNS flush 2026-03-12 17:02:01 -06:00
LICENSE refactor: expand and clarify dual license documentation with detailed sections on code, content, media, and user-generated content 2026-03-26 19:12:56 -06:00
most-read.md feat: add start-here page with recommended reading and update hero CTA 2026-03-03 07:47:57 -07:00
netlify.toml feat: add /water redirect and link to global water bankruptcy project 2026-03-22 20:27:46 -06:00
nightfall.txt feat: add Gemini protocol support with conversion tools, guides, and gemtext versions of key pages 2026-02-18 00:25:38 -11:00
package.json feat: add image thumbnail generation with @11ty/eleventy-img for archive page optimization 2026-02-27 21:06:06 +09:00
pagefind.json feat: add error handling to umami analytics and improve pagefind search metadata 2026-01-05 04:05:42 -11:00
README.md feat: add Deflect.ca DDoS protection documentation to README and colophon 2026-04-03 04:49:49 -06:00

Logo

brennan.day

Brennan Kenneth Brown's IndieWeb blog built with Eleventy. Essays, poetry, and musings on writing, technology, and the human experience.
Visit the website

RSS · GitLab · Contact

Tech Badges
Last Commit
Built with Eleventy Node Valid HTML5
RSS License: CC BY-SA 4.0 GitLab Stars
IndieWeb Badges
IndieWebCamp Webmention Microformats HTML5 Creative Commons
Personal Badges
Made with Eleventy Member of omg.lol Powered by EchoFeed Buy me a coffee Made by a human
Follow me on Mastodon The People Pledge This website kills fascists Listed on url.town

About

This is a personal blog following IndieWeb principles:

  • Own your domain - https://brennan.day (via Porkbun)
  • Own your data - Static site, plain text, version controlled
  • Own your identity - Domain as primary identity
  • Microformats2 markup (h-card, h-entry, h-feed)
  • Webmentions support via webmention.io
  • RSS/Atom feeds

Table of Contents

Getting started

This repository is a personal Eleventy site. For local setup, see:

  • Installation
  • Prerequisites
  • Local Development

Add your files

Content lives in src/posts/ and src/pages/. See Writing Content for the expected front matter and examples.

If you're pushing an existing clone to GitLab, the upstream remote should be:

git remote add origin https://gitlab.com/brennankbrown/brennan.day.git
git branch -M main
git push -uf origin main

Integrate with your tools

This project is designed to work well with GitLab and Netlify.

  • GitLab integrations can be configured in your project settings.
  • Netlify deployment is covered under Deployment.

Collaborate with your team

This is primarily a personal site, but if you collaborate:

  • Use merge requests for changes.
  • Use issues for tracking work.

Test and Deploy

Builds are handled via npm run build (see Deployment). If you wire up CI in GitLab, use Node.js 18+.

Tech Stack

  • Static Site Generator: Eleventy v2.0+
  • Template Engine: Nunjucks
  • Content: Markdown with front matter
  • Styling: Custom CSS (Gruvbox-inspired color scheme)
  • Hosting: Netlify
  • DNS Security: Deflect.ca nameservers for DDoS protection
  • Repository: GitLab
  • Domain: Porkbun

Prerequisites

  • Node.js 18+ and npm
  • Git

Installation

Install dependencies with npm install (see Local Development).

Local Development

Initial Setup

# Clone the repository
git clone https://gitlab.com/brennankbrown/brennan.day brennan.day
cd brennan.day

# Install dependencies
npm install

# Start development server
npm start

The site will be available at http://localhost:8080 with live reload enabled.

Build for Production

npm run build

Output will be in the _site/ directory.

Project Structure

brennan.day/
├── src/                    # Source files
│   ├── _data/             # Global data files
│   │   ├── site.json      # Site configuration
│   │   └── webmentions.js # Webmention fetcher
│   ├── _includes/         # Layouts and partials
│   │   ├── layouts/
│   │   │   ├── base.njk   # Base template
│   │   │   ├── post.njk   # Blog post layout
│   │   │   └── page.njk   # Static page layout
│   │   └── partials/
│   │       ├── header.njk # Site header
│   │       ├── footer.njk # Site footer
│   │       └── sidebar.njk # Sidebar content
│   ├── assets/
│   │   ├── css/           # Stylesheets
│   │   ├── js/            # JavaScript files
│   │   └── images/        # Images
│   ├── posts/             # Blog posts (Markdown)
│   ├── pages/             # Static pages (Markdown)
│   ├── index.njk          # Homepage
│   ├── archive.njk        # Archive page
│   ├── tags.njk           # Tags listing
│   └── feed.njk           # RSS/Atom feed
├── .eleventy.js           # Eleventy configuration
├── package.json           # Dependencies
├── TODO.md                # Project TODO list
├── CHANGELOG.md           # Change log
└── README.md              # This file

Writing Content

New Blog Post

Create a new Markdown file in src/posts/:

---
title: Your Post Title
date: 2025-12-17T10:00:00-07:00
tags: [tag1, tag2, tag3]
layout: layouts/post.njk
---

Your post content here in Markdown.

New Page

Create a new Markdown file in src/pages/:

---
title: Page Title
---

Your page content here.

Pages automatically inherit the layouts/page.njk layout via pages.json.

IndieWeb Features

Microformats2

All posts and pages include proper microformats2 markup:

  • h-card for author identity (sidebar and post bylines)
  • h-entry for blog posts and pages
  • h-feed for post collections (homepage, archive, tag pages)
  • Proper dt-published dates in ISO 8601 format
  • Author information embedded in each post
  • Category/tag markup with p-category

Test your markup at indiewebify.me

Webmentions

Webmentions are fetched from webmention.io at build time.

Setup:

  1. Sign up at webmention.io
  2. Authenticate with IndieAuth
  3. Add your token to environment variables:
    export WEBMENTION_IO_TOKEN=your_token_here
    

For Netlify deployment, add the token in Site Settings → Environment Variables.

RSS Feed

The RSS/Atom feed is available at /feed.xml and is auto-discovered via <link> tags in the HTML head.

SEO & Discoverability

  • XML Sitemap: /sitemap.xml for search engines
  • robots.txt: Proper search engine directives
  • humans.txt: Credits and team information
  • security.txt: Security contact information at /.well-known/security.txt
  • Open Graph: Rich social media previews
  • Twitter Cards: Optimized Twitter sharing
  • Canonical URLs: Prevent duplicate content issues

Accessibility

This site follows WCAG 2.1 AA standards:

  • Skip link for keyboard navigation
  • ARIA labels on all landmarks
  • Semantic HTML structure
  • Focus indicators on interactive elements
  • prefers-reduced-motion support
  • Screen reader utilities
  • Sufficient color contrast

Code Syntax Highlighting

Code blocks are automatically highlighted using Eleventy's syntax highlighting plugin with a custom Gruvbox-inspired theme:

```javascript // Supported languages include JS, Python, HTML, CSS, and many more const greeting = "Hello, World!"; console.log(greeting); ```

Enhanced Markdown Features

This site supports extended markdown capabilities for rich content creation:

Mathematical Expressions - Render LaTeX equations using KaTeX:

  • Inline math: $E = mc^2$
  • Block math: $$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$

Emoji Support - Use emoji shortcodes that automatically convert:

  • :smile:😊
  • :heart:❤️
  • :thumbsup:👍

Footnotes - Standard markdown footnote syntax:

Here's a statement with a footnote[^1].

[^1]: This is the footnote content.

Mermaid Diagrams - Create beautiful diagrams with Mermaid syntax:

graph TD;
A[Start] --> B{Decision};
B -->|Yes| C[End];
B -->|No| D[Loop];

Styled Components - Custom CSS classes for:

  • Alert boxes (info, warning, danger)
  • Button variants (primary, secondary, outline)
  • Color utilities (primary, secondary, success, danger)
  • Enhanced typography (kbd, details, mark, etc.)

See the style guide for a complete demonstration of all markdown features.

Each blog post automatically displays up to 3 related posts based on shared tags. If no related posts are found, recent posts are shown instead.

Full-text search is powered by Pagefind, a static search library that runs entirely in the browser:

  • Visit /search/ or click Search in the navigation
  • Searches across all posts and pages
  • Fast, privacy-friendly (no external services)
  • Automatically updated on each build

Digital Security & DDoS Protection

This site uses Deflect.ca for DNS management and DDoS protection. Deflect is a Canadian social enterprise by eQualitie that provides free DDoS mitigation and website security services to civil society organizations, independent media, and human rights groups worldwide.

Founded in 2011, Deflect protects organizations facing digital threats and censorship, supporting approximately 2% of the global internet population annually. Their work has defended sites like Black Lives Matter, Ukrainian independent media, and countless human rights organizations against cyber attacks.

By using Deflect.ca nameservers, this site contributes to supporting digital security for vulnerable communities while ensuring resilience against DDoS attacks and censorship.

Deployment

Quick Netlify Setup

  1. Connect your GitLab repository to Netlify
  2. Configure build settings:
    • Build command: npm run build
    • Publish directory: _site
  3. Add environment variables:
    • WEBMENTION_IO_TOKEN: Your webmention.io token
  4. Configure custom domain at Porkbun (DNS settings in deployment guide)
  5. Enable HTTPS (automatic via Let's Encrypt)

Custom Domain (Porkbun)

Point your Porkbun DNS to Netlify using Deflect.ca nameservers for enhanced DDoS protection:

  • Configure Deflect.ca nameservers in your Porkbun domain settings
  • Deflect will proxy traffic to Netlify while providing DDoS mitigation
  • Alternative: Create CNAME record pointing to your Netlify subdomain

Configuration

Site configuration is in src/_data/site.json:

  • Site metadata (title, description, URL)
  • Author information (name, bio, social links)
  • Navigation menu
  • IndieWeb endpoints (webmention, pingback)

Custom Filters

Eleventy filters available in templates:

Date Filters:

  • readableDate - Human-friendly date (e.g., "December 17, 2024")
  • htmlDateString - HTML date format (YYYY-MM-DD)
  • isoDate - ISO 8601 format for machine reading

Content Filters:

  • readingTime - Calculate estimated reading time
  • excerpt(limit) - Generate text excerpt
  • truncate(length) - Truncate text with ellipsis

Collection Filters:

  • filterTagList - Remove utility tags
  • filterByTag(tag) - Get posts with specific tag
  • head(n) - Get first n items

IndieWeb Filters:

  • getWebmentionsForUrl - Get webmentions for a URL
  • webmentionsByType - Filter by mention type (like, repost, reply)

Recommendation Filters:

  • relatedPosts(currentPost, limit) - Find related posts based on shared tags

License

Content is licensed under CC BY-SA 4.0.

Code is licensed under AGPL-3.0 and available for reference, but please use this as a resource to build your own site rather than cloning this one wholesale.

Inspiration & Credits

Contact


Built with ❤️ on Treaty 7 Territory (Calgary, Alberta)