No server. No internet. No drama. Just you, your machine, and this week's shifts.
Building shift schedules in Excel works — until you have to eyeball it for overlapping shifts. ScheduleWork is built for drag — drop — export, while the app handles conflict detection and Morning/Afternoon/Evening stats for you.
No account. No login. No lost data from a dropped connection — because there's no connection to drop.
| 🖱️ Drag & drop | Assign a shift with one drag into an Employee × Day cell |
| 👥 Group management | Meat / Soup / Salad by default — or rename to whatever fits your team |
| Overlapping shift? Red border + warning, instantly | |
| 🕒 Split shifts | 09:00–12:00, break, back for 17:00–21:00 — no problem |
| 📊 S / T / Đ stats | Auto-counts Morning / Afternoon / Evening shifts per day, editable by hand |
| 🖼️ Crisp exports | High-resolution JPG (up to 3× scale), sharp like a real spreadsheet |
| 💾 100% offline | Your data stays on your machine, full stop |
Tauri × React × TypeScript × Vite × Tailwind × Rust
Light, fast, and doesn't eat RAM the way Electron does.
1️⃣ Install Xcode Command Line Tools
xcode-select --installSkip if already installed.
2️⃣ Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"3️⃣ Install dependencies
cd ~/lich-ca
npm install4️⃣ Run it
npm run tauri dev🎉 That's it — the app should launch.
1️⃣ Install prerequisites
Tauri on Windows needs the Microsoft C++ Build Tools and WebView2 (WebView2 already ships with most Windows 10/11 machines, but installing manually never hurts):
- Microsoft Visual Studio C++ Build Tools — during install, check "Desktop development with C++"
- WebView2 Runtime
2️⃣ Install Rust
Download and run rustup-init.exe from rustup.rs, or via winget:
winget install --id Rustlang.RustupRestart your terminal afterward so cargo shows up on PATH.
3️⃣ Install Node.js
winget install OpenJS.NodeJS.LTS4️⃣ Install dependencies
cd ~\lich-ca
npm install5️⃣ Run it
npm run tauri dev🎉 Same command as macOS — Tauri handles the platform differences under the hood.
cd ~/lich-ca
npm run tauri buildOutput lands in src-tauri/target/release/bundle/:
| Platform | Output |
|---|---|
| 🍏 Apple Silicon | .app in macos/, .dmg in dmg/Lich ca_0.1.0_aarch64.dmg |
| 💻 Intel Mac | same as above, x64 instead of aarch64 |
| 🪟 Windows | .msi installer in bundle/msi/, and/or .exe in bundle/nsis/ |
macOS: open the .dmg, drag ScheduleWork into Applications.
Windows: run the .msi or .exe installer and follow the prompts.
Option 1 — Drag & drop
Drag a shift type from the right-side panel, drop it into an Employee × Day cell.
Option 2 — Select & click
Select a shift type → click the target schedule cell.
Press Esc or click Deselect to exit assignment mode.
- 🔍 Search employees by name
- 🧩 Filter the schedule by group
- ✏️ Click a group or employee name directly to rename it
- 🗑️ Hover to reveal a × button and delete a group or employee
Default work areas: Meat · Soup · Salad — each with its own icon and centered heading, so long schedules stay easy to scan.
Click a shift type to edit it in place:
- Shift name
- Start / end time
- Display color
Hover over a shift type to reveal a × button and delete it.
⚠️ Changing a shift's hours re-checks every schedule currently using that shift type. If it creates a conflict, the change won't be saved.
ScheduleWork automatically flags overlapping shifts for the same employee on the same day:
- 🔴 Red border around the affected shift
⚠️ Warning icon- 🕒 The conflicting time range shown clearly
Drag a shift somewhere invalid, and it snaps back to its original spot — nothing breaks.
Back-to-back shifts — fine:
10:00 – 14:00 → 14:00 – 18:00 ✅ valid
Split shifts:
09:00 – 12:00 (working)
12:00 – 17:00 (gap — free for another shift)
17:00 – 21:00 (working)
The two working periods of a split shift cannot overlap each other.
Not supported yet: overnight shifts like 22:00 – 06:00. End time must always be later than start time.
| Label | Time range |
|---|---|
| S | Morning — before 14:00 |
| T | Afternoon — 14:00 to 17:00 |
| Đ | Evening — from 17:00 |
A shift spanning multiple periods is counted toward whichever period holds the largest share of its working time. Values can be edited by hand — clear a manual entry and it snaps back to the calculated value.
Click Export Schedule to save the full week as a high-resolution JPG, including:
📌 Schedule title · 📅 Week date range · 👥 Employee list · 🎨 Assigned shifts · 📊 Staffing stats
🔍 Search/group filters only affect the visible UI — the exported image always includes the full week.
If the current schedule has overlapping shifts or invalid hours, ScheduleWork shows exactly which employee, date, and time range conflict, and blocks export until it's fixed.
Clear Current Week removes only the shifts for the week you're viewing (with a confirmation prompt first). Untouched: other weeks' schedules, employees, groups, shift types, and app settings.
~/Library/Application Support/com.lichca.scheduler/data.json
(Windows equivalent: %APPDATA%\com.lichca.scheduler\data.json)
No server, no cloud, no one reads it but you.
npm testCovers: conflict detection · back-to-back shifts · split shifts · working-hour validation.
ScheduleWork/
├── src/ # React frontend
├── src-tauri/ # Tauri / Rust backend
├── tests/ # Scheduling logic tests
├── public/ # Static assets
├── package.json
├── vite.config.ts
├── tailwind.config.js
└── README.md
No sign-in · no account · no server · no internet connection required · your data stays on your device.
Built for restaurants, retail stores, and small teams who need a simple, efficient way to manage weekly shift schedules.