ricardodantas
perch
Rust

A beautiful terminal social client for Mastodon and Bluesky 🐦

Last updated Jun 21, 2026
86
Stars
1
Forks
13
Issues
0
Stars/day
Attention Score
35
Language breakdown
Rust 81.9%
Astro 18.0%
JavaScript 0.1%
β–Έ Files click to expand
README

Perch Timeline

🐦 Perch

A beautiful terminal social client for Mastodon and Bluesky

Read, post, and engage across social networks β€” all from your terminal.

Release Crates.io CI License Rust Version


πŸ“– Table of Contents


✨ Features

🐘 Mastodon Integration

Full OAuth authentication with any instance. Browse timelines, post, reply, like, and boost.

πŸ¦‹ Bluesky Integration

AT Protocol support with app passwords. Stay connected to the decentralized social web.

πŸ“ Cross-Posting

Write once, post to multiple networks simultaneously. Perfect for maintaining presence everywhere.

πŸ–₯️ Beautiful TUI

Gorgeous three-panel terminal interface with vim keybindings and real-time updates.

⚑ Powerful CLI

Script your social media with comprehensive commands. Automate posts, fetch timelines, manage accounts.

πŸ” Secure Storage

Credentials stored safely in your system keyring. Never worry about plaintext tokens.


Feature Highlights

| Feature | Description | |---------|-------------| | πŸ” Timeline Filtering | View all posts or filter by network | | πŸ’Ύ Offline Cache | SQLite-backed cache for offline reading | | 🎨 15 Built-in Themes | From Dracula to Cyberpunk | | ⌨️ Vim Keybindings | Navigate like a pro | | πŸ“‹ Draft Support | Save drafts for later | | πŸ“… Scheduled Posts | Queue posts for optimal timing | | πŸ”” Notifications | Desktop alerts for mentions | | πŸ–ΌοΈ Media Support | Attach images to posts |


πŸ“Έ Screenshots

Timeline View β€” Browse posts from all your networks
Timeline View

Compose Post β€” Write once, post everywhere
Compose Dialog

Accounts β€” Manage your connected accounts
Accounts View

Keyboard Shortcuts β€” Vim-style navigation
Help Dialog

Theme Picker β€” 15 beautiful themes
Theme Picker

About β€” Version info and links
About Dialog


πŸš€ Quick Start

Installation

macOS

# Homebrew (recommended - fast, pre-built binary)
brew install ricardodantas/tap/perch

Linux

# Homebrew (recommended)
brew install ricardodantas/tap/perch

Or via Cargo

cargo install perch

Windows

# Via Cargo (requires Rust toolchain)
cargo install perch

Or download perch-*-x8664-pc-windows-msvc.zip from GitHub Releases.

From Source

git clone https://github.com/ricardodantas/perch
cd perch
cargo install --path .

First Run

  • Add a Mastodon account:
perch auth mastodon mastodon.social
  • Or add a Bluesky account:
perch auth bluesky
  • Launch the TUI:
perch


πŸ” Authentication

Mastodon (OAuth)

perch auth mastodon <instance>

This will:

  • Register Perch with your Mastodon instance
  • Open your browser for authorization
  • Ask you to paste the authorization code
  • Store credentials securely in your system keyring
Examples:

perch auth mastodon mastodon.social
perch auth mastodon fosstodon.org
perch auth mastodon hachyderm.io

Bluesky (App Password)

perch auth bluesky

You'll need an App Password from Bluesky settings.

Note: App passwords are more secure than your main password β€” they can be revoked individually and don't have full account access.


πŸ’» Usage

TUI Mode

perch

Launch the beautiful terminal interface with three-panel layout:

  • Left panel: Accounts and filters
  • Center panel: Timeline/feed
  • Right panel: Post details and media

CLI Commands

Posting

# Post to all configured networks
perch post "Hello world!"

Post to specific networks

perch post "Hello Fediverse!" --to mastodon perch post "Hello everyone!" --to mastodon,bluesky

Post with content warning

perch post "Spoiler content" --cw "Movie spoilers"

Post with media

perch post "Check this out!" --media ~/photo.jpg

Scheduled Posts

# Schedule a post for later
perch post "Good morning!" --schedule "in 2h"
perch post "Happy Friday!" --schedule "YYYY-MM-DD HH:MM" --to mastodon,bluesky

List pending scheduled posts

perch schedule list

Cancel a scheduled post

perch schedule cancel abc123

Process due scheduled posts (one-time)

perch schedule run

Run scheduler daemon (continuous)

perch schedule daemon perch schedule daemon --interval 30 # Check every 30 seconds

Schedule time formats:

  • Relative: "in 5m", "in 2h", "in 1d", "in 30 minutes"
  • Time today: "15:00", "3pm" (schedules for tomorrow if past)
  • Date+time: "YYYY-MM-DD HH:MM", "YYYY-MM-DDTHH:MM"
TUI Scheduling: In the compose dialog (n), press Tab to switch to the schedule input field. Type your schedule time and it validates in real-time. Press Tab or Enter to confirm, F4 to clear.

Timeline

# View home timeline (all networks)
perch timeline

View specific network

perch timeline mastodon perch timeline bluesky

Limit posts

perch timeline --limit 50

Account Management

# List all accounts
perch accounts

Remove an account

perch accounts remove <account-id>


⌨️ Keybindings

Global

| Key | Action | |-----|--------| | Tab | Switch panel | | ? / F1 | Show help | | t | Change theme | | q | Quit | | Ctrl+c | Force quit |

Navigation

| Key | Action | |-----|--------| | ↑ / k | Move up | | ↓ / j | Move down | | g / Home | Go to first item | | G / End | Go to last item | | PageUp | Page up | | PageDown | Page down |

Timeline View

| Key | Action | |-----|--------| | r | Refresh timeline | | f | Cycle filter (All/Mastodon/Bluesky) | | Enter | View post details | | o | Open in browser | | l | Like/favorite | | b | Boost/repost | | R | Reply to post |

Compose

| Key | Action | |-----|--------| | n | New post | | Ctrl+Enter | Send post | | Alt+1 | Toggle Mastodon | | Alt+2 | Toggle Bluesky | | Esc | Cancel |


🎨 Themes

Perch includes 15 beautiful themes based on popular terminal and editor color schemes.

Press t in the TUI to cycle through themes.

Available Themes

| Theme | Description | |-------|-------------| | πŸ¦‡ Dracula | Dark purple aesthetic (default) | | πŸŒ™ One Dark Pro | Atom's iconic dark theme | | ❄️ Nord | Arctic, bluish color palette | | 🐱 Catppuccin Mocha | Warm pastel dark theme | | β˜• Catppuccin Latte | Warm pastel light theme | | 🎸 Gruvbox Dark | Retro groove colors | | πŸ“œ Gruvbox Light | Retro groove, light variant | | πŸŒƒ Tokyo Night | Futuristic dark blue | | πŸŒ… Solarized Dark | Precision colors, dark | | 🌞 Solarized Light | Precision colors, light | | 🎨 Monokai Pro | Classic syntax highlighting | | 🌹 RosΓ© Pine | All natural pine with soho vibes | | 🌊 Kanagawa | Inspired by Katsushika Hokusai | | 🌲 Everforest | Comfortable green forest theme | | πŸŒ† Cyberpunk | Neon-soaked futuristic theme |


βš™οΈ Configuration

Perch uses TOML for configuration. The config file is located at:

~/.config/perch/config.toml

Full Configuration Example

# ─────────────────────────────────────────────────────────────

Display Settings

─────────────────────────────────────────────────────────────

Theme (dracula, nord, catppuccin-mocha, etc.)

theme = "dracula"

Enable vim-like keybindings

vim_mode = true

Show media previews (when supported)

show_media = true

─────────────────────────────────────────────────────────────

Timeline Settings

─────────────────────────────────────────────────────────────

Default timeline view

default_timeline = "home"

Number of posts to fetch

post_limit = 50

Auto-refresh interval in seconds (0 = manual only)

refreshintervalsecs = 0

─────────────────────────────────────────────────────────────

Posting Settings

─────────────────────────────────────────────────────────────

Default visibility for posts

Options: public, unlisted, private, direct

default_visibility = "public"

Default networks to post to (when using CLI without --to)

default_networks = ["mastodon", "bluesky"]


πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         User                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β–Ό                               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     perch (TUI)         β”‚     β”‚     perch (CLI)         β”‚
β”‚  β€’ Browse timelines     β”‚     β”‚  β€’ perch post           β”‚
β”‚  β€’ Compose posts        β”‚     β”‚  β€’ perch timeline       β”‚
β”‚  β€’ Like & boost         β”‚     β”‚  β€’ perch accounts       β”‚
β”‚  β€’ Switch themes        β”‚     β”‚  β€’ Scriptable commands  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              β”‚                               β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Core Library                           β”‚
β”‚  β€’ api/mastodon.rs  β€” Mastodon OAuth + API                  β”‚
β”‚  β€’ api/bluesky.rs   β€” AT Protocol integration               β”‚
β”‚  β€’ auth/            β€” System keyring storage                β”‚
β”‚  β€’ db.rs            β€” SQLite cache & drafts                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β–Ό                               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   🐘 Mastodon API       β”‚     β”‚   πŸ¦‹ Bluesky API        β”‚
β”‚   (Any instance)        β”‚     β”‚   (bsky.social)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Project Structure

perch/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ api/              # Network API clients
β”‚   β”‚   β”œβ”€β”€ mod.rs        # Unified SocialApi trait
β”‚   β”‚   β”œβ”€β”€ mastodon.rs   # Mastodon OAuth + REST
β”‚   β”‚   └── bluesky.rs    # AT Protocol client
β”‚   β”œβ”€β”€ app/              # TUI application
β”‚   β”‚   β”œβ”€β”€ mod.rs
β”‚   β”‚   β”œβ”€β”€ state.rs      # Application state
β”‚   β”‚   β”œβ”€β”€ events.rs     # Key event handling
β”‚   β”‚   └── ui.rs         # UI rendering
β”‚   β”œβ”€β”€ auth/             # Credential storage
β”‚   β”‚   └── mod.rs        # System keyring
β”‚   β”œβ”€β”€ models/           # Data models
β”‚   β”‚   β”œβ”€β”€ mod.rs
β”‚   β”‚   β”œβ”€β”€ account.rs
β”‚   β”‚   β”œβ”€β”€ network.rs
β”‚   β”‚   └── post.rs
β”‚   β”œβ”€β”€ config.rs         # Configuration loading
β”‚   β”œβ”€β”€ db.rs             # SQLite database
β”‚   β”œβ”€β”€ theme.rs          # Color themes
β”‚   β”œβ”€β”€ lib.rs            # Library root
β”‚   └── main.rs           # Entry point
β”œβ”€β”€ Cargo.toml
└── LICENSE


πŸ”§ Building from Source

Requirements

  • Rust 1.85+
  • Linux, macOS, or Windows

Build

# Clone the repository
git clone https://github.com/ricardodantas/perch
cd perch

Build release binary

cargo build --release

The binary will be at:

target/release/perch

Or install directly

cargo install --path .

Development

# Run in development
cargo run

Run tests

cargo test

Run linter

cargo clippy

Format code

cargo fmt


🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Quick Start for Contributors

  • Fork the repository
  • Create a feature branch: git checkout -b feature/amazing-feature
  • Make your changes
  • Run tests: cargo test
  • Run clippy: cargo clippy
  • Format: cargo fmt
  • Commit: git commit -m "Add amazing feature"
  • Push: git push origin feature/amazing-feature
  • Open a Pull Request

πŸ“„ License

This project is licensed under the GPL-3.0-or-later license β€” see the LICENSE file for details.


Built with πŸ¦€ Rust and ❀️ by Ricardo Dantas

πŸ”— More in this category

Β© 2026 GitRepoTrend Β· ricardodantas/perch Β· Updated daily from GitHub