Many project teams use excel to create Gantt style plans, while it works there are some downsides. This app provides user with the ability to load an app into your browser, that enables the development and display of gantt project plans with all data still residing locally in your browser. No data gets sent back to a server. You can save and load Gantt data to your local file system as when you close your browser the data disappears!
There are many debates an opinion on the use of Gantt charts, especially if when the team is using Agile approaches to delivery. In my experience there are often senior stakeholders who desire/like Gantt charts. With good stakeholder training and expectation management you can use Gantt charts in an environment where Agile approaches are also used. Especially if you also use Critical Chain Project Management techniques in which you provide buffers to deal with uncertainty.
This app is a modern, feature-rich Gantt chart utility which would not be possible without Svelte and SVAR components.
Svelte is a UI framework that uses a compiler to let you write concise components using HTML, CSS and JavaScript. Developers consistently rank Svelte as the framework theyβre most excited about using.
This application provides a comprehensive project management interface for manually scheduling tasks, resource assignments, linking dependencies, and managing project markers and file import/export capabilities.
When you have your plan make sure to save it to your local drive. Then maximize the Gantt chart and take a screen shot to include in your communications materials.
temp://123456789
, saved tasks and links will retain those IDs unmodified. This is useful during editing sessions to avoid breaking in-memory relations.normalizedIds: true|false
so you can tell which mode produced the file.The current timeline Start and End values are saved into metadata (timelineStart
, timelineEnd
).
When loading a file, the timeline is restored from metadata if present. If not present, the app computes a sensible window from the tasksβ min start and max end (with padding) to ensure the project is visible immediately.
File Import/Export: Save and load projects as JSON files
Data Persistence: Maintains state across browser sessions
Real-time Updates: Immediate visual feedback for all changes
Undo/Redo: Built-in operation history (via SVAR Gantt)
Clone the repository
git clone <repository-url>
cd simple-web-gantt-viewer
Install dependencies
npm install
Start development server
npm run dev
Open browser
Navigate to http://localhost:5173
(or the URL shown in terminal)
npm run build
The built files will be in the dist/
directory, ready for deployment.
After building the assets, above with no errors you can check the wrangler.toml
#:schema node_modules/wrangler/config-schema.json
name = "simple-web-gantt-editor"
compatibility_date = "2024-09-25"
assets = { directory = "./dist" }
Install cloudfare wrangler CLI utility
npx wrangler --version
Login to your account
npx wrangler login
Deploy app to cloud site
npm run deploy
Deployment console output
β
οΈ wrangler 4.31.0
βββββββββββββββββββ
π Building list of assets...
β¨ Read 4 files from the assets directory C:\Users\rnwol\workspace\simple-web-gantt-viewer\dist
π Starting asset upload...
π Found 3 new or modified static assets to upload. Proceeding with upload...
+ /index.html
+ /assets/index-9PkJZyyr.css
+ /assets/index-JpO8yJsk.js
Uploaded 1 of 3 assets
Uploaded 2 of 3 assets
Uploaded 3 of 3 assets
β¨ Success! Uploaded 3 files (2.88 sec)
Total Upload: 0.36 KiB / gzip: 0.26 KiB
Uploaded simple-web-gantt-editor (12.28 sec)
Deployed simple-web-gantt-editor triggers (3.51 sec)
https://simple-web-gantt-editor.throughputfocus.workers.dev
Current Version ID: 97161d48-2900-4d58-8492-f029746a4a08
If you want to make this app accessable via a simple URL then set up a CNAME DNS record.
to map https://gantt.rnwolf.net to https://simple-web-gantt-editor.throughputfocus.workers.dev
Then add route to cloudflare so that you run your Worker for a given url.
Route: gantt.rnwolf.net/*
Worker: simple-web-gantt-editor
A helper script is provided to convert between the JSON project format and an Excel workbook.
Prerequisites: Astralβs uv (no virtualenv needed). The script declares its dependencies inline.
Export JSON -> Excel
uv run scripts/gantt_excel_helper.py to-xlsx --in docs/gantt-project-2025-08-22.json --out out.xlsx
Import Excel -> JSON
uv run scripts/gantt_excel_helper.py to-json --in out.xlsx --out out.json --project-name "My Plan"
Optional: Override timeline window when importing
uv run scripts/gantt_excel_helper.py to-json --in out.xlsx --out out.json \
--timeline-start 2025-08-10T00:00:00Z --timeline-end 2025-09-30T00:00:00Z
Notes:
scales
, columns
, and taskTypes
so the file loads in the editor out-of-the-box.TIP: Save the Resource view, then open a second browser window/tab, load the resource view there, and align your Project Plan window and Resource View window side-by-side. This makes it easy to visually compare plan vs capacity by resource.
src/
βββ App.svelte # Main application component
βββ MarkerManager.svelte # Marker CRUD interface
βββ SimpleCustomTaskForm.svelte # Task editing form
βββ Links.svelte # Link/dependency management
βββ MyTooltipContent.svelte # Custom tooltip display
βββ urlCell.svelte # URL link cell renderer
βββ gantt-styles.css # Custom Gantt styling
βββ main.js # Application entry point
{
id: 1, // Unique identifier
text: "Task Name", // Display name
start: Date, // Start date
duration: 5, // Duration in days
optimistic: 5, // Optimistic duration in days
pessimistic: 10, // Pessimistic duration in days
progress: 60, // Completion percentage (0-100)
type: "task", // task, summary, milestone, etc.
parent: null, // Parent task ID for hierarchy
resources: "R001, R002", // Assigned resources
details: "Description", // Task description
url: "https://...", // External link
comments: [...] // Comment array
}
{
id: 1, // Unique identifier
source: 2, // Source task ID
target: 3, // Target task ID
type: "e2s" // end-to-start, start-to-start, etc.
}
{
id: 1, // Unique identifier
start: Date, // Marker date
text: "Milestone Name", // Display text
css: "myMarkerClass" // Optional CSS class for styling
}
src/gantt-styles.css
for visual customizationzoomConfig
taskTypes
arraystandardDateConfig
users
array for commentstimelineStart
/timelineEnd
in the project metadata and restores them on load. If your file lacks these, the app will auto-derive a window from task dates. You can also manually adjust "Timeline Start" and "Timeline End" in the top bar to bring tasks into view.git checkout -b feature/amazing-feature
)git commit -m 'Add amazing feature'
)git push origin feature/amazing-feature
)This project is licensed under the GNU General Public License v3.0 License - see the LICENSE file for details.
Built with β€οΈ using Svelte and SVAR components