Stridetober 🍂 Walk it
Oct 4 – Oct 31. Most total steps is crowned THE OCTOBER STEP CHAMPION on November 1 — top three split the pot 50/30/20.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Working name (set in src/config/app.ts). See PLAN.md for the full spec and
SCHEMA.md for the data model.
pnpm db:seed reads data/roster.csv (git-ignored; columns are listed in
SCHEMA.md).
• pnpm dev / pnpm build / pnpm lint / pnpm typecheck
• pnpm db:indexes — create indexes
• pnpm db:seed — create indexes and seedREADME 전문 보기 ↗Working name (set in src/config/app.ts). See PLAN.md for the full spec and
SCHEMA.md for the data model.
pnpm install
cp .env.example .env.local # then fill in MONGODB_URI, SESSION_SECRET, COACH_ACCESS_CODE
pnpm db:seed # indexes + school, program, season, distances, roster
pnpm dev
pnpm db:seed reads data/roster.csv (git-ignored; columns are listed in
SCHEMA.md).
pnpm dev / pnpm build / pnpm lint / pnpm typecheckpnpm test — unit tests. src/lib/results/fixtures/ holds real vendor output (Arrow/XM, RACE RESULT, Badger State PDF text, a hand-split division PDF) with other schools' names replaced, run through the parsers and the fetch chain; regenerate a fixture from a fresh download when a vendor changes its format. Two tests on unsanitized local data (data/results/, git-ignored) skip where it isn't present.pnpm db:indexes — create indexes (run again after pulling: new indexes were added Oct 8)pnpm db:seed — create indexes and seedpnpm db:migrate — backfill fields added since the database was seededpnpm db:clear-taps "<meet>" --yes — wipe a meet's taps and gun times (test data)pnpm db:delete-meet "<meet>" --yes — hard-delete a test meet and everything tied to it (races, taps, imports, entries, results, its join sessions, and its venue/course/series if no other meet uses them); dry run without --yes. Deleting a meet in the UI only hides it (soft delete) and keeps its log.MONGODB_URI=… MONGODB_DB=… pnpm db:…COACH_ACCESS_CODE on /join to get a school-level coach
session: create meets, set up races, see/regenerate join codes./join?code=… links, and can
regenerate them from the same sheet./v/<token>) opens a read-only session for one meet./v/<token>) opens a
read-only session for every meet: the meets list (happening now / upcoming /
past) and each meet's live results. Share it once with parents; replacing it
signs those viewers out.Polling follows the race state: 10 s before the start, 2.5 s while in progress (15 s after 90 minutes, with a nudge to mark the race finished), 30 s once finished, and paused while the page is hidden. The meet page refreshes at 5 s while any race is in progress, otherwise 30 s.
Clock sync: devices sample GET /api/time five times and keep the shortest
round trip (src/lib/client/clock.ts). Every tap sends device time + offset;
the server stores both plus the corrected time. POST /api/taps is idempotent
on clientTapId.
A venue is the place (Tuscumbia Golf Course); a course is a layout there, and
a changed route is a new course, because course bests only make sense on the
same layout. The meet form asks for the venue only: the first meet at a venue
creates a course named after it; later meets reuse the venue's current layout
unless the coach picks another or adds a "New layout…". Meets can be edited
(meet page → Edit) to set this on meets created before courses existed. The
record screen's "Compare with · This course" and the "Names and tiles" sheet's "same
course" tag both key off meets.courseId.
When boys and girls JV run together, set up one race with the Mixed category: the lineup offers the whole roster, managers see one list at each checkpoint, and the live results page gets an Everyone / Girls / Boys filter. Import maps each gender's results contest to that same race (places stay per contest), and the CSV's Race column reads "JV Girls" / "JV Boys" so the workbook can split them.
A finish that beats what the runner came in with earns a badge on the results board and the athlete sheet: PR (best at this distance in this program, any course), SB (this season), Course PR (this course layout), Meet PR (this meet in earlier years). Only the strongest shows on the board; the sheet lists the rest and the previous best. Bests come from official results across every season the app knows, so they are only as complete as the history imported. While a finish rests on an app tap the badge is outlined and says "pending official results"; inside two seconds of the old mark it reads "PR?". A first race at a distance earns nothing: a record means beating a previous mark. A meet marked "doesn't count for records" (edit meet; for a short course) still shows its times but never earns or sets a best; the same flag exists per race and per result in the schema.
Meets → the history button → upload the team's split-sheet PDF (one PDF for
years of meets: "Meet, Month Dth YYYY" header, a table per gender with
Mile 1 / Mile 2 / Mile 3.1 segment times, Finish, Place with "JV" for the JV
race). The review lists the meets (ticked unless already in the app), lets
you name each venue (for course bests) and decide who each unknown name is
(an existing athlete, or a new alumni with a graduation year). Everything
lands in one transaction: seasons, meets, races with Mile 1 / Mile 2 /
Finish checkpoints, results with mat splits, alumni and season rosters, and
programs.settings.historyCompleteFromYear moves back to the earliest
season imported.
placesDerived and the board says "division place".
Imported times keep the sheet's precision (whole seconds, tenths,
hundredths) and are shown no finer than that, or than the program's
timePrecision setting (whole seconds for the Crusaders). The record screen
and running race clocks always show tenths.src/lib/results/live.ts).
Only exact and alias name matches are shown live; do the real import after.
Be a good neighbour: let the timing company know before leaning on their feed.pnpm db:migrate backfills fields added since a database was seeded
(races.liveFeed, meets.resultsUrl, schools.viewerLink and the Mixed race category are the latest).