179 nationalities. One platform.

CAMLAP is the Flutter platform Donnish designed and built for the NSW Service for the Treatment and Rehabilitation of Torture and Trauma Survivors. It lets clinicians run trauma-informed clinical assessments in a survivor's first language, with native script and audio. Now expanding from NSW to national, with global in sight.

179
Nationalities served
120+
Languages supported
NSW → national
Deployment scope
Two hands hold a tablet showing the CAMLAP Languages screen, listing Arabic, Dari, Persian, Hazaragi, Nepali, Kirundi, Swahili and Karen

Trauma recovery, at scale.

STARTTS is the NSW Service for the Treatment and Rehabilitation of Torture and Trauma Survivors. They deliver trauma recovery services to refugees from torture and persecution. Their clinicians needed to conduct sensitive clinical assessments across massive language and literacy barriers.

STARTTS were decommissioning a first iteration of their assessment platform due to technology end-of-life and a lack of customisation. They approached Donnish to assist in the creation of a new tool that could not only improve the existing process of facilitating clinical programs to assist victims of trauma, but could be utilised by wider national and global organisations.

The goal: build on the critical work STARTTS have pioneered to give it wider reach, potentially to all parts of the globe. Existing off-the-shelf tools could not handle trauma-informed care for clients who may not read, write, or speak English. The ability to customise clinical questionnaires to offer native script and audio simply did not exist.

A laptop on a plinth showing the CAMLAP Builder questionnaire editor

How CAMLAP is built.

A clinical questionnaire builder and presenter for trauma-survivor assessment: two Flutter web apps on Firebase Hosting, a Firebase and Google Cloud backend, Azure Blob for questionnaire bundles and audio, and Stripe for subscriptions.

CAMLAP solution architecture: two Flutter web apps served by Firebase Hosting, backed by Firebase and Google Cloud (Firestore, Cloud Functions, Secret Manager), with Azure Blob storage for questionnaire bundles, and Stripe, SendGrid and Sentry as third-party services. A Cloud Function reads the Azure connection string from Secret Manager and streams files, so the client never ships the secret. A scheduled function purges expired interview links and results hourly.
  • Request / data flow
  • Owned app / function
  • Third-party tiles link out
  1. 01, Client apps

    Two Flutter web apps plus a shared Dart library.

    CAMLAP Builder
    Flutter web · authoring
    CAMLAP Presenter
    Flutter web · review
    Interviewee mode
    Live · Group · Telehealth
    Shared library
    Dart
  2. HTTPS

    02, Hosting & auth

    Served and signed-in through Firebase.

    Firebase Hosting
    Both apps · Google CDN
    Firebase Auth
    Google + Microsoft Entra
  3. Callable functions

    03, Serverless functions

    Firebase Cloud Functions · Node.js.

    azureBlob
    Secure file access
    stripeCheckout
    Checkout session
    removeExpiredObjects
    Hourly cron · scheduled
  4. Data / storage

    04, Cloud platform

    Firebase and Google Cloud for data and logic; Azure for files.

    Google Cloud · Firebase

    Cloud Firestore
    Records, users, results
    Cloud Functions
    Node.js runtime
    Secret Manager
    Azure conn string
    Scheduler + Pub/Sub
    Firebase-managed cron

    Azure

    Blob Storage
    Questionnaire bundle + audio
    AD app registration
    App identity
  5. Integrations

    05, Third parties

    Payments, email, monitoring, delivery.

    Third-party services

    Stripe
    Payments & subscriptions
    SendGrid
    Expiry email reminders
    Sentry
    Error monitoring

    Source & delivery

    Bitbucket
    Source control
    Manual deploy
    Firebase CLI · scripts

Architecture pattern · Secure file access + lifecycle

  1. Flutter app
  2. azureBlob function
  3. Secret Manager reads secret
  4. Azure Blob
  5. File streamed back

The client never ships the Azure connection string: a Cloud Function reads it from Secret Manager and uploads or streams the questionnaire and audio via the Azure SDK, with no direct SAS. A scheduled function purges expired interview links and results hourly, and SendGrid emails a reminder before results expire.

Flutter on Firebase, Google Cloud and Azure

Co-delivery, not handover.

CAMLAP was created through a Design and Build process using a dual-track agile (Scrum) approach. This was a co-delivery team: STARTTS roles formed part of the delivery team. STARTTS are responsible for product ownership; we are responsible for design, delivery and support.

The team scales up and down as required against the product roadmap, supplemented with a support and maintenance agreement. Delivery is from a hybrid Australia and Philippines team.

What makes the engagement work: clear, transparent communication and agreed processes. All work is visible on the Jira Kanban board, signed off by the client there. That includes future planning and tracking of maintenance items.

How it's built today: engineering, refactoring and tests run through Claude Code, and design changes go through Figma with Claude Code reading the design context directly. A small senior team with that tooling keeps CAMLAP moving across web, mobile and desktop.

Donnish have been excellent partners. They ask great questions to understand what we want to achieve and offer real technical expertise. They worked with us to develop shared and concrete expectations of how to best work together to manage timelines, budget, and outcomes. No uncertainty ever lasts long.
Joshua HallClinical Research Lead, STARTTS, NSW Government Health

Built for clinicians. And for survivors.

Design principles

CAMLAP was designed to serve clinicians and their consulting teams as well as the trauma survivors themselves. Human-centred from the first sketch.

  • Designed with trauma survivors at the centre
  • Every interaction designed to feel safe, respectful, accessible
  • Adaptive interfaces for varying literacy levels
  • Audio and visual modes for non-literate clients
  • Simplicity · every user should intuitively understand what to do next

The technology

Flutter for the greatest flexibility across mobile and web. Firebase and Azure backend, Stripe for subscription payments. Work managed through a Jira board, using Loom.

  • Flutter · chosen for one codebase across web and mobile
  • Firebase · auth, real-time data, hosting
  • Google Cloud · backend services
  • Azure · supplementary platform services
  • Stripe · subscription payment when creating a subscription

From New South Wales. Toward the world.

Reach · expanding

National and international rollout

The platform is now expanding from NSW to national, with international deployment in sight. The trauma-informed clinical-assessment work STARTTS pioneered now has a digital vehicle to reach survivors anywhere a clinician can sit with a tablet.

Design goal · Simplicity

The UX should disappear. The work should not.

Clinicians and survivors alike should intuitively understand what to do next. Adaptive interfaces, audio and visual modes, and native-script questionnaires meet people where they are.

Got a service that should reach further? Tell us about it.

We'll get back to you within a business day, usually faster.