Simple Gantt
A lightweight, browser-based Gantt chart and task management tool. No server required. Works completely offline or syncs with Dropbox.
Features
📊 Core Gantt Functionality
- Interactive Gantt Chart – Visual timeline with drag-and-drop tasks
- Spreadsheet Grid – Edit tasks in a familiar table format
- Task Hierarchy – Support for parent-child task relationships
- Collapse/Expand – Fold a parent's children out of view in both the grid and chart, with "Expand All"/"Collapse All" toolbar controls; purely visual, your data is never touched
- Column Hide/Show – Hide any grid column, core or custom, via a "🙈 Hide Column" entry on its right-click menu or the toolbar's "Columns" popover (a checkbox per column, doubling as a clear "N hidden" indicator); toggle it back with "👁️ Show Column" or by re-checking the box, or restore every hidden column at once with the popover's "Show all" link. Purely visual, like Collapse -- a hidden column's data is never touched and it still appears in full in CSV export and Dropbox backup
- Manual "In Progress" Flag – Click the marker next to any Task ID, or right-click the row and choose "Mark In Progress," to tint that grid row purple for your own ad-hoc tracking; grid-only, never touches the Gantt chart or CSV export
- 100%-Done Checkmark – A task at 100% gets a small ✓ next to its name in the grid, in the same spot the critical-path ⚡ icon uses (both can show together). Grid-only, applies to parent rows too since their % Done is itself a live rollup of their children
- Late Indicator – The End column tints itself automatically: red if it's in the past, yellow if it's today, no color if it's not due yet. Pure date math (doesn't consult % Done), applies to every row including parents. Grid-only, like the In Progress flag
- Plan My Day – A "Plan My Day" toolbar button opens a docked panel over the grid/chart (header and toolbar stay usable) with a "Recommended" list computed live from Late/upcoming tasks -- overdue first, then due today, then due soon, capped so it never becomes a second copy of the grid. Pin whichever ones matter into "Today's Plan" (from the panel's "+", or the ★ toggle on any row's Task ID in the grid, both stay in sync); check one off to mark it 100% done, click its 📝/+ icon to open that task's real Notes, or click its 📋 icon to open that task's real Detail Card and adjust any field right there. A "Start New Day" link clears the pin list in one click once you're ready to start curating fresh, rather than yesterday's picks rolling forward silently. Per-project, localStorage-only, never in CSV export or Dropbox backup
- Task Notes – Every task has a built-in Notes column (right after Labels) -- no setup needed. Click its flag, or right-click the row and choose "Add Notes"/"View/Edit Notes," for a small click-to-expand modal rendering a lightweight Markdown subset (headers, bold, italic, links, lists, task checkboxes, inline
code and fenced ``` code blocks); still a plain-text cell underneath, so it round-trips through CSV import/export like any other column. (A custom column named "Notes" still gets the same treatment too, for anyone using that older convention.)
- Project Notes – A single Markdown note for the whole project, separate from any one task -- scope, context, a changelog of decisions. Opened via the toolbar's "Notes" button, using the same click-to-expand-and-edit Markdown UX (and renderer) as the per-task Notes column. Stored with the project alongside the named-resources registry and collapse state: localStorage-only, not part of CSV export -- but is included in a Dropbox backup's
meta.json, and restored back out along with the rest of that backup
- Grid Search/Filter – Filter rows by any column's value -- Task Name, Resource, % Done, dates, custom columns, all of it; matches keep their parent/ancestor chain visible for context, and search composes with Collapse (a manually collapsed section stays collapsed even if something inside it matches)
- Structured Filters – A toolbar "Filters" button groups five dedicated, per-field filters -- Resource (checkbox multi-select over your named resources), Parent (checkbox multi-select over every task actually used as a parent, labeled by name -- narrows to that parent's own direct children, with the parent kept visible for outline context), % Done (Not started / In progress / Complete), and a From/To date range each for Start and End. All five compose with each other, with Grid Search, and with Labels via AND; a "Clear filters" link resets them at once. View-only, like every other filter here
- Global Clear Filters – A "Clear filters" button in the toolbar (next to Search/Labels/Filters) resets Grid Search, the Label filter, and the Structured Filters dropdown all in one click, rather than clearing each of the three individually. Disabled whenever none of them has anything active
- Labels – Tag any row with one or more free-text labels (comma or semicolon-separated). The toolbar's label filter is a checkbox multi-select, sourced from your named labels: check one or more to narrow the grid to tasks carrying any of them; an opt-in "Label in chart" toggle applies that same filter to the Gantt chart
- Bulk Edit – Click and drag to select 2 or more rows, click "Bulk Edit," and apply one Resource/% Done/Parent value to the whole selection at once; a row where that field is read-only (e.g. % Done on a parent task) is skipped and called out separately
- Task Detail Card – Right-click any row and choose "Edit Details..." for every field of that one task -- Resource (with your named-resource quick-pick chips), Parent, Def. Alloc, % Done, Start/Duration/End, Depends, Labels, custom columns -- in a single form, instead of tabbing cell-to-cell across the grid. Nothing is written until you click Save, which applies every changed field as one Undo step; Cancel, the ✕, or Esc all discard without asking. Unlike every other modal here, clicking outside the card does nothing -- it can hold several pending edits at once, so an accidental click away never costs you anything
- Named Resources – Define resource names ahead of time via the "Resources" toolbar button, then pick them from a quick-pick ▾ icon on any grid Resource cell instead of typing from scratch. The Resource cell stays free text underneath (comma/semicolon-separated, allocation annotations like
Alice (50%) included) -- the registry is just a faster way to fill it in. Renaming a registered name updates every task already assigned it; deleting one only affects future suggestions
- Named Labels – Same idea as Named Resources, one-to-one: define labels ahead of time via the "Labels" toolbar button, then pick them from a quick-pick ▾ icon on any grid Labels cell. The Labels cell stays free text underneath -- the registry is purely structural, no color/badge treatment. Renaming a registered label updates every task already carrying it; deleting one only affects future suggestions
- Named Topics – Define the Kanban board's tabs ahead of time via the "Topics" toolbar button. Unlike Resources/Labels, the grid's Topic cell is a closed-set dropdown sourced from this list, not free text, and unlike Resources/Labels (always alphabetized), Topic order is meaningful -- it's the board's left-to-right tab order -- so new topics are added at the end and the Manager modal has ▲/▼ buttons to reorder them. Renaming a topic updates every task already set to it; deleting one only affects what's selectable going forward
- Named Lanes – Define the Kanban board's columns via the "Lanes" toolbar button, the same order-preserving dropdown model as Named Topics (▲/▼ reorder, new lanes added at the end) -- Lane order is the board's left-to-right column order within whichever Topic tab is selected. All four named registries (Resources/Labels/Topics/Lanes), Lane's arranged order included, are part of a Dropbox backup and come back exactly as they were on restore -- not just reconstructed from whatever's still in use on a task
- Kanban Board – A fourth workspace mode (next to Grid/Split/Chart) for the same tasks, viewed as cards instead of rows. Topics are tabs across the top, in your own topic order (one shown at a time, plus a catch-all "Uncategorized" for anything not yet assigned one); Lanes are the board's columns, left to right ("Unsorted" first, then your own lane order). Only leaf tasks become cards -- same as the Workload dashboard and Critical Path, a parent's fields are always a rollup, not something you set directly. A card shows its Resource, % Done, a "🔗 Blocked by N" badge (computed live from Depends -- blocked as long as the referenced task is under 100%), and an Overdue/Due today badge (the same Late Indicator logic as the grid's End column). Drag a card to a different lane to update it, or click it to open the same Task Detail Card every other view uses -- one Undo step either way. Honors Grid Search/Structured Filters/the Label filter the same way the grid does, so a card list never drifts out of sync with what's filtered elsewhere; a manual row Collapse is the one exception, since it's a Grid-only tree-view convenience with no equivalent on a flat board of leaf-only cards
- Undo / Redo – Toolbar buttons plus Ctrl/Cmd+Z and Ctrl/Cmd+Y (or Ctrl/Cmd+Shift+Z). Reverting a change correctly recalculates anything that cascaded from it too -- a dependent task's Start, a parent's rolled-up % Done -- not just the one cell you touched. Per-project, capped at 50 steps, cleared on reload
- Type an explicit End date on a leaf task – A task with no children now accepts a direct edit to its End date, back-solving Duration from Start + End instead of only deriving End forward from Start + Duration. A task with children still gets its End rolled up from them and stays read-only. CSV import honors an explicit End on a leaf row the same way
- Resource Color-Coding – Each resource gets a deterministic color, shown as a stripe on the left edge of its bars (first-listed resource wins on multi-resource tasks) and listed in the chart legend; complements the Workload dashboard's per-resource view
- Critical Path Highlighting – Opt-in toggle ("Critical path", off by default, in the chart's own "View ▾" menu) that runs the chain of zero-slack tasks determining the project's overall end date through a standard CPM pass over the Depends graph. Critical tasks get a small ⚡ next to their name in the grid and an outlined bar in the chart; parallel branches with float are correctly left unmarked. Suppressed while a dependency cycle exists, since a cycle has no well-defined critical path.
- Chart View Controls, in the chart itself – Zoom is an always-visible Day/Week/Month toggle directly on the chart panel, not buried in a menu; Weekends off, Critical path, and Label in chart live in a "View ▾" menu right next to it. None of these ever touch the grid, so they live with the chart, not the generic toolbar. "Pop out" opens the chart in its own window -- really a second, fully independent instance of the app defaulted to chart-only view, so dragging, hovering, and zooming there all work exactly like the main window (same code, same project data via shared local storage)
- Chart Scrollbar – An explicit, always-visible scrollbar on the chart panel (rather than relying on the browser's own, which can be thin or fully auto-hiding depending on OS/browser) makes clear there's more to scroll to when most rows are unscheduled and the chart's own content is mostly blank between the few that have bars
- Progress Tracking – Mark tasks as not started, in progress, complete, or overdue
- Dependencies – Link tasks to show sequential relationships
- Milestones – Create zero-duration milestone markers
🔄 Automatic Date Recalculation
- Depends – a finish-to-start constraint. If task B Depends on task A, B's Start is kept equal to A's End date. This runs live on every edit; it's calendar-only and never looks at % Done, so it's on you to keep dates accurate as work runs long or short.
- Parent dates automatically span all children – a parent's Start/End/% Done are continuously rolled up from its children (earliest start, latest end, duration-weighted % Done), all the way up through grandparents. Also live on every edit.
- Manual "Sync Dependencies" button – both rules above already run automatically, so you shouldn't need this. It forces a full recompute of every row anyway, mainly useful right after pasting in a large block of rows.
- Renumber Task IDs – A Tools-menu action that reassigns Task ID 1, 2, 3... in current row order, closing gaps left by deleted tasks for cleaner CSV/PDF exports. Depends, Parent, and any collapsed/flagged rows are rewritten to match in the same pass, so nothing breaks; explicit and opt-in only, never automatic, and undoes as a single Ctrl+Z step. A plain-text ID mention inside Notes/Labels isn't rewritten.
- Dependency cycle detection – if the Depends graph loops back on itself (A depends on B depends on A, or a longer chain), the affected Task IDs get a red outline with a tooltip naming the cycle, plus a one-time status-bar warning. Purely informational -- it doesn't remove the Depends link or block anything, it just explains why those tasks' dates might not settle.
🌐 Flexible Deployment
- 100% Browser-Based – No server, no installation. Just open the HTML file.
- Fully Offline – All data stored in browser's local storage
- Installable PWA – Add it to your home screen or desktop from a browser tab; a service worker caches the app shell and libraries so it keeps working (including on repeat visits with no connection) after the first successful load
- Dropbox Integration – Optional backup and sync across devices
- CSV Import/Export – Move data in and out easily
- PNG / Paginated PDF Export – Export the Gantt chart as a PNG, or as a PDF that automatically tiles a long timeline across as many landscape pages as needed (each page a full-height vertical slice, left to right) rather than shrinking it illegibly onto one page
📱 User Experience
- Responsive Design – Below a phone/tablet-width breakpoint, portrait shows the grid and chart as a single full-width pane you switch between (same Grid/Split/Chart buttons as desktop) instead of an unusably narrow side-by-side split; landscape keeps the real resizable two-pane split, with a wider, touch-draggable divider. Touch-sized toolbar buttons and full-screen modals apply in both orientations. The toolbar itself collapses down to just Search, Grid/Split/Chart, Undo/Redo, and Add row, with everything else tucked behind a "More ▾" toggle instead of spilling across several rows
- Split-View – Adjustable grid/chart split (or show one side only) on wider screens
- Multiple Zoom Levels – Day, Week, or Month view
- Resource Workload Dashboard – See who's overallocated at a glance
- Dark Mode Header – Clean, modern interface
- Project Switching – Multiple projects in one browser tab
🔐 Data Management
- Automatic Saving – Changes persist to browser storage instantly
- Dropbox Backup – Optional encrypted sync to Dropbox (~1 min after edit)
- Version History – Restore any previous backup
- Project Import – Discover and import projects from Dropbox across devices
- Delete Project – Removes a project from this browser; if it has Dropbox backups, a separate explicit prompt ("Yes, delete from Dropbox" / "No, keep backups") asks whether to remove those too. Deleting your only remaining project is gated behind typing "DELETE" to confirm, and leaves you on a fresh blank project afterward rather than none at all
Getting Started
Option 1: Use Online (No Setup)
Open in your browser:
🔗 https://adambeltz2.github.io/Simple-Gantt/
Option 2: Download & Open Locally
- Download
index.html from this repo
- Open it in any modern browser (Chrome, Firefox, Safari, Edge)
- Start creating tasks immediately
No server, no npm, no build step required.
How to Use
Creating & Editing Tasks
| Action | How |
|---|
| Add Task | Click "➕ Add row" -- inserts right after whatever row you have selected, or at the bottom if nothing's selected. Right-click a row for "Insert row above"/"Insert row below" instead |
| Edit Cell | Double-click any cell in the grid |
| Delete Task | Right-click row → Delete row |
| Reorder Tasks | Drag rows up/down, or right-click a row → "Move to Task ID..." to jump it next to a specific task by ID (also reparents it to match, so it lands at the right outline depth) |
| Add Column | Right-click column header → Add column |
Setting Task Dates
Column Layout:
- ID – Unique task identifier (auto-generated)
- Outline – Indentation level (1, 1.1, 1.1.1, etc.)
- Task Name – What the task is
- Resource – Who's working on it
- Def. Alloc – % of their time allocated (0-100)
- % Done – Progress (0-100)
- Start – Begin date (YYYY-MM-DD format)
- Dur. – Duration in days
- End – Completion date (YYYY-MM-DD format). Editable directly on a leaf task (no children) -- Duration is back-solved from Start + End. A task with children keeps its End read-only and rolled up from its children instead
- Depends – Parent task IDs (comma-separated)
- Parent – Which task this one is nested under, for outline grouping. Directly editable (its own dropdown); independent of "Depends," which is a separate finish-to-start scheduling link, not a hierarchy setting
- Labels – Free-text tags, comma or semicolon-separated
- Notes – Click-to-expand Markdown note for the task. Read-only at the cell level; click the flag to view/edit in a modal
- Status – Not Started / In Progress / Complete, calculated only from % Done (0%, between, 100%). Read-only -- always freshly recomputed, never typed directly
- Topic – Which Kanban board column (tab) this task belongs to, picked from a dropdown sourced from your named topics (see Named Topics, below)
- Lane – Which Kanban board row this task sits in, picked from a dropdown sourced from your named lanes (see Named Lanes, below)
Example Setup:
ID Name Start End Depends Parent
1 Website Redesign 2024-01-15 2024-03-15 - -
2 Discovery & Wireframes 2024-01-15 2024-01-20 1 1
3 UI Design 2024-01-21 2024-02-10 2 1
4 Frontend Dev 2024-02-11 2024-03-15 3 1
The Bubble-Up Magic
When child task dates change, parents automatically expand -- live, on every edit, no button required:
BEFORE:
Parent Task Start: 1/15 End: 3/15
└─ Child 1 Start: 1/15 End: 1/20 ← Change to 1/25
└─ Child 2 Start: 1/21 End: 2/10
AFTER (Automatic):
Parent Task Start: 1/15 End: 2/10 ✅ Parent expanded
└─ Child 1 Start: 1/15 End: 1/25
└─ Child 2 Start: 1/21 End: 2/10
The "↻ Sync Dependencies" button just forces a full recompute of every row on demand -- handy after pasting in a large block of data, but not something you need to click for the bubble-up itself.
Zoom & View Options
| Control | Effect |
|---|
| Zoom: Day/Week/Month | Change Gantt chart time scale |
| Weekends off | Hide weekends in chart |
| Grid Only (100%) | Show spreadsheet, hide chart |
| Split View (55/45) | Balanced grid + chart (default) |
| Chart Only (~8%) | Full-width Gantt chart |
| Fit columns | Auto-resize columns to content |
CSV Import & Export
Import
- Click "📤 Import" button
- Select a CSV file from your computer
- Data loads instantly; parent dates recalculate automatically
Export
- Click "📥 Export CSV" button
- File downloads with consistent, validated dates
- Parent dates are pre-calculated before export
CSV Format:
ID,Outline,Task Name,Resource,Def. Alloc,% Done,Start,Dur.,End,Depends,Parent
1,1,Project,,,0,,,,,
2,1.1,Phase 1,Alice,50,100,2024-01-15,5,2024-01-19,,1
3,1.2,Phase 2,Bob,100,50,2024-01-20,7,2024-01-26,2,1
Dropbox Integration (Optional)
Why Use Dropbox?
| Feature | Without Dropbox | With Dropbox |
|---|
| Local Storage | ✅ Yes | ✅ Yes + Dropbox backup |
| Version History | ❌ Current version only | ✅ Last 25 backups |
| Cross-Device | ❌ Browser-only | ✅ Access anywhere |
| Backup Safety | ❌ If you clear cache, data is gone | ✅ Always recoverable |
| Project Discovery | ❌ Manual re-entry on new device | ✅ Auto-import found projects |
Setting Up Dropbox
- Click "Back up" button
- Choose "Continue to Dropbox"
- Authorize Simple Gantt (read/write access to
/Apps/Simple Gantt Backups/)
- Automatic backups start ~1 minute after edits stop
- Click "Versions" anytime to restore a past backup
Disconnecting
Click "Disconnect" – Your local data stays, backups stay in Dropbox, no data deleted.
Resource Workload Dashboard
View team allocation at a glance:
- Click "👥 Workload" button
- Choose resolution: Daily, Weekly, or Monthly
- Choose unit: Percentage (%) or Hours (8h/day)
- Cells show: Green = OK, Red = Overallocated
- Click "Export CSV" to download workload report
Projects & Data
Create New Project
- Click project selector dropdown
- Choose "➕ Create New Project..."
- Enter project name
- Start adding tasks
Rename Project
Click "Rename" button, enter new name
Delete Project
Click "Delete" button. If the project has Dropbox backups, you're asked separately whether to delete those too ("Yes, delete from Dropbox" / "No, keep backups") -- keeping them just means the project may show up again later under "Check Dropbox for other projects."
Deleting your only remaining project requires typing DELETE to confirm, the same as the old "Reset" button used to (now removed) -- afterward you're left on a fresh, blank project rather than no project at all.
Switch Project
Select different project from dropdown at top-left
Keyboard & Navigation
| Shortcut | Action |
|---|
| Double-click cell | Edit |
| Tab | Move to next cell |
| Shift + Tab | Move to previous cell |
| Enter | Confirm edit, move down |
| Esc | Cancel edit |
| Right-click | Context menu (add/delete row/col) |
| Ctrl/Cmd + Z | Undo the last change |
| Ctrl/Cmd + Y (or Ctrl/Cmd + Shift + Z) | Redo |
Troubleshooting
Grid won't load
- Open DevTools (F12 → Console)
- Check for errors
- Refresh page
- Try in incognito mode
Dates aren't calculating
- This should be automatic, but you can click "↻ Sync Dependencies" to force a full recompute
- "Depends" should reference the task ID(s) this task can't start before -- not its parent
- "Parent" should reference the summary task this row belongs to; a parent needs children with dates set to roll up
Data lost after browser clear
- If using Dropbox: Click "Versions" to restore
- If offline-only: Data is only in browser storage
- Prevention: Export CSV regularly
Dropbox won't connect
Can't find old projects
- Click "Versions" → "Check Dropbox for other projects"
- Select projects to import
- They'll appear in project dropdown
Data Privacy & Storage
Local Storage
- 100% in your browser
- Not sent to any server (except Dropbox if you enable it)
- Cleared only if you clear browser cache OR delete a project (per-project, via "Delete")
Dropbox Storage
- Your choice to enable; disabled by default
- Backups stored in
/Apps/Simple Gantt Backups/ in your Dropbox
- Only you have access (read your Dropbox, not read others)
- 25 backups per project; older ones auto-delete
No Tracking
- No analytics
- No ads
- No data collection
- Open source – inspect the code yourself
Browser Support
| Browser | Support |
|---|
| Chrome/Edge (latest) | ✅ Full |
| Firefox (latest) | ✅ Full |
| Safari (latest) | ✅ Full |
| Mobile browsers | ✅ Full -- single-pane responsive layout, installable as a PWA |
| Internet Explorer | ❌ Not supported |
Tips & Best Practices
1. Use Task IDs Consistently
- Keep IDs simple (1, 2, 3...) or hierarchical (1.1, 1.2, 2.1...)
- Set "Depends" to parent ID for auto-hierarchy
2. Set Realistic Durations
- Dur. should equal (End – Start + 1) days
- Or let Simple Gantt auto-calculate when you enter Start/End
3. Export Regularly
- Export CSV weekly as a backup
- You own the file immediately; no cloud needed
4. Sync Dependencies After a Bulk Paste
- Dependency and parent dates already recalculate automatically as you edit, including on CSV import
- After pasting in a large block of rows at once, click "↻ Sync Dependencies" to force a full recompute in one go
5. Use Resources for Workload Tracking
- Enter resource names consistently ("Alice", "Alice", not "Alice", "alice")
- Set "Def. Alloc" for each task (50 = half-time)
- View "Workload" dashboard to spot overallocation
Keyboard Shortcuts Summary
F12 Open DevTools (to see console logs)
Ctrl/Cmd+Z Undo the last change
Ctrl/Cmd+Y Redo (Ctrl/Cmd+Shift+Z also works)
Ctrl/Cmd+E Export CSV (if keyboard-enabled)
Ctrl/Cmd+I Import CSV (if keyboard-enabled)
Tab Next cell in grid
Shift+Tab Previous cell
Enter Confirm edit
Esc Cancel edit
Double-click Edit cell
Right-click Context menu
Version History
See CHANGELOG.md for detailed release notes.
Latest: v2.11.0 (2026-08-24)
✨ Grid Search/Filter – A search box in the toolbar filters rows by Task Name or Resource, keeping a match's parent/ancestor chain visible for outline context. Built on the same hideRow/showRow mechanism as Collapse (not jexcel's own built-in search(), which manages visibility by detaching rows from the DOM and would conflict with it) -- the two compose with AND, so a manually collapsed section stays collapsed even if a search matches something inside it. Resets automatically when you switch projects.
v2.10.1 (2026-08-24)
🧪 Test coverage expanded to CSV round-tripping and the Workload dashboard – no functional changes; closes the last tech-debt item from the original repo review.
v2.10.0 (2026-08-24)
✨ Notes Field – Add a custom column literally named "Notes" (case-insensitive) and it becomes click-to-expand: each cell shows a small flag instead of raw text, opening a modal that renders a self-contained Markdown subset (bold, italic, links, bullet/numbered lists) with an Edit toggle. No new CDN dependency -- the renderer is a small inline subset, not a full library. Still a plain-text cell underneath (readOnly at the grid level so editing only happens through the modal), so it round-trips through CSV import/export exactly like any other custom column.
v2.9.1 (2026-08-24)
🐛 Critical date bug fixed: End dates were landing before Start dates for users in most US/Americas timezones – new Date("YYYY-MM-DD") parses as UTC midnight, which silently rolls back to the previous calendar day when read in any timezone behind UTC. This was masked for years by the old exclusive-End convention (fixed in 2.9.0) accidentally canceling it out for 1-day tasks -- removing that convention unmasked it. Every internal date parse now goes through a timezone-safe helper. If you saw End dates before Start dates after updating to 2.9.0, click "↻ Sync Dependencies" once now to fix it.
v2.9.0 (2026-08-24)
✨ Late Indicator – The End column colors itself automatically (red = overdue, yellow = due today) on every row, including parents. Grid-only, like the In Progress flag.
🐛 End date is now inclusive – "End" now means the actual last day of work, not the day after it. A 1-day task starting 8/20 now shows End=8/20 (previously 8/21). This also fixes two side effects of the old convention: Gantt bars were rendering one day wider than they should have, and the chart's "overdue" red coloring was kicking in a day later than it should have. If you have existing projects, their stored End dates were computed under the old convention -- click "↻ Sync Dependencies" once after updating to refresh everything to the new one. Successor tasks (via "Depends") still start the very next working day after their dependency finishes; only the stored date's meaning changed, not the actual schedule.
🐛 Parent rollup now handles 3+ level hierarchies correctly – Found while fixing the bug above: a grandparent-level task could roll up using a mid-level parent's stale, pre-rollup dates if that parent hadn't been recalculated yet in the same pass. The rollup now repeats to a fixed point (like dependency resolution already did), so it's correct regardless of how deep your outline goes or what order rows appear in.
v2.8.0 (2026-08-24)
🔒 CSV import sanitization closed for every ingestion path – Task Name, Resource, and custom-column text imported from a CSV now have HTML-significant characters stripped, whether the CSV comes from the manual Import button, a Dropbox backup restore, or Dropbox project discovery. Previously only the manual Import path sanitized anything, and even then only Start/End dates.
v2.7.0 (2026-08-24)
🐛 Sync Dependencies fixed – The button, and the docs describing it, previously described a "bubble-up" mechanism that wasn't actually wired into CSV import/export/Dropbox backup, and its standalone implementation misread the Depends column as a parent/child relationship. Removed that dead code; the button now just force-triggers the same dependency (finish-to-start, date-only) and parent (rollup) logic that already runs automatically on every edit.
v2.6.0 (2026-08-24)
✨ Manual "In Progress" Flag – Click the marker next to any Task ID to tint that row purple for your own ad-hoc tracking. Grid-only: never touches the Gantt chart, and has zero effect on CSV export or Dropbox backups.
v2.5.0 (2026-08-24)
✨ Collapse/Expand Parent Tasks – Fold a parent's children out of view via a toggle on its row (or "Expand All"/"Collapse All" in the toolbar). View-only: your task data is never modified, and the collapsed/expanded state is remembered per project.
🔒 CDN Integrity – The pinned-version libraries (PapaParse, Frappe Gantt, html2canvas, Dropbox SDK) now load with Subresource Integrity hashes, so a compromised or altered CDN file can no longer execute silently.
Development & Testing
Simple Gantt still ships as a single static index.html with no build step. A small package.json exists only to run the Playwright UI test suite under tests/:
npm install
npx playwright install chromium # first time only
npm test
Contributing
This is an open-source project. Contributions welcome! Planned features and known follow-ups live in BACKLOG.md.
License
MIT License – Use freely, modify, and redistribute.
See LICENSE file for details.
Credits & Thanks
Support
- 📖 Documentation – See above
- 🐛 Bug Reports – Open an issue
- 💬 Questions – Check existing issues or start a discussion
- ☕ Support Development – Buy me a coffee
FAQ
Q: Is my data secure?
A: Yes. Data stays in your browser by default. Dropbox backups are encrypted in transit and at rest (Dropbox's security). We don't have access to your data.
Q: Can I use this for large projects (1000+ tasks)?
A: Yes, but performance may slow. Consider splitting into multiple projects.
Q: Does this work offline?
A: Completely. Dropbox is optional. Use offline and export CSV as backup.
Q: Can I export to Microsoft Project?
A: Not directly, but the CSV format is compatible with most project tools (Excel, Sheets, Monday.com, etc.).
Q: Can teams collaborate in real-time?
A: Not yet. Each user has their own local version. Share via CSV exports.
Q: What if I accidentally delete something?
A: Click Undo (or Ctrl/Cmd+Z) right away -- it reverts the last change and correctly recalculates any dependent dates or parent rollups that cascaded from it, not just the raw cell. If you need to go back further than your current session's undo history, and you're using Dropbox, click "Versions" to restore an earlier backup instead.
Roadmap
Planned features for future releases:
- 🔒 Real-time collaboration (WebRTC-based)
- 📅 Calendar sync (Google, Outlook)
- 🔗 Kanban board view
- 📊 Advanced reporting & analytics
- 🌐 Multiple language support
- 📱 Dedicated mobile app
Made with ❤️ for project managers everywhere.
Happy planning! 🚀
If Simple Gantt saved you some time, buy me a coffee ☕.