Back to portfolio

Domo

1 / 2

The project

Domo is a progressive web application (PWA) for patients of Sanctuary Kliniek who want to structure and reflect on difficult thoughts and everyday decisions outside of therapy sessions. The project was designed to remedy the lack of an accessible way for patients to independently record their thoughts and to help the clinic have more focused and efficient therapeutic conversations.

Structured logs are created by users by describing a situation and rating four dimensions from 0 to 6: personal feasibility, practical feasibility, want, and trust. The application visualises the resulting log as a bubble, thereby creating a more playful, less clinical experience. Users can view, search, filter, edit, reflect on previous logs, and export them as PDFs to voluntarily discuss during therapy sessions. The app also has a tutorial, information pages, light and dark themes, account management, and support for accessing encrypted logs across devices.

Domo uses end-to-end encryption, since the logs could contain sensitive mental-health information. The information is encrypted on the user’s device before storage, and the user can choose to share it with a healthcare professional.

The product gives patients a low-threshold way to make more conscious and balanced decisions. For Sanctuary Kliniek, it can provide a more structured input for treatment sessions, while also stimulating the patient’s autonomy and self-reflection.

We started with a bubble blower and somehow ended up building an encrypted mental-health platform.

The customer

Our client was Sanctuary Kliniek, a psychiatric clinic in Alphen aan den Rijn, which treats patients with a variety of mental-health conditions and from a range of cultural backgrounds. Our main contact was Lennard van Venrooij, psychiatrist, and Manager Innovation at the clinic.

We communicated with the client often and collaboratively. We had regular meetings where we presented the current version of the application, discussed requirements, and took feedback on its functionality and design. Our team also played a consulting role, as the original product concept was relatively broad and not written as a technical specification. We turned the client’s ideas into concrete requirements, user stories, prototypes, and implementation decisions.

The client was heavily involved throughout the project and helped us prioritise features as the product evolved. Also, one of the patients in the clinic anonymously tested a beta version of the application. Their feedback helped us validate the usability of the interface and improve it from the perspective of a real user.

The team

The team was formed by six people: Nout Mulder, Gherardo Ulivieri, Adam van Lith, Bence Válint, Myrthe Spreeuw, and Katherine Liem. We worked with an agile workflow in which Nout was active as the SCRUM Master and partial Product Owner, coordinating SCRUM meetings and client communication, with Katherine managing SCRUM planning and project milestones.

We separated the technical work into frontend and backend teams. The frontend team (Nout, Myrthe, Katherine) focused on the Flutter interface, responsive design, and user-facing features, while the backend team (Gherardo, Adam, Bence) focused on API, database, authentication, encryption, testing, and deployment. We collaborated via regular meetings, GitHub issues and pull requests, and client demos.

The biggest challenges were keeping both sides of the application in sync, handling delayed tasks, and fixing communication and merge issues. We worked around these by having fixed meeting times, breaking down large tasks into smaller ones, and prioritizing the most important features. We are most proud of taking a broad client idea and turning it into a secure, deployed, and usable application.

The technologies

Languages:

  • Dart: client-side application logic and frontend application.
  • Python: backend API, data validation, and server-side logic.
  • SQL: user accounts, persistent storage, logs encrypted, metadata.

Major frameworks and libraries:

  • Flutter Web: progressive web app for mobile and desktop browsers, responsive.
  • FastAPI: REST API for user identification, key storage, and log management.
  • SQLAlchemy and PostgreSQL: storing and accessing relational data
  • Web Crypto API: client-side encryption and decryption of sensitive log data.
  • Auth0 and OAuth2-Proxy: Access Control and User Authentication.
  • Traefik: reverse proxy, routing between application services

Testing and code quality:

  • pytest: backend unit and integration tests.
  • Flutter Test: test data and application logic of the frontend.
  • Flutter Analyse: static analysis for the Dart and Flutter code base
  • Flake8 and Black: Python linting and formatting

Deployment:

  • The application is containerised with Docker Compose. The production stack is Flutter Web for the frontend, FastAPI for the backend, PostgreSQL for the database, OAuth2-Proxy, and Traefik as a reverse proxy. GitHub Actions runs CI checks on pull requests and deploys new releases to the client’s remote virtual machine.