DeadlineFlow is an offline-first JavaFX desktop app for visual project scheduling with a Gantt timeline, task dependencies, conflict/risk detection, and critical path analysis.
- Offline-only local app (no accounts, no network calls)
- Java 21 + JavaFX 21
- Multi-project management with project colors and priorities
- Gantt timeline with Day / Week / Month scale and zoom
- Drag task bars to move/resize dates (minimum duration 1 day)
- Task CRUD with progress (0-100), status, and dependency controls
- Finish-Start dependencies with cycle prevention
- Conflict detection + conflict section + tooltips
- Risk rules:
- Overdue => red accent
- Due in <48h => yellow accent
- Today dashboard:
- Due Today
- Due in 7 days
- Overdue
- Blocked by dependencies
- Critical Path Method (CPM):
- Earliest/latest timings and slack
- Critical task highlighting
- Project finish date
- Cycle detection disables CPM highlight
- SQLite persistence with schema migration + indexes
- Seed sample workspace on first launch (2 projects, 8 tasks)
- JUnit 5 tests for topology/cycle, conflict rule, CPM correctness
com.deadlineflow
├── app
│ ├── DeadlineFlowApp (JavaFX bootstrap)
│ └── AppContext (DI/wiring)
├── presentation
│ ├── view (MainView + dialogs)
│ ├── viewmodel (MainViewModel)
│ └── components (GanttChartView custom control)
├── application
│ └── services
│ ├── SchedulerEngine
│ ├── ConflictService
│ ├── RiskService
│ ├── DependencyGraphService
│ └── CriticalPathService
├── domain
│ ├── model (Project, Task, Dependency, enums, Conflict)
│ └── exceptions
└── data
├── repository (interfaces)
└── sqlite (SQLite DB, migration, seed, repositories, workspace store)
Layering:
- Presentation: JavaFX UI and view model state handling.
- Application: pure scheduling/business algorithms (no JavaFX dependency).
- Domain: immutable entities/value-like objects.
- Data: SQLite persistence and observable repository-backed state.
Prerequisites:
- Java 21+
Commands:
./gradlew runRun tests:
./gradlew testThe SQLite workspace is stored at:
~/.deadlineflow/workspace.db
Add screenshots here:
docs/screenshot-main.pngdocs/screenshot-critical-path.pngdocs/screenshot-conflicts.png