Anagnori — the app for learning about yourself
A self-guided iOS app I'm building around a framework that helped me in therapy. Still figuring it out in public.
Resume (PDF)zheng.harvey5@gmail.com
Designer & engineer | 2026 — present
Tools: SwiftUI, TypeScript, HTML prototyping, Claude Code Platform: iOS · anagnori.app
Overview
Solo-built iOS app in SwiftUI — design, build, and the marketing site. It started from my own experience with Exposure and Response Prevention (ERP) in a clinical setting: I wanted to see whether the thing that had worked for me could work outside a therapist's office, and along the way I realized the pattern overlapped with how habits get built and broken.
The method here is self-testing, not a study. I'm the only person who has used it. I make a change with Claude Code, run my own experiments through the app for a while, and then walk every flow end-to-end as the person I'm building for — someone motivated to change something but not necessarily to go to therapy. That same loop is how I set up the monorepo, the CI, and the design of the app.
What that gets me is interaction decisions I can actually defend, and they're documented below: dropping the three-level clinical hierarchy for the flat list my own notes always were, moving the "breaking or building?" mode question out of every entry and into settings, and rebuilding the debrief so you can see what you're grading while you grade it. What it can't tell me is whether any of this helps someone else. There are no other users, no efficacy data, and no research behind the app itself. The build isn't available anywhere yet, and it's still changing, so this case study may reflect an older state of it.
Why I built it
ERP (exposure and response prevention) is still very much present in my day-to-day life, even if I'm not as deliberate about defining experiments. At first I would freeze trying to do anything, but rationalizing what would likely happen would make me more likely to do things, and over time I became more and more likely to push myself to do actions that would have scared me before. For example, in the past I might not have talked to someone in public if I overheard them talk about something I'm interested in. Now, though, I'm pretty willing to try to strike up some conversations with people I don't know in places I've never been to. As I kept doing it, the anxiety spike decreased, and it would always get easier.
From therapy, I would keep a lot of the experiments in a Google doc. Try to call some bakery and ask for a specific pastry, pretend to be a confused tourist when asking for directions. Over time, I got to thinking of everyday occurrences as exposures. Strike a conversation with the barista. Go running in tights without shorts for modesty. Things like that. Over time, the record of evidence and my progress grew. I began to think about how I could help others with this. In a conversation with a relative, I realized there was a lot of overlap with the habit forming and breaking cycle as well, and thought this could be a way to make it more accessible.
This year, I've really been on a journey of self discovery, and Anagnori (based off of the Greek anagnorisis, a moment in a play or other work when a character makes a critical discovery) is an attempt to help others get started on the journey.
Prototyping in HTML
I prototyped in HTML before writing any SwiftUI for the speed of iteration with Claude Code. I could ask Claude to generate a variety of options, pick elements I liked across different directions, and iterate toward a visual language I was happy with.



I landed on a minimalist lavender direction. Lavender and lilac read calm to me like a spa environment might, and the lighter shade kept the whole thing soft calming and soft. I tend to prefer light mode for contrast, and here it doubled as a tonal choice: a calmer, lighter surface for an app with the aim of getting people to be open an vulnerable.
First pass: the clinical port
The first build was one largely based off the clinical ERP model: three levels of hierarchy, distress ratings, and a chart of my SUDS curve over time. This was the MVP to see what it would be like to interact with an app instead of copying a table in Google docs for each experiment.
From the first pass, I thought three things could be improved. First, the state machine didn't match how I thought about experiments, since it was missing the case if I didn't complete the exposure. This is important, as the data about why I couldn't do something is important for the next time I may try. Second, having hierarchies didn't fit too well, since my document was just a flat list of items. Of course there are patterns, but having the user create a hierarchy before a routine and then an experiment was a lot of friction before they could even get started. Third, the app never got to why it was important to actually do these experiments. For me, I wanted to try to move toward my values and the type of person I wanted to be, so I rethought how I wanted users to create and interact with experiments more in line with the type of personal development I had been doing.
Rebuilding around how I thought about experiments
The insight was largely a culmination of a lot of learning and personal development, with the help of Acceptance and Commitment Therapy (ACT). Combined with my knowledge of habits from reading James Clear, I realied a lot of these loops were fairly similar, and could be generalized as something more for habit breaking and personal development. In anxiety and habit cycles, there's a trigger, an urge, and an implied direction if I act on the urge. That is, does performing the action move me toward or away from the life I want? The rebuild was about changing who the user gets to be while using the app, without changing the information the app captured.
Something I learned from ACT is using values to orient the actions I take in life. Am I avoiding doing something by taking the easy way but also moving away from my values? Or am I moving toward my values with this action?
For this, I put values onboarding at the very start to try to orient people toward a life they want to live. This goes in line with a lot of the messaging I heard in books about how to live life: if you live by your values, it can be easier to get close with death, as you've done what you wanted in life. This is a large part of ACT as well, where even if something is harder, moving toward it can create more vitality in our lives. After all, avoiding things to be alone in itself can sound like a life to avoid living.
Values also shift, so as people try things and feel like they maybe aren't for them, they can reevaluate and select different values to see if they are more in line with who they are. The goal isn't to get people set up immediately, but to encourage them to begin the self-discovery process and hit that critical moment of self-discovery.
Refining through end-to-end critique
With this new onboarding flow to help push people to vitality, I started looking at UX patterns more closely. For the next iteration, I took a critique approach and walked through every flow end-to-end as the target user. In the process, I noted where UX patterns diverged from the mental model someone may bring to the app, like how they understand anxiety or triggers, and general friction points that may prevent someone from starting an experiment.
The biggest catch was the mode question. The rebuild asked "are you breaking this habit or building this one?" on every new pattern, which felt like interrogation after a handful of entries. Since I'm more familiar with breaking habits, I opted to focus the app on that and moved that question into the settings to default to breaking. Breaking and forming habits are fairly similar, as in order to break a habit, you often need to replace the old habit with something new, preferably that will move you to your values. So, it made sense to me to only surface breaking habits to the user.
The second was the debrief flow. The "completed / not completed" choice used to be a modal with no surrounding context — tap the button and a form loaded with no reminder of what you were grading. I redesigned it as a segmented control at the top of the sheet with the full context visible underneath (pattern name, the prediction, the trigger). You see what you're grading while you're grading it.
The third was more generally revamping the onboarding flow to try to get the user to create and complete an experiment. I thought looking at these fields, getting pretty vunlerable with an app you know nothing about could be fairly difficult, so I wanted to provide some quick examples of how the app could be used to break habits that people generally know are bad, like using their phone when they get bored rather than sitting in thoughts. The goal here is for users to learn and start identifying loops and routines within their life, and ask if it's moving them to or away from their values.
Where I currently am
The app exists as a working iOS build but isn't available anywhere yet, as I've been testing it myself. My aim is to eventually work on it as an effective, clinically proven self-driven ERP app. The marketing site is live at anagnori.app.
As I keep testing the app for myself, there's still a lot I feel like I would want to improve. However, it's a lot better than it was just a week after starting the project. The framework is also used in clinical settings, making it more trustworthy, at least to me, since it has real world efficacy. I didn't, however, expect the app to be as generalizable as I did when I first set out to just make an app for ERP.
My main goals for the app, at this point, are to get a UX research study on this through an IRB and continue iterating on the app until I feel it's ready for others to try.