A team project-management web app — projects with member roles, a drag-and-drop Kanban board, checklists, tags, comments, deadlines, notifications and a full activity history.
Live: https://apurvdas.github.io/project-manager/ — sign in with the shared guest account:
| 🔑 Field | Value |
|---|---|
guest@example.com |
|
| Password | TourTheBoard-2026 |
The guest belongs to a small team working on four projects — a coffee shop's online ordering, a fitness-app rebuild, a brand refresh, and a finished support portal.
👉 Things to try once you're in (click to expand)
| Where | Try this |
|---|---|
| Dashboard | See your open tasks, deadlines and project progress at a glance. |
| Board | Drag a card across Todo → In progress → Review → Completed. |
| A task | Tick checklist items (progress updates live), paste a list straight into the checklist, or leave a comment. |
| Overdue work | Flagged in red — "Order status notifications" is already past its deadline. |
| ☾ / ☀ switch | Flip dark / light mode from the top bar. The whole app works on phones, too. |
This account is shared, so please keep it friendly — the sample data is reset from time to time. Guests can't delete projects or manage members; those need a manager or owner role. You can also register your own account and run projects of your own.
| Feature | What it does | |
|---|---|---|
| 🗂️ | Projects & roles | Four-rung role ladder (owner → manager → member → viewer), enforced in the database. |
| ✅ | Tasks | Multiple assignees, priorities, due dates, comments, tags and checklists. |
| 🧲 | Kanban board | Drag-and-drop between columns; every move is re-validated server-side. |
| ☑️ | Checklists | Live progress, paste-a-list bulk add. |
| 🏷️ | Tags | Shared, colour-coded labels across a project's tasks. |
| 💬 | Comments | Discussion per task; authors and managers can tidy up. |
| ⏰ | Deadlines | Overdue work flagged in red on the dashboard and board. |
| 🔔 | Notifications | Assignments, status changes, comments, invites — you're never notified of your own action. |
| 📜 | Activity history | Every change recorded as a filterable, paginated project log. |
| 🌗 | Dark / light + mobile | Theme switch and a layout that works on phones. |
Permissions aren't just hidden buttons — they're enforced in the backend (Postgres row-level
security in the live version, App\Libraries\ProjectPolicy in the original CI4 build).
| Capability | 👁️ Viewer | 🧑💻 Member | 🛠️ Manager | 👑 Owner |
|---|---|---|---|---|
| View the project | ✅ | ✅ | ✅ | ✅ |
| Create / update tasks, comment, tick checklists | — | ✅ | ✅ | ✅ |
| Create tags | — | ✅ | ✅ | ✅ |
| Delete own task / comment | — | ✅ | ✅ | ✅ |
| Project settings | — | — | ✅ | ✅ |
| Add / remove members & viewers | — | — | ✅ | ✅ |
| Delete any task / comment / tag | — | — | ✅ | ✅ |
| Archive or delete the project | — | — | — | ✅ |
| Change any member's role | — | — | — | ✅ |
The fiddly bits the ladder doesn't show
- A manager can bring in members and viewers, but can't mint another manager or a second owner.
- Managers can't remove one another — only the owner can.
- The owner can never be removed or duplicated; ownership is transferred, not cloned.
- Non-members get a 404, not a "403" — the response never reveals which projects exist.
flowchart LR
U["🧑 Browser<br/>HTML · CSS · ES modules"]
P["📄 GitHub Pages<br/>static site, no build step"]
subgraph SUPA["🟢 Supabase — Postgres + Auth"]
RLS["🔒 Row-level security<br/>+ SQL functions"]
DB[("🗄️ Postgres")]
RLS --> DB
end
U -->|loads UI| P
U -->|REST + Auth| RLS
The browser is never trusted — every permission rule lives in the database.
The live version (project-manager/v2) is hosted free: a static front end on GitHub Pages and
Supabase for the database and auth. Every permission from the original ProjectPolicy is enforced
in Postgres with row-level security and SQL functions — the UI only hides controls.
The original version (project-manager) is the same app on a classic PHP stack.
| Layer | Live version (v2) | Original version |
|---|---|---|
| Front end | Plain HTML / CSS / ES modules, no build step | CodeIgniter 4 views, vanilla JS |
| Back end | Supabase (Postgres + Auth), RLS + SQL functions | PHP 8.3, CodeIgniter 4.7 |
| Auth | Supabase Auth | CodeIgniter Shield 1.4 |
| Database | Postgres | MySQL 8 |
| Hosting | GitHub Pages + Supabase (free tier) | Self-hosted PHP + MySQL |
| Tests | API permission tests + Playwright | 244 PHPUnit tests + Playwright |
flowchart LR
A["📥 Todo"] --> B["🔧 In progress"]
B --> C["👀 Review"]
C --> D["✅ Completed"]
C -.->|needs work| B
Both versions live together in one repo, each in its own folder:
| Path | What's there |
|---|---|
project-manager/v2 |
v2 — live version: static front end (web/) + Supabase (supabase/). Its README covers running, testing and deploying. |
project-manager |
v1 — original PHP / CodeIgniter 4 build. |
Branches are named by version type. The live site is deployed from v2-supabase.
| Branch | Version | Role |
|---|---|---|
v2-supabase |
v2 | Default branch. GitHub Pages deploys the live app from here. |
v1-codeigniter |
v1 | The PHP / CodeIgniter 4 version. |
desktop-app |
— | Windows desktop (Tauri) wrapper around v2. |
The same app in its own window — tray icon, Windows notifications, automatic updates and offline editing. It's a thin Tauri shell around the v2 front end.
- Download the latest
.exe— per-user install, no admin needed (SmartScreen: More info → Run anyway the first time; unsigned). - Current release:
desktop-v0.2.1(~2 MB). - Build, behaviour and release steps:
project-manager/v2/desktop-app.
Install from one command (Windows Command Prompt — downloads and runs the installer):
curl -L -o "%TEMP%\pm-setup.exe" https://github.com/ApurvDas/project-manager/releases/download/desktop-v0.2.1/Project.Manager_0.2.1_x64-setup.exe && "%TEMP%\pm-setup.exe"PowerShell — always the latest release
$u=(irm https://api.github.com/repos/ApurvDas/project-manager/releases/latest).assets|?{$_.name -like '*setup.exe'}|% browser_download_url; $o="$env:TEMP\pm-setup.exe"; iwr $u -OutFile $o; & $oLive version (Supabase + static site)
Needs Docker Desktop running and Node.
cd project-manager/v2
npm install
npx supabase start # local Postgres + Auth + API; applies migrations and seed.sql
npm run serve # http://localhost:8123Sign in as admin@example.test (or manager, developer, designer, tester), password
Password123!. Local emails (login links, password resets) land in Mailpit at
http://127.0.0.1:54324; Supabase Studio is at http://127.0.0.1:54323.
npx supabase db reset rebuilds the database from scratch.
npm test # permission rules, called through the API as each seeded role
npm run e2e # Playwright browser testsFull deploy steps are in the v2 README.
Original version (PHP / CodeIgniter 4)
Needs PHP 8.3, MySQL 8 and Composer (Node only for the e2e tests).
cd project-manager
composer install
cp env .env # then set the database section
php spark migrate
php spark db:seed DevelopmentSeeder
npm run serve # http://localhost:8123Seeded accounts all use Password123!; sign in with the email (admin@example.test, plus
manager, developer, designer, tester).
vendor/bin/phpunit tests # 244 unit and feature tests
npm run e2e # Playwright browser testsNo licence has been chosen yet. CodeIgniter, Shield and the other dependencies keep their own
licences; add a LICENSE file to set the terms for the application code.
🔗 Open the app: https://apurvdas.github.io/project-manager/ · Local dev: http://localhost:8123 · Mailpit: http://127.0.0.1:54324 · Supabase Studio: http://127.0.0.1:54323