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; care records are sent to the sync API only when the user is 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 count of how many caregivers synced records 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 account is needed for logging and looking back at your records. Cloud backup and cross-device restore require signing in.

Can anyone see my records?

The app does not publish your care records to other users. Without an account, records stay in the browser on your device; when you sign in, they can also sync to the cloud. The journey view shows your own history. The “Candlelight” count aggregates users who synced records, without displaying individual records.

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 a JSON backup before you switch and import it on the new device. CSV is for viewing records in a spreadsheet and cannot be imported to restore the app.

Could I lose my records?

Records are stored in the browser, but clearing its data or losing the device can also mean losing your records. Export a JSON backup from the look-back screen and keep a copy outside the device, or sign in to back up to the cloud. CSV is for reviewing records in a spreadsheet.

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.

Preparing belongings for a visit or stay

For organizing belongings before a visit or stay, see CareReady. Its checklist supports packing and checking what comes home. It is a separate app; records do not automatically transfer between the two.

Open-source collaboration

This product is developed publicly. Review the code, report issues, and propose improvements on GitHub.

Small, focused PRs with a short verification plan are easier to review.