Tuti는 지친 사람이 아주 낮은 부담으로 일상 밖의 공기를 잠깐 만날 수 있도록 돕는 서비스입니다.
이 서비스는 관광지를 많이 보여주는 앱이 아닙니다. 여행 계획을 세워주는 앱도 아닙니다. Tuti가 해결하려는 문제는 “어디를 갈지 모르는 것”보다 조금 더 앞에 있습니다.
움직이고 싶지만, 움직일 에너지가 부족한 상태
Tuti는 사용자의 현재 상태를 짧게 묻고, 오늘 가능한 정도의 작은 외출을 조용히 제안합니다.
오늘의 에너지에 맞춰, 부담 없는 작은 바깥을 추천하는 상태 전환 서비스
많은 사람들은 쉬고 싶거나 답답할 때 “어딘가 나가면 조금 나아질 것 같다”는 감각을 갖습니다. 하지만 실제로 움직이기까지는 생각보다 많은 결정이 필요합니다.
- 어디를 갈지 정해야 합니다.
- 멀지 않은지 판단해야 합니다.
- 사람이 많은지 확인해야 합니다.
- 가서 무엇을 해야 할지 생각해야 합니다.
- 실패하면 더 피곤해질까 봐 망설이게 됩니다.
Tuti는 이 과정을 줄입니다. 사용자가 여행을 계획하게 만드는 대신, 지금 상태에서 가능한 아주 작은 움직임을 제안합니다.
Tuti의 질문은 “춘천 갈래요?”가 아닙니다.
“두 시간 정도 여유 내볼 수 있을까요?”
목적지는 중심이 아닙니다. 중요한 것은 사용자가 오늘 감당할 수 있는 이동의 크기와, 그곳에서 받을 수 있는 작은 상태 변화입니다.
Tuti는 강한 여행 의지가 있는 사람보다, 일상에서 잠깐 벗어나고 싶지만 실행 에너지가 낮은 사람을 위한 서비스입니다.
- 번아웃을 느끼는 직장인
- 쉬었지만 여전히 답답한 청년
- 무기력해서 계획이 부담스러운 사람
- 혼자 조용히 바깥 공기를 쐬고 싶은 사람
- 여행보다 작은 환기가 필요한 사람
Tuti는 사용자를 분석하거나 평가하지 않습니다. 긴 설문도 요구하지 않습니다. 처음 들어온 사용자는 세 가지 질문만 답합니다.
- 오늘은 어느 정도 움직일 수 있을까요?
- 어떤 공기가 필요할까요?
- 혼자 있고 싶은가요?
그 다음 Tuti는 총 6개의 추천 카드를 보여줍니다. 사용자는 긴 설명을 읽지 않고, 이미지와 짧은 문장 중심으로 오늘 가능한 바깥을 느껴볼 수 있습니다.
사용자의 현재 에너지, 필요한 분위기, 혼자 있고 싶은 정도를 아주 짧게 입력받습니다.
Tuti의 추천 기준은 단순한 거리가 아닙니다. 이동 피로도는 다음 요소를 함께 고려하는 개념입니다.
- 물리적 거리
- 심리적 거리
- 행동 난이도
- 현재 상태
예를 들어 어떤 날은 집 앞 공원이 한계일 수 있고, 어떤 날은 강변이나 근교까지 가능할 수 있습니다. Tuti는 “지금 이 사람이 어디까지 움직일 수 있는가”를 중심으로 추천합니다.
추천 결과는 정보 목록이 아니라 감각 카드로 제공됩니다. 각 카드는 최소한의 정보만 담습니다.
- 짧은 상태 문장
- 이동 시간
- 혼잡도
- 오늘 가능한 정도
상세 화면도 관광 정보 나열을 피합니다. 사용자가 “아, 이런 공기구나”라고 느낄 수 있도록 이미지와 짧은 설명을 중심으로 구성합니다.
기록 화면은 성취나 성장 관리가 아닙니다. 다녀온 장소와 그때의 짧은 감각을 조용히 남기는 공간입니다.
Tuti는 다음을 지향하지 않습니다.
- 여행 일정 생성
- 관광지 정보 과다 제공
- 리뷰와 평점 경쟁
- SNS 피드
- 성취 시스템
- 생산성 관리
- AI 챗봇형 대화
Tuti는 사용자를 더 부지런하게 만들려 하지 않습니다. 사용자의 상태를 조용히 이해하고, 같이 지나가는 서비스가 되고자 합니다.
현재 프로토타입에는 다음 흐름이 구현되어 있습니다.
- 별도 인트로 없이 바로 시작하는 3단계 상태 입력
- 상태 기반 추천 데이터 생성
- 이동 피로도 기반 추천 정렬
- 6개 카드 스와이프 화면
- 추천 상세 화면
- 나의 기록 화면
- PWA 아이콘 및 manifest 설정
- Capacitor 연동을 위한 정적 빌드 설정
- Next.js App Router
- React
- TypeScript
- Zustand
- TanStack Query
- Emotion styled components
- Capacitor 준비 설정
- PWA manifest 및 앱 아이콘
- Docker 기반 개발 환경
처음 실행할 때는 공통 env와 개발 서버 env를 각각 준비합니다.
cp .env.example .env
cp .env.development.example .env.developmentDocker가 설치되어 있다면 다음 명령으로 실행할 수 있습니다.
docker compose -f docker-compose.dev.yml up브라우저에서 아래 주소로 접속합니다.
http://localhost:5080
docker compose -f docker-compose.dev.yml run --rm app sh -lc "pnpm lint"
docker compose -f docker-compose.dev.yml run --rm app sh -lc "pnpm build:web"
docker compose -f docker-compose.dev.yml run --rm app sh -lc "pnpm cap:sync"build:app은 .app-build/에 서버 전용 경로를 제외한 임시 Next.js 프로젝트를 만들고 static export한다. 원본 Route Handler는 변경하지 않으며, 앱 산출물은 .env.production의 NEXT_PUBLIC_API_BASE_URL을 사용한다.
개발용 Docker Compose는 .env.development를 읽어 PostGIS가 포함된 PostgreSQL을 함께 실행합니다. app 컨테이너에서는 db:5432로 접근하고, 호스트에서는 아래 주소로 접근할 수 있습니다.
postgresql://tuti_user:tuti_password@localhost:55432/tuti?schema=public
마이그레이션과 seed 데이터는 app 컨테이너 안에서 실행합니다.
docker compose -f docker-compose.dev.yml run --rm app sh -lc "pnpm db:deploy && pnpm db:seed"배포용 환경 변수는 .env.production에 분리합니다.
cp .env.production.example .env.production배포 빌드의 NEXT_PUBLIC_API_BASE_URL은 Docker Compose build arg로도 필요하므로, 배포 compose를 실행할 때는 production env 파일을 명시합니다.
docker compose --env-file .env.production -f docker-compose.prod.yml up --build -d향후에는 실제 위치 데이터와 LLM 기반 상태 해석을 연결해 추천 품질을 높일 수 있습니다.
- 사용자 입력 문장의 감정 맥락 해석
- 실제 장소 데이터 연결
- 날씨, 시간대, 혼잡도 반영
- 이동 피로도 모델 고도화
- 짧은 영상 기반 카드 UX 강화
- iOS/Android 네이티브 빌드
Tuti의 목표는 더 많은 여행지를 보여주는 것이 아닙니다.
지금 상태의 사람이 아주 작은 에너지로도 잠깐 일상 밖으로 나갈 수 있게 만드는 것