stegodon is an SSH-first federated blogging platform. Users connect via SSH to create notes in a terminal interface. Notes federate to the Fediverse via ActivityPub and are available through RSS feeds and a web interface.
Built with Go and Charm Tools.
- SSH-First TUI - Connect via SSH, authenticate with your public key, create notes in a beautiful terminal interface
- ActivityPub Federation - Follow/unfollow users, federate posts to Mastodon/Pleroma with HTTP signatures
- Relay Support - Subscribe to ActivityPub relays (FediBuzz, YUKIMOCHI) to discover content beyond direct follows
- Threading & Replies - Reply to posts, view threaded conversations with recursive reply counts
- Mentions - Tag users with
@username@domain, autocomplete suggestions, highlighted in TUI/web - Hashtags - Use
#tagsin your posts, highlighted in TUI and stored for discovery - RSS Feeds - Per-user and aggregated feeds with full content
- Web Interface - Browse posts with terminal-themed design and SEO optimization
- Multi-User - Admin panel, user management, single-user mode, closed registration
- Markdown Links - Clickable links in TUI (OSC 8), web UI, and federation:
[text](url)
Docker (Recommended):
docker pull ghcr.io/deemkeen/stegodon:latest
docker-compose up -dBinary:
# Download the binary from GitHub Releases
chmod +x stegodon
# Check version
./stegodon -v
# Run
./stegodonConnect via SSH:
ssh 127.0.0.1 -p 23232On first login, choose your username. All data is stored in ~/.config/stegodon/ (or Docker volume).
See DOCKER.md for complete Docker deployment guide.
- Tab - Cycle through views
- Shift+Tab - Cycle through views in reverse order
- Ctrl+N - Jump to notifications view
- Up/Down or j/k - Navigate lists
- Enter - Open thread view for posts with replies (or delete notification in notifications view)
- Esc - Return from thread view
- r - Reply to selected post
- l - Like/unlike selected post (federated)
- o - Toggle URL display for selected post (home timeline)
- Press once: Show clickable URL
- Press again or navigate: Show post content
- Cmd+click (Mac) or Ctrl+click (Linux) URL to open in local browser
- u - Edit note (in my posts)
- d - Delete note with confirmation
- a - Delete all notifications (in notifications view)
- Ctrl+S - Save/post note
- Ctrl+C or q - Quit
Environment variables override embedded defaults:
# Basic settings
STEGODON_HOST=0.0.0.0 # Server IP (use 127.0.0.1 to prevent remote connections)
STEGODON_SSHPORT=23232 # SSH port
STEGODON_HTTPPORT=9999 # HTTP port
# ActivityPub federation
STEGODON_WITH_AP=true # Enable federation
STEGODON_SSLDOMAIN=yourdomain.com # Your public domain (required for ActivityPub)
# Access control
STEGODON_SINGLE=true # Single-user mode
STEGODON_CLOSED=true # Closed registration
# Customization
STEGODON_NODE_DESCRIPTION="My personal microblog server" # NodeInfo description
# Logging (Linux only)
STEGODON_WITH_JOURNALD=true # Send logs to systemd journald
# Profiling (development/debugging)
STEGODON_WITH_PPROF=true # Enable pprof profiler on localhost:6060File locations:
- Config:
./config.yaml->~/.config/stegodon/config.yaml-> embedded defaults - Database:
./database.db->~/.config/stegodon/database.db - SSH key:
./.ssh/stegodonhostkey->~/.config/stegodon/.ssh/stegodonhostkey
Viewing logs (Linux with journald):
# Follow logs in real-time
journalctl -t stegodon -f
# View recent logs
journalctl -t stegodon --since "1 hour ago"
# View logs for a specific service
journalctl -u stegodon.service -fProfiling (when STEGODON_WITH_PPROF=true):
# Access web UI
open http://localhost:6060/debug/pprof/
# CPU profile (30 seconds)
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# Heap profile
go tool pprof http://localhost:6060/debug/pprof/heap
# Goroutine count
curl http://localhost:6060/debug/pprof/goroutine?debug=1 | grep "goroutine profile"- Set
STEGODON_WITH_AP=trueandSTEGODON_SSLDOMAIN=yourdomain.com - Make your server publicly accessible with HTTPS
- Proxy HTTP port (9999) through nginx/caddy with TLS
- Follow users: Go to the "Follow" view, enter
username@domain.com
Your profile: https://yourdomain.com/users/<username>
Relays let you discover content from across the Fediverse without following individual users. Admin users can manage relays from the admin panel.
Supported relays:
- FediBuzz - Hashtag-based (e.g.,
relay.fedi.buzz/tag/music) - YUKIMOCHI - Full firehose (e.g.,
relay.toot.yukimochi.jp)
Relay controls:
a- Add relay (enter URL or domain)d- Unsubscribe from relayp- Pause/resume relay (paused relays log but don't save content)r- Retry failed subscriptionx- Delete all relay content from timeline
- Personal:
http://localhost:9999/feed?username=<user> - Aggregated:
http://localhost:9999/feed - Single note:
http://localhost:9999/feed/<uuid>
Browse posts through a terminal-themed web interface:
- Homepage:
http://localhost:9999/- View all posts from all users - User profile:
http://localhost:9999/users/<username>- View posts by a specific user - Single post:
http://localhost:9999/posts/<uuid>- View individual post with thread context
The web UI features:
- Terminal-style aesthetic matching the SSH TUI
- SEO optimized with proper meta tags
- Clickable Markdown links
- Responsive design
- RSS feed links for each user
Replace localhost:9999 with your domain when deployed publicly.
git clone https://github.com/deemkeen/stegodon
cd stegodon
go build
./stegodonRequirements:
- Go 1.25+
- Terminal with 24-bit color, 115x28 minimum
- OSC 8 support for clickable links (optional: Ghostty, iTerm2, Kitty)
- SSH: wish
- TUI: bubbletea, lipgloss
- Web: gin
- Database: SQLite with WAL mode
- Federation: Custom ActivityPub implementation with HTTP signatures
- DATABASE.md - Database schema and tables
- FEDERATION.md - ActivityPub federation details
- DOCKER.md - Docker deployment guide
MIT - See LICENSE file
Contributions welcome! Open an issue or pull request on GitHub.
