OpenTrailPaper
LilyGO T5S3 4.7" E-Paper PRO용 오픈소스 자전거 컴퓨터 펌웨어, 오프라인 지도·GPX 경로·FIT 기록·블루투스 센서 지원
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗참석 투표 → 자동 팀 나누기 → 경기 결과 입력 → 레이팅 갱신을 하나의 모바일 웹으로 제공한다. 명세: basketball-club-app-spec.md
python -m venv .venv
.venv/Scripts/pip install -r requirements-dev.txt # macOS/Linux: .venv/bin/pip
cp .env.example .env # DATABASE_URL 비우면 sqlite:///./local.db
alembic upgrade head # Windows는 PYTHONUTF8=1 권장
python scripts/seed_members.py --demo # 데모: 운영진 김민수 / PIN 1234
uvicorn app.main:app --reload
.env에 SETUP_TOKEN 설정 → http://localhost:8000/setup?token=...pytestmain(운영) / dev(개발) 브랜치. -pooler 호스트 연결 문자열 사용DATABASE_URL=<main pooled url> alembic upgrade headDATABASE_URL, SECRET_KEY(openssl rand -hex 32), SETUP_TOKEN, SEASONhttps://<도메인>/setup?token=<SETUP_TOKEN> 에서 첫 운영진 생성 (이후 /setup은 404)/admin/members/import 멤버 붙여넣기 → 운영진 지정 → /admin/rating-setup 초기 등급 → 첫 모임 생성kb-sonics, 리전 sin1 = Neon ap-southeast-1 과 같은 싱가포르)main 에 push 하면 Vercel 이 자동 배포DATABASE_URL=<운영 pooled url> alembic upgrade head 먼저 실행 후 pushTEST_DATABASE_URL=<테스트 전용 DB url> pytest (테스트마다 테이블을 지우므로 운영 DB 금지)api/index.py Vercel 진입점
app/config.py 환경변수 + 가중치/기준값 (명세 13장)
app/db.py NullPool 엔진 (서버리스)
app/models.py 데이터 모델 (명세 6장)
app/auth.py 멤버 쿠키 / 운영진 개인 PIN (bcrypt, 5회 실패 10분 잠금)
app/routers/pages.py 멤버 화면: 홈, 투표, 오늘 경기, 기록, 내 기록, /setup
app/routers/admin.py 운영진 화면: 모임, 출석, 팀 짜기, 점수, 게임2 선택, 멤버, 초기 등급, 레이팅, 설정, 작업 기록
app/routers/api.py JSON API (명세 11장, /api/docs)
app/services/balancer.py 전수 탐색 밸런싱 (순수 함수)
app/services/lopsided.py 게임1 일방성 판정
app/services/rating.py openskill 래퍼 + recalculate_from
app/services/stats.py 출석/승률/연승 집계
app/services/ops.py 화면·API 공용 업무 로직
candidates(다시 섞기 후보 5개), candidate_idx, lopsided(판정 결과 — 실제 선택은 game2의 lineup_mode).pin_must_change (임시 PIN 첫 로그인 시 변경 강제), is_owner (관리자)./setup으로 만든 계정이 관리자. 운영진 지정·해제와 PIN 재설정은 관리자만 가능. 그 외 운영 기능은 운영진과 동일.1234(DEFAULT_PIN)로 시작하고, 첫 로그인 때 PIN 변경(1234 재사용 불가) → 내 정보(주/부 포지션·키·몸무게) 확인을 거쳐야 다른 화면 사용 가능. 운영진은 일반 멤버 PIN을 1234로 초기화 가능(운영진 PIN 초기화는 관리자만). 운영진·관리자는 같은 PIN으로 운영진 로그인까지 한 번에 처리. Member.admin_pin_hash → pin_hash 로 변경.position(주, 밸런싱 기준) / position2(부, 선택) / weight_kg(선택, 본인·운영진만 열람, 공개 API 미포함). 일괄 등록은 G/F 형식 지원.member_id와 같을 때만 허용./admin/ratings, 팀 짜기 화면의 "왜 이렇게 나눴나"(운영진 전용)에서만 노출.Attendance.leave_time, "HH:MM") 필수이며 참석 인원에 포함. 출석 체크·팀 짜기·오늘 경기 화면에 ⏰시간 표시.Member.is_guest=True, is_active=False 로 저장되어 이름 선택·멤버 관리·기록에서 제외되고, 실력(1~5, 기본 3)으로 밸런싱에 참여. 같은 이름으로 다시 오면 기록을 이어 쓰고, 운영진이 같은 이름으로 멤버를 추가하면 정식 멤버로 전환.Attendance.proxy_by). 본인이 직접 투표하면 대리 표시 해제. API PUT /api/sessions/{id}/vote 도 운영진이면 대리 처리.