Case Studies

Products I have shaped and built.

A closer look at mobile products, interaction design, and the engineering decisions behind them.

Featured Case StudyDAIT / Madrid

Meeting people beyond the swipe

DAIT is a social matching app created for the Spanish market, starting with its first community in Madrid.

As co-founder and sole app engineer, I built the mobile experience end to end with React Native and Expo, shaping product scope, interaction details, and parts of the product language alongside the team.

Promotional film by maxiku.tv.

Lead App EngineeringReact Native / ExpoProduct

My Role

Co-founder, lead app engineer, product scoping.

Product

A social matching app designed for the Spanish market, with Madrid as its first community.

Build

React Native and Expo, gesture-heavy interactions, deep links, privacy-aware AI flows.

Collaboration

The app's visual design was led primarily by a collaborator; I contributed product scoping, architecture, implementation, company admin.

The Product Journey

From the city to the interaction

DAIT is built around small moments that can lead to meeting someone: expressing preferences, opening a trusted conversation, connecting in person, and celebrating a new connection.

Express

Quizzes and motion make self-description feel lighter.

Trust

Zelia stays behind explicit consent before personal AI chat begins.

Meet

QR sharing bridges an offline encounter into a live compatibility flow.

Connect

Accepting a candidate ends in a celebratory transition rather than a quiet state change.

Chapter 01

Invite expression

Short quizzes invite people to reveal preferences through different kinds of interaction: instinctive swipes, ordered choices, and quick trade-offs. The goal was not only variety. It was to make each quiz mechanic feel distinct while still belonging to one coherent product.

Implementation-wise the different game modes offered to deeply dive into gesture-driven animations, making sure that they are performant and at the same time feel natural. To allow for finetuning, most of these animations were programmed by hand instead of LLM-supported.

Quiz selection

The entry point uses animated buttons to invitingly present to the user the options, further making clear that quizzes are ordered as a queue.

Green vs. Red Flag

Quick swipes capture instinctive reactions and keep the rhythm lively.

Rank It

A ranking mechanic turns preference into priority, not just yes-or-no feedback.

Would You Rather

Forced choices create clarity fast and give the app another expressive mode.

Product Decision

At first look the selection screen serves to branch into several types of quizzes (instinct, ranking, and direct choice). Behind the scenes, we needed to make sure to nudge the user to play all types of quizzes. Based on recent playing history, the app limits the available options of quizzes to two (user still perceives that he can choose), while at the same time showing him what is coming (user sees what he can expect in the future) to maintain engagement and a sense of control.

Engineering Focus

Gesture-driven interaction, animated card transitions, and shared flow logic make the quiz family feel consistent even though each mode behaves differently. The structure makes heavy use of generic components.

Implementation Note

Swipe Gesture Intent as a Normalized Boundary Problem

A note on the gesture math behind the Green vs. Red Flag quiz, where normalized translation and velocity combine into a circular decision boundary.

Read the note ->
Chapter 02

Earn trust before AI interaction

Zelia is the app's AI conversation layer. Before a user enters that experience, they first encounter an explicit consent step for processing personal context. This was a product decision I advocated for, informed by building for European users and the sensitivity of AI-mediated conversations. At the same time it avoids an explicit privacy consent step in the onboarding, possibly narrowing the funnel.

The consent screen stays clear in intent, while carefully revealing an example conversation behind, giving the user a sneak peek of what he can expect.

The chat interface itself is kept clean, while still being able to render formatted content.

Consent gate

An explicit first-use permission step before the chat opens.

Chat with Zelia

After consent, the AI interaction becomes available as part of the normal app flow.

Product Is Also Language

Who is your product copy about?

A note I wrote while working on DAIT about whether product language makes the product the protagonist or the person using it.

Read the note ->
Chapter 03

Connect a real-world moment to the app

The live match flow begins with a QR code, so that the user can add another user to his list of connections. The main value comes however from how gracefully the product continues after the scan.

That means handling more than one outcome: someone may already be inside the app, or they may still be at the edge of it. This is necessary from product side to not introduce hard stops for (possible) users even if they do not have the app installed. And from the technical POV it merges web page, QR sharing and scanning, shareable URLs to user profiles all back to the app in one tight package.

Scan QR

A shared QR is the entry point into a live, in-person compatibility flow.

No app installed

The fallback becomes a download or onboarding step instead of a dead end.

App installed

The scan opens into the app and leads toward a live compatibility moment between two people.

Scan within app

An existing user can start from the in-app scanner and continue directly into the compatibility flow.

Chapter 04

Celebrate the decision to connect

Accepting a candidate should feel like an emotionally meaningful action, not just a database update.

In the connections flow, users review candidates and decide whether they want to launch a real match. That final interaction benefits from motion because it gives the decision a sense of weight and warmth.

Connections screen
Connections screen

Two candidate cards become part of a flow that invites action instead of passive browsing.

Celebration state

Once the candidate is accepted, the transition acknowledges the moment instead of treating it like a silent state flip.

Engineering the Product

One app, implemented end to end

As sole app engineer, I implemented DAIT's mobile application in React Native and Expo: the architecture, app structure, flow logic, gesture-heavy interactions, data handling, the integrations needed to support its product behavior.

As a founder, I was also part of deciding what deserved to exist at all. That overlap between product scoping and implementation is one of the main reasons this project represents me well.

Selected Implementation Peeks

Swipe quiz behavior

The green-versus-red-flag quiz is not a static form. Each card needs to track question changes, measure dwell time, and turn directional gestures into explicit answers.

That combination lets the flow feel expressive while still giving the product useful structured data.

useAnimatedReaction(
  () => activeIndex.value,
  (current, previous) => {
    if (current !== previous) {
      scheduleOnRN(handleQuestionChange, current)
    }
  },
  [quizData]
)

const onSwipeRight = () => handleResponse(question.id, 'green')
const onSwipeLeft = () => handleResponse(question.id, 'red')
const onSwipeDown = () => handleResponse(question.id, 'neutral')

QR scan to live compatibility

The live flow is driven by QR data, camera permission state, haptics, and route transitions. Once a valid scan lands, the user is pushed into a shared profile route that can continue toward compatibility and connection.

The important thing here is continuity: scan, confirm, continue.

function handleBarCodeScanned({ data }: { data: string }) {
  if (scannedRef.current)
    return

  if (isValidScannedData(data)) {
    const userId = extractUserIdFromScannedData(data)
    if (userId) {
      scannedRef.current = true
      Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)
      router.push(`/sharing/u/${userId}`)
    }
  }
}

The consent gate is backed by explicit status handling rather than a vague boolean. The user can activate, revoke, and re-activate consent, and the UI reacts to those states clearly.

That matters because consent is a product feature here, not just an implementation footnote.

const consentStatus = userInfo.assistant_consent.status
const isConsentActive = consentStatus === 'active'

return isConsentActive
  ? (
      <Button
        title={t('zelia_privacy.revoke_cta')}
        onPress={handleRevokeConsent}
      />
    )
  : (
      <Button
        title={activationActionTitle}
        onPress={handleReactivateConsent}
      />
    )
Mobile Foundation

React Native and Expo app structure, navigation, state, and flow composition.

Interaction Craft

Gestures, animated transitions, and feedback loops that make product moments feel alive.

Product Logic

Consent states, branching journeys, and social flows that needed to work beyond happy-path screens.

Workflow Evolution

From building the app to improving how it gets built

DAIT began when AI played almost no role in my development process. It has since become one of the projects where I most actively refine agent-supported mobile workflows.

The product itself stays human-facing. What changed is the way I build, test, and inspect it.

Today I use DAIT as a real environment for exploring how coding agents can support React Native and Expo work without losing the discipline of verification.

What This Project Demonstrates

DAIT brings together the kind of work I want to keep doing:

  • React Native and Expo engineering with whole-app ownership.
  • Product thinking around scope, copy, trust, and journey design.
  • Animation and interaction work that supports meaning instead of decoration.
  • AI-supported mobile workflows grounded in a real product instead of toy examples.

If you are building a mobile product that needs both thoughtful implementation and product judgment, I would be glad to talk.