12 releases (6 breaking)
| 0.8.2 | Sep 3, 2025 |
|---|---|
| 0.8.1 | Sep 3, 2025 |
| 0.7.0 | Aug 29, 2025 |
| 0.6.0 | Aug 28, 2025 |
| 0.2.0 | Aug 16, 2025 |
#1152 in Command line utilities
555KB
5.5K
SLoC
tree2md
๐ Generate beautiful tree structures in Markdown, HTML, or Terminal format
tree2md # Pretty terminal tree with colors & bars
tree2md --github https://github.com/you/repo --inject README.md # Auto-update your docs with one command!
Transform your project structure into stunning visualizations โ from colorful terminal trees with progress bars to GitHub-ready documentation with clickable links. Perfect for READMEs, architecture docs, and code reviews.

๐ฏ Key Features
- ๐จ Multiple Output Formats โ Markdown, HTML with collapsible folders, or Terminal tree
- ๐ GitHub Integration โ Automatic link rewriting for clickable GitHub navigation
- ๐ Safe by Default โ Auto-excludes
.env, secrets,node_modules/,.git/and more - ๐ Rich Statistics โ File counts, extensions breakdown, lines of code with visual bars
- ๐ README Injection โ Update README.md between tags automatically (idempotent)
- โก Smart Presets โ
--preset readmefor docs,--preset funfor emojis & animations
๐ฅ Installation
From crates.io
cargo install tree2md
# Your Git Repository
tree2md
From source
git clone https://github.com/zawakin/tree2md
cd tree2md
cargo install --path .
Pre-built binaries
Download from GitHub Releases
๐ Quick Start
# Beautiful terminal tree with progress bars and file sizes
tree2md # Auto-detects terminal for colorful output!
tree2md --preset fun # With emojis and animations ๐
# Save as Markdown with full statistics
tree2md --preset readme > STRUCTURE.md
# Auto-inject into README with GitHub links
tree2md --github https://github.com/you/repo/tree/main --inject README.md
# HTML output with collapsible folders
tree2md --output html --fold auto > tree.html
# Focus on specific files (e.g., only Rust files, max 3 levels)
tree2md src/ -L 3 -I "*.rs" --stats full
๐ Example Output
- src/
- [cli.rs](src/cli.rs) (452 lines)
- [main.rs](src/main.rs) (262 lines)
- tests/
- [emoji_test.rs](tests/emoji_test.rs) (175 lines)
- [filtering_test.rs](tests/filtering_test.rs) (295 lines)
- [safety_test.rs](tests/safety_test.rs) (357 lines)
- [Cargo.toml](Cargo.toml) (36 lines)
- [LICENSE](LICENSE) (21 lines)
- [README.md](README.md) (310 lines)
**Totals**: ๐ 2 dirs โข ๐ 8 files โข ๐งพ ~1.7K LOC
**By type**:
- Test: 3 (38%) ######---------
- Rust: 2 (25%) ####-----------
- Markdown: 1 (13%) ##-------------
- TOML: 1 (13%) ##-------------
- License: 1 (13%) ##-------------
๐ ๏ธ CLI Options
Filtering
-L, --level <N>โ Limit traversal depth-I, --include <GLOB>โ Include patterns (repeatable)-X, --exclude <GLOB>โ Exclude patterns (repeatable)--use-gitignore {auto|never|always}โ Respect.gitignore
Links & Output
--links {on|off}โ Toggle Markdown links--github <URL>โ Rewrite links to GitHub--fold {auto|on|off}โ Collapsible folders--no-statsโ Hide stats footer
Safety
--safe(default) โ Excludes sensitive files--unsafeโ Disable all safety filters--restrict-root <DIR>โ Prevent traversal outside root
README Integration
--inject <FILE>โ Update README.md between tags--tag-start <STR>โ Custom start tag (default:<\!-- tree2md:start -->)--tag-end <STR>โ Custom end tag (default:<\!-- tree2md:end -->)--dry-runโ Preview without writing
Metadata
--stamp {version|date|commit|none}โ Add generation metadata--stamp-date-format <FMT>โ Date format
๐ Safety Defaults
Excluded by default:
.env,.ssh/**,*.pem,*.keynode_modules/,target/,dist/,build/.git/**,.DS_Store,Thumbs.db
Use -I to selectively include, or --unsafe to disable filters.
๐ Common Use Cases
README injection
tree2md . --github https://github.com/you/repo/tree/main --inject README.md
Docs / Architecture
tree2md src --fold on > docs/ARCHITECTURE.md
Code reviews
tree2md . -L 3 -I "*.rs" -I "*.toml" --no-stats
CI/CD auto-update
tree2md . --github $GITHUB_URL --inject README.md --stamp version
git add README.md
git commit -m "Update structure"
โก Performance
- Fast โ Parallel traversal with efficient filtering
- Memory safe โ Streams output, no huge buffers
- Deterministic โ Always the same result for same input
- Git-aware โ Respects
.gitignore
๐๏ธ Build from Source
git clone https://github.com/zawakin/tree2md
cd tree2md
cargo build --release
cargo test
๐ค Contributing
PRs welcome! See CONTRIBUTING.md.
For development:
cargo fmt
cargo clippy -- -D warnings
๐ Project Structure
Markdown-Style
tree2md -L 2 . --output md --inject README.md --tag-start '<tag-start>' --tag-end '<tag-end>'
<!-- tree2md-md:start -->
- .claude/
- .github/
- scripts/
- [update-readme-embeds.sh](scripts/update-readme-embeds.sh) (28 lines)
- src/
- [cli.rs](src/cli.rs) (452 lines)
- [main.rs](src/main.rs) (262 lines)
- tests/
- [emoji_test.rs](tests/emoji_test.rs) (175 lines)
- [exclude_pattern_test.rs](tests/exclude_pattern_test.rs) (125 lines)
- [filtering_test.rs](tests/filtering_test.rs) (295 lines)
- [fixtures.rs](tests/fixtures.rs) (272 lines)
- [html_output_test.rs](tests/html_output_test.rs) (448 lines)
- [include_directory_test.rs](tests/include_directory_test.rs) (112 lines)
- [include_pattern_test.rs](tests/include_pattern_test.rs) (85 lines)
- [links_test.rs](tests/links_test.rs) (377 lines)
- [output_format_test.rs](tests/output_format_test.rs) (177 lines)
- [preset_test.rs](tests/preset_test.rs) (203 lines)
- [safety_test.rs](tests/safety_test.rs) (357 lines)
- [spec_compliance_test.rs](tests/spec_compliance_test.rs) (422 lines)
- [stats_test.rs](tests/stats_test.rs) (279 lines)
- [.gitignore](.gitignore) (30 lines)
- [CHANGELOG.md](CHANGELOG.md) (252 lines)
- [CLAUDE.md](CLAUDE.md) (9 lines)
- [Cargo.lock](Cargo.lock)
- [Cargo.toml](Cargo.toml) (36 lines)
- [LICENSE](LICENSE) (21 lines)
- [README.md](README.md) (310 lines)
**Totals**: ๐ 6 dirs โข ๐ 23 files โข ๐งพ ~4.7K LOC
**By type**:
- Test: 12 (52%) ########-------
- Rust: 3 (13%) ##-------------
- Markdown: 3 (13%) ##-------------
- License: 1 (4%) #--------------
- TOML: 1 (4%) #--------------
- Shell: 1 (4%) #--------------
- Ignore: 1 (4%) #--------------
- Lock: 1 (4%) #--------------
<!-- tree2md-md:end -->
Tree(tty)-Style
tree2md -L 2 . --output tty --inject README.md --tag-start '<tag-start>' --tag-end '<tag-end>'
<!-- tree2md-tree:start -->
|-- .claude/
|-- .github/
|-- scripts/
| `-- update-readme-embeds.sh [โโโโโโโโโโ] 28 (S)
|-- src/
| |-- cli.rs [โโโโโโโโโโ] 452 (L) โ
| `-- main.rs [โโโโโโยทยทยทยท] 262 (M)
|-- tests/
| |-- emoji_test.rs [โโโโยทยทยทยทยทยท] 175 (M)
| |-- exclude_pattern_test.rs [โโโยทยทยทยทยทยทยท] 125 (M)
| |-- filtering_test.rs [โโโโโโโยทยทยท] 295 (M)
| |-- fixtures.rs [โโโโโโโยทยทยท] 272 (M)
| |-- html_output_test.rs [โโโโโโโโโโ] 448 (L) โ
| |-- include_directory_test.rs [โโโยทยทยทยทยทยทยท] 112 (S)
| |-- include_pattern_test.rs [โโยทยทยทยทยทยทยทยท] 85 (S)
| |-- links_test.rs [โโโโโโโโโยท] 377 (L)
| |-- output_format_test.rs [โโโโยทยทยทยทยทยท] 177 (M)
| |-- preset_test.rs [โโโโโยทยทยทยทยท] 203 (M)
| |-- safety_test.rs [โโโโโโโโยทยท] 357 (L)
| |-- spec_compliance_test.rs [โโโโโโโโโโ] 422 (L)
| `-- stats_test.rs [โโโโโโโยทยทยท] 279 (M)
|-- .gitignore [โยทยทยทยทยทยทยทยทยท] 30 (S)
|-- CHANGELOG.md [โโโโโโโโโยท] 252 (M)
|-- CLAUDE.md [ยทยทยทยทยทยทยทยทยทยท] 9 (XS)
|-- Cargo.lock
|-- Cargo.toml [โโยทยทยทยทยทยทยทยท] 36 (S)
|-- LICENSE [โยทยทยทยทยทยทยทยทยท] 21 (S)
`-- README.md [โโโโโโโโโโ] 310 (L)
**Totals**: ๐ 6 dirs โข ๐ 23 files โข ๐งพ ~4.7K LOC
**By type**:
- Test: 12 (52%) ########-------
- Rust: 3 (13%) ##-------------
- Markdown: 3 (13%) ##-------------
- Lock: 1 (4%) #--------------
- Shell: 1 (4%) #--------------
- TOML: 1 (4%) #--------------
- Ignore: 1 (4%) #--------------
- License: 1 (4%) #--------------
<!-- tree2md-tree:end -->
๐ License
MIT License โ see LICENSE.
๐ Acknowledgments
Inspired by the classic tree command, designed for Markdown & GitHub integration.
Made with โค๏ธ for the open source community.
Dependencies
~6โ19MB
~202K SLoC