A fast, feature-rich terminal file manager written in Rust. Two-pane layout with syntax-highlighted previews, inline image display, archive browsing, SSH remote access, async file operations, OpenAI integration, and comprehensive undo. Feature clone of RTFM.
Built on crust (TUI) and glow (images). Single binary, ~3.6MB, ~50ms startup.
# Download from releases (Linux/macOS, x86_64/aarch64)
# Or build from source:
git clone https://github.com/isene/pointer
cd pointer
cargo build --release
# Run
./target/release/pointer
# Start in specific directory
pointer ~/Documents
# Use as file picker
pointer --pick=/tmp/selected.txtPress ? for built-in help. Press q to quit (saves state).
| Directory browsing | File preview with bat |
|---|---|
![]() |
![]() |
| Image preview | |
![]() |
- Two-pane layout with configurable width ratio and border styles
- LS_COLORS support for consistent terminal theming
- Syntax highlighting via bat/batcat
- Image preview via kitty/sixel/w3m protocols (using glow)
- Archive browsing (zip, tar, gz, bz2, xz, rar, 7z as virtual directories)
- SSH/SFTP remote browsing (Ctrl-E)
- Async file operations with progress for large copy/move
- Comprehensive undo (delete, move, rename, copy, symlink, permissions, bulk rename)
- Trash system with toggle and browser
- Tab management (create, close, switch, duplicate, rename)
- Bookmarks with instant single-key jump
- Search (filename), grep (content), filter (extension/regex)
- fzf and navi integration
- locate with jump-to-result
- Bulk rename (regex, case conversion, extension change, prefix/suffix)
- File comparison (diff between two tagged files)
- Git status display
- Directory hashing (SHA1 change detection)
- OpenAI integration (file description, interactive chat)
- Plugin system (JSON manifests, external commands)
- Script evaluator (
@mode with full context via env vars) - Top bar color matching (path-based, like RTFM's @topmatch)
- File picker mode (
--pick=/pathfor external tool integration) - Scrolloff (3-line margin) and wrap-around navigation
| Key | Action | Key | Action |
|---|---|---|---|
| Navigation | View | ||
| j/k | Move down/up | a | Toggle hidden files |
| h/l | Go up / enter | A | Toggle long format |
| PgDn/PgUp | Page down/up | o | Cycle sort mode |
| HOME/END | First/last | i | Invert sort |
| ~ | Home directory | - | Toggle preview |
| ' | Jump to mark | _ | Toggle images |
| > | Follow symlink | b | Toggle bat highlighting |
| Tags | Search | ||
| t | Tag/untag | / | Search filenames |
| T | Show tagged | n/N | Next/prev match |
| u | Clear tags | g | Grep file contents |
| Ctrl-T | Tag by pattern | f/F | Filter ext/regex |
| File Ops | Tabs | ||
| p | Copy here | ] / [ | New / close tab |
| P | Move here | J/K | Prev/next tab |
| d | Delete | 1-9 | Switch to tab |
| c | Rename | { / } | Rename / duplicate |
| s | Create symlink | Command | |
| = | Create directory | : | Shell command |
| E | Bulk rename | ; | Command history |
| X | Compare (2 tagged) | @ | Script evaluator |
| U | Undo | + | Add to interactive |
| Marks | Info | ||
| m | Set mark | e | File properties |
| M | Show marks | G | Git status |
| Clipboard | H | Hash directory | |
| y | Yank to primary | S | System info |
| Y | Yank to clipboard | I | AI describe |
| Ctrl-Y | Copy right pane | Ctrl-A | AI chat |
| Key | Action |
|---|---|
| Shift-Down/Up | Scroll line |
| TAB / Shift-TAB | Page down/up |
| ENTER | Refresh preview |
Config: ~/.pointer/conf.json (auto-created on first run)
State: ~/.pointer/state.json (marks, history, recent files)
Trash: ~/.pointer/trash/
Plugins: ~/.pointer/plugins/
{
"width": 4,
"border": 2,
"preview": true,
"trash": true,
"bat": true,
"show_hidden": false,
"long_format": false,
"sort_mode": "name",
"sort_invert": false,
"interactive": ["vim", "less", "top", "htop", "fzf", "navi"],
"c_top_fg": 0, "c_top_bg": 249,
"c_status_fg": 252, "c_status_bg": 236,
"topmatch": [["PassionFruit", 171], ["Dualog", 72], ["", 249]],
"ai_key": "",
"ai_model": "gpt-4o-mini"
}Press @ to run a shell command with pointer context as environment variables:
| Variable | Content |
|---|---|
POINTER_SELECTED |
Full path of selected item |
POINTER_DIR |
Current working directory |
POINTER_TAGGED |
Newline-separated tagged paths |
POINTER_INDEX |
Selected index (0-based) |
POINTER_COUNT |
Number of files |
POINTER_CONTEXT |
JSON with all above |
Scripts can control pointer via stderr directives: cd:/path, select:filename, status:message.
Plugins are JSON manifests in ~/.pointer/plugins/:
{
"name": "My Plugin",
"description": "Does something useful",
"key": "F5",
"command": "my-script.sh"
}Commands receive POINTER_CONTEXT env var with JSON state.
| Tool | Clones | Type |
|---|---|---|
| rush | rsh | Shell |
| crust | rcurses | TUI library |
| glow | termpix | Image display |
| pointer | RTFM | File manager |
| kastrup | Heathrow | Messaging |
| tock | Timely | Calendar |
| scroll | brrowser | Browser |
Build: Rust toolchain (cargo)
Runtime (optional, for full features):
batorbatcatfor syntax highlightingfzffor fuzzy findingImageMagick(convert,identify) for image previewpdftotextfor PDF previewgitfor git statusxclipfor clipboard (also uses OSC 52)locatefor file searchnavifor cheatsheetscurlfor AI integration
Unlicense - public domain.
Created by Geir Isene (https://isene.org) with extensive pair-programming with Claude Code.


