Northstar should use a serverless AWS backend with a privacy-first boundary:
Expo app
-> Amazon Cognito (sign-in, MFA and account recovery)
-> API Gateway HTTP API + Cognito JWT authorizer
-> Lambda service layer
-> DynamoDB (profiles, achievements, meeting preferences, direct-message metadata)
-> EventBridge Scheduler + Lambda (meeting reminder fan-out)
-> Amazon Pinpoint / SNS or Expo Push service (push delivery)
-> S3 private bucket (approved resource metadata only, no public health/member data)
-> CloudWatch / CloudTrail / AWS WAF monitoring and audit
| Data | Store | Notes |
|---|---|---|
| Account ID, pseudonym, settings | DynamoDB Profiles |
Key by Cognito sub; do not require a real name. |
| Meeting catalog | DynamoDB Meetings |
Curated/imported server-side; clients must not scrape third-party sources. |
| Saved meetings and reminders | DynamoDB MemberMeetings |
Partition by memberId; TTL temporary reminder records. |
| Direct messages | DynamoDB Messages |
Encrypt at rest; owner-only access checks in Lambda; add reporting/blocking before launch. |
| Learning completion | DynamoDB Progress |
Store module IDs and timestamps, not sensitive journal content. |
sub server-side and never trust a member ID passed in a request body.All /v1/me/*, /v1/messages/*, and /v1/progress/* routes require a Cognito JWT.
GET /v1/meetings?format=remote&query=
POST /v1/me/meetings/{meetingId}
GET /v1/me/reminders
PUT /v1/me/preferences
GET /v1/messages/threads
POST /v1/messages/threads/{threadId}/messages
POST /v1/moderation/reports
POST /v1/push-tokens
Return only data belonging to the JWT subject. Validate every request with JSON schema in Lambda; do not log message bodies or authorization headers.
.env.example to .env locally; store production values in EAS environment variables or CI secrets.Never ship IAM access keys, AWS secret access keys, Cognito client secrets, database credentials, or a privileged API key in an Expo build. EXPO_PUBLIC_* values are configuration identifiers, not secrets.