가고 싶은 곳을 모으고, 함께 지도를 만들고, AI로 동선을 완성하세요.
링크를 장소로 바꾸고, 친구와 지도를 만들고, 나만의 코스를 완성해 보세요.
웹 앱 열기 · 로컬에서 실행하기 · 아키텍처 · 기여하기
여행, 카페 투어, 주말 약속을 준비할 때 장소는 여러 SNS 링크와 메신저 대화에 흩어집니다. Moido는 링크를 장소로 바꾸고, 친구와 하나의 지도에 모은 뒤, 실제로 움직일 수 있는 동선까지 연결하는 협업형 장소 플래너입니다.
- 링크에서 장소로 — Instagram·YouTube 등에서 공유한 URL을 분석하고 검색 결과를 확인해 저장합니다.
- 함께 만드는 지도 — 초대 코드로 친구가 참여하고 같은 지도에 장소와 핀을 쌓습니다.
- AI 동선 계획 — 저장한 장소를 선택해 순서, 예상 이동, 추천 체류 시간을 포함한 코스를 만듭니다.
- 나만의 시각 언어 — 모이도 캐릭터 핀, 코스튬, 색상, 배경 스킨으로 지도를 꾸밉니다.
- 프리텐다드 기반 UI — 모든 화면의 한국어 텍스트를 프리텐다드 중심으로 정리해 읽기 편한 경험을 만듭니다.
공유 인텐트 또는 URL 붙여넣기로 장소 후보를 추출하고, 검색 결과와 지도를 확인한 뒤 원하는 지도에 저장합니다. 잘못 추출된 장소는 직접 검색으로 바로 교정할 수 있습니다.
지도 생성, 초대 코드 참여, 장소 저장, 즐겨찾기와 공유가 하나의 협업 공간 안에서 이어집니다. 샘플 지도를 통해 처음 온 사용자도 핵심 흐름을 바로 경험할 수 있습니다.
선택한 지도와 장소를 바탕으로 Gemini가 코스 순서와 설명을 제안합니다. 추천 결과는 장소별 흐름과 예상 체류 시간을 읽기 쉬운 타임라인으로 보여 줍니다.
캐릭터 핀, 코스튬, 프레임 색상, 커버와 배경 스킨을 조합해 지도마다 다른 분위기를 만들 수 있습니다. 다크 프로필 화면에서도 같은 디자인 언어가 유지됩니다.
제품 화면에 사용된 캐릭터 탐색, 지도 스킨, 핀 코스튬 보드입니다. README의 제품 이미지는 이 프로젝트의 모이도 원본만 선별했으며, Figma 보드에 함께 있던 타 서비스 레퍼런스와 구버전 인증 화면은 포함하지 않았습니다.
일상 뒤집기는 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 | 타입·단위·통합·플로우 검증 |
.
├── 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
- 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
git clone https://github.com/JunnnnyWon/moido.git
cd moido
corepack enable
pnpm install --frozen-lockfileKeep 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/.envThe 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:8081export DATABASE_URL='postgresql://USER:PASSWORD@localhost:5432/moido'
pnpm --filter @workspace/db push-safepush-force is intentionally not recommended for normal development because it may apply destructive schema changes.
# Terminal 1
pnpm --filter @workspace/api-server dev
# Terminal 2
pnpm --filter @workspace/moido devThe Expo CLI then provides web, simulator, and device launch options. Kakao is the supported authentication path in the current product.
| 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.
# 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:guestbookWhen the API contract changes, update lib/api-spec/openapi.yaml, regenerate clients, and include generated changes in the same pull request.
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
- Web: https://moido-prototype.netlify.app
- API: https://moido.junnnny.kr
- Full operations guide:
deploy/DEPLOY.md
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.
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.
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.
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.






