Skip to content

A beautiful terminal social client for Mastodon and Bluesky 🐦

License

Notifications You must be signed in to change notification settings

ricardodantas/perch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

69 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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-*-x86_64-pc-windows-msvc.zip from GitHub Releases.

From Source

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

First Run

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

πŸ” Authentication

Mastodon (OAuth)

perch auth mastodon <instance>

This will:

  1. Register Perch with your Mastodon instance
  2. Open your browser for authorization
  3. Ask you to paste the authorization code
  4. 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)
refresh_interval_secs = 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

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes
  4. Run tests: cargo test
  5. Run clippy: cargo clippy
  6. Format: cargo fmt
  7. Commit: git commit -m "Add amazing feature"
  8. Push: git push origin feature/amazing-feature
  9. Open a Pull Request

πŸ“„ License

This project is licensed under the MIT License β€” see the LICENSE file for details.


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

About

A beautiful terminal social client for Mastodon and Bluesky 🐦

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •