Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
425 commits
Select commit Hold shift + click to select a range
9464f2d
Ukryj Cup, popraw mapę, szukanie adresu i ekran gry
claude Jun 10, 2026
f974935
Wspólna karta gry, format NvN, ładniejsze filtry sportów
claude Jun 10, 2026
4ae7ddc
Dołączanie jako bramkarz (piłka nożna)
claude Jun 10, 2026
b16bd3f
Publiczne mecze dla niezalogowanych, moje gry na głównej, mniej filtrów
claude Jun 10, 2026
1350dfd
Ukryj Cup wszędzie; pozwól uczestnikom zapraszać gości
claude Jun 10, 2026
6986a11
Odwołane mecze tylko w historii; lepszy opis na głównej
claude Jun 10, 2026
d87f38c
Linki www w nowej karcie; usuń flagę z atrybucji mapy
claude Jun 10, 2026
a92bb87
Mock usunięty, filtr czasu, zaproszenia emailem, tryb invite-only
claude Jun 10, 2026
f465fb9
Audit fixes: mobile, dialogi, spójność UI, ikony kopiowania
claude Jun 10, 2026
b7b4e9e
Map: multi-select sport/type filters, remove Rezerwacja pill, filter …
claude Jun 11, 2026
9e5c36d
Audit fixes: slate-* colors, error state in moje-gry, homepage map te…
claude Jun 11, 2026
3411457
Event UX: relation-aware CTA, clearer organizer settings, better addr…
claude Jun 11, 2026
563d316
Landing: Mapa boisk CTA, gate organizer settings behind Edytuj, fix i…
claude Jun 11, 2026
30e266c
Hide game alerts + SMS features behind flags; add BACKLOG.md
claude Jun 11, 2026
424dacb
fix(seed): replace ON CONFLICT with WHERE NOT EXISTS for event_partic…
claude Jun 11, 2026
86e129e
feat(hero): remove stats bar, keep Mapa boisk CTA button
claude Jun 11, 2026
11b9cf1
Merge branch 'claude/kind-ptolemy-9Mvh0'
claude Jun 11, 2026
2a4deb6
fix(dashboard): stack CTA buttons vertically on mobile, add Znajdź grę
claude Jun 11, 2026
1f729cc
fix(hero): consistent button style, always side-by-side layout
claude Jun 11, 2026
1dab4b8
fix(events): include event_participants in getMyEvents and getMyParti…
claude Jun 11, 2026
60c4cbc
fix(EventListCard): remove duplicate sport emoji, show full title whe…
claude Jun 11, 2026
410de16
copy(hero): change headline to "Twoja gra zaczyna się tutaj"
claude Jun 11, 2026
ba87929
copy(hero): "Mecze, boiska i gracze w Twojej okolicy"
claude Jun 11, 2026
c2fed52
ui: uproszczenie kart i home — brak badge relacji, mapa zamiast kafelków
claude Jun 12, 2026
f6895bc
ui(home): usunięcie dublujących się sekcji i odchudzenie strony głównej
claude Jun 12, 2026
732b7cf
feat(event): potwierdzenie zapisu z wyborem roli; Edytuj tylko dla wł…
claude Jun 12, 2026
88e6493
ui(hero): usunięcie CTA z landing page dla niezalogowanych
claude Jun 12, 2026
69c0bd9
ui: odchudzenie dashboardu i panele zarządzania tylko dla organizatora
claude Jun 12, 2026
fc8ec6c
data: seed boisk siatkówki plażowej — powiat poznański (16 obiektów)
claude Jun 12, 2026
8a68b8b
data: uzupełnienie seed plażówki — GPS, telefony, godziny, rezerwacje
claude Jun 12, 2026
f9929d0
fix: poprawka UUID w seed plażówki (bv → bb, poprawne hex)
claude Jun 12, 2026
85e0d1b
feat: venue seeds, GPS fixes, photo+coord enrichment workflows
claude Jun 12, 2026
f68be80
fix: poprawka filtrów PostgREST — not.is.null zamiast not.field=is.null
claude Jun 13, 2026
d19edfe
fix: wielowariantowe geocodowanie adresów (fallback dla brakujących n…
claude Jun 13, 2026
c86b0cf
fix: pomiń geocodowanie słabych adresów (tylko dzielnica/miasto bez u…
claude Jun 13, 2026
9c2c496
feat: Google Places photo proxy + photo_reference w DB
claude Jun 13, 2026
5d19400
fix: graceful fallback gdy migracja 038 nie zaaplikowana
claude Jun 13, 2026
ffd9fe1
fix: odrzuć wielokrotnie reużywane place_id (generyczne wyniki Google)
claude Jun 13, 2026
29fcc8a
feat: grupowanie współlokalizowanych obiektów w jeden pin z multi-emoji
claude Jun 13, 2026
66285bd
fix: wire photo_reference/photo_url from DB to frontend display
claude Jun 13, 2026
632910d
fix: replace for...of Map iteration with forEach for TS compatibility
claude Jun 13, 2026
d9b9fa9
feat: add venue moderation panel at /admin/moderacja
claude Jun 13, 2026
f197b6a
fix: use inline admin check in moderacja to avoid premature access de…
claude Jun 13, 2026
e4352d9
fix: always show satellite photo until admin approves venue photos
claude Jun 13, 2026
5c254ae
feat: Tinder-style venue review queue at /admin/przeglad
claude Jun 13, 2026
613bb12
feat: add duplicate suggestions to review queue + fix mobile admin menu
claude Jun 13, 2026
efb6ac5
fix: replace Set spread with Array.from for ES5 compat
claude Jun 13, 2026
629e538
chore: add bulk moderation SQL script
claude Jun 13, 2026
45595a5
fix: show all sports emojis on map pins + sync map_visibility with mo…
claude Jun 13, 2026
2956c0f
remove: Google Places photo proxy endpoint
claude Jun 14, 2026
a8a0715
polish: redesign event card for a more professional feel
claude Jun 14, 2026
da6f85d
asset: add custom beach volleyball icon (ball on a beach scene)
claude Jun 14, 2026
a07c436
asset: swap hand-drawn ball for clean Tabler volleyball icon
claude Jun 14, 2026
718dcd3
asset: use 🏐 volleyball emoji on beach scene per feedback
claude Jun 14, 2026
dc05bc5
asset: colorful FIVB-style volleyball (blue/yellow/white pinwheel) on…
claude Jun 14, 2026
3478673
Redesign home: games-first hero, rich game cards, how-it-works
claude Jun 14, 2026
5cca84c
Merge branch 'claude/kind-ptolemy-9Mvh0'
claude Jun 14, 2026
308c39d
Redesign event detail page: hero, player count block, sticky join bar
claude Jun 14, 2026
a84daef
fix hero: remove trust bar, link 'Znajdź grę' to /wydarzenia
claude Jun 14, 2026
5eba9e7
Redesign /wydarzenia: new browse UI with sport+date chips, compact cards
claude Jun 14, 2026
6f9d59d
Event detail: participants list, move 'O meczu' down, fix sticky bar;…
claude Jun 14, 2026
db35dbb
fix: add vercel.json with rootDirectory=frontend
claude Jun 14, 2026
247d98e
Hide organizer panels after event starts; fix map pin shift on popup
claude Jun 14, 2026
a8a93aa
Use EventBrowseCard uniformly on home feed and moje-gry; add Wszystki…
claude Jun 14, 2026
3ccf1fb
Add admin map visibility toggle to normal venue page
claude Jun 14, 2026
58e27f3
Tighten event UI: clickable venue, compact cards, smaller join/counter
claude Jun 14, 2026
9916bf0
Unify terminology, smarter filters, hide results/comments from guests
claude Jun 14, 2026
b6696c0
Fix venue card/pin navigation: invalid HTML and missing fieldId fallback
claude Jun 14, 2026
ca08ce9
Fix invite link, unify visibility, tighten home layout
claude Jun 14, 2026
2d5cba2
Redesign mobile menu as uniform list; hide "Stałe gierki" behind flag
claude Jun 14, 2026
3c610a5
Premium graphic home page — sport-field motifs, no flat green
claude Jun 14, 2026
1aa43b1
Simplify visibility to public/private, drop "Blisko mnie", goalkeeper UX
claude Jun 14, 2026
0227853
Home: remove sport showcase, unify logged-in/out hero, sharpen copy
claude Jun 14, 2026
7780ae9
Events page: use shared Header hamburger, drop filter/plus icons and …
claude Jun 14, 2026
37fb50f
Hero: richer combined-sport background motifs, bigger floating balls
claude Jun 14, 2026
9506ad5
Add admin-delete-events policy + test-user seed script
claude Jun 14, 2026
b383842
Hero: replace SVG court noise with photo background + gradient overlay
claude Jun 14, 2026
9d592e5
Hero: replace SVG court noise with photo background + gradient overlay
claude Jun 14, 2026
f247d65
Hero: clean gradient design, no decorations, unified logged-in/out, t…
claude Jun 14, 2026
5aefcf2
Merge clean hero redesign + admin delete policy to master
claude Jun 14, 2026
d4be132
Hero: remove CTA buttons under headline in both variants
claude Jun 14, 2026
9213b77
Merge: remove hero CTA buttons
claude Jun 14, 2026
3e82f73
Hero: restore contained pitch+balls motif (fixes desktop drift), pres…
claude Jun 14, 2026
f571eec
How it works: clarify invite-by-link vs publicize-to-fill-gaps
claude Jun 14, 2026
63cd3f1
Show organizer at bottom of event page; add SQL test-user seed
claude Jun 14, 2026
5cf337a
Event: drop misleading +freeSpots badge, gate roster behind avatar to…
claude Jun 14, 2026
19d4d8c
Home: unify hero copy, show steps+CTA for logged-in, drop hero bottom…
claude Jun 14, 2026
1c09068
Event: expand roster inline with real avatars; pre-match result note …
claude Jun 14, 2026
b481959
Hero: combined court motif (basketball + volleyball net + football li…
claude Jun 14, 2026
4f257b8
Add demo-events seed script (wipe + fill realistic matches)
claude Jun 14, 2026
b7e1b6b
Card: 'wolnych miejsc' label; hero headline 'Czas na bojo?'; add SQL …
claude Jun 14, 2026
42fb31b
Hero: volleyball court lines instead of net mesh
claude Jun 14, 2026
15e2e47
Update hero subtitle to approved copy; confirm no CTA buttons under h…
claude Jun 15, 2026
a520f90
Hero subtitle B4; reserve roster with separator; fix delete modal on …
claude Jun 15, 2026
925cd79
Fix court SVG (hoop/backboard, volleyball net, football arc) + empty …
claude Jun 15, 2026
37706cc
Merge feature branch: UI improvements, hero redesign, event page fixes
claude Jun 15, 2026
3274963
Fix cookie banner styling + improve court SVG visibility on desktop
claude Jun 15, 2026
ef114c8
Add in-app browser detection on login page
claude Jun 15, 2026
a3fe488
Inline in-app browser lock on Google button only, email/password unaf…
claude Jun 15, 2026
414c41a
fix: remove duplicate declarations from AuthForm.tsx
claude Jun 15, 2026
282a59d
remove goalkeeper indicator and cancellation hint text
claude Jun 15, 2026
f9fd0e4
remove Google login — email/password and magic link only
claude Jun 15, 2026
dce1f0b
restore Google login, remove 'albo e-mailem' divider text
claude Jun 15, 2026
38a57cd
feat: team selection UI — Niebiescy vs Czerwoni
claude Jun 15, 2026
75d5424
feat: show 'Utwórz skład' button when teamMode is brak
claude Jun 15, 2026
3a3bb94
remove team name labels and drag hint from TeamsPanel
claude Jun 15, 2026
668ce4d
fix: hide TeamsPanel from non-organizers
claude Jun 15, 2026
7756234
fix: persist map filters in URL so back-navigation restores them
claude Jun 15, 2026
d1a8ad0
feat: join code system replaces invite token flow
claude Jun 15, 2026
1af438c
Fix UX issues: compact invite panel, roster replaces avatars, publish…
claude Jun 15, 2026
e6ae754
Fix team management showing to all users due to is_admin=true for all
claude Jun 15, 2026
9eda3f0
Hide join code panel for now
claude Jun 16, 2026
f1305b7
Remove JoinByCodeSection from home page
claude Jun 16, 2026
8a5ed5e
Update hero text; swipe-to-assign in unassigned tray; fix publish toggle
claude Jun 16, 2026
5ad92dc
Improve publishTeams error reporting — surface exact Supabase error
claude Jun 16, 2026
83f14a3
Fix publishTeams via RPC to bypass PATCH 400 error on events table
claude Jun 16, 2026
4c80e90
Add clickable player profiles, groups, and real personal stats
claude Jun 16, 2026
f38609e
Fix group code input overflowing card width
claude Jun 16, 2026
07d0859
Add next-themes dependency for dark mode
claude Jun 16, 2026
a4382d0
Add dark mode: next-themes, Tailwind class strategy, toggle in Header
claude Jun 16, 2026
7460bce
Dark mode foundation + past event display + stats rework
claude Jun 16, 2026
f0d2f33
UX: move invite section below members, add groups to home page
claude Jun 16, 2026
284d653
Remove attendance bar; reliable badge based on 0 no-shows; stats link…
claude Jun 16, 2026
4331ceb
Stats: only matchesPlayed + eventsOrganized; frekwencja only when noS…
claude Jun 16, 2026
4930898
Ignore .claude/ session directory
claude Jun 16, 2026
df16671
Hide join button after match start; show closed-signups message instead
claude Jun 16, 2026
c0583ff
Show unassigned players below teams in published view
claude Jun 17, 2026
43df5e8
Separate participant list and teams into independent panels
claude Jun 17, 2026
cae4e36
Polish dark mode: ink-blue palette, elevation system, nav dark variants
claude Jun 17, 2026
1925232
Fix organizer card width, filter clip, and gray-on-white contrast
claude Jun 17, 2026
9ae6bd2
Make dark mode app-wide via global token mapping
claude Jun 17, 2026
52c1d48
Restore invite link panel on event page
claude Jun 17, 2026
5965a1b
Add Skip + progress counter to venue moderation Tinder
claude Jun 17, 2026
3756902
Fix matchesPlayed stat and make organizer clickable
claude Jun 18, 2026
4202489
Add cover photo upload to events and groups
claude Jun 18, 2026
3b82755
Fix invite section layout and rename Admin to Założyciel
claude Jun 18, 2026
a3629f9
Guard JoinCodePanel — show only to participants and organizer
claude Jun 18, 2026
8f099e1
Add product analytics — event tracking + admin dashboard
claude Jun 18, 2026
c90ed7f
Group invite: shareable join link + fix button overflow
claude Jun 18, 2026
7acfa0a
Restore join-approval flow for events
claude Jun 18, 2026
5cca9f9
Group page: don't show "not found" when only secondary data fails
claude Jun 18, 2026
d1c8bcc
Add group editing for the founder only
claude Jun 18, 2026
7e0f380
docs: aktualizacja przewodnika — grupy, profile graczy, turniej, anal…
claude Jun 19, 2026
1f7d636
fix(grupy): potwierdzenie przy opuszczaniu i usuwaniu, dyskretniejsza…
claude Jun 19, 2026
1fd7913
fix(auth): reset hasla przez /auth/callback?next=/auth/reset
claude Jun 22, 2026
ee2d885
feat: swipe druzyny fix + RSVP 'moze' + password recovery fix
claude Jun 22, 2026
7a7f043
fix: wyszukiwarka boisk, licznik graczy, kopia meczu, limit gosci
claude Jun 30, 2026
bfda7eb
feat: roster UX — atrybucja gosci, bramkarz dla gosci, limit bramkarz…
claude Jun 30, 2026
59b5ec2
fix(#5): wlasny picker godziny (HH:MM dropdowny) zamiast natywnego ze…
claude Jun 30, 2026
eeda719
feat(#11): opcjonalne przypisanie boiska do grupy
claude Jun 30, 2026
593bd5d
feat(#10): Open Graph dla strony meczu — podglad linku z info o meczu
claude Jun 30, 2026
cf7712b
perf(#6): okno renderowania listy boisk (60 + 'Pokaz wiecej')
claude Jun 30, 2026
b2c5149
fix: panel 'Zarzadzaj wydarzeniem' dostepny tez po starcie meczu
claude Jun 30, 2026
1a220c9
feat: atrybucja gosci jako linijka 'dodal(a)' zamiast +N
claude Jun 30, 2026
dcfbfd3
fix: blokada tworzenia meczu zaczynajacego sie w przeszlosci
claude Jun 30, 2026
79de3d6
feat: bez auto-awansu rezerwy, prefill boiska grupy, OG image, dark m…
claude Jul 1, 2026
79b546e
feat: usun graczy spoza apki i limit bramkarzy, dodaj toggle rozrozni…
claude Jul 26, 2026
f3796a2
fix: dziala 'Dolacz'/'Wycofaj' przy RSVP 'Moze'; usuniety external_count
claude Jul 26, 2026
c51b6f5
perf(mapa): klastrowanie w pickerach, punktowe ikony, fix klikniecia …
claude Jul 26, 2026
89e581d
feat: 'Moze' -> 'Obserwuj', osobna sekcja i statusy; fix pierwszego k…
claude Jul 26, 2026
189d0e7
feat: rozdziel tag 'Organizujesz' od statusu uczestnictwa; auto-toggl…
claude Jul 26, 2026
227181a
feat: metody platnosci (BLIK/gotowka/inne) + znizka z karta sportowa
claude Jul 26, 2026
4e32bed
refactor: rozbij zarzadzanie skladem na osobne, jednofunkcyjne karty
claude Jul 26, 2026
43e2d60
feat: nazwa wlasna dla 'inna karta', lista akceptowanych kart, numer …
claude Jul 26, 2026
c1a95e9
test: skrypt danych testowych — 20 wydarzen ze wszystkimi kombinacjam…
claude Jul 26, 2026
219d711
fix: wyszukiwarka adresu przy tworzeniu wydarzenia + confirm przy zmi…
claude Jul 26, 2026
038b60f
fix: dlugie tytuly na kartach, opis wydarzenia, live search w tworzen…
claude Jul 26, 2026
a69ce70
fix: seed cleanup lapie tez stary format markera (title zamiast descr…
claude Jul 26, 2026
5fabe08
docs: CLAUDE.md — kontekst projektu i pulapki dla Claude Code
claude Jul 31, 2026
83c96fa
docs: usuń nieaktualne AUDIT.md i STATUS.md, scal STRATEGIA.md do docs/
claude Aug 2, 2026
b289389
docs: baza wiedzy w docs/ — wizja, funkcje, domena, architektura, baz…
claude Aug 2, 2026
a359fb3
docs: AGENTS.md jako kanoniczne zasady pracy, CLAUDE.md jako wskaźnik
claude Aug 2, 2026
4effdc7
feat: warstwa danych strukturalnych dla wyszukiwarek i modeli językowych
claude Aug 2, 2026
f96762e
docs: luki wobec wizji do backlogu, korekty w PRZEWODNIK i README
claude Aug 2, 2026
b2db077
feat: hook doc-guard przypominający o aktualizacji dokumentacji
claude Aug 2, 2026
e8a266c
Merge pull request #66 from fpudelko/claude/bojo-project-onboarding-0…
janbrzo Aug 2, 2026
0acde68
docs: konsolidacja wg badań — mniej plików, krócej, bez inwentarzy
claude Aug 2, 2026
d6defba
feat: walidator spójności dokumentacji + CI dla kodu aplikacji
claude Aug 2, 2026
040e383
chore: hook doc-guard wskazuje walidator, martwy kod oznaczony w miejscu
claude Aug 2, 2026
e6f6426
feat: metadata i canonical dla stron publicznych + BreadcrumbList boiska
claude Aug 2, 2026
26e96bd
docs: sekcja treści SEO/GEO w backlogu
claude Aug 2, 2026
8d53b0a
feat: llm-context.md dla modeli czytających na zimno + llms.txt wg sp…
claude Aug 3, 2026
b1a9739
Merge pull request #67 from fpudelko/claude/bojo-project-onboarding-0…
janbrzo Aug 3, 2026
7f7fcff
feat: mobile-first landing page dla niezalogowanych
claude Aug 3, 2026
217d511
Merge pull request #68 from fpudelko/claude/bojo-landing-redesign-gndgo7
janbrzo Aug 3, 2026
65c5835
docs: bugi i pomysly z testow na urzadzeniu do backlogu
claude Aug 3, 2026
e7b378b
fix(landing): sticky CTA nie zaslania juz stopki
claude Aug 3, 2026
733cf49
feat: zwolnione miejsce oferowane rezerwowemu z oknem czasowym
claude Aug 3, 2026
5e10ed5
feat: propozycje skladow od uczestnikow z glosowaniem
claude Aug 3, 2026
618f90b
test: scenariusze dla oferty z rezerwy i propozycji skladow + instruk…
claude Aug 3, 2026
b18b845
chore: paczki SQL do postawienia bazy od zera (4 wklejki zamiast 59)
claude Aug 3, 2026
e4e68aa
feat: przypisanie istniejacego meczu do grupy + brak zaproszenia do r…
claude Aug 3, 2026
2819a8f
chore: analiza satelitarna boisk tylko recznie (cron chodzil ~20x/mie…
claude Aug 3, 2026
da3f7b1
chore: audyt danych o boiskach + odtworzenie recznych wspolrzednych z…
claude Aug 3, 2026
e0114a0
feat: mecze grup na stronie glownej czlonka (takze prywatne)
claude Aug 3, 2026
1e71a64
feat: imienne zaproszenia na mecz z ekipy + sekcja zaproszen na stron…
claude Aug 3, 2026
71ab335
test: grupy i mecze prywatne do przetestowania przeplywow grupowych
claude Aug 3, 2026
44fcf9e
chore: eksport danych o boiskach do oceny z reki
claude Aug 3, 2026
f286e72
fix: przycisk zapraszania pod licznikiem wolnych miejsc, nie na koncu…
claude Aug 3, 2026
26abc4b
chore: sprzatanie katalogu boisk na podstawie notatek AI
claude Aug 3, 2026
c804e57
chore: audyt boisk rozbity na pojedyncze zapytania (Supabase pokazuje…
claude Aug 3, 2026
66835c7
chore: diagnostyka i naprawa katalogu boisk (sporty skazone sasiedztw…
claude Aug 3, 2026
b3bdd82
fix: rezerwowy widzi 'wypisz sie z rezerwy' + plan naprawy katalogu b…
claude Aug 4, 2026
7440a64
test: dane testowe dla Jana (wyniki, historia, komentarze, przypadki …
claude Aug 4, 2026
ff0ba78
docs: gotowy prompt 'Rewizja przed startem' dla modelu wysokiej polki
claude Aug 4, 2026
9f1f3fd
chore: generator jednego pliku do wklejenia z promptem rewizji
claude Aug 4, 2026
dabbd4f
feat: dashboard zalogowanego przebudowany + koniec mignięcia landingu
claude Aug 4, 2026
49acccb
docs: wynik rewizji przed startem (2026-08)
claude Aug 4, 2026
e2fcc4b
docs: projekt przejecia profilu goscia (claim) w backlogu
claude Aug 4, 2026
4932dca
Merge pull request #69 from fpudelko/claude/bojo-landing-redesign-gndgo7
janbrzo Aug 4, 2026
3719558
feat: krotszy kreator meczu - mniej decyzji, sensowne domyslne
claude Aug 4, 2026
fc34c56
feat: krotszy kreator meczu - mniej decyzji, sensowne domyslne
claude Aug 4, 2026
5a3016e
merge: master (redesign dashboardu + krotszy kreator)
claude Aug 4, 2026
0f86d4e
docs: zasada pracy przez pull requesty (koniec pushowania na master)
claude Aug 4, 2026
4b2ed77
Merge pull request #70 from fpudelko/claude/kind-ptolemy-9Mvh0
fpudelko Aug 4, 2026
d1e3013
feat: strona meczu - usuniete zdjecie, badge relacji, edycja terminu,…
claude Aug 4, 2026
2166513
feat: landing i dashboard — zwrot na organizatora, zasięg ogólnopolski
claude Aug 4, 2026
5ed76a5
fix: poprawki landingu po przeglądzie na realnym urządzeniu
claude Aug 5, 2026
29b159d
fix: wolna przestrzeń hero faktycznie nad badgem, nie pod rzędem zauf…
claude Aug 5, 2026
b26df22
fix: rząd zaufania większy (jedna linia), statystyka sportów wraca do…
claude Aug 5, 2026
fc534ba
fix: mniejszy peek telefonu, rząd zaufania jak na dole strony, szybsz…
claude Aug 5, 2026
07987b9
fix: większy H1 w hero — 3 linie zamiast 2, bez wpływu na układ pod s…
claude Aug 5, 2026
d992282
Merge pull request #72 from fpudelko/claude/bojo-landing-redesign-gndgo7
janbrzo Aug 5, 2026
79b142e
fix: H1 w hero — rozmiar między oryginałem a poprzednią zmianą, 2 linie
claude Aug 5, 2026
30559fa
Merge pull request #73 from fpudelko/claude/bojo-hero-h1-tweak
janbrzo Aug 5, 2026
e5f8192
Merge remote-tracking branch 'origin/claude/event-page-drobnica' into…
claude Aug 5, 2026
30ad17f
fix: wyrównanie wcięć w blokach wyboru roli gościa (PR #71)
claude Aug 5, 2026
4fecee2
Merge pull request #71 from fpudelko/claude/event-page-drobnica
janbrzo Aug 5, 2026
d341fc6
Uporządkuj dokumenty prawne i odchudź kreator meczu
claude Aug 5, 2026
4f55091
Merge pull request #74 from fpudelko/claude/organizers-match-creation…
janbrzo Aug 5, 2026
c6dfe39
Update strategia.md
janbrzo Aug 5, 2026
1e8a77a
fix: naprawa buildu produkcyjnego - useSearchParams wywalal prerender…
claude Aug 5, 2026
398702d
Merge pull request #75: naprawa buildu produkcyjnego
fpudelko Aug 5, 2026
39e5a10
fix: zaproszenia od uczestnika (RLS na RETURNING) + rozjezdzajace sie…
claude Aug 5, 2026
eb252eb
Merge pull request #76 from fpudelko/claude/fix-invites-rls-and-card-…
fpudelko Aug 5, 2026
35361af
feat: import boisk z OSM (Geofabrik PBF) - nazwy ze zlaczenia przestr…
claude Aug 5, 2026
38e1a1e
Merge pull request #77 from fpudelko/claude/import-osm-lubelskie
fpudelko Aug 5, 2026
31113f0
fix: karuzela mapy nad nawigacja + domyslny sklad zalezny od sportu
claude Aug 5, 2026
89f1c01
Merge pull request #78 from fpudelko/claude/map-carousel-and-defaults
fpudelko Aug 5, 2026
97b3d71
fix: odmiana w nazwach miejscowosci + konfigurowalna bramka publikacji
claude Aug 5, 2026
6b24c8c
Merge pull request #79 from fpudelko/claude/import-gate-option
fpudelko Aug 5, 2026
63cffbd
docs: agent sam merguje swoj PR po zielonym CI
claude Aug 5, 2026
da54083
Merge pull request #80: agent sam merguje swój PR
fpudelko Aug 5, 2026
4aa77c5
feat: mapa bez zaszytego Poznania - widocznosc decyduje map_visibility
claude Aug 5, 2026
4e3687f
Merge pull request #81: mapa bez zaszytego Poznania
fpudelko Aug 5, 2026
2e6439a
chore: diagnostyka - czemu obiektow nie widac na mapie
claude Aug 5, 2026
b7c6a59
feat: workflow diagnozy mapy - lejek zapytania bez recznego SQL
claude Aug 6, 2026
f56daab
Merge pull request #82: diagnostyka mapy bez ręcznego SQL
fpudelko Aug 6, 2026
32e13f0
fix: mapa otwiera sie na Polsce, nie na Poznaniu
claude Aug 6, 2026
1477beb
perf: strony boisk na zadanie zamiast prerenderu calego katalogu
claude Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file removed .DS_Store
Binary file not shown.
69 changes: 69 additions & 0 deletions .claude/hooks/doc-guard.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env bash
# doc-guard — pilnuje, żeby dokumentacja w docs/ nie rozjechała się z kodem.
#
# start (SessionStart) — mówi, gdzie leży dokumentacja
# record (PostToolUse) — po zmianie kodu wskazuje KONKRETNY plik do aktualizacji
#
# To jest PRZYPOMNIENIE, nie bramka. Hook nigdy nie blokuje — kończy się exit 0
# w każdej ścieżce, a jego wyjście to tylko kontekst dla modelu. Odpowiedzialność
# za aktualizację zostaje po stronie piszącego.
#
# Żeby nie hałasować: dla danej kategorii zmian odzywa się raz na sesję, a edycja
# czegokolwiek w docs/ wycisza wszystkie kategorie do końca sesji.
set -uo pipefail

MODE="${1:-record}"
payload="$(cat 2>/dev/null || true)"

sid="$(printf '%s' "$payload" | jq -r '.session_id // "nosession"' 2>/dev/null || echo nosession)"
state="${TMPDIR:-/tmp}/bojo-doc-guard/${sid}"
mkdir -p "$state" 2>/dev/null || exit 0

case "$MODE" in
start)
jq -nc '{hookSpecificOutput:{hookEventName:"SessionStart",
additionalContext:"Dokumentacja projektu leży w docs/ (indeks: docs/README.md), zasady pracy w AGENTS.md. Zmiana kodu pociąga za sobą aktualizację odpowiedniego pliku w docs/ — mapowanie w AGENTS.md, sekcja \"Aktualizacja dokumentacji\". Walidator spójności: npm run check:docs. docs/wizja.md jest dokumentem nadrzędnym: jego sekcji 1 nie parafrazować."}}' 2>/dev/null
;;

record)
f="$(printf '%s' "$payload" | jq -r '.tool_input.file_path // .tool_response.filePath // ""' 2>/dev/null)"
[ -n "$f" ] || exit 0

# Edycja dokumentacji wycisza hook do końca sesji.
case "$f" in
*/docs/*|*/frontend/public/llms.txt|*/frontend/public/llm-context.md|*/AGENTS.md)
: > "$state/docs"
exit 0 ;;
esac
[ -e "$state/docs" ] && exit 0

# Klasyfikacja zmienionego pliku → kategoria + sugerowany plik dokumentacji.
# Flagi sprawdzane przed ogólnym lib/, bo mają węższe i ważniejsze mapowanie.
case "$f" in
*/frontend/src/lib/features.ts|*/frontend/src/config/features.ts)
kat="flagi"
cel="docs/funkcje.md (sekcja \"Flagi funkcji\") — tabela flag jest jedynym miejscem poza kodem, gdzie widać, co jest ukryte" ;;
*/supabase/migrations/*)
kat="migracje"
cel="docs/baza-danych.md — mapa tabela → migracja" ;;
*/frontend/src/lib/*)
kat="lib"
cel="docs/domena.md (jeśli zmieniły się reguły domenowe) lub docs/funkcje.md (jeśli doszła/zniknęła funkcja); jeśli zmiana jest widoczna dla użytkownika — także docs/llm-context.md (RAG INJECTION, patrz AGENTS.md)" ;;
*/frontend/src/app/*)
kat="trasy"
cel="docs/funkcje.md — a jeśli doszła lub zniknęła trasa użytkownika, także frontend/public/llms.txt oraz docs/llm-context.md (RAG INJECTION, patrz AGENTS.md)" ;;
*)
exit 0 ;;
esac

# Raz na sesję dla danej kategorii.
[ -e "$state/seen-$kat" ] && exit 0
: > "$state/seen-$kat"

jq -nc --arg plik "${f##*/bojo-app/}" --arg cel "$cel" \
'{hookSpecificOutput:{hookEventName:"PostToolUse",
additionalContext:("Zmieniłeś " + $plik + ". Przed końcem zadania sprawdź: " + $cel + ". Po zmianach uruchom: npm run check:docs. (Przypomnienie doc-guard — nie blokuje.)")}}' 2>/dev/null
;;
esac

exit 0
27 changes: 27 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/doc-guard.sh start",
"timeout": 10
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/doc-guard.sh record",
"timeout": 10
}
]
}
]
}
}
78 changes: 78 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# ============================================================
# Bojo (Boiska Poznań) — zmienne środowiskowe
# Skopiuj ten plik do .env i uzupełnij wartości.
# NIGDY nie commituj pliku .env do repozytorium.
# ============================================================

# ----- Frontend (Next.js) — zmienne publiczne, widoczne w przeglądarce -----

# Supabase: URL projektu, np. https://abcdefghijkl.supabase.co
NEXT_PUBLIC_SUPABASE_URL=

# Supabase: klucz publiczny "anon" (bezpieczny dla frontendu — chroniony przez RLS)
NEXT_PUBLIC_SUPABASE_ANON_KEY=

# Mapbox: token publiczny — używany TYLKO do miniatur zdjęć boisk (opcjonalny).
# Bez niego mapa nadal działa (Leaflet + OpenStreetMap), znikają tylko miniaturki.
# https://account.mapbox.com/
NEXT_PUBLIC_MAPBOX_TOKEN=

# Adres produkcyjny aplikacji — używany w sitemap.xml, robots.txt, JSON-LD
# i znacznikach SEO. Domena kanoniczna: https://bojo.pl
# Opcjonalny — bez niego kod używa https://bojo.pl (NIE localhost), więc przy
# pracy lokalnej ustaw http://localhost:3000, jeśli testujesz linki absolutne.
NEXT_PUBLIC_SITE_URL=

# Włącznik rezerwacji w aplikacji ("true" = pokaż UI rezerwacji globalnie).
# Można też włączyć per-obiekt flagą booking_enabled w bazie. (opcjonalny)
NEXT_PUBLIC_FEATURE_RESERVATIONS=false

# ----- Scraper / wzbogacanie danych — TYLKO lokalnie / w GitHub Actions -----
# Te wartości NIGDY nie trafiają do frontendu. W GitHub Actions trzymaj je w Secrets.

# Supabase: URL projektu (ta sama wartość co NEXT_PUBLIC_SUPABASE_URL)
SUPABASE_URL=

# Supabase: klucz service_role — pełny dostęp do bazy, OMIJA RLS.
# Settings → API → service_role. Trzymaj w sekrecie!
SUPABASE_SERVICE_ROLE_KEY=

# Google Places API — dla enrich_google.py (telefon/strona/godziny).
# https://console.cloud.google.com/
GOOGLE_PLACES_API_KEY=

# Anthropic (Claude) API — dla enrich.py i enrich_booking.py.
# https://console.anthropic.com/
ANTHROPIC_API_KEY=

# Domyślny model Claude dla scrapera (opcjonalny).
ANTHROPIC_MODEL=claude-haiku-4-5-20251001

# ----- Supabase Edge Functions — sekrety (ustawiane przez `supabase secrets set`) -----
# To NIE są zmienne .env frontendu. Ustaw je w projekcie Supabase, np.:
# supabase secrets set RESEND_API_KEY=...
# Używane przez funkcje: notify-game-alert, send-invites, send-event-sms.

# Resend — wysyłka e-maili (powiadomienia o grach, zaproszenia).
# https://resend.com/api-keys Nadawca: noreply@bojo.app (zweryfikuj domenę w Resend).
RESEND_API_KEY=

# SMSAPI.pl — wysyłka SMS (preferowany dostawca dla PL).
# https://ssl.smsapi.pl/ → Ustawienia → Tokeny API
SMSAPI_TOKEN=

# Twilio — zapasowy dostawca SMS (używany, gdy SMSAPI zawiedzie).
# https://console.twilio.com/
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=

# ----- Logowanie / Auth (konfiguracja w panelu Supabase, nie w .env) -----
# Authentication → Providers:
# • Google OAuth — Client ID/Secret z Google Cloud Console.
# • Email — włącz "Email" provider dla logowania e-mailem + hasłem i magic-linków.
# Authentication → URL Configuration:
# • Site URL: https://bojo.app
# • Redirect URLs: dodaj https://bojo.app/auth/callback i https://bojo.app/auth/reset
# Authentication → Emails (SMTP): podłącz Resend jako custom SMTP, inaczej maile
# potwierdzające / magic-linki są mocno limitowane (kilka/godzinę) na darmowym planie.
109 changes: 109 additions & 0 deletions .github/workflows/analyze-venues-satellite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Analiza satelitarna boisk (AI)

# Wykrywa typ boiska, nawierzchnię, wymiary, infrastrukturę
# na podstawie zdjęcia satelitarnego Mapbox (zoom 18).
#
# Koszt szacunkowy:
# • claude-sonnet-4-6 → ~$0.010–0.015 / boisko (vision input ~1000 tok, output ~300 tok)
# • claude-haiku-4-5 → ~$0.002–0.003 / boisko (tańszy, nieco gorszy przy skomplikowanych obiektach)
# • 400 "quality" boisk (powiat poznański, mają jakieś info) → ~$4–6 Sonnet / ~$1 Haiku
# • Ponowna analiza wszystkich co miesiąc: zalecaj Haiku, Sonnet tylko przy pierwszym przebiegu
#
# Wymagane sekrety:
# SUPABASE_URL
# SUPABASE_SERVICE_ROLE_KEY
# ANTHROPIC_API_KEY
# MAPBOX_TOKEN (publiczny token z uprawnieniami styles:tiles)

# Bez harmonogramu — uruchamiany wyłącznie ręcznie.
#
# Poprzedni cron ('0 3 1-7 * 5') miał być pierwszym piątkiem miesiąca, ale
# GitHub łączy dzień miesiąca z dniem tygodnia przez OR, nie AND: job chodził
# przez pierwsze 7 dni miesiąca ORAZ w każdy piątek — ~20 przebiegów na miesiąc,
# każdy przepisujący oceny AI po całej bazie. Analiza kosztuje i nadpisuje dane,
# więc ma być decyzją, nie tłem.
on:
workflow_dispatch:
inputs:
dry_run:
description: 'Tryb podglądu — nic nie zapisuje'
default: true
required: false
type: boolean
limit:
description: 'Maks. liczba boisk (0 = wszystkie kwalifikujące się)'
default: '0'
required: false
type: string
all:
description: 'Przetwórz też już przeanalizowane (--all)'
default: false
required: false
type: boolean
overwrite:
description: 'Nadpisz istniejące pola (surface, is_indoor, lit…) wartościami AI'
default: false
required: false
type: boolean
model:
description: 'Model Claude'
default: 'claude-sonnet-4-6'
required: false
type: choice
options:
- claude-sonnet-4-6
- claude-haiku-4-5-20251001
- claude-opus-4-8
concurrency:
description: 'Równoległe requesty do API (1–2 dla Haiku, max 3 dla Sonnet)'
default: '1'
required: false
type: string
save_images:
description: 'Zapisz zdjęcia satelitarne do Supabase Storage (bucket: venue-satellites)'
default: false
required: false
type: boolean

jobs:
analyze:
name: "Analiza satelitarna ${{ inputs.dry_run == true && '(DRY RUN)' || '(ZAPIS)' }}"
runs-on: ubuntu-latest
timeout-minutes: 120

steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
cache-dependency-path: scraper/requirements.txt

- name: Zainstaluj zależności
working-directory: scraper
run: pip install httpx anthropic python-dotenv

- name: Zbuduj argumenty
id: args
run: |
LIMIT="${{ inputs.limit || '0' }}"
MODEL="${{ inputs.model || 'claude-sonnet-4-6' }}"
CONCURRENCY="${{ inputs.concurrency || '3' }}"
ARGS="--model $MODEL --concurrency $CONCURRENCY"
[ "$LIMIT" != "0" ] && ARGS="$ARGS --limit $LIMIT"
[ "${{ inputs.dry_run }}" = "true" ] && ARGS="$ARGS --dry-run"
[ "${{ inputs.all }}" = "true" ] && ARGS="$ARGS --all"
[ "${{ inputs.overwrite }}" = "true" ] && ARGS="$ARGS --overwrite"
[ "${{ inputs.save_images }}" = "true" ] && ARGS="$ARGS --save-images"
echo "args=$ARGS" >> $GITHUB_OUTPUT
echo "Argumenty: $ARGS"

- name: Uruchom analizę satelitarną
working-directory: scraper
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
MAPBOX_TOKEN: ${{ secrets.MAPBOX_TOKEN }}
run: python analyze_venues.py ${{ steps.args.outputs.args }}
40 changes: 40 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# CI dla kodu aplikacji — typecheck, testy, spójność dokumentacji.
# Deterministyczna bramka: agent (i człowiek) dostaje pass/fail zamiast
# polegać na pamiętaniu o uruchomieniu testów przed pushem na produkcję.
#
# `npm run build` celowo NIE wchodzi do CI: wymaga kluczy Supabase
# (NEXT_PUBLIC_SUPABASE_URL/ANON_KEY) — do dodania po skonfigurowaniu
# sekretów repo, patrz BACKLOG.
name: CI

on:
push:
branches: [master]
pull_request:

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Zależności
working-directory: frontend
run: npm ci

- name: Typecheck
working-directory: frontend
run: npx tsc --noEmit

- name: Testy (Vitest)
working-directory: frontend
run: npm test

- name: Spójność dokumentacji
run: node scripts/check-docs.mjs
63 changes: 63 additions & 0 deletions .github/workflows/classify.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Klasyfikacja obiektów (map_visibility)

# Ustawia map_visibility na podstawie danych w bazie:
# public — boisko do sportu zespołowego z rezerwacją lub dobrymi danymi
# organizer_only — wygląda na boisko ale mało danych (warto sprawdzić)
# hidden — siłownia, bilard, brak danych itp.
#
# Wymagane sekrety:
# SUPABASE_URL
# SUPABASE_SERVICE_ROLE_KEY

on:
workflow_dispatch:
inputs:
dry_run:
description: 'Tryb podglądu — nic nie zapisuje'
default: true
required: false
type: boolean
limit:
description: 'Maks. obiektów (0 = wszystkie)'
default: '0'
required: false
type: string
reset:
description: 'Nadpisz też obiekty z już ustawioną visibility (domyślnie: tylko public)'
default: false
required: false
type: boolean

jobs:
classify:
name: Klasyfikacja (${{ inputs.dry_run == true && 'DRY RUN' || 'ZAPIS' }})
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
cache-dependency-path: scraper/requirements.txt

- name: Install dependencies
working-directory: scraper
run: pip install httpx python-dotenv

- name: Build arguments
id: args
run: |
ARGS="--limit ${{ inputs.limit }}"
[ "${{ inputs.dry_run }}" = "true" ] && ARGS="$ARGS --dry-run"
[ "${{ inputs.reset }}" = "true" ] && ARGS="$ARGS --reset"
echo "args=$ARGS" >> $GITHUB_OUTPUT

- name: Run classifier
working-directory: scraper
env:
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
run: python classify.py ${{ steps.args.outputs.args }}
Loading