TL;DR

  • Ani-Sho는 계정이나 개인정보 수집 없이 무작위 팬과 애니메이션을 토론하는 무료·안전한 오픈소스 공간임.
  • 사용자는 아바타와 이름을 고른 뒤 무작위로 매칭되며, 게스트 세션은 httpOnly 쿠키에 저장되고 일주일 또는 직접 전환할 때까지 유지됨.
  • 새 기능은 계정 없이 작동하고 개인정보를 수집하지 않으며 무료로 제공되어야 하고, API 키 없이 새로 복제한 저장소에서 실행되어야 함.
  • 현재 매칭 대기열·채팅·방 상태는 서버 메모리에 저장되며, 서버리스 환경에서는 인스턴스 간 상태가 공유되지 않을 수 있음.
  • 프로젝트는 Node.js 20 이상이 필요하고 환경 변수나 API 키 없이 실행되며, 라이선스는 MIT임.

Ani-Sho

  • Ani-Sho는 애니메이션을 이야기하는 무료·안전한 공간이며, 아바타를 고르면 무작위 팬과 연결되어 토론할 수 있음.

목표

  • 전체 생태계를 계정 없이 운영하는 것이 핵심 목표임. 가입, 이메일, 비밀번호, Google 계정 연결 없이 사진을 고르고 이름을 받은 뒤 참여하는 방식임.
  • 사용자가 계정을 만들 필요가 없다는 원칙은 추가되는 모든 기능에 적용됨.

승인 기준

  • 애니메이션 토론을 더 재미있고 친근하며 누구나 환영받는 경험으로 만드는 기능이 승인 기준에 부합함.
  • 조정, 신고, 차단, 스팸 방지 등 사용자 안전을 지키는 기능이 대상임.
  • 계정 없이 작동하고 개인정보를 수집하지 않으며 모든 사용자에게 무료로 제공되고, API 키 없이 새로 복제한 저장소에서 실행되는 변경 사항이 우선 대상임.
  • 가입, 로그인, 유료 장벽, 광고, 추적 기능을 추가하는 변경 사항은 거부 대상임.

Discord 참여

  • 질문, 아이디어, 버그 보고 또는 파워 스케일링 논쟁을 위해 Discord에 참여할 수 있음.
  • 기능을 만들기 전에 작동 방식에 관해 묻거나 아이디어를 제안하는 가장 빠른 경로임.

아티스트 안내

  • 애니메이션 아티스트가 사용자 프로필 사진으로 사용할 오리지널 작품을 만들도록 제안함. 모든 게스트가 대화 중 자신을 나타낼 이미지를 고르므로 작품이 커뮤니티의 얼굴이 됨.
  • 제출 기준은 다음과 같음.
  • JPG 또는 PNG 형식의 정사각형 이미지이며 크기는 512 x 512 이상임.
  • 본인이 만든 오리지널 캐릭터여야 하며, 기존 애니메이션 캐릭터나 트레이싱·복제 작품은 허용되지 않음.
  • Discord에 공유하거나, 파일을 public/avatars에 추가하고 src/lib/avatars.ts에 한 줄을 추가하는 풀 리퀘스트를 제출함.
  • 크레딧에 표시할 이름을 함께 전달함.
  • 제출자는 작품의 창작자 본인임을 확인하고 저장소 라이선스에 따라 프로젝트에서 사용할 수 있도록 허가함. 채택된 작품의 아티스트는 프로젝트에 크레딧으로 표시됨.

검토 중인 아이디어

  • 최고의 토론자를 커뮤니티가 선정하는 대회
  • 아티스트 제작 아바타 추가
  • 게스트용 신고, 차단, 요청 빈도 제한 등 안전 도구
  • 새로운 작품과 더 나은 토론 질문 등 주제 확대
  • 서버리스 호스팅에서도 매칭이 안정적으로 작동하도록 공유 방 저장소 도입
  • 작업을 맡으려면 같은 기능을 두 사람이 동시에 만들지 않도록 먼저 Discord에서 의사를 밝혀야 함.

빠른 시작

  • Node.js 20 이상이 필요하며 환경 변수와 API 키는 필요하지 않음.
  • https://github.com/maxiujin/anibate.git 저장소를 복제하고 프로젝트 디렉터리에서 npm install과 npm run dev를 실행함.
  • 브라우저에서 http://localhost:3000을 열어 실행 결과를 확인함.
  • 한 컴퓨터에서 전체 매치를 시험하려면 서로 다른 브라우저 두 개를 사용하거나 일반 창과 비공개 창을 열어 각각 게스트로 입장한 뒤 양쪽에서 Enter gauntlet을 누름.

작동 방식

  • 계정 대신 게스트를 사용함. 입장하면 선택한 이름 및 아바타와 함께 임의 토큰을 httpOnly 쿠키에 저장하며, 쿠키는 일주일 동안 또는 Switch를 누를 때까지 유지됨. 관련 파일은 src/lib/guest.ts임.
  • 기본 프로필 이미지는 public/avatars에 있으며 목록은 src/lib/avatars.ts에 있음.
  • 매칭 대기열, 방, 메시지는 서버 메모리에 보관하며 관련 파일은 src/lib/forum-store.ts임. 브라우저는 /api/gauntlet을 2.5초마다 폴링함.
  • 토론 주제 열 개는 src/lib/topics.ts에 정의되어 있음.

프로젝트 구성

  • src/app/page.tsx: 랜딩 페이지와 gauntlet 셸
  • src/app/api/guest/route.ts: 게스트 세션 시작 및 종료
  • src/app/api/gauntlet/route.ts: 참가, 나가기, 메시지 전송, 상태 폴링
  • src/components/: 게스트 선택기, 헤더 칩, gauntlet UI
  • src/lib/: 게스트 세션, 아바타, 주제, 메모리 내 저장소
  • public/avatars/: 아바타 이미지

스크립트

  • npm run dev: 로컬 개발 서버 실행
  • npm run build: 프로덕션 빌드
  • npm run start: 프로덕션 빌드 제공
  • npm run lint: ESLint 실행

기여

  • 저장소를 포크하고 브랜치를 만든 뒤 변경 사항을 적용함.
  • npm run lint와 npm run build를 실행하고, main을 대상으로 풀 리퀘스트를 열어 변경 사항이 목표에 어떻게 기여하는지 설명함.
  • 병합된 풀 리퀘스트는 라이브 사이트에 자동 배포됨.
  • 시작하기 좋은 변경 사항은 src/lib/topics.ts에 주제를 추가하거나, 정사각형 이미지를 public/avatars에 넣고 src/lib/avatars.ts에 한 줄을 추가하는 작업임.
  • 비밀 정보를 커밋하지 않아야 함. 앱에는 비밀 정보가 필요하지 않으며 자세한 내용은 .env.example에 있음.

알려진 제한 사항

  • 상태가 메모리에 있으므로 서버가 재시작되면 방과 채팅이 초기화됨.
  • 서버리스 호스팅에서는 별도 서버 인스턴스끼리 메모리를 공유하지 않으므로 두 플레이어가 서로 다른 인스턴스에 배정되어 상대를 보지 못하는 경우가 있음. 공유 저장소로 해결할 수 있으며, 로컬 개발이 키 없이 계속 작동하는 조건이라면 환영하는 기여임.
  • 게스트 세션에는 아직 조정 기능과 요청 빈도 제한이 없음.

라이선스

  • 라이선스는 MIT이며, @maxiujin이 만들고 유지 관리함.