RepoPilotOpen in app →

yorukot/superfile

Pretty fancy and modern terminal file manager

Healthy

Healthy across the board

Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 3d ago
  • 21+ active contributors
  • Distributed ownership (top contributor 26% of recent commits)
Show 3 more →
  • MIT licensed
  • CI configured
  • Tests present

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/yorukot/superfile)](https://repopilot.app/r/yorukot/superfile)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/yorukot/superfile on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: yorukot/superfile

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/yorukot/superfile shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across the board

  • Last commit 3d ago
  • 21+ active contributors
  • Distributed ownership (top contributor 26% of recent commits)
  • MIT licensed
  • CI configured
  • Tests present

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live yorukot/superfile repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/yorukot/superfile.

What it runs against: a local clone of yorukot/superfile — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in yorukot/superfile | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 33 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>yorukot/superfile</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of yorukot/superfile. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/yorukot/superfile.git
#   cd superfile
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of yorukot/superfile and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "yorukot/superfile(\\.git)?\\b" \\
  && ok "origin remote is yorukot/superfile" \\
  || miss "origin remote is not yorukot/superfile (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "main.go" \\
  && ok "main.go" \\
  || miss "missing critical file: main.go"
test -f "src/internal/model.go" \\
  && ok "src/internal/model.go" \\
  || miss "missing critical file: src/internal/model.go"
test -f "src/internal/model_render.go" \\
  && ok "src/internal/model_render.go" \\
  || miss "missing critical file: src/internal/model_render.go"
test -f "src/internal/handle_file_operations.go" \\
  && ok "src/internal/handle_file_operations.go" \\
  || miss "missing critical file: src/internal/handle_file_operations.go"
test -f "src/internal/ui/filepanel/type.go" \\
  && ok "src/internal/ui/filepanel/type.go" \\
  || miss "missing critical file: src/internal/ui/filepanel/type.go"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 33 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~3d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/yorukot/superfile"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Superfile is a terminal file manager written in Go using Bubble Tea (TUI framework) that provides a modern, visually-enhanced alternative to traditional CLI file managers like ls and cd. It features multi-pane navigation, rich icon support via src/config/icon/, syntax highlighting through Chroma, and clipboard integration, all rendered in the terminal without leaving the shell. Modular Go monorepo: src/cmd/ contains CLI entry points (main.go, debug_info.go), src/config/ houses configuration and icon theming, src/internal/ holds core logic. Website is separate (Astro-based in website/). Build artifacts and release logic in release/. Config loads from XDG directories via github.com/adrg/xdg.

👥Who it's for

Power users and developers who spend significant time in terminal environments and want a faster, more intuitive file browser than cd + ls. Also appeals to those migrating from GUI file managers (Finder, Explorer) who need terminal-native workflow but crave visual feedback.

🌱Maturity & risk

Actively maintained and production-ready. The project has substantial community engagement (Discord server, Homebrew/Winget packages), comprehensive CI/CD via GitHub Actions (superfile-build-test.yml, testsuite-run.yml), and regular releases. Go 1.25.5 dependency and recent feature work (plugins, themes) indicate ongoing development without stagnation.

Low-to-medium risk: single maintainer (yorukot) is the core owner, though CI/CD is robust. Dependency chain is moderate (~25 direct deps) and mostly stable (Charm libraries v2.x, standard Go ecosystem). Primary risk is platform-specific behavior across macOS/Linux/Windows (evidenced by separate shell helpers: cd_on_quit.sh, cd_on_quit.ps1, cd_on_quit.fish) requiring careful testing.

Active areas of work

Active feature development: plugin system and theme support are recent additions (evidenced by config structure). CI workflows for PR labeling, first-interaction automation, and automated release builds indicate mature DevOps. Renovate.json suggests automated dependency updates. Website deployments happening via website-ci.yml workflow.

🚀Get running

Clone and build using the provided Makefile or shell scripts: git clone https://github.com/yorukot/superfile && cd superfile && make build (or ./build.sh for direct build). For development: ./dev.sh sets up environment. Binary starts with ./superfile or spf (if installed via package manager).

Daily commands: Development: go run main.go or ./dev.sh for a dev environment. Production: make build generates binary in release/, or use pre-built packages (Homebrew: brew install superfile, Winget: winget install yorukot.superfile). Start the app with spf command.

🗺️Map of the codebase

  • main.go — Entry point for the superfile application; initializes CLI and bootstraps the entire TUI application
  • src/internal/model.go — Core data model and state management for the entire file manager; defines the central Model struct that drives all UI updates via Bubble Tea
  • src/internal/model_render.go — Rendering pipeline for the UI; orchestrates how file panels, modals, and status displays are composed and output to terminal
  • src/internal/handle_file_operations.go — Central handler for all file system operations (copy, paste, delete, rename); critical for data integrity and user actions
  • src/internal/ui/filepanel/type.go — Defines the FilePanel abstraction and its API; foundation for multi-panel file browsing interface
  • src/internal/common/config_type.go — Configuration schema and types; all user preferences and application settings flow through this
  • src/internal/key_function.go — Keyboard input handling and key binding dispatch; maps user input to all application commands

🛠️How to make changes

Add a new keyboard shortcut/command

  1. Define the new message type in src/internal/model_msg.go (e.g., MsgMyNewCommand) (src/internal/model_msg.go)
  2. Add key binding logic in src/internal/key_function.go to map a key to your new message (src/internal/key_function.go)
  3. Implement the command handler in src/internal/model.go's Update() method to process the message (src/internal/model.go)
  4. If a file operation is needed, add the handler to src/internal/handle_file_operations.go (src/internal/handle_file_operations.go)

Add a new configuration option

  1. Add the field to the Config struct in src/internal/common/config_type.go (src/internal/common/config_type.go)
  2. Set a default value in src/internal/common/default_config.go (src/internal/common/default_config.go)
  3. Update the config file parser in src/internal/common/load_config.go if custom parsing is needed (src/internal/common/load_config.go)
  4. Use the config value in the appropriate handler or rendering code (e.g., src/internal/model_render.go) (src/internal/model_render.go)

Add a new file operation (copy, move, delete variant)

  1. Implement the operation logic in src/internal/file_operations.go or a new file like file_operations_myop.go (src/internal/file_operations.go)
  2. Add a message type for the operation in src/internal/model_msg.go (src/internal/model_msg.go)
  3. Wire the operation in src/internal/handle_file_operations.go dispatch logic (src/internal/handle_file_operations.go)
  4. Add a key binding in src/internal/key_function.go to trigger the operation (src/internal/key_function.go)

Add a new UI panel or modal dialog

  1. Create a new type in src/internal/ui/ (e.g., src/internal/ui/myui/type.go) following the FilePanel pattern (src/internal/ui/filepanel/type.go)
  2. Implement Render() and Update() methods for your UI component (src/internal/ui/filepanel/render.go)
  3. Add the component to the Model struct in src/internal/model.go and invoke it from model_render.go (src/internal/model.go)
  4. Handle input for your modal in src/internal/handle_modal.go (src/internal/handle_modal.go)

🔧Why these technologies

  • Bubble Tea (TUI framework) — Provides reactive event-driven architecture for terminal UI; clean separation of model and view via Elm-inspired Update/View pattern
  • Lipgloss (styling library) — Abstracts terminal styling (colors, layout, positioning); enables consistent theme system and responsive UI across terminal types
  • Go (language choice) — Single statically-compiled binary with no runtime dependency; cross-platform (macOS, Linux, Windows); fast file I/O and system calls
  • go-zoxide integration — Provides smart directory jumping via zoxide; zero-config frecency-based navigation

🪤Traps & gotchas

Shell integration required: Superfile changes directories but must signal parent shell via cd_on_quit helpers (bash, fish, PowerShell). Users must source the appropriate script or use a wrapper function. XDG/config paths vary by OS: github.com/adrg/xdg abstracts this but ~/.config/ structure differs on macOS (uses ~/Library/). Trash vs delete: Uses trash-go (Github.com/hymkor/trash-go) instead of permanent deletion; behavior differs on Windows. Zoxide and fzf are optional dependencies: Projects may not have them installed; graceful degradation needed. Terminal escape sequences: Lipgloss v2 output may not render correctly in older terminals; TERM env var matters.

🏗️Architecture

💡Concepts to learn

  • Terminal User Interface (TUI) Framework — Superfile is built on Bubble Tea, a Go TUI framework using composable components; understanding the elm-inspired architecture (Model-Update-View) is fundamental to contributing to UI features
  • XDG Base Directory Specification — Superfile uses github.com/adrg/xdg to store config and cache across different OSes; knowing XDG paths (~/.config, ~/.cache, ~/.local) is critical for config file handling
  • Syntax Highlighting via AST Traversal — File preview uses Chroma v2 (lexer-based highlighter) to colorize code; understanding lexer tokens vs. rendered output helps when adding new language support or custom themes
  • Cross-Platform Shell Integration — Superfile's ability to change the parent shell's directory on exit (cd_on_quit) is non-trivial and differs per shell (bash/fish/PowerShell); requires understanding shell sourcing and environment variables
  • ANSI Escape Sequences & Terminal Rendering — Lipgloss v2 and charmbracelet/x/ansi handle color codes and cursor movement; understanding 24-bit color support, alternate screen buffers, and TERM capabilities is essential for TUI debugging
  • Icon Theming & Font Fallbacks — Superfile renders Nerd Fonts icons for file types via src/config/icon/icon.go; missing glyphs require fallback logic, and theming needs understanding of terminal color palettes
  • File System Trash vs. Permanent Deletion — Uses trash-go instead of rm -f; trash behavior differs on macOS (.Trash), Linux (.local/share/Trash), and Windows (Recycle Bin); critical for safe file operations
  • charmbracelet/bubbletea — Direct dependency and TUI framework foundation; understanding Bubble Tea is essential for hacking on Superfile's UI
  • junegunn/fzf — Optional fuzzy-finder integration (via reinhrst/fzf-lib); powers file search and navigation in Superfile
  • mikefarah/yq — Similar Go CLI tool with rich config system; useful reference for advanced config patterns in terminal tools
  • ajeetdsouza/zoxide — Integrated as dependency (go-zoxide wrapper); provides smart directory jumping; Superfile wraps its functionality
  • gokceusta/lf — Predecessor terminal file manager in a similar niche; different architecture (Lua-configurable) but same user base

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for src/internal/file_operations.go

The file_operations.go module handles critical file manipulation logic (compression, extraction, deletion), but there's only one test file (file_operation_compress_test.go) that appears incomplete. Given the complexity of cross-platform file operations and the project's use of stretchr/testify, adding tests for file move, copy, delete, and permission operations would catch regressions and improve maintainability. This is especially important for a file manager where data loss bugs are critical.

  • [ ] Review src/internal/file_operations.go to identify untested functions
  • [ ] Create src/internal/file_operations_test.go with test cases for move, copy, delete operations
  • [ ] Add tests for edge cases: symbolic links, permission errors, cross-filesystem moves
  • [ ] Ensure tests pass on both Unix-like systems and Windows (using filepath package appropriately)
  • [ ] Aim for >80% code coverage on file_operations.go

Add GitHub Actions workflow for multi-platform binary testing

The repo has superfile-build-test.yml but it only tests builds. Given that superfile supports macOS, Linux, and Windows (with cd_on_quit scripts for each platform), there should be a dedicated workflow that actually runs integration tests across platforms. The testsuite-run.yml exists but its scope is unclear. Create a workflow that runs Go tests (go test ./...) on matrix OS (ubuntu-latest, macos-latest, windows-latest) to catch platform-specific bugs early.

  • [ ] Review .github/workflows/testsuite-run.yml to understand current test strategy
  • [ ] Create .github/workflows/platform-integration-tests.yml with matrix strategy for [ubuntu-latest, macos-latest, windows-latest]
  • [ ] Configure step to run 'go test ./...' with race detector enabled
  • [ ] Add conditional steps for platform-specific tests (e.g., testing cd_on_quit shell scripts)
  • [ ] Ensure workflow uploads test coverage reports to a coverage service

Add documentation for configuration schema and icon customization

The config system is complex with src/config/icon/icon.go, src/internal/common/config_type.go, and src/internal/common/default_config.go, but there's no dedicated documentation for users or contributors on how to customize icons or extend configuration. The CONTRIBUTING.md exists but doesn't cover config architecture. Create a CONFIGURATION.md file documenting the schema, predefined variables (src/internal/common/predefined_variable.go), string functions (src/internal/common/string_function.go), and icon customization with examples.

  • [ ] Review src/internal/common/default_config.go and config_type.go to extract schema documentation
  • [ ] Review src/config/icon/icon.go and src/internal/common/predefined_variable.go for available customization options
  • [ ] Create docs/CONFIGURATION.md with sections: Config File Location, Schema, Predefined Variables, Icon Customization, Style Functions
  • [ ] Add 3-5 practical examples (e.g., custom file type icons, color themes for different file types)
  • [ ] Link CONFIGURATION.md from README.md and CONTRIBUTING.md

🌿Good first issues

  • Add unit tests for src/config/icon/icon.go icon loading and fallback logic; currently appears untested based on missing test files in src/config/
  • Document the plugin system architecture (referenced in config but no clear spec); create a plugins/PLUGIN_DEVELOPMENT.md guide with examples
  • Expand keyboard shortcut help text in src/cmd/help_printer.go; currently minimal, should match feature set of modern file managers (batch rename, multi-select, etc.)

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 0f6eff7 — feat: new website & logo design (#1423) (yorukot)
  • e248f4b — fix: files processed in deterministic order (#1421) (xelavopelk)
  • d4bc461 — feat: highlight install command on home page & format (elvisdragonmao)
  • b3feae8 — feat: add contribute footer link (elvisdragonmao)
  • 49c41c3 — feat: add search (elvisdragonmao)
  • 693a92e — feat: improve docs styling (elvisdragonmao)
  • aa4a700 — feat: add Giscus theme (elvisdragonmao)
  • 42a941b — feat: add icon for docs (elvisdragonmao)
  • 10f2315 — feat: add branding page (elvisdragonmao)
  • cbf3e03 — refactor: extract Giscus component (elvisdragonmao)

🔒Security observations

The superfile codebase demonstrates reasonable security practices as a terminal file manager written in Go. Primary concerns are around external process execution (exiftool, trash utilities), shell script injection risks in build/deployment scripts, and dependency maintenance. The project uses well-maintained TUI libraries (BubbleTea, Lipgloss) and has no obvious hardcoded credentials. No SQL injection or XSS risks detected given the nature of the application. The main recommendations are: (1) audit and harden shell scripts, (2) review external tool execution in dependencies, (3) update to stable Go version, (4) establish a security policy and disclosure process. Overall security posture is moderate to good for a terminal utility application.

  • Medium · Outdated Go Version — go.mod. The project specifies Go 1.25.5 in go.mod, which appears to be a future/unreleased version. This may indicate either a configuration error or the use of an unstable Go toolchain. Production code should use stable, officially released Go versions. Fix: Update go.mod to use a stable, currently released Go version (e.g., 1.23.x or 1.24.x). Verify the Go version compatibility with all dependencies.
  • Medium · Potential Shell Script Injection in Build/Release Scripts — build.sh, dev.sh, release/release.sh, cd_on_quit/cd_on_quit.sh, cd_on_quit/cd_on_quit.ps1, cd_on_quit/cd_on_quit.fish. The repository contains shell scripts (build.sh, dev.sh, release/release.sh, cd_on_quit scripts) that may process user input or environment variables without proper validation. These scripts could be vulnerable to command injection if they incorporate unsanitized user input. Fix: Audit all shell scripts for injection vulnerabilities. Use proper quoting and escaping for all variables. Consider using safer alternatives like Go-based build scripts. Add input validation for any user-controlled variables.
  • Low · Deprecated or Potentially Unmaintained Dependencies — go.mod. Several dependencies may have security or maintenance concerns: github.com/lithammer/shortuuid (marked as incompatible version v3.0.0+incompatible), github.com/rkoesters/xdg (appears to be a duplicate/alternative of adrg/xdg), and github.com/barasher/go-exiftool which wraps external tools that may have security implications. Fix: Review and update all dependencies to their latest versions. Remove duplicate XDG dependencies. Verify that go-exiftool and trash-go properly handle external process security. Consider replacing incompatible version dependencies with officially maintained versions.
  • Low · External Process Execution Risks — go.mod (dependencies: barasher/go-exiftool, hymkor/trash-go). Dependencies like github.com/barasher/go-exiftool and github.com/hymkor/trash-go execute external system tools (exiftool, trash CLI). These introduce risks if the external tools are not properly validated or if PATH manipulation attacks are possible. Fix: Ensure external tool paths are validated and use absolute paths where possible. Implement proper error handling and validate all output from external processes. Consider sandboxing external tool execution or using pure Go alternatives if available.
  • Low · Missing Security-Related Configuration Files — Repository root. No evidence of SECURITY.md or security policy documentation. The repository has no apparent security.txt or disclosure policy for responsible vulnerability reporting. Fix: Create a SECURITY.md file documenting security policies, supported versions, and responsible disclosure procedures. Consider adding a .well-known/security.txt file.
  • Low · Potential Information Disclosure via Debug Scripts — src/cmd/debug_info.go, dev.sh. The presence of src/cmd/debug_info.go and dev.sh scripts may expose sensitive system information when executed. Debug builds could inadvertently include sensitive data in logs. Fix: Ensure debug functionality is disabled in production builds. Review debug_info.go to verify it doesn't expose sensitive system information. Implement build-time flags to exclude debug code from release binaries.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · yorukot/superfile — RepoPilot