DEV Community

cuculhart
cuculhart

Posted on

Most "WBS tools" are secretly Gantt editors — I built a board for real Work Breakdown Structures

I built Plesfeda — a board for building real Work Breakdown
Structures. Breakdown first, schedule later. MIT-licensed, fully
local, runs in your browser with no install.

Repo: https://github.com/cuculhart/plesfeda
Live demo: https://cuculhart.github.io/plesfeda/

A Plesfeda board — a WBS tree with dependency edges and the critical path

The idea

Most things called "WBS tools" are actually Gantt chart editors. You
arrange rows and draw dates — useful, but it never builds the thing a
WBS actually is: work, broken down, into a structure.

Serious PM tools didn't help either. MS Project, OpenProj, LibrePlan —
they let you move rows, but never let you pick up a whole block of work
and hang it somewhere else in the structure. Their calendars don't even
ship with Japanese holidays, so estimates always ended up back in Excel.

Plesfeda is not a project management tool. It's a tool for calmly
judging whether a volume of work fits inside a deadline. The
protagonists are breakdown and hierarchy — dependencies,
scheduling, and the Gantt chart are all derived output, never the
input surface.

Breakdown input

The core feature is an input flow that mirrors the act of decomposing:

  1. Place a [task] on the board and choose breakdown.
  2. Two dotted slots appear — the first is an active input with a cursor, the second is a ghost previewing the next entry.
  3. Every Enter promotes the ghost to active and sprouts a new ghost, so children stack up at the tempo of your thinking.
  4. Walk away mid-entry and the active slot falls back to a ghost parked at the parent's tail — click it to resume.

Ghosts never persist into data until confirmed.

The structure is free

  • Reparent whole subtrees — drop a node onto another node and the entire branch moves. Drop on empty space to make it a root. Cycles are always rejected.
  • It's a forest — multiple roots are first-class. Add a parent later and adopt existing roots as children: bottom-up structuring.
  • Derived WBS numbers — every node shows 1.2.3-style numbering computed from position. Reparenting renumbers automatically; nothing is stored.
  • Deleting a parent is a choice — promote its children to roots, or delete the whole subtree.
  • Effort rollup — leaves take a hand-entered effort; parents show the recursive subtree total (Σ), so a root shows the cost of the whole structure. Units: days or hours.

Structure becomes schedule

Tasks can declare predecessors (finish-to-start). One simple rule —
leaf earliest start = max(parent start, predecessor finishes) — drives
a PERT/CPM forward pass that returns the structure's earliest finish.
The toolbar always shows the project's earliest completion, and the
critical path is highlighted on nodes and dependency edges.

Dependency cycles and ancestor/descendant dependencies are flagged as
errors, and Gantt output stays locked until they're resolved — so a
broken structure can't produce a plausible-looking schedule.

The Gantt output — holiday-aware calendar and critical path

The Gantt is a read-only report rendered from the tree: baseline date,
weekend/holiday exclusion (click a day header to toggle a holiday),
milestones (zero-effort leaves render as ◆), and print-friendly
two-dimensional pagination with repeated headers and page numbers —
real report output.

Why the Gantt is read-only

Typical Gantt tools let you grab a bar and drag the date. That's
manual tail-end fitting — the structure loses the reason for the date.
In Plesfeda you fix the structure and look at the schedule, not
the other way around. Read-only Gantt is a deliberate design choice.

Fully local, by design

Data lives in the browser's localStorage and JSON files only
({app:'plesfeda', version:1} export/import). No account, no cloud,
nothing is sent anywhere.

Tech stack

  • React 19 + TypeScript + Vite
  • Canvas on @xyflow/react (React Flow, MIT)
  • English-first i18n — Japanese is a translation table keyed by the English source; untranslated strings fall back to English

Why the name

Plesfeda = Welsh pleth ("weave / braid") + Old Irish feda
("woods" — also the name of the letters of Ogham, the lost Celtic
script whose characters are named after trees). A structure woven
from trees.

Honest limitations

Single-player and local-only — deliberately. Editing is mouse-first,
so phones can look but won't enjoy it. The Gantt report caps at 400
days of horizon. v0.1.0.

License

MIT. Feedback and issues welcome:
https://github.com/cuculhart/plesfeda/issues

Top comments (0)