Closed general

Per-plan working calendar: let a plan work some federal holidays (Adom works Columbus Day and Veterans Day)

Drew Owens · ·closed by Drew Owens

Problem

adom-gantt treats all eleven observed US federal holidays (5 U.S.C. 6103) as non-working days, hardcoded in fedHolidays(). Adom works Columbus Day and Veterans Day. So on an Adom plan, Auto-schedule pushes work off Oct 12 and Nov 11, Critical under-weights any task that spans them, and Analytics under-counts hours by 8 per holiday per task. Every organization's calendar differs, so this needs to be per plan, not a new hardcoded list.

Proposal

An optional project.calendar block in the data file, read by the same working-day helper that Auto-schedule, Critical and Analytics already share:

"calendar": {
  "workHolidays": ["Columbus Day", "Veterans Day"],
  "extraDaysOff": ["2026-11-27", "2026-12-24"]
}
  • workHolidays: names from the built-in list that this plan treats as working days.
  • extraDaysOff: dates that are not working days even though they are weekdays (company shutdowns).
  • Absent means today's behaviour, so nothing changes for existing plans.
  • The holiday band on the day grain should follow the same calendar, so a worked holiday is not drawn as a day off.

Found on drew2/instapcb-launch (launch Jan 11, 2027), where the difference is 70 vs 68 working days.

2 Replies

Drew Owens ·

Correction to the numbers in the description: counted from Tue 2026-09-29, the difference is 71 working days (Adom calendar) vs 69 (all federal holidays off), not 70 vs 68.

Drew Owens ·

Fixed in 0.76.0, built as proposed.

  • Setup has a Working calendar card under Project dates. It lists the eleven federal holidays as checkboxes, all ticked as days off by default; untick the ones the team works (Columbus Day and Veterans Day for Adom). Below them is a list of extra days off: pick a date, then Add day off.
  • It is stored as project.calendar, { "workHolidays": [...], "extraDaysOff": ["YYYY-MM-DD"] }. It can live in the data file or in the sidecar, and the sidecar's copy wins, as it does for the project dates. Unknown holiday names and malformed dates are dropped. A plan with no calendar keeps today's behaviour.
  • The same working-day helper that Auto-schedule, Critical and Analytics share now reads it. So do the header's workday counts and the day grain's shading: a worked holiday is not shaded, and an extra day off is shaded and named on hover.
  • Only the owner can change it. The page disables the card for everyone else, and the server keeps the owner's calendar whatever another save carries. Every change is one Ctrl+Z and one changelog line (plan.calendar), for example "works Columbus Day; added 27-Nov-2026 as a day off".

Tests: a new UI flow (19 checks, including Auto-schedule landing a two-day task on Columbus Day when the plan works it, undo and redo, reload, export, and the team view being read-only) and new server checks (owner-only, junk dropped, exported, changelog wording).

Drew Owens closed this ·

Log in to reply.