본문으로 건너뛰기
전체 프로젝트
운영 중 · 베타

puny-chat

1:1 메신저에 두 사람 사이에서 사는 작은 도트 생명체가 있습니다. 대화하고, 밥을 주고, 치워 주면서 자라는 걸 지켜봅니다.

데스크톱 브라우저의 puny-chat. 채팅 위 작은 무대에 버디가 있다
무엇
iPhone + 웹 앱 · 한국어 / 일본어 / 영어
시작
2026년
역할
혼자
운영 환경
Railway + MongoDB Atlas, 싱가포르

소개

puny-chat은 딱 두 사람을 위한 메신저이자, 그 사이에서 사는 작은 생명체입니다. 배가 고파지고, 어지르고, 대화할수록 자랍니다. AI 프롬프트도 매일 해야 하는 미션도 없습니다. 둘이 함께 작은 무언가를 돌볼 뿐입니다.

이름만 정하고 게스트로 시작한 뒤, 8자리 초대 코드로 친구 한 명을 초대합니다. 같은 Expo 앱이 iPhone과 웹에서 돌아가고, 웹 앱은 홈 화면에 추가해 알림도 받을 수 있습니다. 50초짜리 데모에서는 로그인 없이 알이 자라는 모습을 볼 수 있습니다.

주요 기능

실시간 채팅
다시 연결되면 놓친 메시지를 채우고, 다시 보내도 한 번만 전달됩니다. 입력 중·읽음·온라인 표시도 있습니다.
키우는 버디
알에서 아기, 어린이, 어른으로. 시간이 지나면 배고파지고 똥도 싸지만, 며칠 잊어도 죽지 않습니다.
쉬운 돌보기
밥그릇이나 똥을 누르거나, 채팅에 “밥”만 보내면 됩니다. 누가 돌봤는지는 대화에 남습니다.
기분이 있는 버디
혼자 두면 춤추고 노래합니다. 어린이가 되면 “오랜만이야!”, “밥 먹었어?” 하고 말을 겁니다.
딱 둘이서
가입 없이 시작하고 Google은 나중에 연결. 초대 코드 하나, 방 하나에 두 명.
어디서나
iPhone이 먼저, 같은 앱을 웹에서도. 홈 화면에 추가하면 푸시도 옵니다. 한국어·일본어·영어, 라이트와 다크.
새 방. 버디가 태어났고 친구를 초대하는 버튼이 있다
8자리 초대 코드
대화 사이에 버디 이벤트가 섞인 채팅
버디 상세. 경험치, 배부름, 청결, 밥주기와 청소 버튼

구성

앱
Expo (React Native) · TypeScript · Expo Router — iPhone과 웹을 코드 하나로
서버
Java 25 · Spring Boot 4 · WebFlux · WebSocket
데이터
MongoDB Atlas
인증 · 푸시
Firebase Authentication · Expo push · Web Push (VAPID)
인프라
Railway (서버) · Cloudflare Workers (웹) · Terraform, state는 R2 · GitHub Actions

메모

버디는 볼 때 계산한다

배고픔과 똥은 저장하지도, 스케줄러로 갱신하지도 않습니다. 누군가 방을 열 때 마지막으로 밥을 주고 치운 시각에서 계산합니다.

트랜잭션 없이 딱 한 번

클라이언트 메시지 ID에 유니크 인덱스를 걸어 다시 보내도 같은 메시지가 돌아옵니다. 조건부 업데이트라 둘이 동시에 밥주기를 눌러도 한 번만 반영됩니다.

읽었는지 보고 푸시

3초가 지나도 아직 안 읽었을 때만 iPhone과 웹에 푸시를 보냅니다. Web Push 암호화와 서명은 추가 라이브러리 없이 JDK만으로 합니다.

작은 앱에는 작은 인프라

처음에는 UR check와 설정을 공유해 Azure에서 월 2,000엔 정도로 돌렸습니다. 지금은 Railway, Atlas 무료 플랜, Cloudflare를 Terraform 설정 하나로 운영합니다.