logo

Press Office

Press Office Podium Image

Overview

Press Office is a mobile simulation game where you step into the role of the White House Press Secretary. You handle press briefings, manage relationships with journalists, and try to keep the administrations approval ratings steady through a full four year term.

I had worked with React Native for several years in previous roles, but it had been a while since I had built a full mobile product end to end. The ecosystem has changed a lot during that time. Expo and EAS have matured into a very developer friendly platform, and the newer React Native architecture and improvements in performance made the framework feel more modern and enjoyable to work with. This project was a chance to return to mobile development with fresh tools and a more polished workflow.

It also let me explore how AI can support development in practical ways. I used v zero by Vercel for early prototyping. Since it is designed around file based routing and Tailwind style utilities, it mapped well to how I structure web projects in Next.js. I was then able to transfer those prototypes almost directly into React Native using NativeWind, React Native Reusables, and Expo Router. This made it surprisingly easy to move from web style mock ups to a mobile experience without rewriting the design language.

Press Office grew into a full narrative driven mobile game with offline first data, scenario generation, and end to end testing. The project let me combine game design, mobile engineering, and AI driven tooling in a single product.

One thing that makes it stand out is the overall scope. I designed the gameplay systems, created a component library, built a content pipeline powered by LLMs, and curated around six hundred scenarios. It was a true solo project from start to finish.

Technology Stack

  • React Native + Expo Router — Cross-platform mobile development with file-based routing
  • TypeScript — End-to-end type safety
  • WatermelonDB — High-performance offline-first SQLite database
  • Zustand — Lightweight state management for UI
  • NativeWind — Tailwind CSS adapted for React Native
  • React Native Reusables — shadcn/ui-inspired accessible component primitives
  • OpenAI API + Zod — LLM content generation with schema validation
  • Maestro — YAML-based E2E testing on real iOS/Android simulators
  • GitHub Actions — CI/CD with automated testing and bundle analysis

Key Features

LLM-Powered Content Pipeline

The content pipeline is one of the more distinct pieces of the project. Instead of calling an AI model during gameplay, I created a command line tool that generates all scenarios ahead of time. This avoids latency for users, avoids API costs, and gives me better control over quality.

The pipeline runs in stages. It checks for balance across the existing content, generates new situations with journalist questions and multiple player responses, and validates everything against strict Zod schemas before it is accepted. This gives me the creative range of AI generation but with the consistency and tone of hand authored content.

The final library contains roughly six hundred scenarios that cover domestic policy, foreign affairs, scandals, and more. Each scenario includes context specific journalist reactions and approval effects on different voter groups.

Offline-First Architecture

All game data stays on the device using SQLite through WatermelonDB. This made the app fast, private, and fully offline. There is no backend to maintain or monitor.

WatermelonDB manages the structured game state, while Zustand handles short lived UI state such as dialogs and animation flags. Components subscribe to the data they need and update automatically, creating a smooth experience without manual refresh logic.

Mobile Component Library

React Native does not have the same range of established component libraries as the web, so I leaned on React Native Reusables and combined it with NativeWind. This gave me a familiar workflow similar to Tailwind and shadcn ui, which worked well with the earlier v zero prototypes.

The architecture follows an atomic approach with small primitives in one area, shared components in another, and screen specific layouts kept separate. It made the UI predictable and easy to extend.

E2E Testing with Maestro

Mobile testing can be unpredictable, but Maestro made it straightforward to create reliable end to end tests. The suite covers actions like starting a new game, completing levels, and verifying that progress persists through app restarts.

These tests run automatically in continuous integration on both iOS and Android simulators, with reports and screenshots captured for any failures.

Production-Ready Patterns

Although this is a portfolio project, I built it using production minded patterns. It includes analytics and advertising consent flows that respect GDPR and Apple tracking policies, global error boundaries with Sentry, and a continuous integration pipeline that runs type checking, linting, unit tests, end to end tests, and bundle size checks on every pull request.

Development Challenges

Content Generation at Scale: Achieving consistent tone from an LLM required many rounds of prompt refinement and validation rules. I created tone guidelines and filters to catch scenarios that drifted into partisan or inconsistent territory.

Offline Relational Data: The game includes many interconnected entities such as games, levels, situations, journalists, and cabinet members. Modeling these relationships in an offline first database took careful planning and frequent iteration.

Mobile E2E Reliability: End to end testing on mobile has many moving parts. I added strategies to handle timing issues, system dialogs, and differences between iOS and Android.

Balancing Game Systems: It took a good amount of tuning to make approval changes feel meaningful without being discouraging. The system needed to respond to player choices while still giving room to experiment.

Future Enhancements

  • Localization: The content pipeline could be extended to generate translated scenarios, making the game accessible to non-English speakers.
  • Adaptive Difficulty: Using player approval volatility to dynamically adjust scenario intensity.
  • Journalist Personalities: Expanding the archetype system so individual journalists have more distinct questioning styles.

Conclusion

mobile engineering, AI tooling, and production practices. I built the systems, generated the content, designed the data layer, and set up the continuous integration pipeline that validates every change.

More than the technical stack, it reflects my ability to take an idea and guide it through the entire product lifecycle. It is a project I am genuinely proud of and one I had a lot of fun creating.