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](#-features) - [πŸ“Έ Screenshots](#-screenshots) - [πŸš€ Quick Start](#-quick-start) - [πŸ” Authentication](#-authentication) - [πŸ’» Usage](#-usage) - [⌨️ Keybindings](#️-keybindings) - [🎨 Themes](#-themes) - [βš™οΈ Configuration](#️-configuration) - [πŸ—οΈ Architecture](#️-architecture) - [πŸ”§ Building from Source](#-building-from-source) - [🀝 Contributing](#-contributing) - [πŸ“„ License](#-license)
## ✨ 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 ```bash # Homebrew (recommended - fast, pre-built binary) brew install ricardodantas/tap/perch ``` #### Linux ```bash # Homebrew (recommended) brew install ricardodantas/tap/perch # Or via Cargo cargo install perch ``` #### Windows ```bash # Via Cargo (requires Rust toolchain) cargo install perch ``` Or download `perch-*-x86_64-pc-windows-msvc.zip` from [GitHub Releases](https://github.com/ricardodantas/perch/releases). #### From Source ```bash git clone https://github.com/ricardodantas/perch cd perch cargo install --path . ``` ### First Run 1. **Add a Mastodon account:** ```bash perch auth mastodon mastodon.social ``` 2. **Or add a Bluesky account:** ```bash perch auth bluesky ``` 3. **Launch the TUI:** ```bash perch ```
## πŸ” Authentication ### Mastodon (OAuth) ```bash perch auth mastodon ``` 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:** ```bash perch auth mastodon mastodon.social perch auth mastodon fosstodon.org perch auth mastodon hachyderm.io ``` ### Bluesky (App Password) ```bash perch auth bluesky ``` You'll need an [App Password](https://bsky.app/settings/app-passwords) 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 ```bash 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 ```bash # 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 ```bash # 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 ```bash # View home timeline (all networks) perch timeline # View specific network perch timeline mastodon perch timeline bluesky # Limit posts perch timeline --limit 50 ``` #### Account Management ```bash # List all accounts perch accounts # Remove an account perch accounts remove ```
## ⌨️ 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](https://toml.io) for configuration. The config file is located at: ``` ~/.config/perch/config.toml ``` ### Full Configuration Example ```toml # ───────────────────────────────────────────────────────────── # 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 ```bash # 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 ```bash # 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 **GPL-3.0-or-later** license β€” see the [LICENSE](LICENSE) file for details. ---

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