Logo

Tomo Japan

swift-badge firebase-badge supabase-badge

Inspiration

The inspiration for Tomo Japan is two-pronged:

1) A Second Chance at the Very First App I Ever Tried to Build

Ever since I started learning Swift to become a self-taught iOS Engineer (transitioning from 5+ years in finance), I've wanted to build a Japan itinerary app (see below for the app screens I created at that time). Initially, my development skills were too limited to move beyond coding the UI interface of screens (i.e. limited backend and data flows). Fast forward, after 1.5 years of learning iOS development on my own, the Shipaton hackathon was the perfect opportunity to put my development skills to the test and finally launch a Japan Travel App (Tomo Japan) to the App Store. This journey has truly come full circle, ending right where my iOS development journey began: from failing to launch my first Japan travel app, to a journey of growth, and finally launching Tomo Japan now.

2) Passion for Japan Travel and Culture

My love for Japan dates back to middle school, inspiring me to learn about the culture, study Japanese in school, travel to Japan, and watch Japanese shows. Fast forward to present day, I've traveled to Japan extensively and watch Japan travel content for fun on Instagram and TikTok in my free time while adding to my ever-growing list of places to visit when I return to Japan next time. Launching Tomo Japan is my creative avenue to translate my personal Japan travel research, from locations starred on Google Maps to social media content consumed, into a comprehensive, shared resource for the world. It's a lot of work to document my insider knowledge and travel lessons, but it's a worthy goal now that Tomo Japan has been launched!

Comparison


What It Does

Tomo Japan ("Tomodachi," or friend in Japanese) is your pocket travel friend for discovering new destinations in Japan, from curated cities, to hidden gems and inspiring itineraries. The app currently covers the extended Tokyo area with plans to launch to destinations across Japan soon!

The app helps travelers navigate Japan's complexities by consolidating information into one seamless resource. Users can uncover the best destinations through:

  • Curated city and location guides
  • Well-planned itineraries
  • Seasonal highlights
  • Essential travel tips and website links
  • Local gems not found in traditional guidebooks

Currently, users can access a free selection of core destinations and upgrade to Tomo Lifetime Pro with a single purchase to unlock all content.

Paywall


How It is Built

As a SwiftUI programmer, the app was built using modern, scalable, and fully native Apple technologies.

  • Front-End: Built with SwiftUI, following the MVVM (Model-View-ViewModel) architectural pattern for clean state management and separation of concerns.
  • Back-End: Powered by the Firebase stack, utilizing Firestore for structured content storage and Firebase Storage for media assets. Firebase was chosen for its real-time database capabilities, seamless SwiftUI integration, and ability to quickly implement scalable, client-facing features.
  • Content Management (Bridging Data Validation between SQL and NoSQL):
    • SQL: Content is first authored in Google Docs, then imported into Supabase (SQL) for strict data type validation and structured storage in relational tables. Sub-models are generated to create smaller data payloads for faster client-side loading.
    • NoSQL: Once validated, the dataset is exported as JSON and passed through a custom lightweight ETL pipeline, built with JavaScript, which automates transforming and loading the data into Firestore (NoSQL).
    • Purpose: This workflow bridges SQL precision with NoSQL scalability, ensuring schema consistency during content creation while enabling flexible, real-time querying within the app.
  • Image Asset Management: Image assets are uploaded from desktop to Firebase Storage using custom scripts and Firebase Functions, which automate photo renaming and resizing for different display requirements across views.
  • Authentication: Implemented with Firebase Authentication, supporting Sign in with Apple and Google Sign-In.
  • In-App Purchases: Managed through RevenueCat, enabling the Tomo Lifetime Pro subscription tier.
  • AI Co-pilot: Google Gemini, serving as the Shipaton Hackathon Vibe-Coding Partner during development.

Architecture

Learn more about the architecture in my Medium article: Behind the Architecture from 0 → 1 for iOS App, Tomo Japan


Challenges

  • Content Management Complexity: Manually managing content within the Firebase database structure quickly proved too time-consuming. I addressed this challenge by taking a Twitter user's recommendation to use Supabase, which led to the creation of Tomo Japan's semi-automated content management pipeline detailed above. It's not perfect and can be improved, but it works.

  • Time Constraints: With the goal of shipping an MVP, I had to be aggressive with feature cuts, eliminating initially planned items like in-app itinerary creation and map views. This hackathon taught me to ship the smallest MVP first and iterate rapidly based on community feedback.

Learn more about my challenges and what I would do differently in my Medium article: The Journey to Publishing Mobile App, Tomo Japan

Mitigants (thanks to #buildInPublic)

Pre-Launch

Key wins before launch included:

  • Improving the content management pipeline
  • Testing user interest in various types of Japanese content via engagement before implementing in code
  • Building a strong supportive community on X and TikTok. My daily #buildInPublic updates on Twitter and insights from TikTok also helped build motivation to work hard towards publishing the app.

Pre-launch

Post-Launch

Improving the user experience took priority over expanding content. The community’s feedback proved invaluable, offering actionable insights that guided Tomo Japan's improvements.

Post-Launch


Marketing

Tomo Japan was launched 1 week before the deadline for Shipaton, so I marketed on every social media channel I had to get user feedback, build a user basis, and promote Tomo Japan. Marketing


Feedback Loop

Since Tomo Japan launched later than expected, I had just about a week to gather feedback and act on it (thanks #buildinpublic community!). Version 1.1 reflects that: faster paywall performance, UI polish, and accessibility improvements to build user trust.

One major learning moment: my initial RevenueCat setup caused a very slow paywall, flagged by three users who even sent me videos and detailed explanations describing the issue. That’s the power of building in public—users helped me spot a critical error quickly, and I was able to ship a fix right away.

Launch-Bug


Accomplishments That I'm Proud Of

  • Community Validation: Received accolades from the broader App Store, Twitter, TikTok, and Instagram communities. The app received many comments from users stating they wished they had this app for their own trip to Japan.

  • Strong Tomo Brand Concept: Got consistent user feedback that the app has a wonderful, "cute" mascot concept, encouraging me to lean into the brand identity of mascot, Tomo, in future updates.

  • Many Technical Firsts: Learned SQL and JavaScript, used Supabase and Firebase Functions for the first time, and built my best app yet. Explored architecture deeply and iterated through multiple versions.

  • Self-Taught Engineer Launches App in Around 50 Days: I developed and launched Tomo Japan during a major life transition. The first 30 days were dedicated to full-time app development, but the latter 20 were spent balancing my new full-time iOS engineering job with development before and after work (it was tiring but worthwhile!). Launching this app in 50 days while transitioning careers is a huge personal and professional victory.

  • Featured Twice by RevenueCat: The first time for a funny picture with #Shipaton written in ketchup; and the second time for my Medium article reflections. It was really encouraging to see the RevenueCat Team highlight my content, which helped me stay motivated throughout Shipaton, thank you!

Timeline

RevenueCatFeature


What I Learned

  • Shipping Early is Everything: There is never enough time to push a perfect app through the App Store process. The key lesson learned is to ship the smallest MVP early, gather community feedback, and iterate quickly.

  • Confidence as a Self-Taught Engineer: Impostor syndrome is real, but through Shipaton, I found a technical voice on Twitter and a personal voice on TikTok. I learned the broader developer community shares similar struggles, I am not alone, and that after working hard to teach myself Swift, I truly belong (in the iOS community).

  • The Power of Building in Public: It was a powerful motivator, a crucial source of feedback, and an unexpected way to find support and lifelong friends. Learn more about building in public in this Medium article: A Secret Weapon for Every Indie Dev? Building in Public → App Launch for Tomo Japan

My socials:

  • X/Twitter (@tammyho52): Technical journey for building Tomo Japan.
  • TikTok (@tamtamcodes): Personal growth journey while participating in Shipaton.
  • Medium (@tho52): Writing about the Shipaton app-building process.
  • Other TikToks (@tammyho52, @tomojapanapp): Testing Japan content strategy and App Marketing.

Twitter

Instagram

OtherTikTok

Engagement

I’m amazed by the growth of my new accounts during Shipaton, showing strong interest in Tomo Japan and my development journey:

  • Twitter account gained 32K+ Views, 780+ Engagement, and 65+ Followers in just 60 days
  • Main TikTok account gained 26K+ Views, 1.1K+ Likes, and 115+ Followers in only 30 days

Engagement


What's Next for Tomo Japan

The focus is now on iterative development driven by user feedback:

  • Content Expansion: Create more destination content, starting with Osaka and Fukuoka, based on Instagram survey results.
  • UI/UX Polish: Fix priority bugs, including a better tab bar implementation and improved scroll position saving for navigation.
  • Visual Enhancements: Add photos for food and seasonal recommendation sections to break up text walls and improve user engagement.
  • Feature Parity: Launch initially planned features, including a map view for all destinations, user favoriting, and an in-app itinerary creator.

WhatNextTomo


What's Next For Me After Shipaton

Shipaton has been an incredible experience. I shipped a ton & grew a ton. It's an adventure that will go into my Core Memory book, and I'm so grateful I had the chance to launch Tomo Japan during this tough period of my life. Looking forward to smoother sailing as I launch my career as a self-taught iOS Engineer.

WhatNextMe


Supplemental Information Created for Shipaton

Covers the technical challenges I faced, the learnings, and how I tackled it. Available in detail on X/Twitter.

Supplemental

Built With

  • firebaseauthentication
  • firebasefunctions
  • firebasestorage
  • firestore
  • googlegemini
  • javascript
  • revenuecat
  • sql
  • supabase
  • swift
  • swiftui
Share this project:

Updates

Submission history