tree2md 0.8.1

Like the tree command, but outputs in Markdown. Optionally embed file contents as code blocks.
# tree2md

[![Crates.io](https://img.shields.io/crates/v/tree2md.svg)](https://crates.io/crates/tree2md)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

**๐Ÿ“ Generate beautiful tree structures in Markdown, HTML, or Terminal format**

```bash
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.

![tree2md screenshot](docs/images/tree2md_screenshot.png)

---

## ๐ŸŽฏ 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 readme` for docs, `--preset fun` for emojis & animations

---

## ๐Ÿ“ฅ Installation

### From crates.io

```bash
cargo install tree2md

# Your Git Repository
tree2md
```

### From source

```bash
git clone https://github.com/zawakin/tree2md
cd tree2md
cargo install --path .
```

### Pre-built binaries

Download from [GitHub Releases](https://github.com/zawakin/tree2md/releases)

---

## ๐Ÿš€ Quick Start

```bash
# 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

```markdown
- 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`, `*.key`
* `node_modules/`, `target/`, `dist/`, `build/`
* `.git/**`, `.DS_Store`, `Thumbs.db`

Use `-I` to selectively include, or `--unsafe` to disable filters.

---

## ๐Ÿ“ Common Use Cases

**README injection**

```bash
tree2md . --github https://github.com/you/repo/tree/main --inject README.md
```

**Docs / Architecture**

```bash
tree2md src --fold on > docs/ARCHITECTURE.md
```

**Code reviews**

```bash
tree2md . -L 3 -I "*.rs" -I "*.toml" --no-stats
```

**CI/CD auto-update**

```bash
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

```bash
git clone https://github.com/zawakin/tree2md
cd tree2md
cargo build --release
cargo test
```

---

## ๐Ÿค Contributing

PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md).

For development:

```bash
cargo fmt
cargo clippy -- -D warnings
```

---

## ๐Ÿ“‚ Project Structure

### Markdown-Style

```bash
tree2md -L 2 . --output md --inject README.md --tag-start '<tag-start>' --tag-end '<tag-end>'
```

````markdown
<!-- 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

```bash
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](LICENSE).

---

## ๐Ÿ™ Acknowledgments

Inspired by the classic `tree` command, designed for Markdown & GitHub integration.

Made with โค๏ธ for the open source community.