You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A full-stack platform that lets you draw geofences on a map, attach campaigns to them, and automatically deliver real-time contextual notifications to Android users the moment they enter a zone.
PORT=4000NODE_ENV=developmentBETTER_AUTH_SECRET=<32+ char random string>BETTER_AUTH_URL=http://localhost:4000JWT_SECRET=<32+ char random string>JWT_EXPIRES_IN=24hTRUSTED_ORIGINS=http://localhost:3000DATABASE_URL=postgresql://user:password@localhost:5432/geocontextREDIS_URL=redis://localhost:6379# Firebase — optional, runs in mock mode without these# Get from: Firebase Console → Project Settings → Service Accounts → Generate new private keyFIREBASE_PROJECT_ID=peoplecontextosFIREBASE_CLIENT_EMAIL=firebase-adminsdk-xxxxx@peoplecontextos.iam.gserviceaccount.comFIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"RATE_LIMIT_MAX=1000RATE_LIMIT_WINDOW_MS=60000
dashboard/.env.local
NEXT_PUBLIC_BACKEND_URL=http://localhost:4000
App/local.properties
sdk.dir=/path/to/Android/Sdk
backend.url=http://10.0.2.2:4000
sdk.apiKey=pcos_<key from dashboard>
Architecture
Fence-Match Pipeline
Android SDK
└─ POST /location/event { device_id, lat, lng }
│
▼
PostGIS ST_DWithin query
│ matched fences
▼
For each fence:
├─ Fetch active campaign
├─ Dedup check (Redis 30 min TTL)
├─ Log to event_logs
├─ Send FCM push via Firebase Admin SDK
└─ Publish to Redis "geo:events" channel
│
▼
SSE stream → Dashboard /events/stream
RBAC
Role
Access
admin
Full dashboard access: map, geofences, campaigns, users, API keys