OpenGantt logo OpenGantt

[![Website](https://img.shields.io/badge/Website-OpenGantt-458588?logo=googlechrome\&logoColor=white)](https://jebbycodes.github.io/OpenGantt/) [![Obsidian Plugin](https://img.shields.io/badge/Obsidian-Plugin-7C3AED?logo=obsidian\&logoColor=white)](https://community.obsidian.md/plugins/gantt) [![GitHub Release](https://img.shields.io/github/v/release/JebbyCodes/OpenGantt?label=release)](https://github.com/JebbyCodes/OpenGantt/releases) [![Build](https://img.shields.io/github/actions/workflow/status/JebbyCodes/OpenGantt/release.yml?label=build)](https://github.com/JebbyCodes/OpenGantt/actions/workflows/release.yml) [![License](https://img.shields.io/github/license/JebbyCodes/OpenGantt)](https://github.com/JebbyCodes/OpenGantt/blob/main/LICENSE) [![GitHub Stars](https://img.shields.io/github/stars/JebbyCodes/OpenGantt)](https://github.com/JebbyCodes/OpenGantt/stargazers) > A lightweight, YAML-driven Gantt chart for the browser, Obsidian, and desktop. **[๐ŸŒ OpenGantt Website](https://jebbycodes.github.io/OpenGantt/)** ยท **[๐Ÿ“ Obsidian Plugin](https://community.obsidian.md/plugins/gantt)** ยท **[๐Ÿ“ฆ GitHub Releases](https://github.com/JebbyCodes/OpenGantt/releases)** OpenGantt turns a small YAML definition into an interactive Gantt chart with **planned work, actual work, live progress, hierarchical tasks, custom columns, printing, and export**. It can be used in three ways: * ๐ŸŒ **Standalone web app** โ€” use OpenGantt directly in your browser or as a self-contained HTML application. * ๐Ÿ“ **Obsidian plugin** โ€” embed Gantt charts directly inside Markdown notes. * ๐Ÿ–ฅ๏ธ **Desktop application** โ€” package the same frontend as a native Tauri application. The chart data remains plain YAML, making it easy to read, edit, search, diff, back up, and keep alongside the project it describes. --- ## โœจ Features ### ๐Ÿ“… Gantt charts * Planned and actual task bars * Live progress for open tasks * Day, week, month, and year scales * Today indicator * Task hierarchy with expandable/collapsible rows * Milestones * Planned vs. actual comparison * Actual bars with optional diagonal hatching * Automatic progress calculation * Task status and schedule variance ### ๐Ÿ“Š Customisable task table The table alongside the timeline can display: * Task name * Progress * Planned start/end dates * Actual start/end dates * Planned duration * Actual duration * Schedule variance * Status * Notes * Custom YAML fields Columns can be reordered, hidden, or added from the chart interface. Any additional property placed on a task automatically becomes available as a custom column. ### ๐Ÿ“ YAML-driven Charts are defined using simple YAML: ```yaml scale: week mode: both title: Example project rows: - label: Stage 1 - Planning plan: [2026-09-07, 2026-09-12] fact: [2026-09-07, 2026-09-14] children: - label: Collect requirements plan: [2026-09-07, 2026-09-09] fact: [2026-09-07, 2026-09-10] - label: Write specification plan: [2026-09-10, 2026-09-12] fact: [2026-09-11, 2026-09-14] - label: Stage 2 - Development plan: [2026-09-15, 2026-10-10] fact: [2026-09-15] ``` Because the chart is represented as text, it works particularly well with Git, Markdown, Obsidian, and other text-based workflows. --- ## ๐Ÿš€ Quick start ### ๐ŸŒ Web version **[Open OpenGantt in your browser โ†’](https://jebbycodes.github.io/OpenGantt/)** The web version runs directly in your browser with no installation required. It provides: * YAML editing * Open * Save * Save As * Obsidian block copying * Example chart * Printing * PNG export * SVG export * CSV export * Timeline scaling * Plan / Actual / Both modes * Table and column controls The repository also contains a self-contained standalone application: ```text dist/Gantt.html ``` Simply open it in a modern browser. No server is required and the standalone build does not need an internet connection. ### ๐Ÿ“ Obsidian OpenGantt is available through the **[Obsidian Community Plugins](https://community.obsidian.md/plugins/gantt)**. Install it from: **Settings โ†’ Community plugins โ†’ Browse โ†’ OpenGantt** Alternatively, you can build and install the plugin manually using the development instructions below. ### ๐Ÿ–ฅ๏ธ Desktop OpenGantt can also be packaged as a native desktop application using **[Tauri 2](https://tauri.app/)**. See [Building the desktop application](#building-the-desktop-application) for instructions. ### Keyboard shortcuts | Shortcut | Action | | ------------------------------ | ------- | | `Ctrl` / `Cmd` + `O` | Open | | `Ctrl` / `Cmd` + `S` | Save | | `Ctrl` / `Cmd` + `Shift` + `S` | Save As | | `Ctrl` / `Cmd` + `P` | Print | --- # ๐Ÿ“ฆ Installation ## Requirements ### For using the web application No installation is required. Open: **https://jebbycodes.github.io/OpenGantt/** in a modern browser. Alternatively, download or clone the repository and open: ```text dist/Gantt.html ``` ### For using the Obsidian plugin Install OpenGantt from the **[Obsidian Community Plugins](https://community.obsidian.md/plugins/gantt)**. No additional dependencies are required for normal plugin use. ### For development The JavaScript build system requires: * [Node.js](https://nodejs.org/) LTS * npm The Obsidian plugin build uses `esbuild`. ### For building the desktop application The desktop version uses: * Node.js * npm * Rust * Cargo * Tauri 2 The Rust project specifies a minimum Rust version of **1.77.2**. --- # ๐Ÿ› ๏ธ Development setup Clone the repository: ```bash git clone https://github.com/JebbyCodes/OpenGantt.git cd OpenGantt ``` Install the JavaScript dependencies: ```bash npm install ``` The dependencies and available npm scripts are defined in `package.json`. --- # ๐Ÿงฑ Building OpenGantt has separate build processes for the standalone application and the Obsidian plugin. ## Standalone application Build the browser version with: ```bash npm run build:app ``` This runs `build-app.mjs`. The build produces: ```text dist/ โ”œโ”€โ”€ Gantt.html โ””โ”€โ”€ index.html ``` `Gantt.html` is the standalone application intended to be opened directly. `index.html` contains the same generated application and serves as the frontend entry point used by Tauri. ### Offline operation The standalone application bundles its required JavaScript, CSS, and `js-yaml` dependency into the generated HTML. Nothing needs to be downloaded when the generated file is opened. --- ## Obsidian plugin Build the Obsidian plugin with: ```bash npm run build ``` The build produces: ```text main.js styles.css ``` `manifest.json` is already present in the repository and is copied alongside those files when the optional vault path is supplied. The build script bundles the plugin while leaving Obsidian, Electron, CodeMirror, and Lezer packages external because they are provided by the Obsidian host application. ### Automatically install into an Obsidian vault Pass the path to your Obsidian vault: ```bash npm run build -- "/path/to/your/vault" ``` For example, on Windows: ```powershell npm run build -- "C:\Users\YourName\Documents\Obsidian Vaults\My Vault" ``` The build script installs the plugin into: ```text /.obsidian/plugins/gantt/ ``` The resulting directory contains: ```text /.obsidian/plugins/gantt/ โ”œโ”€โ”€ main.js โ”œโ”€โ”€ manifest.json โ””โ”€โ”€ styles.css ``` The repository also contains a Windows helper: ```text BUILD-AND-INSTALL.bat ``` which can be used to automate the installation process where available. ### Manual installation If you build without specifying a vault: ```bash npm run build ``` copy: ```text main.js manifest.json styles.css ``` to: ```text /.obsidian/plugins/gantt/ ``` Then open Obsidian and go to: **Settings โ†’ Community plugins โ†’ enable OpenGantt** --- # ๐Ÿ–ฅ๏ธ Building the desktop application OpenGantt uses **[Tauri 2](https://tauri.app/)** for its desktop shell. The Tauri configuration specifies: * Application name: `OpenGantt` * Version: `1.2.0` * Frontend directory: `dist/` * Frontend build command: `npm run build:app` After installing the required Rust/Tauri tooling, build the desktop application with: ```bash npx tauri build ``` Tauri will first run: ```bash npm run build:app ``` and then package the generated `dist/` frontend into the native application. For development with the Tauri shell: ```bash npx tauri dev ``` The exact native output location depends on the platform and Tauri's build configuration. --- # ๐Ÿงช Testing Run the project's test suite with: ```bash npm test ``` The test command currently runs tests covering: * Model behaviour * Timeline calculations * Table columns * Export functionality The individual test files are: ```text test/model.test.mjs test/timeline.test.mjs test/columns.test.mjs test/export.test.mjs ``` The available test command is defined directly in `package.json`. --- # ๐Ÿ“ YAML reference ## Top-level options The following options can be placed alongside `rows`: | Option | Values | Default | Description | | ----------- | ------------------------------ | -----------: | -------------------------------- | | `scale` | `day`, `week`, `month`, `year` | `day` | Timeline scale | | `mode` | `plan`, `actual`, `both` | `both` | Which bars to display | | `height` | `200`โ€“`1600` | `520` | Chart height in pixels | | `padding` | `0`โ€“`365` | `7` | Empty days around the chart | | `hatch` | `true`, `false` | `true` | Diagonal hatching on actual bars | | `progress` | `true`, `false` | `true` | Show progress for open actuals | | `collapsed` | `true`, `false` | `false` | Start with parent rows collapsed | | `columns` | Column names | Saved layout | Select and order table columns | | `table` | `true`, `false`, `hidden` | Saved layout | Show or hide the task table | | `title` | Text | File name | Title used for print/export | ### Example ```yaml scale: month mode: both height: 700 padding: 14 hatch: true progress: true collapsed: false title: EPQ Project rows: - label: Research plan: [2026-09-07, 2026-10-10] fact: [2026-09-07] ``` --- ## Task properties Each task can contain: | Property | Description | | ---------- | ----------------------- | | `label` | Task name | | `plan` | Planned start/end dates | | `fact` | Actual start/end dates | | `children` | Nested tasks | | `notes` | Additional information | Additional properties become custom table columns. For example: ```yaml rows: - label: Write literature review plan: [2026-10-01, 2026-10-14] fact: [2026-10-02, 2026-10-17] owner: Alex priority: High ``` This automatically makes `owner` and `priority` available as table columns. --- ## Planned dates A normal planned task uses two dates: ```yaml plan: [2026-10-01, 2026-10-14] ``` A single planned date creates a milestone: ```yaml plan: [2026-10-14] ``` --- ## Actual dates A completed or ongoing task can have an actual start and end: ```yaml fact: [2026-10-02, 2026-10-17] ``` An open task can contain only its actual start: ```yaml fact: [2026-10-02] ``` Open actual tasks extend to the current date and can display their calculated progress. --- ## Hierarchical tasks Use `children` to create nested tasks: ```yaml rows: - label: Stage 1 - Research plan: [2026-09-07, 2026-10-01] children: - label: Find sources plan: [2026-09-07, 2026-09-14] - label: Evaluate sources plan: [2026-09-15, 2026-09-21] - label: Write notes plan: [2026-09-22, 2026-10-01] ``` Parent rows can be expanded or collapsed using the chart controls. --- # ๐Ÿ“Š Table columns The chart includes several built-in columns. | Column | YAML name | Description | | ------------- | ------------- | ---------------------------------- | | Progress | `progress` | Percentage of planned time elapsed | | Start planned | `planStart` | Planned start date | | End planned | `planEnd` | Planned end date | | Start actual | `actualStart` | Actual start date | | End actual | `actualEnd` | Actual end date | | Planned days | `planDays` | Planned duration | | Actual days | `actualDays` | Actual duration | | Variance | `variance` | Difference from planned completion | | Status | `status` | Current task status | | Notes | `notes` | Task notes | For example: ```yaml columns: - progress - planEnd - actualEnd - variance - status ``` You can also use: ```yaml columns: none ``` to hide the table columns. --- # ๐Ÿ’พ Saving and file formats OpenGantt can work with several file types. | Input | Save behaviour | | ---------------- | --------------------------------------- | | `.md` | Replaces only the selected Gantt block | | `.yaml` / `.yml` | Saves YAML | | `.txt` | Saves YAML using the same extension | | Other text files | Saves YAML using the original extension | When editing a Markdown note containing a Gantt block, OpenGantt preserves the rest of the note. This includes: * Frontmatter * Headings * Other Markdown content * Other code blocks * Content after the Gantt chart If a Markdown note does not contain a Gantt block, OpenGantt can add one without replacing the rest of the document. --- # ๐Ÿ–จ๏ธ Print and export OpenGantt supports printing and several export formats. ### Print The print renderer: * Prints the complete chart rather than only the visible portion * Includes expanded rows * Includes the selected columns * Supports the current chart scale and mode * Uses a light print-friendly colour scheme * Splits long charts across pages * Repeats the heading on subsequent pages * Avoids cutting rows between pages * Numbers pages You can use your browser's **Save as PDF** option to create a PDF. ### Export formats The export panel supports: * **PNG** โ€” raster image * **SVG** โ€” editable vector image * **CSV** โ€” spreadsheet-compatible task data CSV exports include every task, including tasks hidden by collapsed parent rows. --- # ๐Ÿ“ Obsidian usage OpenGantt can render charts directly inside Obsidian Markdown notes. Install OpenGantt from the **[Obsidian Community Plugins](https://community.obsidian.md/plugins/gantt)**, then add a `gantt` code block: ````markdown ```gantt scale: week mode: both rows: - label: Stage 1 - Planning plan: [2026-09-07, 2026-09-12] fact: [2026-09-07, 2026-09-14] children: - label: Research plan: [2026-09-07, 2026-09-09] - label: Planning plan: [2026-09-10, 2026-09-12] ``` ```` The YAML is visible while editing the Markdown source and is rendered as a chart in Reading View. ### Alternative code-block name If another Obsidian plugin already uses the `gantt` code-block name, OpenGantt can use: ````markdown ```epq-gantt rows: - label: Example plan: [2026-09-07, 2026-09-12] ``` ```` --- # ๐ŸŽ›๏ธ Obsidian controls The Obsidian chart toolbar provides: * Day / Week / Month / Year * Plan / Actual / Both * Expand all * Collapse all * Table * Columns * Legend * Print * Export * Full screen * Reset The chart uses its own dark Gruvbox-inspired colours regardless of the active Obsidian theme. Full-screen mode uses browser fullscreen where supported. On environments where browser fullscreen is unavailable, OpenGantt expands within the available Obsidian window. --- # ๐Ÿ—๏ธ Project structure ```text OpenGantt/ โ”‚ โ”œโ”€โ”€ app/ โ”‚ โ”œโ”€โ”€ app.css โ”‚ โ”œโ”€โ”€ shell.js โ”‚ โ””โ”€โ”€ shim.js โ”‚ โ”œโ”€โ”€ dist/ โ”‚ โ”œโ”€โ”€ Gantt.html โ”‚ โ””โ”€โ”€ index.html โ”‚ โ”œโ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ model.js โ”‚ โ”œโ”€โ”€ timeline.js โ”‚ โ”œโ”€โ”€ columns.js โ”‚ โ”œโ”€โ”€ chart.js โ”‚ โ”œโ”€โ”€ export.js โ”‚ โ”œโ”€โ”€ main.js โ”‚ โ””โ”€โ”€ styles.css โ”‚ โ”œโ”€โ”€ src-tauri/ โ”‚ โ”œโ”€โ”€ Cargo.toml โ”‚ โ”œโ”€โ”€ tauri.conf.json โ”‚ โ””โ”€โ”€ ... โ”‚ โ”œโ”€โ”€ test/ โ”‚ โ”œโ”€โ”€ model.test.mjs โ”‚ โ”œโ”€โ”€ timeline.test.mjs โ”‚ โ”œโ”€โ”€ columns.test.mjs โ”‚ โ””โ”€โ”€ export.test.mjs โ”‚ โ”œโ”€โ”€ vendor/ โ”‚ โ””โ”€โ”€ js-yaml.min.js โ”‚ โ”œโ”€โ”€ build-app.mjs โ”œโ”€โ”€ esbuild.mjs โ”œโ”€โ”€ package.json โ”œโ”€โ”€ package-lock.json โ”œโ”€โ”€ manifest.json โ”œโ”€โ”€ main.js โ”œโ”€โ”€ styles.css โ”œโ”€โ”€ LICENSE โ””โ”€โ”€ README.md ``` ### Important directories | Path | Purpose | | ------------ | ------------------------------------------------- | | `app/` | Standalone application's editor and browser shell | | `src/` | Core Gantt chart implementation | | `src-tauri/` | Tauri desktop application | | `test/` | Automated tests | | `vendor/` | Local third-party browser dependencies | | `dist/` | Generated standalone/Tauri frontend | ### Important build files | File | Purpose | | --------------------------- | -------------------------------------- | | `build-app.mjs` | Builds the standalone HTML application | | `esbuild.mjs` | Builds the Obsidian plugin | | `package.json` | Defines dependencies and npm scripts | | `src-tauri/tauri.conf.json` | Configures the Tauri application | | `src-tauri/Cargo.toml` | Defines the Rust/Tauri package | --- # ๐Ÿ”ง Available npm commands | Command | Purpose | | ------------------- | ------------------------------------- | | `npm install` | Install development dependencies | | `npm run build` | Build the Obsidian plugin | | `npm run build:app` | Build the standalone HTML application | | `npm test` | Run the automated tests | --- # ๐Ÿงฉ Architecture OpenGantt uses a shared chart implementation across its different interfaces. ```text โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ YAML data โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ OpenGantt model โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ Browser Obsidian Tauri frontend plugin desktop โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Gantt renderer โ”‚ โ”‚ Timeline + table โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` The standalone builder embeds the application's JavaScript, CSS, and YAML parser into a single HTML file. The Tauri configuration then uses the generated `dist/` directory as its frontend. --- # ๐Ÿ”— ts-gantt OpenGantt is based on the **[`ts-gantt`](https://github.com/yermolim/ts-gantt)** project. `ts-gantt` provides the underlying Gantt-chart concepts and rendering foundation, while OpenGantt adds its own: * YAML-driven format * Planned/actual/progress workflow * Gruvbox-inspired interface * Custom table columns * Tooltip system * Print renderer * Export system * Standalone application * Obsidian integration The underlying `ts-gantt` project is MIT licensed. OpenGantt itself is released under the Unlicense. --- # ๐Ÿค Contributing Contributions, bug reports, improvements, and feature ideas are welcome. Before submitting a change: 1. Fork the repository. 2. Create a branch for your change. 3. Install dependencies with `npm install`. 4. Make your changes. 5. Run the test suite: ```bash npm test ``` 6. Test the relevant build: ```bash npm run build ``` or: ```bash npm run build:app ``` 7. Open a pull request with a clear description of the change. For UI changes, include screenshots where useful. --- # ๐Ÿ› Reporting bugs When reporting a problem, include as much of the following as possible: * Operating system * Browser or Obsidian version * OpenGantt version/commit * Whether you are using the web app, Obsidian plugin, or desktop application * The YAML that reproduces the issue * Console/build errors * Screenshots or recordings when appropriate A minimal reproducible example makes debugging considerably easier. --- # ๐Ÿ“„ License OpenGantt is released into the public domain under the **Unlicense**. See [`LICENSE`](LICENSE) for the full license text. OpenGantt incorporates the MIT-licensed [`ts-gantt`](https://github.com/yermolim/ts-gantt) project. --- # ๐Ÿ™ Acknowledgements * **[`ts-gantt`](https://github.com/yermolim/ts-gantt)** โ€” underlying Gantt chart foundation * **[`js-yaml`](https://github.com/nodeca/js-yaml)** โ€” YAML parsing * **[Obsidian](https://obsidian.md/)** โ€” Markdown knowledge-management platform supported by the plugin * **[Tauri](https://tauri.app/)** โ€” desktop application framework --- # โš ๏ธ Project status OpenGantt is an actively developed open-source project. The repository currently contains a standalone browser application, an Obsidian plugin, and a Tauri desktop shell. Features and interfaces may change between versions. The latest web version is available at: **[๐ŸŒ https://jebbycodes.github.io/OpenGantt/](https://jebbycodes.github.io/OpenGantt/)** If you are using OpenGantt for important project planning, keep your YAML/Markdown source files under version control or maintain regular backups.