← Back to Projects

TheiA Super App

A role-based super app for handling treatment-room workflows on mobile devices.

CompanyGaia Labs
RoleInteraction App Content CMS design Figma & UX drafts
TeamFrontend 3 Backend 3
PeriodJun 2026 - Present
StatusiOS Released · in operation

A role-based super app that brings time-sensitive treatment-room workflows from CPE, the clinic operations web app, to mobile devices. Doctors and nursing assistants record pre- and post-treatment status on mobile devices, while patients use a dedicated tablet to view skin-analysis results and clinic guidance. Because permissions and workflows differ by role, each role has its own app, all managed in a single monorepo. I owned the UX planning and end-to-end implementation of the Interaction App, and designed the Figma drafts and UX flows for other mini apps, including the anaesthesia and treatment apps. I rebuilt the app over two months for the V2 backend transition, then moved multilingual guide content out of the app bundle and into a CMS to support additional clinics.

Problems and solutions

Problem

The existing treatment-room screen let doctors and nursing assistants check and update a patient's treatment status, but it was limited to a PC-based web environment.

In a clinical setting where staff move frequently, it was difficult to record status immediately before or after treatment, creating a gap between when the work happened and when it was entered into the system.

Judgement

I extended the treatment-room workflow to mobile devices so status could be recorded where treatment takes place.

Rather than putting every function into one app, I designed a mini-app structure that separates permissions and workflows by role.

Solution

Structured the role-based apps to be managed in a single monorepo.

Owned the planning and development of the Interaction App, and designed the Figma drafts and UX flows for the other apps, such as the anaesthesia and treatment apps.

Result

Additional apps for on-site tasks, including consent forms and treatment notes, were later added to the same monorepo, extending the role-based mini-app structure.

Problem

Treatment workflows naturally include waiting periods, such as the time required for anaesthesia to take effect. Rather than leaving that time as passive waiting, I saw an opportunity to present DERMA:CODE results and clinic guidance in a way that helps patients feel actively cared for.

To record states such as anaesthesia start and end, clinicians had to dig through several levels of screens to find the patient every time, which added time spent on work outside treatment.

Judgement

I judged that one tablet placed in the treatment room could improve the patient's wait and shorten the clinicians' recording path at the same time.

I split role-based (patient / clinician) screens inside one app to meet the floor's mixed needs in one go.

Solution

Patient view: during waits such as anaesthesia, patients can open their own DERMA:CODE skin analysis results or check useful nearby information such as pharmacies and transport.

Clinician view: kept the existing work rules from the PC and the treatment mini app (step transitions, admin authentication and so on), and designed screens so doctors and nursing assistants can record status events on the spot in the treatment room.

Result

Went beyond implementing requirements and led the whole project, from UX planning and coordinating design assets to the actual build.

With no hands-on Flutter experience, I made heavy use of AI coding tools, ran feature definition and verification myself, and finished an MVP at a release-ready level in two months.

Problem

Every time a record photo was taken, the face's position and angle differed slightly. One shot did not take long, but the framing had to be redone every time, and a returning patient's before-and-after photos were taken under different conditions.

It happened on every shot, yet it never came up as an improvement request and no related feature was in the brief.

Judgement

Decided that a problem which recurs and affects later work should be fixed first, brief or no brief.

Showing an alignment reference on the camera screen was cheap to build, so instead of a separate feature I put the reference into the capture process itself.

Solution

Overlaid an alignment guideline on the camera screen for positioning and angling the face.

Users line the face up inside the guide and then take the shot.

Result

Clinicians and the CEO responded well, and it became the fixture that keeps record photos framed consistently.

It was not in the brief, but observing a repeated task led to an improvement that also accounts for comparing a returning patient's photos.

Problem

The patient tablet's guide content (video, images, maps and text in five languages) lived as files inside the app bundle. Fixing one line of copy meant shipping a new build, and because it was hardcoded for one clinic, there was no flexible way to add another.

I first handed off the requirements as a planning brief, but the first builds stopped at moving image URLs or porting the existing file layout to an API. My initial handoff did not communicate the development intent clearly enough to the backend team.

Judgement

So that nothing could be read two ways, I rewrote it as a spec at the level of an interface contract rather than a list of requirements: DB schema, API, validation rules and error codes, admin screens, app rendering rules, and seed data for the existing clinic, all in one document.

I split what can be edited into three kinds. Existing items can be edited and hidden but never deleted. Per-clinic differences are handled by operators adding their own items. Menus that display patient treatment data aren't content, so only their order and visibility can be set.

Storage is one document per clinic. Splitting menus, tabs and blocks into tables would mean a migration every time a block type is added. Instead the server validates against a schema and sends the app only the finished document, with languages and image URLs already resolved.

Solution

The backend engineer shipped the implementation across three repositories the day I handed off the spec, and I then finished the operator editor and the app side.

The app caches the document for the session and, when a screen opens, only asks via ETag whether it changed. If it hasn't, a 304 ends the request.

Result

Content changes and new clinics no longer need an app release. The only thing that does is a new block type.

Investigation

The map is cropped to fill the screen, but marker coordinates were computed against the screen. Each device's aspect ratio crops a different amount, so the same value landed in different places, and where a pin sat in the editor didn't match the tablet.

Action

I first switched the coordinate basis to the map image, and then every existing value shifted, because I had changed what the coordinates meant. I restored the definition the existing values were tuned to (alignment coordinates on the reference tablet screen) and redesigned the logic so a position on the reference screen converts to a relative position inside the map image and then to actual screen coordinates. The app and the editor share the same formula.

Result

On the reference tablet the markers sit pixel-for-pixel where they did before, and on other screens they land on the same spot in the picture. Tests in both the app and the editor pin the two existing values within ±3px of the marker center.

Insight

If a migration changes what the data means, it's not just a failed move — it breaks the data's integrity. The cause was that my spec never stated the reference screen for coordinates, so I redefined it in the document and in tests.

Insights and limitations

What remains

These are early results without much production data behind them. Flutter was applied in practice for the first time to ship on iOS tablets, so my hands-on experience across Flutter as a whole, including Android support, is still limited.

Scope

The CMS backend and the first version of the editor were built by the backend engineer from my spec. For backend defects found in operation I traced the cause and wrote the fix, but infrastructure permissions meant the backend engineer shipped the final change.

Tech Stack

Flutter (implemented with AI coding tools)Melos monorepoFigmaiOS firstReact (admin editor)