Skip to content

Repository files navigation

Moido

가고 싶은 곳을 모으고, 함께 지도를 만들고, AI로 동선을 완성하세요.
링크를 장소로 바꾸고, 친구와 지도를 만들고, 나만의 코스를 완성해 보세요.

Live demo Expo 54 React Native 0.81 TypeScript 5.9 MIT License

웹 앱 열기 · 로컬에서 실행하기 · 아키텍처 · 기여하기

모이도 제품 소개

일상 뒤집기

여행, 카페 투어, 주말 약속을 준비할 때 장소는 여러 SNS 링크와 메신저 대화에 흩어집니다. Moido는 링크를 장소로 바꾸고, 친구와 하나의 지도에 모은 뒤, 실제로 움직일 수 있는 동선까지 연결하는 협업형 장소 플래너입니다.

  • 링크에서 장소로 — Instagram·YouTube 등에서 공유한 URL을 분석하고 검색 결과를 확인해 저장합니다.
  • 함께 만드는 지도 — 초대 코드로 친구가 참여하고 같은 지도에 장소와 핀을 쌓습니다.
  • AI 동선 계획 — 저장한 장소를 선택해 순서, 예상 이동, 추천 체류 시간을 포함한 코스를 만듭니다.
  • 나만의 시각 언어 — 모이도 캐릭터 핀, 코스튬, 색상, 배경 스킨으로 지도를 꾸밉니다.
  • 프리텐다드 기반 UI — 모든 화면의 한국어 텍스트를 프리텐다드 중심으로 정리해 읽기 편한 경험을 만듭니다.

주요 기능

1. 흐름을 끊지 않고 장소 저장하기

공유 인텐트 또는 URL 붙여넣기로 장소 후보를 추출하고, 검색 결과와 지도를 확인한 뒤 원하는 지도에 저장합니다. 잘못 추출된 장소는 직접 검색으로 바로 교정할 수 있습니다.

링크 하나로 장소 저장

2. 친구와 함께 지도 만들기

지도 생성, 초대 코드 참여, 장소 저장, 즐겨찾기와 공유가 하나의 협업 공간 안에서 이어집니다. 샘플 지도를 통해 처음 온 사용자도 핵심 흐름을 바로 경험할 수 있습니다.

함께 만드는 공유 지도

3. 저장한 장소를 AI 코스로 바꾸기

선택한 지도와 장소를 바탕으로 Gemini가 코스 순서와 설명을 제안합니다. 추천 결과는 장소별 흐름과 예상 체류 시간을 읽기 쉬운 타임라인으로 보여 줍니다.

AI로 동선 완성

4. 지도마다 나만의 분위기 만들기

캐릭터 핀, 코스튬, 프레임 색상, 커버와 배경 스킨을 조합해 지도마다 다른 분위기를 만들 수 있습니다. 다크 프로필 화면에서도 같은 디자인 언어가 유지됩니다.

나만의 지도 꾸미기

5. 캐릭터가 있는 디자인 시스템

제품 화면에 사용된 캐릭터 탐색, 지도 스킨, 핀 코스튬 보드입니다. README의 제품 이미지는 이 프로젝트의 모이도 원본만 선별했으며, Figma 보드에 함께 있던 타 서비스 레퍼런스와 구버전 인증 화면은 포함하지 않았습니다.

모이도 비주얼 시스템

제품 화면 한눈에 보기

일상 뒤집기 제품 화면 모음. 모든 휴대폰 화면은 동일한 크기로 정렬되어 있다.

아키텍처

Moido architecture

일상 뒤집기는 pnpm 모노레포입니다. Expo 앱은 OpenAPI 계약에서 생성한 타입 클라이언트를 사용하고, Express API는 Zod로 같은 계약을 검증합니다. Kakao 인증과 Gemini 기반 코스 생성을 연결하고, Drizzle을 통해 PostgreSQL에 데이터를 저장합니다.

계층 기술 역할
클라이언트 Expo 54, React Native 0.81, Expo Router 6 iOS·Android·Web UI, 라우팅, 알림, 위치, 공유 인텐트
지도 react-native-maps, Leaflet 네이티브·웹 지도 경험
API Express 5, Zod/OpenAPI, Pino 인증, 지도, 장소, 코스, 초대, 약속, 방명록
데이터 PostgreSQL 17, Drizzle ORM 관계형 데이터와 스키마 관리
AI Google Gemini 장소 기반 코스 생성
연동 Kakao, Expo Push OAuth·프로필 동기화와 푸시 알림
배포 Netlify, Docker Compose, Caddy 정적 웹 배포, API·DB 런타임, DNS-01 TLS
품질 TypeScript 5.9, Vitest, Supertest, Playwright Core 타입·단위·통합·플로우 검증

Workspace

.
├── artifacts/
│   ├── moido/                 # Expo / React Native application
│   ├── api-server/            # Express API
│   └── mockup-sandbox/        # Design prototyping workspace
├── lib/
│   ├── api-spec/              # OpenAPI source and Orval config
│   ├── api-zod/               # Generated Zod contracts
│   ├── api-client-react/      # Generated typed React Query client
│   ├── db/                    # Drizzle schema and database tools
│   └── integrations-gemini-ai/
├── deploy/                    # Docker, Caddy, and deployment guide
├── docs/images/               # Curated Figma-derived repository visuals
└── scripts/                   # Workspace and Netlify build helpers

Getting started

Prerequisites

  • Node.js 22.16+
  • pnpm 10.33.0 via Corepack
  • PostgreSQL 17 for local API development
  • Kakao developer credentials for sign-in
  • Gemini API credentials only when testing AI route generation

Install

git clone https://github.com/JunnnnyWon/moido.git
cd moido
corepack enable
pnpm install --frozen-lockfile

Configure the environment

Keep credentials in your shell, secret manager, or an ignored local .env; never commit real values. deploy/.env.example is the canonical deployment template.

cp deploy/.env.example deploy/.env
chmod 600 deploy/.env

The local app defaults to http://localhost:5000 for the API and http://localhost:8081 for web. Override them when needed:

export EXPO_PUBLIC_API_URL=http://localhost:5000
export EXPO_PUBLIC_WEB_URL=http://localhost:8081

Prepare the database

export DATABASE_URL='postgresql://USER:PASSWORD@localhost:5432/moido'
pnpm --filter @workspace/db push-safe

push-force is intentionally not recommended for normal development because it may apply destructive schema changes.

Run API and app

# Terminal 1
pnpm --filter @workspace/api-server dev

# Terminal 2
pnpm --filter @workspace/moido dev

The Expo CLI then provides web, simulator, and device launch options. Kakao is the supported authentication path in the current product.

Environment variables

Variable Required Purpose
DATABASE_URL API PostgreSQL connection string
PUBLIC_API_URL Deploy Public API origin used for OAuth callbacks
PUBLIC_API_DOMAIN Deploy API host used by Caddy
ALLOWED_REDIRECT_ORIGINS Deploy Explicit OAuth redirect allowlist
CORS_ORIGINS Deploy Browser origin allowlist
KAKAO_REST_API_KEY Auth Kakao OAuth application key
KAKAO_CLIENT_SECRET Auth Kakao OAuth client secret
AI_INTEGRATIONS_GEMINI_API_KEY AI Gemini route generation; AI endpoints return 503 when unavailable
AI_INTEGRATIONS_GEMINI_BASE_URL No Gemini endpoint override
EXPO_PUBLIC_API_URL App API base URL embedded in the client
EXPO_PUBLIC_WEB_URL App Public web origin embedded in the client
PG_POOL_MAX No PostgreSQL connection pool size
WAITING_API_URL, WAITING_API_KEY No Optional waiting-room integration
CF_API_TOKEN TLS Cloudflare DNS-01 certificate automation
LOG_LEVEL No Pino logging level

See deploy/.env.example for placeholders and deploy/DEPLOY.md for the production checklist.

Development commands

# Type-check every library and application
pnpm run typecheck

# Build all affected workspaces
pnpm run build

# Unit and integration tests
pnpm --filter @workspace/moido test
pnpm --filter @workspace/api-server test

# Regenerate the typed API client after changing OpenAPI
pnpm --filter @workspace/api-spec codegen

# Selected browser flow checks
pnpm --filter @workspace/moido test:e2e:layout
pnpm --filter @workspace/moido test:e2e:appointment
pnpm --filter @workspace/moido test:e2e:guestbook

When the API contract changes, update lib/api-spec/openapi.yaml, regenerate clients, and include generated changes in the same pull request.

Deployment

The web build is exported by Expo and published through Netlify. The API and PostgreSQL run with Docker Compose behind Caddy, which provisions TLS with Cloudflare DNS-01.

Browser → Netlify CDN → Expo Web
                    ↘ HTTPS :9443 → Caddy → Express API → PostgreSQL
                                                    ↘ Kakao / Gemini / Expo Push

Security

Do not report vulnerabilities in a public issue. Follow SECURITY.md, keep OAuth/API credentials out of commits, and use placeholders in examples. The repository ignores generic .env files and local deployment state by default.

Contributing

Read CONTRIBUTING.md before opening a pull request. Keep changes focused, update the API contract and generated clients together, and run the relevant type checks and tests.

Design assets

Repository visuals were exported from the Moido Figma source and reviewed frame by frame. The node manifest and transformation policy live in docs/images/README.md. External moodboard references were deliberately excluded.

License

Code is available under the MIT License. Moido names, logos, characters, and product artwork remain project brand assets and are not granted separate trademark rights by the software license.

About

Collaborative map planner for shared places and AI-powered routes.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages