Skip to content
πŸ“œ Generates table of contents for markdown files inside local git repository. Links are compatible with anchors generated by github or other sites.
Branch: master
Clone or download

Latest commit

Latest commit 427b21a Jun 24, 2019


Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Create FUNDING.yml Jul 26, 2019
lib fix(deps): replace markdown-to-ast with @textlint/markdown-to-ast Nov 21, 2018
test Added option for stdout Jun 17, 2016
.gitignore extracting headers May 27, 2012
.pre-commit-hooks.yaml Add pre-commit metadata to doctoc Oct 27, 2017
.travis.yml Update .travis.yml (#136) Nov 9, 2017
LICENSE proper license Feb 7, 2013 doc: adding patreon badge Feb 14, 2018
doctoc.js expose API in top level (#160) Mar 1, 2019
package.json 1.4.0 Nov 21, 2018

DocToc build status

become a patron

Generates table of contents for markdown files inside local git repository. Links are compatible with anchors generated by github or other sites via a command line flag.

Table of Contents generated with DocToc


npm install -g doctoc


In its simplest usage, you can pass one or more files or folders to the doctoc command. This will update the TOCs of each file specified as well as of each markdown file found by recursively searching each folder. Below are some examples.

Adding toc to all files in a directory and sub directories

Go into the directory that contains you local git project and type:

doctoc .

This will update all markdown files in the current directory and all its subdirectories with a table of content that will point at the anchors generated by the markdown parser. Doctoc defaults to using the GitHub parser, but other modes can be specified.

Update existing doctoc TOCs effortlessly

If you already have a TOC inserted by doctoc, it will automatically be updated by running the command (rather than inserting a duplicate toc). Doctoc locates the TOC by the <!-- START doctoc --> and <!-- END doctoc --> comments, so you can also move a generated TOC to any other portion of your document and it will be updated there.

Adding toc to individual files

If you want to convert only specific files, do:

doctoc /path/to/file [...]




You can use this feature to do more sophisticated things. For example, if you have ack installed, you could add <!-- DOCTOC SKIP --> to specific files and then use

ack -L 'DOCTOC SKIP' | xargs doctoc

to recompile only those files which don't have the DOCTOC SKIP comment.

Using doctoc to generate links compatible with other sites

In order to add a table of contents whose links are compatible other sites add the appropriate mode flag:

Available modes are:



doctoc --bitbucket

Specifying location of toc

By default, doctoc places the toc at the top of the file. You can indicate to have it placed elsewhere with the following format:

<!-- START doctoc -->
<!-- END doctoc -->

You place this code directly in your .md file. For example:

Here we are, introducing the post. It's going to be great!
But first: a TOC for easy reference.

<!-- START doctoc -->
<!-- END doctoc -->

# Section One

Here we'll discuss...

Running doctoc will insert the toc at that location.

Specifying a custom TOC title

Use the --title option to specify a (Markdown-formatted) custom TOC title; e.g., doctoc --title '**Contents**' . From then on, you can simply run doctoc <file> and doctoc will will keep the title you specified.

Alternatively, to blank out the title with a newline, use the --notitle option. This will simply remove the title from the TOC.

Specifying a maximum heading level for TOC entries

Use the --maxlevel option to limit TOC entries to headings only up to the specified level; e.g., doctoc --maxlevel 3 .

By default,

  • no limit is placed on Markdown-formatted headings,
  • whereas headings from embedded HTML are limited to 4 levels.

Printing to stdout

You can print to stdout by using the -s or --stdout option.

Usage as a git hook

doctoc can be used as a pre-commit hook by using the following configuration:

-   repo:
    sha: ...  # substitute a tagged version
    -   id: doctoc

This will run doctoc against markdown files when committing to ensure the TOC stays up-to-date.

You can’t perform that action at this time.