{"id":23919480,"url":"https://github.com/deemkeen/stegodon","last_synced_at":"2026-02-22T21:53:39.981Z","repository":{"id":150455721,"uuid":"572501635","full_name":"deemkeen/stegodon","owner":"deemkeen","description":"Blog directly from ssh!","archived":false,"fork":false,"pushed_at":"2026-02-04T10:34:57.000Z","size":2210,"stargazers_count":73,"open_issues_count":3,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-04T19:30:40.659Z","etag":null,"topics":["activitypub","bubbletea","charm","cli","fediverse","go","golang","lipgloss","ssh","tui","wish"],"latest_commit_sha":null,"homepage":"https://stegodon.social","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deemkeen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["deemkeen"]}},"created_at":"2022-11-30T12:14:00.000Z","updated_at":"2026-02-04T10:35:00.000Z","dependencies_parsed_at":"2023-04-30T05:15:28.802Z","dependency_job_id":"962df0d2-7c32-47fe-8385-cf09092c50fd","html_url":"https://github.com/deemkeen/stegodon","commit_stats":{"total_commits":7,"total_committers":1,"mean_commits":7.0,"dds":0.0,"last_synced_commit":"346da1c30576af0fb0612b54fba0ba7d8908a968"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/deemkeen/stegodon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deemkeen%2Fstegodon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deemkeen%2Fstegodon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deemkeen%2Fstegodon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deemkeen%2Fstegodon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deemkeen","download_url":"https://codeload.github.com/deemkeen/stegodon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deemkeen%2Fstegodon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29183388,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T00:44:15.062Z","status":"ssl_error","status_checked_at":"2026-02-07T00:35:01.758Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activitypub","bubbletea","charm","cli","fediverse","go","golang","lipgloss","ssh","tui","wish"],"created_at":"2025-01-05T14:52:35.266Z","updated_at":"2026-02-22T21:53:39.970Z","avatar_url":"https://github.com/deemkeen.png","language":"Go","funding_links":["https://github.com/sponsors/deemkeen"],"categories":["Go","Table of Contents"],"sub_categories":[],"readme":"# stegodon\n\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/deemkeen/stegodon)](https://github.com/deemkeen/stegodon/releases) [![Go Version](https://img.shields.io/github/go-mod/go-version/deemkeen/stegodon)](https://github.com/deemkeen/stegodon/blob/main/go.mod) [![License](https://img.shields.io/github/license/deemkeen/stegodon)](https://github.com/deemkeen/stegodon/blob/main/LICENSE) [![Docker Build](https://github.com/deemkeen/stegodon/actions/workflows/docker.yml/badge.svg)](https://github.com/deemkeen/stegodon/actions/workflows/docker.yml) [![Release](https://github.com/deemkeen/stegodon/actions/workflows/release.yml/badge.svg)](https://github.com/deemkeen/stegodon/actions/workflows/release.yml)\n\n**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.\n\nBuilt with Go and [Charm Tools](https://github.com/charmbracelet).\n\n## Showtime\n\n![demo](./demo.gif)\n\n## Features\n\n- **SSH-First TUI** - Connect via SSH, authenticate with your public key, create notes in a beautiful terminal interface\n- **ActivityPub Federation** - Follow/unfollow users, federate posts to Mastodon/Pleroma with HTTP signatures\n- **Relay Support** - Subscribe to ActivityPub relays (FediBuzz, YUKIMOCHI) to discover content beyond direct follows\n- **Threading \u0026 Replies** - Reply to posts, view threaded conversations with recursive reply counts\n- **Mentions** - Tag users with `@username@domain`, autocomplete suggestions, highlighted in TUI/web\n- **Full-Text Search** - Press `/` to search across all posts (local and federated) with highlighted snippets\n- **Hashtags** - Use `#tags` in your posts, highlighted in TUI and stored for discovery\n- **RSS Feeds** - Per-user and aggregated feeds with full content\n- **Web Interface** - Browse posts with terminal-themed design and SEO optimization\n- **Multi-User** - Admin panel, user management, single-user mode, closed registration\n- **Markdown Links** - Clickable links in TUI (OSC 8), web UI, and federation: `[text](url)`\n\n## Quick Start\n\n**Docker (Recommended):**\n```bash\n# Create a directory for Stegodon\nsudo mkdir -p /srv/stegodon\ncd /srv/stegodon\n\n# Download the docker-compose file\ncurl -LO https://raw.githubusercontent.com/deemkeen/stegodon/main/docker-compose.yml\n\n# Edit the configuration to suit your server\nnano docker-compose.yml\n\n# Start Stegodon\ndocker compose up -d\n```\n\n**Binary:**\n```bash\n# Download the binary from GitHub Releases\nchmod +x stegodon\n\n# Check version\n./stegodon -v\n\n# Run\n./stegodon\n```\n\n**Connect via SSH:**\n```bash\nssh 127.0.0.1 -p 23232\n```\n\nOn first login, choose your username. All data is stored in `~/.config/stegodon/` (or Docker volume).\n\nSee [DOCKER.md](DOCKER.md) for complete Docker deployment guide.\n\n## Navigation\n\n### Global\n\n- **Tab** - Cycle through views\n- **Shift+Tab** - Cycle through views in reverse order\n- **Ctrl+N** - Jump to notifications view\n- **Ctrl+C** or **q** - Quit\n\n### Timeline Views (Home, My Posts, Global)\n\n- **Up/Down** or **j/k** - Navigate posts\n- **Enter** - Open thread view for posts with replies\n- **Esc** - Return from thread view\n- **/** - Open search overlay (search across all local and federated posts)\n- **r** - Reply to selected post\n- **l** - Like/unlike selected post (federated)\n- **b** - Boost/unboost selected post (federated)\n- **i** - Toggle engagement info (show who liked/boosted)\n- **o** - Toggle URL display for selected post (home timeline)\n  - Press once: Show clickable URL\n  - Press again or navigate: Show post content\n  - Cmd+click (Mac) or Ctrl+click (Linux) URL to open in local browser\n- **u** - Edit note (in my posts)\n- **d** - Delete note with confirmation\n- **Ctrl+S** - Save/post note\n\n### Search Overlay\n\n- **/** - Activate search from any timeline view\n- **Type** - Search query (debounced, results update as you type)\n- **Up/Down** - Navigate results\n- **Enter** - Open thread for selected result\n- **Esc** - Close search overlay\n\n### Followers View\n\n- **Up/Down** or **j/k** - Navigate list\n- **Enter** - View profile of selected follower\n- **f** - Follow back (sends request for remote users)\n\n### Following View\n\n- **Up/Down** or **j/k** - Navigate list\n- **Enter** - View profile of selected user\n- **f** - Unfollow selected user\n\n### Profile View\n\n- **Up/Down** or **j/k** - Navigate posts\n- **Enter** - View thread for selected post\n- **f** - Toggle follow/unfollow\n- **Esc** - Return to previous view\n\n### Notifications View\n\n- **Up/Down** or **j/k** - Navigate notifications\n- **Enter** - Delete selected notification\n- **a** - Delete all notifications\n\n## Configuration\n\nEnvironment variables override embedded defaults:\n\n```bash\n# Basic settings\nSTEGODON_HOST=0.0.0.0             # Server IP (use 127.0.0.1 to prevent remote connections)\nSTEGODON_SSHPORT=23232            # SSH port\nSTEGODON_HTTPPORT=9999            # HTTP port\n\n# ActivityPub federation\nSTEGODON_WITH_AP=true             # Enable federation\nSTEGODON_SSLDOMAIN=yourdomain.com # Your public domain (required for ActivityPub)\n\n# Access control\nSTEGODON_SINGLE=true              # Single-user mode\nSTEGODON_CLOSED=true              # Closed registration\nSTEGODON_SSH_ONLY=true            # SSH-only mode (disables web UI)\n\n# Customization\nSTEGODON_NODE_DESCRIPTION=\"My personal microblog server\"  # NodeInfo description\nSTEGODON_MAX_CHARS=200            # Default is 150, max length is capped to 300 characters\nSTEGODON_SHOW_GLOBAL=true         # Show global timeline (local + all federated posts) in TUI and web\nSTEGODON_SHOW_TOS=true            # Show terms of service acceptance screen on login\n\n# Logging (Linux only)\nSTEGODON_WITH_JOURNALD=true       # Send logs to systemd journald\n\n# Profiling (development/debugging)\nSTEGODON_WITH_PPROF=true          # Enable pprof profiler on localhost:6060\n```\n\n**SSH-Only Mode:**\n\nWhen `STEGODON_SSH_ONLY=true`, the web UI is disabled but RSS feeds and ActivityPub still work. This mode:\n- Disables web UI routes (no homepage, profile pages, or tag pages)\n- Keeps RSS feeds and ActivityPub endpoints active\n- Useful when you want federation and RSS but no public web interface\n- TUI access via SSH remains fully functional\n\n**File locations:**\n- Config: `./config.yaml` -\u003e `~/.config/stegodon/config.yaml` -\u003e embedded defaults\n- Database: `./database.db` -\u003e `~/.config/stegodon/database.db`\n- SSH key: `./.ssh/stegodonhostkey` -\u003e `~/.config/stegodon/.ssh/stegodonhostkey`\n\n**Viewing logs (Linux with journald):**\n```bash\n# Follow logs in real-time\njournalctl -t stegodon -f\n\n# View recent logs\njournalctl -t stegodon --since \"1 hour ago\"\n\n# View logs for a specific service\njournalctl -u stegodon.service -f\n```\n\n**Profiling (when STEGODON_WITH_PPROF=true):**\n```bash\n# Access web UI\nopen http://localhost:6060/debug/pprof/\n\n# CPU profile (30 seconds)\ngo tool pprof http://localhost:6060/debug/pprof/profile?seconds=30\n\n# Heap profile\ngo tool pprof http://localhost:6060/debug/pprof/heap\n\n# Goroutine count\ncurl http://localhost:6060/debug/pprof/goroutine?debug=1 | grep \"goroutine profile\"\n```\n\n## ActivityPub Setup\n\n1. Set `STEGODON_WITH_AP=true` and `STEGODON_SSLDOMAIN=yourdomain.com`\n2. Make your server publicly accessible with HTTPS\n3. Proxy HTTP port (9999) through nginx/caddy with TLS\n4. Follow users: Go to the \"Follow\" view, enter `username@domain.com`\n\n**Your profile:** `https://yourdomain.com/users/\u003cusername\u003e`\n\n## Relay Subscriptions\n\nRelays let you discover content from across the Fediverse without following individual users. Admin users can manage relays from the admin panel.\n\n**Supported relays:**\n- **FediBuzz** - Hashtag-based (e.g., `relay.fedi.buzz/tag/music`)\n- **YUKIMOCHI** - Full firehose (e.g., `relay.toot.yukimochi.jp`)\n\n**Relay controls:**\n- `a` - Add relay (enter URL or domain)\n- `d` - Unsubscribe from relay\n- `p` - Pause/resume relay (paused relays log but don't save content)\n- `r` - Retry failed subscription\n- `x` - Delete all relay content from timeline\n\n## RSS Feeds\n\n- Personal: `http://localhost:9999/feed?username=\u003cuser\u003e`\n- Aggregated: `http://localhost:9999/feed`\n- Single note: `http://localhost:9999/feed/\u003cuuid\u003e`\n\n## Web UI\n\nBrowse posts through a terminal-themed web interface:\n\n- **Homepage:** `http://localhost:9999/` - View all posts from all users\n- **User profile:** `http://localhost:9999/users/\u003cusername\u003e` - View posts by a specific user\n- **Single post:** `http://localhost:9999/posts/\u003cuuid\u003e` - View individual post with thread context\n\nThe web UI features:\n- Terminal-style aesthetic matching the SSH TUI\n- SEO optimized with proper meta tags\n- Clickable Markdown links\n- Responsive design\n- RSS feed links for each user\n\nReplace `localhost:9999` with your domain when deployed publicly.\n\n## Building from Source\n\n```bash\ngit clone https://github.com/deemkeen/stegodon\ncd stegodon\ngo build\n./stegodon\n```\n\n**Requirements:**\n- Go 1.26+\n- Terminal with 24-bit color, 115x28 minimum\n- OSC 8 support for clickable links (optional: Ghostty, iTerm2, Kitty)\n\n## Tech Stack\n\n- **SSH:** [wish](https://github.com/charmbracelet/wish)\n- **TUI:** [bubbletea](https://github.com/charmbracelet/bubbletea), [lipgloss](https://github.com/charmbracelet/lipgloss)\n- **Web:** [gin](https://github.com/gin-gonic/gin)\n- **Database:** SQLite with WAL mode\n- **Federation:** Custom ActivityPub implementation with HTTP signatures\n\n## CLI Mode\n\nStegodon supports non-interactive CLI commands for scripting and automation:\n\n```bash\nssh -p 23232 localhost post \"Hello world\"\nssh -p 23232 localhost timeline -j\necho \"Content\" | ssh -p 23232 localhost post -\n```\n\nAll commands support `--json` / `-j` for machine-readable output. See [cli/CLI.md](cli/CLI.md) for full documentation.\n\n## Documentation\n\n- [cli/CLI.md](cli/CLI.md) - CLI mode commands and JSON output\n- [DATABASE.md](DATABASE.md) - Database schema and tables\n- [FEDERATION.md](FEDERATION.md) - ActivityPub federation details\n- [DOCKER.md](DOCKER.md) - Docker deployment guide\n\nFor detailed technical specifications covering the TUI architecture, ActivityPub federation, database schema, and all subsystems, see [specs/overview.md](specs/overview.md).\n\n## License\n\nMIT - See LICENSE file\n\n## Contributing\n\nContributions welcome! Open an issue or pull request on [GitHub](https://github.com/deemkeen/stegodon).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeemkeen%2Fstegodon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeemkeen%2Fstegodon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeemkeen%2Fstegodon/lists"}