A modern, feature-complete blog template built with Eleventy and Tailwind CSS. Designed for writers who want to own their content and participate in the IndieWeb.
New to this? Read the non-technical guide: GUIDE.md
- Simple setup - Edit one config file and you're ready to publish
- IndieWeb ready - Microformats, webmentions, and RSS built-in
- Modern design - Clean, accessible, mobile-first interface
- Privacy focused - No tracking by default, optional ethical analytics
- Full-featured - Search, tags, dark mode, and more
-
Clone and install:
git clone https://github.com/yourusername/indieweb-blog-starter.git cd indieweb-blog-starter npm install -
Configure your site (most important step!): Edit
src/_data/site.jsonwith your information:{ "name": "Your Blog Name", "author": "Your Name", "email": "[email protected]", "url": "https://yourdomain.com", "bio": { "short": "Your tagline", "long": "Your longer bio..." }, "social": { "github": "yourusername", "mastodon": "@[email protected]" } } -
Start writing:
npm run dev
Visit
http://localhost:8080and start creating! -
Deploy:
npm run build
- π Zero Config: Just edit one file and you're ready
- π Dark Mode: Automatic system detection + manual toggle
- βΏ Accessible: WCAG 2.1 AA compliant with accessibility controls
- π Smart Search: Client-side FlexSearch with live results
- πΈοΈ IndieWeb Ready: Microformats2, Webmentions, h-card
- π‘ RSS Feed: Automatic feed generation
- π¨ Tag Colors: Automatic color mapping for tags
- π± Mobile First: Responsive design that works everywhere
- π Privacy Focused: Optional analytics (Plausible/Fathom)
- πͺ Easter Eggs: Hidden interactions for fun
Unlike other templates that require editing dozens of files, this template uses a single configuration file (src/_data/site.json) for most customization:
See the in-depth post: Guide to Making It as an Indie Creator for practical steps to grow an audience, accept support, and keep a simple workflow using this template.
Quick reference (matches the code in src/_includes/layouts/post.njk, src/contact.njk, and src/donate.njk):
-
Newsletter (renders on posts when enabled):
{ "newsletter": { "enabled": true, "provider": "buttondown", "action": "https://buttondown.email/api/emails/embed-subscribe/yourusername", "title": "Join the Newsletter", "description": "Get thoughtful updates delivered to your inbox." } }Use any provider by swapping the
actionwith a POST endpoint. -
Contact form (configure a backend): In
src/contact.njk, wire up Netlify Forms or a service like Formspree/Basin by adding provider attributes, e.g.:<form name="contact" method="POST" data-netlify="true"> <input type="hidden" name="form-name" value="contact"> <!-- fields --> </form>
-
Donations/Sponsorship (renders on
/donate/):{ "donate": { "enabled": true, "kofi": "yourusername", "buymeacoffee": "yourusername", "github": "yourusername", "message": "If you find value in my writing, consider supporting my work." } }
- Site info: Name, description, URL, author
- Social links: GitHub, Mastodon, Twitter (all optional)
- Bio: Short tagline and longer description
- Contact: Email and location
- Newsletter: Buttondown, ConvertKit, or custom integration
- Donations: Ko-fi, Buy Me a Coffee, GitHub Sponsors
- Analytics: Plausible, Fathom, or Simple Analytics
- Webmentions: Automatic setup with webmention.io
Minimal setup (just the essentials):
{
"name": "My Blog",
"author": "Jane Doe",
"email": "[email protected]",
"url": "https://janedoe.blog"
}Full setup with all features:
{
"name": "Jane's Digital Garden",
"author": "Jane Doe",
"email": "[email protected]",
"url": "https://janedoe.blog",
"bio": {
"short": "Writer & digital minimalist",
"long": "I write about technology, minimalism, and intentional living."
},
"social": {
"github": "janedoe",
"mastodon": "@[email protected]"
},
"newsletter": {
"enabled": true,
"provider": "buttondown",
"action": "https://buttondown.email/api/emails/embed-subscribe/jane"
},
"analytics": {
"enabled": true,
"provider": "plausible"
}
}src/
βββ _data/
β βββ site.json # π― Main config file (edit this!)
β βββ tagColors.json # Tag color mappings
βββ _includes/
β βββ layouts/ # Page layouts
β βββ partials/ # Reusable components
βββ assets/
β βββ css/ # Tailwind CSS
β βββ js/ # Interactive features
βββ blog/ # π Your blog posts go here
βββ about.njk # About page
βββ contact.njk # Contact page
βββ uses.njk # Tools & setup page
βββ now.njk # What you're up to now
βββ blogroll.njk # Recommended blogs
βββ archive.njk # Post archive
βββ style.njk # Living style guide
This template includes a tiny build helper that fetches placeholder images so your site looks complete outβofβtheβbox without committing binaries. Files are saved to src/assets/ and passed through to /assets/ at build time.
What gets fetched by default:
- profile.jpg β used on
aboutpage - og-default.png β fallback Open Graph image
- retro-stars.png β background tile used in one demo post
How to customize:
- Drop in your own files: place files with the same names in
src/assets/and the fetcher will skip downloading. - Environment variables: set any of these to your own URLs
PROFILE_IMAGE_URLOG_DEFAULT_URLRETRO_STARS_URL- Example:
PROFILE_IMAGE_URL=https://example.com/me.jpg npm run build
- site.json config: add an optional
assetssection tosrc/_data/site.json:{ "assets": { "profileUrl": "https://example.com/me.jpg", "ogDefaultUrl": "https://example.com/og.png", "retroStarsUrl": "https://example.com/retro-stars.png" } } - Skip entirely: set
SKIP_FETCH_ASSETS=1(ortrue) to bypass downloading (useful for offline/CI).
The fetcher runs as part of the build (npm run build), before CSS and Eleventy.
- Push to GitHub
- Enable GitHub Pages in repository settings
- The included workflow will build and deploy automatically
- Connect your GitHub repository
- Build command:
npm run build - Publish directory:
_site
npm run build
# Upload _site/ folder to your web serverThis template includes IndieWeb features out of the box:
- Sign up at webmention.io
- Add your domain to
site.json:"webmentions": { "enabled": true, "domain": "yourdomain.com" }
- h-card for your identity
- h-entry for blog posts
- h-feed for your blog listing
- All automatically included!
- Edit
tailwind.config.cjsfor theme colors - Modify
src/assets/css/build.cssfor custom styles - Update
src/_data/tagColors.jsonfor tag colors
- Create a new
.njkfile insrc/ - Add front matter with layout and permalink
- Add navigation link in
src/_includes/layouts/base.njk
Supports multiple providers:
- Buttondown: Set
newsletter.providerto"buttondown" - ConvertKit: Set to
"convertkit" - Custom: Use any form action URL
The following improvements are planned to keep this template modern, accessible, and fun to use:
- Themes: additional vibrant code themes and optional color presets
- PWA/Offline: add service worker for basic offline reading
- i18n: language switcher and localized date formatting
- Webmentions UI: simple moderation/preview UI and richer templates
- SEO: JSON-LD schema and improved link previews
- Accessibility: periodic audits and keyboard interaction tests
- Testing: expand Playwright e2e coverage (mobile and dark mode)
- Content Starter: more sample posts and page templates
Have suggestions? Open an issue or PR.
Found a bug or want to improve something? Contributions welcome!
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - feel free to use this template for any project!
Built with:
- Eleventy - Static site generator
- Tailwind CSS - Utility-first CSS
- FlexSearch - Client-side search
- IndieWeb principles and community wisdom
Ready to break free from social media? Clone this template and start building your corner of the independent web! π±
