Codebase Viewer is a cross-platform desktop application—written entirely in Rust—that lets you scan, explore, and document large codebases with millisecond-level responsiveness. The UI is built with egui via eframe, giving you a native-feeling window on Windows, macOS, Linux, and the web (web support experimental).
| Capability | Details |
|---|---|
| Blazing-fast scans | Parallel directory walking powered by the ignore crate’s WalkBuilder, which respects .gitignore, global Git excludes, hidden-file masks, and uses multiple threads. |
| Live tree UI | Immediate-mode GUI rendered by egui/eframe; every file appears as soon as it’s discovered, even while the scan is still running. File icons based on type. |
| Selective exports | Keep the full directory context but choose exactly which files’ contents go into HTML, Markdown, or plain-text reports—ideal for LLM ingestion or documentation. |
| Syntax-highlighted preview | On-the-fly colouring courtesy of syntect, using Sublime-Text grammars. Supports common text file types. |
| Image preview | Preview common image formats (PNG, JPG, GIF, BMP, ICO, TIFF) directly within the app. |
| SVG preview | Preview Scalable Vector Graphics (.svg) files using the resvg crate. |
| Native dialogs & theme awareness | File/dir pickers via rfd and automatic light/dark detection via dark-light. |
| Cross-thread messaging | Non-blocking updates sent through crossbeam-channel for MPMC performance, keeping the UI responsive during scans and report generation. |
| Human-readable sizes | Byte counts formatted with humansize. |
| Config persistence | Settings stored in the OS-native config directory obtained with dirs-next. |
| Selection persistence | Save and load the checked state of files/directories to a JSON file. |
# 1. Clone and build in release mode
git clone https://github.com/noahbclarkson/codebase_viewer.git
cd codebase_viewer
cargo run --release
# 2. Open a project
File ▸ Open Directory … # or use the recent-projects list
# 3. Explore & select
– Navigate the tree using mouse or keyboard
– Use the search bar (Ctrl+F) to filter
– Tick files/dirs you want included in reports/exports
# 4. Generate documentation
File ▸ Generate Report …
Choose Markdown / HTML / Text, select options, and hit **Generate**System requirements: Any modern OS with Rust 1.77+ installed. The app utilizes multiple threads for scanning via Rayon and ignore.
A JSON config (config.json) is auto-saved to the standard user configuration directory:
- Linux:
$HOME/.config/codebase_viewer/ - Windows:
%APPDATA%\codebase_viewer\ - macOS:
~/Library/Application Support/codebase_viewer/
Key fields:
| Key | Purpose | Default |
|---|---|---|
theme |
UI theme: "light", "dark", or "system" |
"system" |
show_hidden_files |
Whether the scanner should include hidden files/directories | false |
auto_expand_limit |
Auto-expand dirs whose total file count ≤ this value after scan | 100 |
max_file_size_preview |
Size threshold (bytes) before preview/export refuses to read a file | 1048576 (1MiB) |
export_format |
Default format for reports: "markdown", "html", "text" |
"markdown" |
export_include_stats |
Default setting for including stats in reports | true |
export_include_contents |
Default setting for including file contents in reports | true |
recent_projects |
List of recently opened directory paths (up to 10) | [] |
src/
├── app.rs # Top-level eframe::App state and logic orchestrator
├── config.rs # Handles loading/saving AppConfig (serde + dirs-next)
├── external.rs # Utility for opening paths in external apps (open crate)
├── fs/ # File system operations
│ ├── file_info.rs # Metadata struct for files/dirs
│ ├── scanner.rs # Background directory scanner (ignore crate)
│ └── stats.rs # Statistics collection during scan (ScanStats)
├── model.rs # Core data structures (FileNode, FileId, Check state)
├── preview.rs # Content preview generation (syntect, image crate)
├── report/ # Report generation logic
│ ├── generator.rs # Core report data collection and dispatch
│ ├── html.rs # HTML report formatter
│ ├── markdown.rs # Markdown report formatter
│ └── text.rs # Plain text report formatter
├── selection.rs # Saving/loading tree selection state to JSON
├── task.rs # Enums for background task messages (ScanMessage, TaskMessage)
└── ui/ # egui UI modules
├── dialogs.rs # Preferences, Report Options, About, Shortcuts windows
├── menu_bar.rs # Top menu bar drawing logic
├── preview_panel.rs # Right panel for file content preview
├── status_bar.rs # Bottom status bar drawing logic
└── tree_panel.rs # Left panel with file tree view and search
- Long-running tasks (directory scanning, report generation) happen in background threads (
std::thread,rayon). - UI updates are driven by messages received via
crossbeam-channel, ensuring the GUI remains responsive (target 60 fps). - Directory scanning respects
.gitignoreand other standard ignore files via theignorecrate. - Reports include the full directory structure for context, followed by the selected subtree and optionally file contents.
# Format code
cargo fmt --all
# Lint code (strict)
cargo clippy --all-targets --all-features -- -D warnings
# Run tests
cargo test --all-features
# Run in debug mode (with hot-reload where applicable)
cargo run
# Run optimized release build
cargo run --release- Always build with
--releasefor optimal performance, especially for the scanner. - On very large repositories, uncheck "Include file contents" in the report dialog if you only need the structure and stats.
- The
max_file_size_previewsetting in Preferences can prevent attempts to load huge files into the preview panel.
- Previewing PDF files is not currently supported.
- Web assembly (
wasm) builds may work but are not actively tested or supported for v0.1.0.
Contributions are welcome! Please follow these steps:
- Fork the repository.
- Create a new branch (
git checkout -b feature/my-new-featureorbugfix/issue-number). - Make your changes. Ensure code is formatted (
cargo fmt) and passes lints (cargo clippy -- -D warnings). - Add tests for new functionality if applicable.
- Commit your changes with descriptive messages.
- Push to your branch (
git push origin feature/my-new-feature). - Open a Pull Request against the
mainbranch of the original repository. Explain the purpose and scope of your changes.
Please also refer to CONTRIBUTING.md for more detailed guidelines.
This project is dual-licensed under either the MIT License or the Apache License, Version 2.0, at your option. See the LICENSE-MIT and LICENSE-APACHE files for details.
This project demonstrates building a responsive, native-feeling desktop application using the Rust GUI ecosystem, primarily egui/eframe.


