Featured project / Travel platform

Japan47

A community travel guide for Japan’s 9 regions and 47 prefectures — discover destinations, contribute places, and plan trips on web, iOS, and Android.

  • Web
  • iOS
  • Android
  • Travel platform
  • Live
Japan47 website homepage with destination discovery

Overview

What Japan47 is about

What it is

Japan47 is a community travel guide for Japan’s 9 regions and 47 prefectures. Users can discover destinations, contribute places and reviews, and keep track of places they have saved or visited. A shared Django REST API powers both the React website and the native Expo mobile app.

Why it exists

Travel information for Japan is often scattered and not organized around the country’s geographic structure. Japan47 organizes destinations through Region → Prefecture → Place, while combining community contributions, moderation, search, and personal travel planning in one product.

My role

I designed and built Japan47 end to end as a solo engineer, including the domain model, Django REST APIs, React web frontend, Expo iOS/Android client, authentication, media handling, and Docker-based deployment.

I also implemented supporting infrastructure and integrations such as transactional email, analytics, caching, image processing, and mobile store build configuration.

Core experience

How discovery is structured

From national regions down to personal itineraries — the product is built around a clear geographic hierarchy and community contribution.

Regions

Browse Japan through its 9 regions.

Prefectures

Explore all 47 prefectures within the regional hierarchy.

Places & discovery

Browse, search, filter, and open detailed destination pages.

Community contributions

Authenticated users can submit and edit places through a moderated publishing workflow.

Reviews & profiles

Users can write reviews, vote reviews as helpful, follow contributors, and build contribution levels through badges and points.

Personal travel

Save favorites, mark places as visited, organize collections, and create multi-stop itineraries.

Mobile access

A native Expo React Native app provides the core Japan47 experience on iOS and Android using the same backend API.

Media & support

Image uploads, optimized thumbnails, support tickets, and platform-specific optional tipping are integrated into the product.

Web experience

Desktop product views

Selected views from the React web experience — discovery, hierarchy, and place detail.

Japan47 website homepage and discovery view
Japan47 places discovery page
Japan47 region page within the geographic hierarchy

Mobile experience

Available on iOS and Android

A native Expo / React Native client delivers the core Japan47 experience on iOS and Android against the same Django REST API.

Japan47 mobile app on iPhone
Japan47 mobile app on iPad

Technology

Technology stack

An API-first stack: Django REST on the server, React on the web, Expo on mobile.

Frontend

  • React 19
  • Vite
  • React Router
  • JavaScript / JSX
  • Plain CSS
  • Vitest
  • Testing Library

Backend

  • Python
  • Django 6
  • Django REST Framework
  • SimpleJWT
  • drf-spectacular
  • django-filter
  • django-cors-headers
  • django-otp
  • Gunicorn
  • Pillow
  • pillow-heif

Database / Cache

  • PostgreSQL 17
  • Redis 8
  • SQLite (local development)

Mobile

  • Expo 54
  • React Native
  • TypeScript
  • Expo Router
  • expo-secure-store
  • expo-image-picker
  • expo-iap

Infrastructure

  • Docker Compose
  • Nginx
  • Hetzner VPS
  • Docker volumes (static / media)

Services / Integrations

  • Resend
  • Umami Analytics
  • Google Fonts
  • Ko-fi
  • Apple In-App Purchases
  • Expo Application Services (EAS)

Contribution

What I built

End-to-end ownership — from product architecture to store-ready mobile clients and production deployment.

Product architecture

Designed Japan47 as an API-first travel product. One Django REST backend powers both the React website and the Expo mobile application around a Region → Prefecture → Place domain model.

Frontend

Built the React 19 + Vite single-page application with React Router, including discovery, search, authentication, place submissions, reviews, profiles, and personal travel management.

Backend & APIs

Implemented versioned Django REST Framework APIs under /api/v1 with JWT authentication, OpenAPI documentation, moderation workflows, reviews, favorites, collections, itineraries, badges, and support functionality.

Responsive UI

Built a custom CSS responsive system so the web experience adapts cleanly across desktop and smaller screens without relying on a UI framework.

Mobile application

Built a native Expo / React Native client in TypeScript with file-based navigation, secure JWT storage, image uploads, and shared backend APIs for the core travel experience.

Authentication

Implemented email/password JWT authentication with email verification, password reset, refresh-token handling, logout, account deletion, and TOTP 2FA for staff administration.

Deployment

Packaged the production stack with Docker Compose using PostgreSQL, Redis, Django/Gunicorn, the React production build, and Nginx for deployment to japan47.alekspetk.com.

Performance & integrations

Added image processing and thumbnails, Redis caching, frontend prerendering, Resend transactional email, Umami analytics, Ko-fi support links, and iOS in-app tipping.

Try it

Explore Japan47

Open the live website or download the apps from the official stores.