A complete blog and wiki server with native ActivityPub support that automatically shares your content in the Fediverse (Mastodon, Pleroma, etc.).
- Node.js 16+ and npm
- Git for cloning the repository
- Domain pointing to your server (for ActivityPub integration)
git clone https://github.com/teodorgross/toffee.git
cd toffee
cp .env.example .env
nano .env
Essential settings:
# Server Configuration
PORT=3000
NODE_ENV=production
# Site Information
SITE_NAME=Your Blog Name
SITE_DESCRIPTION=Your blog description
AUTHOR_NAME=Your Name
AUTHOR_EMAIL=your@email.com
# Domain Configuration (required for ActivityPub)
DOMAIN=yourdomain.com
BASE_URL=https://yourdomain.com
npm install
npm run background
Alternative - Run without background process:
npm run start
Once installed, you can add content by placing Markdown files in:
- Blog posts: Add
.mdfiles to/blog/directory - Wiki pages: Add
.mdfiles to/wiki/directory
Content is automatically detected and published to the Fediverse!
- Markdown-based: Write blog posts and wiki pages in Markdown
- Hot Reload: Changes are automatically detected and reloaded
- Categories & Tags: Organize your content
- Search Function: Search across all content
- Responsive Design: Works on all devices
- Full ActivityPub Implementation: Native Fediverse support
- Followable Account: Users can follow you from Mastodon, Pleroma, etc.
- Automatic Sharing: New blog posts and wiki pages are automatically shared
- WebFinger Support: Discoverable via
@username@domain - JSON Feed: Modern RSS alternative for compatible clients
- Single Application: All-in-one Node.js application
- No Database Required: File system-based
- Automatic Key Generation: ActivityPub keys are generated automatically
- Secure Implementation: Follows ActivityPub standards
# Start in background
npm run background
# Control PM2 process
npm run pm2:start # Start the application
npm run pm2:stop # Stop the application
npm run pm2:restart # Restart the application
npm run pm2:logs # View live logs
npm run pm2:status # Show status
npm run pm2:monit # Open monitoring dashboard
Create .md files in /blog/ directory:
---
title: My First Post
description: This is my first blog post
date: 2025-07-28 12:00:00 +0200
tags: #welcome #blog #firstpost
author: 'Your Name'
---
# Your content here
Write your blog post content in Markdown...Create .md files in /wiki/ directory:
---
title: Documentation Page
category: getting-started
order: 1
tags: [documentation, guide, wiki]
---
# Your Documentation
Write your wiki content in Markdown...Once configured with a proper domain, users can follow your blog from any ActivityPub-compatible client:
- From Mastodon: Search for
@username@yourdomain.com - From Pleroma: Search for
@username@yourdomain.com - Any Fediverse client: Look up your domain's WebFinger endpoint
- Actor:
https://yourdomain.com/actor - WebFinger:
https://yourdomain.com/.well-known/webfinger - Outbox:
https://yourdomain.com/outbox - Inbox:
https://yourdomain.com/inbox - JSON Feed:
https://yourdomain.com/feed.json
toffee/
βββ blog/ # Blog posts (.md files)
βββ wiki/ # Wiki pages (.md files)
βββ public/ # Static assets
βββ views/ # EJS templates
βββ src/ # Source code
βββ activitypub-data/ # ActivityPub keys and data
βββ logs/ # Application logs
βββ ecosystem.config.js # PM2 configuration
This project is licensed under the MIT License - see the LICENSE file for details.
Made with β€οΈ for the decentralized web
