Free ASCII Tree Generator
Turn an indented list into a clean folder tree (├── └──) for READMEs and docs. Unicode or plain-ASCII output. Runs entirely in your browser.
Import options
Indent with spaces or tabs to nest items. Each deeper indent becomes a child. Add a note after ' # ', ' // ', ' - ' or ' <- ' and it will be aligned as a comment in the output. Paste a list of paths (git ls-files, find, dir /s /b) to nest them; end a name with / to mark an empty folder. Importing or dropping a folder or .zip reads only file names — never their contents — and skips node_modules, .git and other build folders (see Import options).
my-project ├── src │ ├── components │ │ ├── Button.tsx │ │ └── Modal.tsx │ ├── lib │ │ └── utils.ts │ └── index.ts # entry point ├── public │ └── favicon.ico ├── package.json └── README.md
💡 Paste a folder structure (or any nested outline) and get a clean tree you can drop into a README, a comment, or documentation. Use the ASCII style for environments that don't render box-drawing characters. Everything runs in your browser.
Common uses
- Add a Folder Tree to a READMEGenerate a clean project-structure tree to document your repository.
- Document a Project StructureCreate a directory tree for technical docs and wikis.
- Make a Tree for a Code CommentGenerate a structure diagram to embed in source-code comments.
- Show a File Tree in a TalkCreate a clean directory diagram for slides and tutorials.
- Turn an Outline into a TreeVisualise any nested outline — not just files — as a tree.
How It Works
Documenting a folder structure in a README usually means drawing the ├── and └── lines by hand. This generates them from a simple indented list.
- 1You type an indented outlineOne item per line; indent with spaces or tabs to nest. Indentation depth defines the hierarchy.
- 2It's parsed into a treeA stack-based parser turns the indentation into a nested structure, entirely in your browser.
- 3Tree connectors are drawnProper ├──, └──, and │ guides are generated, with the correct vertical lines carried down through nested branches.
- 4Copy the resultPick Unicode or plain-ASCII connectors and copy the tree into your README, docs, or a code comment.
A simple text utility that runs entirely on your device — nothing is uploaded.
Guide
Worked example
The page opens with a 12-line example: "my-project" with "src", "public", "package.json" and "README.md" under it, and "components", "lib" and "index.ts" under "src". With the default "├── Unicode" style, ├── marks an item with a sibling below it, └── marks the last one, and │ carries a branch down. A note typed as "index.ts # entry point" comes out as "index.ts # entry point", with every note lined up in one column two spaces after the longest line that has one. Press "- Markdown" for nested bullets (two spaces per level) or "|-- ASCII" for plain characters. Pasting the three paths src/app/page.tsx, src/app/layout.tsx and src/lib/utils.ts gives src with app (page.tsx, layout.tsx) and lib (utils.ts) under it.
Which settings to use, and the limits
- Choose the style for where the tree will go. "├── Unicode" looks best in READMEs and documents. "|-- ASCII" uses only plain characters, for terminals, logs and code comments where box-drawing characters may not show. "- Markdown" makes a bulleted list. "Download" saves tree.txt, or tree.md in Markdown style.
- Nest with indents, or paste paths. Each deeper indent makes a child of the line above. A tab counts as four spaces, and the Tab key in the box inserts two spaces (Shift+Tab removes them; press Escape and then Tab to leave the box). You can also paste a list of paths such as git ls-files, find or dir /s /b output, with / or \ separators, and they merge into one tree. End a name with / to mark an empty folder.
- Add notes after a delimiter. Put " # ", " // ", " - " or " <- " after a name, with a space on each side, and the rest of the line becomes a note, lined up in one column. "Comment style" picks whether the output shows #, // or <--. A name that contains a space, a dash and another space, such as "My Doc - final.docx", is split into a name and a note, so write it without the spaces around the dash.
- Sort folders first and mark folders with a slash. "Folders first" puts folders before files at every level and otherwise keeps your order. "Trailing /" adds a / after every folder, meaning any name that has children or that you ended with /.
- Paste a tree to restyle it. If you paste text that already looks like a tree (├──, └──, |-- or +-- lines, including Linux tree and Windows tree /f output), the box converts it to an indented list and shows "Pasted tree detected — converted back into an editable indented list." Then switch style, sort or add notes. The header lines that Windows prints, such as "Folder PATH listing" and "Volume serial number", are dropped.
- Import names from a folder or a zip. "Import folder" (hidden on phones), dropping a folder on the box, or "Import .zip" reads file names only, never contents. Under "Import options", "Ignore names (comma-separated, * allowed)" skips node_modules, .git, dist, build, .next, __pycache__, .venv and other usual build folders by default, and "Max depth" starts at 7 and goes from 1 to 30. Depth counts the folders above a file, top folder included. A note says how many files were skipped.
Common problems and how to fix them
- The tree comes out flat, with no branches.
- Nothing was indented, so every line became its own top-level item. Indent the children with spaces or the Tab key. The one exception is a list of paths (names containing / or \), which is nested for you, but only if none of the lines is indented.
- Part of a file name shows up as a note.
- A space, then #, //, - or <-, then another space starts a note. "My Doc - final.docx" becomes the name "My Doc" with the note "final.docx". Remove the spaces around the dash, as in "My Doc-final.docx". A # or - without a space on both sides, as in "C# notes.md", stays in the name.
- It says "Couldn't read that .zip. Check that it's a valid, unencrypted zip file."
- The file could not be opened as a zip: it may be damaged, password-protected, or not really a zip. Make a normal zip and try again. "That .zip has no entries." means the archive is empty.
- Files are missing after importing a folder.
- Look at the note under the box, such as "12 files skipped (ignored or too deep)". Files are skipped when any folder or file name matches "Ignore names", or when they sit deeper than "Max depth". Open "Import options" and edit the list or raise Max depth; the change is applied to your last import unless you have edited the text since. Also, a dropped folder is read only up to about 50,000 names before the ignore list is applied, so a project with a huge node_modules can lose real files: use "Import folder" or a zip made without node_modules instead.
- It says "Couldn't read the dropped folder or file."
- The browser refused to list the dropped item. Use "Import folder" instead, or make a .zip and use "Import .zip". On phones the folder option is hidden, so use a zip there.
How it compares
For a folder you already have, the tree command (or tree /f on Windows) in a terminal gives an exact listing in one step, and this tool can restyle what it prints. Use this tool when you want to plan a layout that does not exist yet, show only part of a folder, add notes, or switch between Unicode, ASCII and Markdown. It works from names only, with no file sizes, dates, permissions or contents, and an import skips common build folders unless you change the list. Between the styles, Unicode reads best but its box-drawing characters may not show in some places, ASCII is the safe choice for terminals and code comments, and Markdown is for lists that should render as bullets.
Related Tools
ASCII Banner Generator
Turn text into big ASCII-art banners in classic FIGlet fonts — copy or download as .txt.
Duplicate File & Photo Finder
Find duplicate files and similar photos in a folder: exact copies by content, plus resized or re-saved versions of the same photo. Keep the best copy and move the rest aside. Runs in your browser; nothing is uploaded.
JSON Formatter
Format, validate, minify, and explore JSON data. Tree view, syntax highlighting, and one-click copy.