╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗ ╔═══╗
║ D ║ ║ E ║ ║ P ║ ║ A ║ ║ R ║ ║ T ║ ║ U ║ ║ R ║ ║ E ║ ║ S ║
╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝ ╚═══╝
A project manager that looks and feels like a train station split-flap departure board.
One command. Browser opens. Your projects flip in like arrivals at Penn Station. You glance up and know where everything stands.
Imagine the departure board at a train station — the one with physical letters that flip into place. Now imagine each row is one of your projects. The board tells you what's active, what's next, what shipped. It has opinions about what you should work on. It notices when you've been going too long.
That's Departures.
It's a project manager built for creative directors, artists, and anyone juggling too many projects at once — especially if you have ADHD and traditional project managers feel like staring at a spreadsheet.
graph LR
A["You open Departures"] --> B["Board loads in browser"]
B --> C["Projects flip in"]
C --> D{"What view?"}
D -->|TODAY| E["Your day as a timeline\nProjects + Events + Emails"]
D -->|ALL| F["Every active project\nSorted by priority track"]
D -->|Status filter| G["Just ACTIVE, BLOCKED,\nQUEUED, etc."]
It is not a Jira replacement. It is not a Notion database. It is a war room for one person (or a small team) who needs to see the whole battlefield at a glance.
You need two things installed: Python (the programming language) and Node.js (for building the interface). If you're on Windows, Mac, or Linux, here's the full walkthrough.
| Tool | Version | How to check | How to install |
|---|---|---|---|
| Python | 3.11 or newer | python --version |
python.org/downloads |
| Node.js | 18 or newer | node --version |
nodejs.org |
| Git | any | git --version |
git-scm.com |
Open a terminal (PowerShell on Windows, Terminal on Mac) and run these commands one at a time:
# 1. Download the project
git clone https://github.com/JosephOIbrahim/Slit-Flap.git
cd Slit-Flap
# 2. Install the Python backend
pip install -e .
# 3. Build the frontend (one time only)
cd frontend
npm install
npm run build
cd ..
# 4. Copy the built frontend into the app
# On Mac/Linux:
cp -r frontend/dist departures/frontend/
# On Windows (PowerShell):
Copy-Item -Recurse frontend\dist departures\frontend\
# 5. Launch
departuresYour browser opens. The board loads. You're working.
From now on, you only need one command:
departuresflowchart TB
subgraph CLI["Terminal"]
A["departures command"]
end
subgraph Server["Python Server (FastAPI)"]
B["REST API"]
C["Static File Server"]
end
subgraph Data["Storage"]
D[("SQLite Database\n~/.departures/departures.db")]
end
subgraph Browser["Your Browser"]
E["React Frontend\nSplit-Flap Board"]
end
subgraph External["External APIs (optional)"]
F["Zip → City Lookup"]
G["Weather Data"]
end
A -->|starts| B
A -->|starts| C
B <-->|read/write| D
C -->|serves| E
E <-->|fetch API| B
E -->|zip code| F
F -->|lat/lon| G
Everything runs on your machine. No cloud. No accounts. No subscriptions. Your data lives in a single file at ~/.departures/departures.db.
Every project is a split-flap card — physical character modules with a horizontal split line through the letterforms, just like a real Solari departure board. Names flip into place with a mechanical animation when things change.
graph TD
subgraph Card["Project Card (Front)"]
A["Track · Domain · Last Touched"]
B["████████████████████\n SPLIT-FLAP NAME \n████████████████████"]
C["Next action · Mile 3/8 ━━━━"]
end
style B fill:#171717,stroke:#2a2a2a,color:#c8c4bc
Your day as a departure board. Projects with time blocked, calendar events, and emails — all sorted chronologically with a NOW line showing where you are in the day.
gantt
title TODAY Timeline
dateFormat HH:mm
axisFormat %H:%M
section Events
Morning standup :ev1, 09:00, 30m
Client review call :ev2, 11:30, 30m
Design critique session :ev3, 15:00, 30m
section Projects
Brand Refresh (ACTIVE) :active, 10:00, 60m
This App (ACTIVE) :active, 11:00, 60m
Product Launch (ACTIVE) :crit, 14:00, 60m
AR Prototype (ACTIVE) :active, 16:00, 60m
The board picks your most urgent project based on:
graph LR
A["Has time blocked today?"] -->|+100| S["Score"]
B["Status: ACTIVE?"] -->|+50| S
C["Track 01 (highest priority)?"] -->|+30| S
D["Days since last touched?"] -->|+3/day| S
S --> N["Highest score =\namber border"]
You can override it. But it has an opinion so you don't have to decide.
| Control | What it does | Where |
|---|---|---|
| S M L | Change split-flap character size (64 / 104 / 140px) | Filter bar, right side |
| ◁ · ▷ | Align project names left / center / right | Filter bar, right side |
| ▲ ▼ | Move a project up/down in priority | Bottom-right buttons (select a project first) |
| ZIP | Enter zip code for local weather in header | Top-right |
A small dot in the header. It doesn't nag. It's just there.
| Color | Meaning |
|---|---|
| Green | Under 2 hours. You're fresh. |
| Amber | 2-4 hours. Might want a break. |
| Red | 4+ hours. Walk away. Touch grass. |
Tap the REC button. See what you touched today, what shipped, how long you worked. Evidence of progress for the days when it doesn't feel like you did anything.
You can invite people to view your board in read-only mode. They see everything. They can't change anything.
sequenceDiagram
participant Owner as You (Owner)
participant Server as Departures Server
participant Viewer as Viewer (e.g. Jaime)
Owner->>Server: departures --host 0.0.0.0
Note over Server: Server binds to all interfaces
Owner->>Server: Click SHR → Enter email → INVITE
Server-->>Owner: Generates invite link
Owner->>Viewer: Sends link (text, email, etc.)
Viewer->>Server: Clicks invite link
Server-->>Viewer: Sets auth cookie, redirects to board
Viewer->>Server: Views board (read-only)
Server-->>Viewer: All data visible, no edit allowed
Note over Viewer: Sees "VIEWING · READ ONLY" banner
# 1. Start with network access enabled
departures --host 0.0.0.0
# Terminal will show your LAN IP:
# → Share: http://192.168.1.100:4040- In the browser, click the SHR button (bottom-right)
- Enter the viewer's email → click INVITE
- Click COPY LINK next to their name
- Send the link to them
They need to be on the same Wi-Fi network. The link sets a cookie that lasts 30 days.
Windows Firewall: You may need to allow Python through the firewall when prompted. Or run:
netsh advfirewall firewall add rule name="Departures" dir=in action=allow protocol=TCP localport=4040
| Command | What it does |
|---|---|
departures |
Start the board (opens browser on localhost:4040) |
departures --port 9000 |
Use a custom port |
departures --host 0.0.0.0 |
Enable network access for sharing |
departures --no-browser |
Start without opening browser |
departures seed |
Reset database to the 16 default projects |
departures recap |
Print today's recap in the terminal |
graph TB
subgraph Frontend["Frontend (React + Vite)"]
direction TB
F1["App.jsx — Single-file React app"]
F2["Split-flap character renderer"]
F3["Solari design system\n6-grey palette · 4px radius · 9px min"]
end
subgraph Backend["Backend (Python)"]
direction TB
B1["server.py — FastAPI\n10 project endpoints\n6 event endpoints\n2 settings endpoints\n3 viewer endpoints\nAuth middleware"]
B2["db.py — SQLite via aiosqlite\n6 tables · camelCase mapping\nSeed data · Recap queries"]
B3["cli.py — Click CLI\nBanner · Browser launch\nSeed · Recap · Share"]
end
subgraph Storage["Persistence"]
S1[("~/.departures/\ndepartures.db")]
end
Frontend <-->|REST API| Backend
Backend <-->|aiosqlite| Storage
erDiagram
projects {
text id PK
text name
text status
text track
text domain
text next_action
text deadline
text bg_color
int mile
int mile_total
text today_time
text last_touched
text created_at
text updated_at
}
logs {
int id PK
text project_id FK
text text
text created_at
}
notes {
text project_id PK
text content
text updated_at
}
events {
text id PK
text time
text end_time
text name
text source
text linked_project
}
settings {
text key PK
text value
}
viewers {
text id PK
text email
text token
text created_at
text last_seen
}
projects ||--o{ logs : "has"
projects ||--o| notes : "has"
Design DNA: Studio-grade restraint. Solari di Udine split-flap boards. The 30th Street Station departure board in Philadelphia.
The interface follows seven principles from a design tightening pass:
- Every element earns its space — if removing it loses zero information, it's gone
- Typography has only two volumes — project names SHOUT (split-flap display font), everything else whispers (9px system font). No middle.
- One grid — all spacing snaps to 4 / 8 / 12 / 18 / 24 / 36 / 48px
- Color is information — amber means "this needs your attention." It appears in exactly 5 places.
- Motion is punctuation — the flip animation says "something changed." Nothing else moves.
- The empty state is a design — a board with zero projects still looks intentional
- The details you don't notice are the ones that matter — font smoothing, focus states, scrollbar styling, touch targets
Two fonts: Disket Mono for identity. JetBrains Mono for everything else.
One accent color: Amber #d4a012.
Six greys: #999 · #666 · #444 · #2a2a2a · #1a1a1a · #111. No ad-hoc values.
This was built by a creative director with 16 years in VFX who runs 16+ projects across AI, VFX, and web development. He has ADHD. Every existing project manager shows him a list and says "pick" — which is the worst possible UX for his brain.
Departures has opinions. It tells you what to work on next. It shows you where you left off. It notices when you've been going too long. It captures evidence of progress so the imposter voice has data to argue with.
If any of that sounds familiar, this might be for you.
| Layer | Technology | Why |
|---|---|---|
| Frontend | React 18 + Vite | Fast build, hot reload |
| Styling | Inline styles | Precision design, no framework overhead |
| Display font | Disket Mono | Geometric monospace — train station DNA |
| System font | JetBrains Mono | Clean, readable, monospace utility |
| Backend | FastAPI + uvicorn | Async, fast, minimal boilerplate |
| Database | SQLite (aiosqlite) | Zero config, file-based, portable |
| CLI | Click | Simple, clean command interface |
| Auth | Token-based middleware | Localhost = owner, invite links = viewers |
- Google Calendar integration (replace mock events with real calendar)
- Gmail integration (replace mock emails with real inbox)
- Flip notes (Y-axis card flip to reveal sticky notes on the back)
- USD composition layer for project state (git-trackable, composable)
- PWA support (install to home screen, offline access)
- Cloud deployment option (Railway / Fly.io)
MIT
USD-Composed Project State · Solari Protocol v0.4.0
Built with Claude Code
