Everyone needs to make a schedule at some point, but most tools are complicated, heavyweight, and not easy to share. As someone working in a corporate engineering environment, I need to do create and share schedules constantly.

It would be convenient to share a schedule as a simple text file to put in a mono-spaced email section or Microsoft Teams window. The usual options aren’t great — a full Microsoft Project file is overkill, a spreadsheet doesn’t paste well into chat, and a hand-drawn ASCII chart is tedious to maintain. What I wanted was something as simple as Markdown: a plain text format I could type quickly, that would render into something clear and readable and could be dropped straight into a Teams message. The result is ganttdown, a lightweight Gantt chart tool that turns a simple text file into a monospaced chart you can paste anywhere. It was vibe-coded with Claude.

The web version is available at ganttdown.dougfredericks.net.

How It Works

ganttdown reads a schedule written inside a <task> block. You can embed this block in any plain text or Markdown file — everything outside the block is ignored, so you can surround your schedule with notes, headings, or narrative text.

Each task is a single line with four fields in a fixed order:

<task#>  <name>  <YYYY-MM-DD or dep#>  <duration>
  • Field 1 — Task number using dotted hierarchy, e.g. 1, 1.1, 2.3
  • Field 2 — Task name — everything between the task number and field 3
  • Field 3 — Either a start date in YYYY-MM-DD format, or the number of a task this one depends on
  • Field 4 — Duration in working days (Monday–Friday only)

A complete schedule looks like this:

<task>
// Phase 1
1.0  Project Kickoff  2026-04-13  1
1.1  Get Project Data 2026-04-13  5
1.2  Design           1.1         5

// Phase 2
2.1  Submit to client      1.2         10
2.2  Respond to comments   2.1         5
2.3  Construction          2.2         2
</task>

Lines beginning with // are comments and are ignored. Blank lines are also ignored. The parser figures out what each field is by its shape — a date looks like 2026-04-13, a dependency looks like 1.1, and a duration is a plain integer.

The Output

ganttdown produces a monospaced text chart with one column per working day, grouped by week. Dependencies are computed automatically — a task with a dependency starts the next working day after all its predecessors finish. Weekends are skipped in both durations and the chart grid.

In text, which may look bad depending on the width of your screen, the schedule looks like this:

#     Task Name             Dur    Dep    04/13/2026:04/20/2026:04/27/2026:05/04/2026:05/11/2026:05/1:
                                          M T W T F :M T W T F :M T W T F :M T W T F :M T W T F :M T :
                                          ----------:----------:----------:----------:----------:----:
1.0   Project Kickoff       1      n/a    #         :          :          :          :          :    :
1.1   Get Project Data      5      n/a    # # # # # :          :          :          :          :    :
1.2   Design                5      1.1              :# # # # # :          :          :          :    :

2.1   Submit to client      10     1.2              :          :# # # # # :# # # # # :          :    :
2.2   Respond to comments   5      2.1              :          :          :          :# # # # # :    :
2.3   Construction          2      2.2              :          :          :          :          :# # :

Using It in Microsoft Teams

Teams renders text wrapped in triple backticks as a monospaced code block, which preserves the chart alignment. The web app has a Copy for Teams button that wraps the chart in triple backticks automatically — paste it straight into a Teams message and it renders correctly.

Try It

The web app is at ganttdown.dougfredericks.net. Type or paste your schedule into the input area, click Generate, and use the Copy for Teams button to grab the result.

Leave a Reply

Your email address will not be published. Required fields are marked *

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)