Skip to content

deemkeen/stegodon

Repository files navigation

stegodon

GitHub release (latest by date) Go Version License Docker Build Release

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.

Showtime

demo

Features

  • 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 #tags in 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)

Quick Start

Docker (Recommended):

docker pull ghcr.io/deemkeen/stegodon:latest
docker-compose up -d

Binary:

# Download the binary from GitHub Releases
chmod +x stegodon

# Check version
./stegodon -v

# Run
./stegodon

Connect via SSH:

ssh 127.0.0.1 -p 23232

On first login, choose your username. All data is stored in ~/.config/stegodon/ (or Docker volume).

See DOCKER.md for complete Docker deployment guide.

Navigation

  • 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

Configuration

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:6060

File 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 -f

Profiling (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"

ActivityPub Setup

  1. Set STEGODON_WITH_AP=true and STEGODON_SSLDOMAIN=yourdomain.com
  2. Make your server publicly accessible with HTTPS
  3. Proxy HTTP port (9999) through nginx/caddy with TLS
  4. Follow users: Go to the "Follow" view, enter username@domain.com

Your profile: https://yourdomain.com/users/<username>

Relay Subscriptions

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 relay
  • p - Pause/resume relay (paused relays log but don't save content)
  • r - Retry failed subscription
  • x - Delete all relay content from timeline

RSS Feeds

  • Personal: http://localhost:9999/feed?username=<user>
  • Aggregated: http://localhost:9999/feed
  • Single note: http://localhost:9999/feed/<uuid>

Web UI

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.

Building from Source

git clone https://github.com/deemkeen/stegodon
cd stegodon
go build
./stegodon

Requirements:

  • Go 1.25+
  • Terminal with 24-bit color, 115x28 minimum
  • OSC 8 support for clickable links (optional: Ghostty, iTerm2, Kitty)

Tech Stack

  • SSH: wish
  • TUI: bubbletea, lipgloss
  • Web: gin
  • Database: SQLite with WAL mode
  • Federation: Custom ActivityPub implementation with HTTP signatures

Documentation

License

MIT - See LICENSE file

Contributing

Contributions welcome! Open an issue or pull request on GitHub.

Sponsor this project

 

Packages

 
 
 

Contributors 5

Languages