RunCheck
빈 체육관에 가는 일 없게, RunCheck로 누가, 어디서, 언제 뛰는지 미리 확인한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Next.js 14 (App Router) + Prisma + Postgres (Neon). Интерфейс на четырёх языках: русский, украинский, польский, английский.
Адреса страниц начинаются с языка: /ru, /uk, /pl, /en (например, /pl/sections). Адрес без языка ведёт
на язык из настроек браузера (или на польский), выбор запоминается в cookie lang. Тексты интерфейса — в src/i18n
(ru.ts задаёт структуру, остальные языки повторяют её). Данные (названия матчей и занятий, адреса, цены) хранятся
на языке источника, обычно по-польски.
Локальный сайт и агент сбора работают с той же облачной базой, что и опубликованный сайт (адрес в .env).
npm install
npm run setup # создаёт базу prisma/dev.db и заливает демо-данные
npm run dev # http://localhost:3000
pending и не показываются на сайтеСтраница /admin (логин admin, пароль из переменной ADMIN_PASSWORD в .env): заявки из формы со статусом
pending, кнопки «Опубликовать» и «Отклонить». Без ADMIN_PASSWORD админка закрыта.
Инструкция: DEPLOY.md (Vercel + база Postgres на Neon).
Источники (официальные страницы расписаний клубов) описаны в ingest/sources.ts, площадки в ingest/venue-data.ts.
npm run venues:sync # добавить/обновить реальные площадки в таблице Venue
npm run ingest:fetch # проверить robots.txt и скачать тексты страниц в ingest/out/pages/
# выписать матчи в ingest/out/extracted/<id>.json по правилам ingest/EXTRACTION.md (можно попросить Claude в чате)
npm run ingest:city # городской каталог секций sport.um.warszawa.pl (≈40 минут в первый раз, дальше из кэша)
npm run ingest:dry # проверить выписанное и показать, что будет записано
npm run ingest # записать в базу (повторный запуск обновляет, а не дублирует)
npm run ingest:clear-demo # показать демо-данные из seed.ts
npm run ingest:clear-demo -- --yes # удалить их
Секции (регулярные занятия) хранятся в таблице Activity и показываются на странице «Секции» (/sections).
Городской каталог разбирается программой (ingest/city-catalog.ts): контакты не сохраняются, ссылка ведёт на страницу занятия.
Секции для пенсионеров на сайт не берутся (правило isSeniorOnly в ingest/activities.ts); ранее записанные скрыты статусом hidden.
Записываются только домашние матчи с объявленным временем. Каждый матч сверяется с текстом страницы по дословной цитате.
У события сохраняется ссылка на официальный источник (sourceUrl), она видна на странице события.
Берутся с Wikimedia Commons (олимпийские пиктограммы, в основном общественное достояние, несколько файлов CC BY / CC BY-SA)
скриптом npx tsx scripts/pictograms.ts: он проверяет лицензию каждого файла, кладёт пиктограммы в public/sports/,
делает из бегуна иконку сайта и записывает авторов в src/lib/pictograms.ts (они показаны на странице «Конфиденциальность и источники»).
prisma/schema.prisma: модель данных (Sport, Venue, Organizer, Event)prisma/seed.ts: демо-данные (вымышленные, координаты приблизительные)src/lib/dates.ts: работа со временем Варшавы (Europe/Warsaw)src/app: страницы; src/components: фильтры и строка событияpostgresql, указать DATABASE_URL)