A password-protected shared task/calendar web app. People add activities to one central list, optionally attach dates, and everything shows up on a shared calendar. No user accounts — just a shared password and a display name.
- Frontend: React + Vite + Tailwind CSS + Framer Motion + react-big-calendar
- Backend: Azure Functions v4 (TypeScript)
- Database: SQLite (local via libsql) — swappable to PostgreSQL
- Auth: Shared password → JWT session cookie
- Node.js 20+
- Azure Functions Core Tools (
npm i -g azure-functions-core-tools@4)
Copy the example env file and customize:
cp .env.example api/local.settings.json # Already preconfigured for local devEdit api/local.settings.json and set:
| Variable | Description | Default |
|---|---|---|
APP_PASSWORD |
Shared password for app access | changeme |
SESSION_SECRET |
JWT signing secret | dev-session-secret-change-me |
DATABASE_URL |
SQLite file path | file:./dev.db |
CALENDAR_FEED_TOKEN |
Token for ICS feed URL | dev-calendar-token-change-me |
cd shared && npm install
cd ../api && npm install
cd ../web && npm installBackend (runs on port 7071):
cd api
func startFrontend (runs on port 5173, proxies /api to backend):
cd web
npm run devOpen http://localhost:5173 and enter the password you set in APP_PASSWORD.
The SQLite database auto-creates on first request. No migration step needed for local dev — the schema is created automatically.
For production PostgreSQL, update DATABASE_URL and swap the database service implementation.
The app generates an ICS subscription feed for external calendar apps.
Feed URL: http://localhost:7071/api/calendar.ics?token=YOUR_CALENDAR_FEED_TOKEN
- Open Calendar app
- File → New Calendar Subscription
- Paste the feed URL
- Click Subscribe
- Go to Google Calendar Settings
- "Other calendars" → + → "From URL"
- Paste the feed URL
- Click "Add calendar"
The feed includes all dated activities. Completed items show as [Done] Activity name.
├── api/ Azure Functions backend
│ ├── src/
│ │ ├── functions/ One handler per API route
│ │ ├── services/ Database service + config
│ │ ├── middleware/ Auth (JWT session)
│ │ └── errors/ Error types + response helper
│ └── drizzle/ Schema definition
├── web/ React frontend
│ └── src/
│ ├── components/ UI components
│ ├── pages/ Route pages
│ ├── hooks/ Data hooks
│ └── api/ Typed API client
└── shared/ Shared types & validation schemas
| Method | Path | Description |
|---|---|---|
| POST | /api/auth/login |
Validate shared password |
| POST | /api/auth/logout |
Clear session |
| GET | /api/activities |
List all activities |
| POST | /api/activities |
Create activity |
| PUT | /api/activities/:id |
Update activity |
| DELETE | /api/activities/:id |
Soft-delete activity |
| PATCH | /api/activities/:id/toggle |
Toggle completion |
| GET | /api/calendar.ics?token=... |
ICS subscription feed |
| GET | /api/health |
Health check |