A fast, beautiful, and fully keyboard/mouse-driven Terminal UI for downloading media from social platforms. Built in Rust using ratatui.
- Multi-platform — TikTok, Instagram, X/Twitter, Threads, SoundCloud
- Concurrent downloads — queue multiple URLs, they download in the background without freezing the UI
- Rich detail view — file sizes, duration, syntax-highlighted
metadata.jsonpreview - Mouse support — click queue items, toggle checkboxes, switch tabs, open folders
- Keyboard-first — fully operable without a mouse (
Tab,F1/F2,Enter,o) - Tokyo Night color theme
| New Download | Download Complete | Task Details |
|---|---|---|
![]() |
![]() |
![]() |
| Platform | Videos | Audio | Stories |
|---|---|---|---|
| TikTok | ✅ | ✅ | — |
| ✅ | — | ✅ | |
| X / Twitter | ✅ | — | — |
| Threads | ✅ | — | — |
| SoundCloud | — | ✅ | — |
Requirements: Rust 1.75+ and Cargo
git clone https://github.com/2Xsave/xsave_tui
cd xsave_tui
cargo build --release
./target/release/xsave_tuiOr run directly without cloning:
cargo install --git https://github.com/2Xsave/xsave_tui- Paste a URL into the URL input field (auto-focused on start)
- Toggle options if needed:
- Download Audio — extract audio track (TikTok, SoundCloud)
- Skip Initial URL Check — skip validation, attempt download directly
- Press
Enterto start the download
The download runs in the background. Switch to the Details tab (F2) to see the result, file path, and metadata.json.
| Key | Action |
|---|---|
F1 |
Switch to New Download tab |
F2 |
Switch to Details tab |
Tab / Shift+Tab |
Cycle focus between UI elements |
↑ / ↓ |
Navigate queue (left panel) or scroll details |
Enter |
Start download / toggle checkbox |
o |
Open download folder in file manager (xdg-open) |
Esc / q |
Quit |
| Scroll wheel | Navigate queue or scroll details |
xsave_tui/
├── src/
│ ├── main.rs # Async event loop, keyboard & mouse handling
│ ├── state.rs # App state, task queue, focus management
│ ├── ui.rs # ratatui rendering (Tokyo Night theme)
│ └── downloader.rs # Platform auto-detection & download routing
└── Cargo.toml
The app uses a single tokio::sync::mpsc channel to communicate between the UI thread and background download threads. Each download spawns its own OS thread with a local tokio runtime to avoid Send bound issues with the core library futures.
All platform cores are pulled directly from GitHub:
| Crate | Repository |
|---|---|
insave_core |
2Xsave/insave |
ttsave_core |
2Xsave/ttsave |
sksave_core |
2Xsave/sksave |
trsave_core |
2Xsave/trsave |
twsave_core |
2Xsave/twsave |
MIT


