Released

CareQuest

A local-first care-record PWA with opt-in AWS serverless sync

🧑‍🤝‍🧑 For caregivers
Next.jsTypeScriptAWS ServerlessAWS CDKPWA

CareQuest is a care-logging PWA for family caregivers. The product goal is simple — capture a care session in under 10 seconds with no typing and no sign-up — and the interesting part is the engineering that makes “no account required” a real default rather than a marketing line.

It’s live at veai.jp/carequest and open source.

Design constraint: local-first, cloud-optional

Every record is written to the browser’s localStorage first. Core features — logging, the weekly look-back, JSON/CSV export, deletion — all work with no network and no account. Cloud sync exists, but it is strictly opt-in: signing in via Amazon Cognito is what unlocks cross-device restore, and it is never on the critical path for using the app.

This constraint drives most of the architecture. The front end is a static export that runs entirely client-side; the serverless back end only ever sees data from users who have explicitly signed in.

Architecture

Browser (PWA / localStorage)

  ├─ Next.js 16 (static export, basePath: /carequest)
  │     └─ TypeScript 5 · React 19 · Tailwind CSS 4

  ├─ Service Worker  (offline support; git-SHA version injected at build)

  └─ AWS CloudFront ── S3

          └─ [opt-in, sign-in only]
               API Gateway ── Lambda ── DynamoDB
               Amazon Cognito (user pool auth)

The static site ships from S3 behind CloudFront. The service worker gives offline support and pins a build version by injecting the git SHA at build time, so a stale cache is diagnosable in the field. Signed-in traffic flows through API Gateway (Cognito authorizer) into a Lambda + DynamoDB path for sync.

Infrastructure as Code

The entire back end is provisioned with AWS CDK v2 (infra/) — nothing is clicked together in the console. A cdk synth produces:

  • Amazon Cognito user pool for authentication
  • DynamoDB table with point-in-time recovery enabled
  • API Gateway with a Cognito authorizer and throttling (10 rps, burst 20)
  • Lambda for the sync API
  • 2× CloudWatch alarms and an AWS Budget ($10/mo) — cost and health guardrails baked into the stack

Tech stack

LayerChoice
FrameworkNext.js 16 (static export)
LanguageTypeScript 5, React 19
StylingTailwind CSS 4
Auth / syncAmazon Cognito + aws-amplify v6
IaCAWS CDK v2
Unit testsVitest 4
E2E testsPlaywright
CIGitHub Actions

Notable details

  • Privacy by default. With no account, records never leave the device. The community “Candlelight” widget — a live count of how many caregivers logged today — is served from aggregated, anonymized data only; no individual record is ever exposed.
  • Data portability. Users can export everything as JSON/CSV, and account/cloud deletion is self-serve from within the app.
  • Tested and shipped. Vitest unit tests and Playwright E2E run in GitHub Actions; the same pipeline deploys the static export to S3/CloudFront.

FAQ

Does it work on a phone?

Yes. It runs in a mobile browser, and “Add to Home Screen” makes it open like an app (it is a PWA).

Does it work offline?

Yes. Logging and the weekly look-back work with no network.

Does it cost anything?

No. It is free, with no in-app purchases.

Do I need an account?

No. Every feature works without one. Signing in is optional and only adds cloud backup and cross-device restore.

Can anyone see my records?

No. Records stay in the browser on your device and are never published without your consent. The community “Candlelight” view shows aggregated, anonymized counts only — never an individual record.

What happens when I change phones?

Without an account, records live on that device only, so a new phone starts empty. Sign in to sync them to the cloud and restore on the new device — or export JSON/CSV before you switch.

Could I lose my records?

They persist in the browser unless you clear its data. If you want a copy, export JSON/CSV from the look-back screen, or sign in to back them up to the cloud.

How do I stop, or delete everything?

You can delete all records from the look-back screen at any time. If you signed in, deleting your account and its cloud records is also self-serve inside the app.

Curious about the code? The repository is public: github.com/larai-w/carequest.