Skip to main content

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.

Works offline once loaded
Import options
Defaults skip node_modules, .git, build output and caches.

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).

Tree
Comment style
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.

  1. 1
    You type an indented outline
    One item per line; indent with spaces or tabs to nest. Indentation depth defines the hierarchy.
  2. 2
    It's parsed into a tree
    A stack-based parser turns the indentation into a nested structure, entirely in your browser.
  3. 3
    Tree connectors are drawn
    Proper ├──, └──, and │ guides are generated, with the correct vertical lines carried down through nested branches.
  4. 4
    Copy the result
    Pick 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

Frequently Asked Questions