업데이트 내역

최신순 변경 이력입니다. 프로젝트에 실제로 포함된 내용만 기록합니다.

이 변경 이력은 페이지 소스에서 수동으로 관리합니다. 저장소는 릴리스 날짜를 기록하지 않으므로 날짜는 표시하지 않으며, 항목에는 순서만 있습니다. 앱이 실제로 추적하는 두 날짜는 내장 게임 데이터 스냅숏 2026-09-16(푸터에도 표시)과 브롤러 로스터 동기화 시각(현재 2026. 09. 15.)입니다.

1.1.0계정 이메일 주소와 인증

현재 버전

가입에 이메일 주소가 필요해졌고, 계정이 만들어지기 전에 주소를 인증합니다. 운영자용 계정 목록도 추가되었습니다.

  • 가입하면 6자리 코드가 주소로 발송되고, 코드를 입력해야 계정이 만들어집니다. 그 전에는 users 테이블에 행이 없습니다.
  • 주소 변경에도 코드가 필요하며, 먼저 계정 삭제와 동일한 본인 확인을 요구합니다. 변경 후에는 이전 주소로 알림이 가고 다른 기기는 모두 로그아웃됩니다.
  • 이전에 만들어진 계정에는 주소가 없으며, 그대로 사용할 수 있고 아무것도 제한되지 않습니다.
  • 제3자 로그인은 제공자가 알려준 주소를 사용하며, 제공자가 인증했다고 밝힌 경우에만 인증됨으로 표시합니다.
  • 발송 한도: 주소당 하루 3통, 브라우저당 하루 3개의 서로 다른 주소, 사이트 전체로 시간당 40통.
  • 운영자용 계정 목록 추가: 주소는 기본적으로 가려지고 공개할 때마다 기록되며, 비활성화·비밀번호 강제 재설정·삭제가 가능합니다. 비밀번호는 표시되지 않습니다. 데이터베이스에 평문 비밀번호가 없기 때문입니다.
  • 계정 삭제 시 아바타, 프로필 설정, 채팅 메시지, 인증 대기 행도 함께 삭제됩니다. 이전에는 모두 남아 있었습니다.

1.0.0모집 게시판

다섯 개의 게시판이 각각 글·필터·글별 채팅을 갖추고, 다른 모든 기능과 같은 로컬 데이터베이스로 동작합니다.

  • 팀·친구·클럽 모집 게시판에 자유 게시판과 테마 게시판을 더한 다섯 개.
  • 글마다 채팅 스레드가 붙으며, 메시지를 보내면 글이 게시판 맨 위로 올라갑니다.
  • 모집 글은 모드, 트로피 하한, 최소 경쟁전 티어, 언어를 지정할 수 있고, 각 게시판은 모드·트로피 하한·언어·상태로 필터링됩니다.
  • 새 글 양식의 최소 티어 필드는 이 인스턴스가 실제로 관측한 경쟁전 티어 이름으로 채워지므로, 더 이상 존재하지 않는 티어가 나오지 않습니다.
  • 글을 쓰려면 계정이 필요합니다. 작성자는 모집이 끝난 글을 닫거나 아예 삭제할 수 있습니다.
  • 계정을 삭제해도 게시판 글은 남으며, 행에는 작성자 이름이 기록됩니다 — 개인정보 처리방침을 참고하세요.

0.4.0실제 경쟁전·프레스티지·명성 필드

공식 API가 본 사이트가 추정해 오던 여러 필드를 사실은 제공하고 있었습니다. 그 추정치는 대체 수단으로 남기지 않고 삭제했습니다.

  • 경쟁전 티어 인덱스, 티어 이름, elo, 시즌 id를 시즌·역대 최고 기록과 함께 플레이어별로 저장합니다.
  • 총 프레스티지 레벨, 명성, 명성 등급을 실측값으로 저장하고 표시합니다.
  • 브롤러별 프레스티지, 현재·최장 연승, 장착 스킨을 색인합니다.
  • 경쟁전 티어 라벨 표는 하드코딩 대신 관측한 프로필에서 학습하므로, Supercell이 이름을 바꿔도 낡은 라벨이 남지 않습니다.
  • 장착 스킨은 플레이어별·브롤러별로 기록되며, 스킨 사용률 랭킹이 집계하는 것이 바로 이 데이터입니다.
  • 기존 설치본에는 명시적인 ALTER 단계로 새 컬럼을 적용하므로, 업그레이드해도 데이터베이스를 버릴 필요가 없습니다.
  • 「경쟁전 점수는 추정치」라는 공지는 「경쟁전 점수·프레스티지·명성을 API에서 직접 가져옵니다」로 교체되었고, 수정 전에 시드된 설치본도 제자리에서 갱신됩니다.

0.3.0로스터를 공식 API에서 동기화

내장 브롤러 목록의 수동 관리를 중단했습니다. 동기화 스크립트가 실시간 로스터를 가져와 앱이 임포트하는 생성 파일을 만듭니다.

  • npm run sync가 공식 API에서 로스터를 가져와 내장 데이터 파일을 다시 생성합니다.
  • 모든 브롤러가 실제 스타 파워·가젯·하이퍼차지·기어를 실제 id와 이름으로 갖습니다.
  • 희귀도와 클래스는 API가 제공하지 않는 유일한 필드입니다. 별도 표에서 이름으로 찾고, 없으면 추측하지 않고 미상으로 둡니다.
  • 그 표보다 새로운 브롤러는 중립 회색으로 표시되고 희귀도 집계에서 제외되며, 분류가 필요한 항목은 검사 스크립트가 나열합니다.
  • 브롤러·프로필 아이콘·클럽 배지·맵 아트는 공개된 Brawlify CDN에서 제공되며, 자산이 없으면 이니셜 칩으로 대체합니다.

0.2.0실시간 API 연동과 갱신 큐

데모 데이터를 읽던 사이트가 공식 API를 지속적으로 폴링하며, 본 것을 자체 색인으로 유지하는 구조가 되었습니다.

  • 하나의 API 모듈이 공식 엔드포인트를 감쌉니다. 페이지는 서비스 계층과만 통신하며, 값이 API·로컬 캐시·데모 생성기 중 어디서 왔는지 보고됩니다.
  • 플레이어와 클럽 프로필은 SQLite에 잠시 캐시되어 API 장애 시 그곳에서 제공되므로, 속도 제한으로 페이지가 비지 않습니다.
  • 우선순위 갱신 큐가 북마크·최근 조회 계정을 적극적으로, 나머지는 느리게 폴링하며, 공유 토큰 버킷이 전체 프로세스를 API 속도 제한 안에 유지합니다.
  • API는 항상 최근 25경기만 반환하므로 전투 기록은 가져올 때마다 보관되고, 티어 리스트가 읽는 일별 집계로 합산됩니다.
  • 토큰과 함께 처음 시작하면 8개국 공식 랭킹을 순회해 이름 검색이 즉시 쓸 수 있는 자료를 갖추게 합니다.
  • 백그라운드 동기화는 상주 서버에서는 프로세스 내에서 돌고, 인터벌을 유지할 수 없는 플랫폼에서는 외부 스케줄러가 cron 엔드포인트로 트리거합니다.
  • 태그별 쿨다운이 있는 수동 갱신과, 색인 크기·큐 깊이·최근 API 오류를 보고하는 상태 엔드포인트 — IP에 묶인 토큰 실패에는 명시적인 힌트가 나옵니다.
  • 토큰 설정 전에 시드된 데모 데이터는 실제 토큰이 나타나는 순간 전부 삭제됩니다.

0.1.0첫 빌드

사이트의 뼈대: 라우팅, 번역, 컴포넌트 어휘, 로컬 데이터베이스.

  • 로케일 접두사가 붙은 App Router 페이지(번체 중국어·간체 중국어·영어·일본어). 로케일은 middleware가 쿠키, 다음으로 Accept-Language에서 결정합니다.
  • 소수의 공용 UI 프리미티브와 손으로 만든 SVG 차트 5종 — 컴포넌트 라이브러리도 차트 라이브러리도 없습니다.
  • 다크·라이트 테마는 CSS 변수만으로 구동되며, 선택은 브라우저에 저장되어 첫 렌더링 전에 적용됩니다.
  • 플레이어·클럽 페이지, 태그·이름 검색, 티어 리스트, 랭킹, 각종 계산기, 맵 로테이션.
  • Node 내장 바인딩의 SQLite에 계정·북마크·조회 기록과 플레이어·클럽 디렉터리를 저장.
  • 이메일이 필요 없는 계정: 사용자 이름, scrypt로 해시한 비밀번호, 세션 쿠키.
  • API 토큰이 없어도 사이트 전체를 둘러볼 수 있는 결정적 데모 모드.

업데이트 내역 · BrawlPeek