v0.12.0 codes for FCM and rebranded jama to RosterChirp
This commit is contained in:
60
CLAUDE.md
60
CLAUDE.md
@@ -1,10 +1,10 @@
|
||||
# JAMA — Claude Code Development Context
|
||||
# RosterChirp — Claude Code Development Context
|
||||
|
||||
## What is JAMA?
|
||||
## What is RosterChirp?
|
||||
|
||||
**jama** (just another messaging app) is a self-hosted, closed-source, full-stack Progressive Web App for team messaging. It supports both single-tenant (selfhost) and multi-tenant (host) deployments.
|
||||
**RosterChirp** is a self-hosted, closed-source, full-stack Progressive Web App for team messaging. It supports both single-tenant (selfhost) and multi-tenant (host) deployments.
|
||||
|
||||
**Current version:** 0.11.25
|
||||
**Current version:** 0.11.26
|
||||
|
||||
---
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
## Repository Layout
|
||||
|
||||
```
|
||||
jama/
|
||||
rosterchirp/
|
||||
├── CLAUDE.md ← this file
|
||||
├── KNOWN_LIMITATIONS.md
|
||||
├── Dockerfile
|
||||
@@ -51,7 +51,7 @@ jama/
|
||||
│ │ ├── users.js
|
||||
│ │ ├── settings.js
|
||||
│ │ ├── push.js
|
||||
│ │ ├── host.js ← JAMA-HOST control plane only
|
||||
│ │ ├── host.js ← RosterChirp-Host control plane only
|
||||
│ │ ├── about.js
|
||||
│ │ └── help.js
|
||||
│ └── utils/
|
||||
@@ -106,7 +106,7 @@ jama/
|
||||
|
||||
## Version Bump — Files to Update
|
||||
|
||||
When bumping the version (e.g. 0.11.25 → 0.11.26), update **all three**:
|
||||
When bumping the version (e.g. 0.11.26 → 0.11.27), update **all three**:
|
||||
|
||||
```
|
||||
backend/package.json "version": "X.Y.Z"
|
||||
@@ -116,7 +116,7 @@ build.sh VERSION="${1:-X.Y.Z}"
|
||||
|
||||
One-liner:
|
||||
```bash
|
||||
OLD=0.11.25; NEW=0.11.26
|
||||
OLD=0.11.26; NEW=0.11.27
|
||||
sed -i "s/\"version\": \"$OLD\"/\"version\": \"$NEW\"/" backend/package.json frontend/package.json
|
||||
sed -i "s/VERSION=\"\${1:-$OLD}\"/VERSION=\"\${1:-$NEW}\"/" build.sh
|
||||
```
|
||||
@@ -127,14 +127,14 @@ The `.env.example` has no version field. There is no fourth location.
|
||||
|
||||
## Output ZIP
|
||||
|
||||
When packaging for delivery: `jama.zip` at `/mnt/user-data/outputs/jama.zip`
|
||||
When packaging for delivery: `rosterchirp.zip` at `/mnt/user-data/outputs/rosterchirp.zip`
|
||||
|
||||
Always exclude:
|
||||
```bash
|
||||
zip -qr jama.zip jama \
|
||||
--exclude "jama/README.md" \
|
||||
--exclude "jama/data/help.md" \
|
||||
--exclude "jama/backend/src/data/help.md"
|
||||
zip -qr rosterchirp.zip rosterchirp \
|
||||
--exclude "rosterchirp/README.md" \
|
||||
--exclude "rosterchirp/data/help.md" \
|
||||
--exclude "rosterchirp/backend/src/data/help.md"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -146,7 +146,7 @@ zip -qr jama.zip jama \
|
||||
| `selfhost` | Single tenant — one schema `public`. Default if APP_TYPE unset. |
|
||||
| `host` | Multi-tenant — one schema per tenant. Requires `HOST_DOMAIN` and `HOST_ADMIN_KEY`. |
|
||||
|
||||
JAMA-HOST tenants are provisioned at `{slug}.{HOST_DOMAIN}`. The host control panel lives at `https://{HOST_DOMAIN}/host`.
|
||||
RosterChirp-Host tenants are provisioned at `{slug}.{HOST_DOMAIN}`. The host control panel lives at `https://{HOST_DOMAIN}/host`.
|
||||
|
||||
---
|
||||
|
||||
@@ -156,7 +156,7 @@ JAMA-HOST tenants are provisioned at `{slug}.{HOST_DOMAIN}`. The host control pa
|
||||
- **Schema resolution:** `tenantMiddleware` sets `req.schema` from the HTTP `Host` header before any route runs. `assertSafeSchema()` validates all schema names against `[a-z_][a-z0-9_]*`.
|
||||
- **Migrations:** Auto-run on startup via `runMigrations(schema)`. Files in `migrations/` applied in order, tracked in `schema_migrations` table per schema. **Never edit an applied migration — add a new numbered file.**
|
||||
- **Seeding:** `seedSettings → seedEventTypes → seedAdmin → seedUserGroups` on startup. All use `ON CONFLICT DO NOTHING`.
|
||||
- **Current migrations:** 001 (initial schema) → 002 (triggers/indexes) → 003 (tenants) → 004 (host plan) → 005 (U2U restrictions) → 006 (scrub deleted users)
|
||||
- **Current migrations:** 001 (initial schema) → 002 (triggers/indexes) → 003 (tenants) → 004 (host plan) → 005 (U2U restrictions) → 006 (scrub deleted users) → 007 (FCM push) → 008 (rebrand)
|
||||
|
||||
---
|
||||
|
||||
@@ -203,9 +203,9 @@ Stored in `settings` table per schema:
|
||||
| `feature_branding` | `'true'`/`'false'` | Brand+ |
|
||||
| `feature_group_manager` | `'true'`/`'false'` | Team |
|
||||
| `feature_schedule_manager` | `'true'`/`'false'` | Team |
|
||||
| `app_type` | `'JAMA-Chat'`/`'JAMA-Brand'`/`'JAMA-Team'` | — |
|
||||
| `app_type` | `'RosterChirp-Chat'`/`'RosterChirp-Brand'`/`'RosterChirp-Team'` | — |
|
||||
|
||||
JAMA-HOST always forces `JAMA-Team` on the public schema at startup.
|
||||
RosterChirp-Host always forces `RosterChirp-Team` on the public schema at startup.
|
||||
|
||||
---
|
||||
|
||||
@@ -303,13 +303,7 @@ Single-user add/remove via `groups.js` (GroupInfoModal) always uses the named me
|
||||
## Outstanding / Deferred Work
|
||||
|
||||
### Android Background Push (KNOWN_LIMITATIONS.md)
|
||||
**Status:** Deferred. Web Push with VAPID doesn't survive Android Doze mode.
|
||||
**Fix plan:** Integrate Firebase Cloud Messaging (FCM).
|
||||
1. Create Firebase project (free tier)
|
||||
2. Add Firebase config to `.env` and `sw.js`
|
||||
3. Replace `web-push` subscription flow with Firebase SDK
|
||||
4. Switch backend dispatch from `web-push` to `firebase-admin`
|
||||
5. WebSocket reconnect-on-focus (frontend only, no Firebase needed)
|
||||
**Status:** Implemented (v0.11.26+). Replaced web-push/VAPID with Firebase Cloud Messaging (FCM). Requires Firebase project setup — see .env.example for required env vars and sw.js for the SW config block.
|
||||
|
||||
### WebSocket Reconnect on Focus
|
||||
**Status:** Deferred. Socket drops when Android PWA is backgrounded.
|
||||
@@ -326,19 +320,25 @@ HOST_DOMAIN= # host mode only
|
||||
HOST_ADMIN_KEY= # host mode only
|
||||
JWT_SECRET=
|
||||
DB_HOST=db
|
||||
DB_NAME=jama
|
||||
DB_USER=jama
|
||||
DB_NAME=rosterchirp
|
||||
DB_USER=rosterchirp
|
||||
DB_PASSWORD= # avoid ! (shell interpolation issue with docker-compose)
|
||||
ADMIN_EMAIL=
|
||||
ADMIN_NAME=
|
||||
ADMIN_PASS=
|
||||
ADMPW_RESET=true|false
|
||||
APP_NAME=jama
|
||||
APP_NAME=rosterchirp
|
||||
USER_PASS= # default password for bulk-created users
|
||||
DEFCHAT_NAME=General Chat
|
||||
JAMA_VERSION= # injected by build.sh into Docker image
|
||||
ROSTERCHIRP_VERSION= # injected by build.sh into Docker image
|
||||
VAPID_PUBLIC= # auto-generated on first start if not set
|
||||
VAPID_PRIVATE= # auto-generated on first start if not set
|
||||
FIREBASE_API_KEY= # FCM web app config
|
||||
FIREBASE_PROJECT_ID= # FCM web app config
|
||||
FIREBASE_MESSAGING_SENDER_ID= # FCM web app config
|
||||
FIREBASE_APP_ID= # FCM web app config
|
||||
FIREBASE_VAPID_KEY= # FCM Web Push certificate public key
|
||||
FIREBASE_SERVICE_ACCOUNT= # FCM service account JSON (stringified, backend only)
|
||||
```
|
||||
|
||||
---
|
||||
@@ -347,7 +347,7 @@ VAPID_PRIVATE= # auto-generated on first start if not set
|
||||
|
||||
```bash
|
||||
# Production: Ubuntu 22.04, Docker Compose v2
|
||||
# Directory: /home/rick/jama/
|
||||
# Directory: /home/rick/rosterchirp/
|
||||
|
||||
./build.sh # builds Docker image
|
||||
docker compose up -d # starts all services
|
||||
@@ -359,4 +359,4 @@ Build sequence: `build.sh` → Docker build → `npm run build` (Vite) → `dock
|
||||
|
||||
## Session History
|
||||
|
||||
Previous development was conducted via Claude.ai web interface (sessions summarised in this document). Development continues in Claude Code from v0.11.25.
|
||||
Development continues in Claude Code from v0.11.26 (rebranded from jama to RosterChirp).
|
||||
|
||||
Reference in New Issue
Block a user