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 UIsrc/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이 만들고 유지 관리함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요