Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
318 commits
Select commit Hold shift + click to select a range
916319a
Fix mega-group flooding: skip city-only addresses, batch outreach upsert
claude Jun 4, 2026
9ab112f
Add --sleep between groups to avoid Haiku 50k TPM rate limit
claude Jun 4, 2026
504dedd
Skip city-only and generic-name venues in enrich.py
claude Jun 4, 2026
4b6757d
Show AI-enriched booking URL and summary on venue detail page
claude Jun 4, 2026
4fec5ac
Make web search count configurable via --max-searches (default 2)
claude Jun 4, 2026
046892d
Fix mega-group flooding: skip city-only addresses, batch outreach upsert
claude Jun 4, 2026
ea22876
Add --sleep between groups to avoid Haiku 50k TPM rate limit
claude Jun 4, 2026
1be1d07
Skip city-only and generic-name venues in enrich.py
claude Jun 4, 2026
e90e1f6
Fix enrich_booking.py crash on 429: add retry with backoff, lower con…
claude Jun 4, 2026
8fe39b0
Deduplicate enrich_booking.py by URL: analyse each page once, apply t…
claude Jun 4, 2026
a4814b4
Remove --sleep: rely on reactive 429 retry instead of proactive wait
claude Jun 4, 2026
5f2c233
Outreach panel: full contact text, venue details on expand, assignee …
claude Jun 4, 2026
bf67e33
Fix release assignment bug; add venue link and address in expanded row
claude Jun 4, 2026
60963b0
Add duplicate contact detection and cleanup to outreach panel
claude Jun 4, 2026
e6b7c1a
Fix Supabase 1000-row default limit in getFields
claude Jun 4, 2026
cd2b192
chore: remove React Native template leftovers, fix stale infra config
claude Jun 4, 2026
ef9c88a
test: add validation suite, fix broken events rate-limit mock
claude Jun 4, 2026
418397b
docs: add collaborator guide, rewrite stale README
claude Jun 4, 2026
c002bbb
Simplify hero cards; add mobile info badges in outreach
claude Jun 4, 2026
f5c9a3e
Restore description and chips on hero cards, remove only headline
claude Jun 4, 2026
67a3076
Fix contact info wrapping in outreach expanded row on mobile
claude Jun 4, 2026
e789363
Personalized home hero + "Jak to działa" features section
claude Jun 4, 2026
27a9688
Add map_visibility to fields: public vs organizer-only
claude Jun 5, 2026
3ac071f
Add 3rd visibility state 'hidden'; segment picker visibility
claude Jun 5, 2026
28e4fea
Redesign mobile nav + homepage intent cards; merge futsal/football
claude Jun 5, 2026
20b7f2f
Replace duplicate "Jak to działa" tiles with editorial 3-step copy
claude Jun 5, 2026
9c85f0b
Add game alerts, in-app notifications, and nearby games
claude Jun 5, 2026
7e35928
Fix geolocation errors, simplify event filters, reorder landing
claude Jun 5, 2026
4829991
Show all non-hidden fields on public map
claude Jun 5, 2026
3bb7f92
Add branded OG image for Safari/social link previews
claude Jun 5, 2026
9b6cec2
temp: add MapVisibility type to Field interface
claude Jun 5, 2026
2998f5e
Merge master: bring in all UI/feature work + fix TypeScript build error
claude Jun 5, 2026
9946481
Add email login (password + magic link) alongside Google
claude Jun 5, 2026
51a9476
Add comments, toast, 404/500, repeat game, cost split, activity log, …
claude Jun 5, 2026
b40be88
Add strategy & roadmap doc for partner meeting
claude Jun 5, 2026
64f666c
Nav cleanup, sport consistency, map popup, Nawiguj on events
claude Jun 5, 2026
4ad9967
External players count, nav nowrap fix, outreach table scroll
claude Jun 5, 2026
cfa0c52
Fix admin table clipping, add field address to event detail, add dist…
claude Jun 5, 2026
f137a51
Add Nominatim geocode enrichment script + district filter in admin
claude Jun 5, 2026
78b47ac
Add GitHub Actions: enrich-geocode + enrich-all workflows
claude Jun 5, 2026
2b50d00
Fix enrich-all order: Nominatim first, then Google, then Claude
claude Jun 5, 2026
f150ef5
enrich.py: detect sports for 'wielofunkcyjne' + capture booking_url
claude Jun 5, 2026
987139d
enrich_geocode: switch to photon.komoot.io (primary) + Nominatim fall…
claude Jun 5, 2026
56e985f
Scraper: odwrotny scraper rezerwacji + bogatsze dane OSM; filtry dzie…
claude Jun 6, 2026
8b43643
Dodaj workflow GitHub Actions dla odwrotnego scrappera rezerwacji
claude Jun 6, 2026
0565e12
Usuń komercyjne platformy ze scrapera — zgodność z prawem
claude Jun 6, 2026
43013cf
Filtruj obiekty bez numeru ulicy — unikaj fałszywych dopasowań
claude Jun 6, 2026
0c36aa7
enrich.py: grupowanie po WWW + lepsza filtracja generycznych nazw
claude Jun 6, 2026
57de02d
Scraper: dane z rezerwacji, filtry dzielnic/danych, zgodność prawna
fpudelko Jun 6, 2026
2800116
enrich_geocode.py: wywal Photon, zostaw tylko Nominatim
claude Jun 6, 2026
86aa0a6
Dodaj klasyfikator obiektów (map_visibility) + wywal Photon z geocodera
claude Jun 6, 2026
6e6d7b1
Klasyfikator obiektów + usunięcie Photon z geocodera (#62)
fpudelko Jun 6, 2026
7dfa80b
enrich-all: opcja claude_rerun_all (--all flag) (#63)
fpudelko Jun 6, 2026
6fa07bc
Merge pull request #61 from fpudelko/claude/kind-ptolemy-9Mvh0
fpudelko Jun 6, 2026
f4b469e
enrich_google.py: zastąp keyword Nearby Search typami + Text Search d…
claude Jun 6, 2026
5dbb119
BOJO Community Cup — turniej drużynowy (landing, rejestracja, drabinka)
claude Jun 6, 2026
50b3cd9
Merge pull request #64 from fpudelko/claude/kind-ptolemy-9Mvh0
fpudelko Jun 6, 2026
251de02
turniej: napraw klik w hero + skład przez rejestrację graczy
claude Jun 6, 2026
aae2970
turniej: prywatność kontaktów (RODO), ukryte menu admina, min 7, bez …
claude Jun 6, 2026
5d82af4
ux/a11y: landmark, skip-link, aria labels, copy, tournament banner
claude Jun 7, 2026
2eb4a08
turniej: baner na home zgodny z modelem zgłoszeń (drużyna + link, bez…
claude Jun 7, 2026
310ce00
Merge pull request #65 from fpudelko/claude/kind-ptolemy-9Mvh0
fpudelko Jun 7, 2026
fab002c
ux: Lovable top-10 patch — announcement bar, soft-wall, date groups, …
claude Jun 7, 2026
bb1d41e
Merge branch 'claude/kind-ptolemy-9Mvh0'
claude Jun 7, 2026
4bd1ceb
ux: menu fix, blur, copy cleanup, mapa date filter
claude Jun 7, 2026
190e380
fix: turniej rejestracja — guard i toast gdy turniej nie istnieje w DB
claude Jun 7, 2026
09f1fd3
feat: restrict team shuffle to organizer, add publish/unpublish for s…
claude Jun 7, 2026
ea6230c
scripts: add map_visibility generator from outreach CSV
claude Jun 7, 2026
c746f30
scripts: add outreach CSV source file
claude Jun 7, 2026
f33ecd1
scripts: set_map_visibility — almost all fields organizer_only minimum
claude Jun 7, 2026
a47f4d9
feat(home): Lovable v3 redesign — split hero, trust bar, features moc…
claude Jun 8, 2026
a818a6c
feat(ui): redesign event cards and detail page to match Lovable mockups
claude Jun 8, 2026
8ddcd4f
feat(home): fix FeaturesSection background conflict with Lovable mockups
claude Jun 8, 2026
8c49cad
feat(ui): add iOS-style bottom navigation + redesign event cards to m…
claude Jun 8, 2026
1c45f79
Mobile UI: BOJO header, hide announcement bar, bottom nav on mapa, he…
claude Jun 8, 2026
716cfe4
Fix participant count, address display, and duplicate avatar in event…
claude Jun 8, 2026
4f89577
Shorten landing page, phone frame mockups, remove handball from filters
claude Jun 8, 2026
811051e
Fix cookie banner blocking bottom nav; remove phone screenshots from …
claude Jun 8, 2026
6abc4c1
Revert to hamburger menu, remove bottom nav from all pages
claude Jun 8, 2026
c3c3e4d
Fix recurring status label, clean moje-gry, redesign home for logged-…
claude Jun 8, 2026
3a56e52
Match Lovable mockups: 4-emoji filter, event detail redesign, map ven…
claude Jun 8, 2026
55d6b06
Hide cancelled events from public event lists
claude Jun 8, 2026
0c4180a
Redesign /mapa as venue explorer matching mockup
claude Jun 8, 2026
cd85298
Restrict event management UI to organizers
claude Jun 8, 2026
f761687
Fix venue map: smooth carousel sync, working filters, replace date fi…
claude Jun 8, 2026
bf18840
Fix map jumping: Morton-sort carousel + stop() before pan
claude Jun 8, 2026
cb0f0c9
Fix dropdown clipping, swap Wolne→Gry dziś, add portal to PillDropdown
claude Jun 8, 2026
b8325a8
Venue map: clustering, quality filter, powiat bbox, name cleanup, ric…
claude Jun 8, 2026
27bc201
Reduce clustering aggressiveness: radius 40→22px, disable at zoom 13
claude Jun 8, 2026
867b11d
Add AI satellite venue analysis: migration + analyze_venues.py
claude Jun 8, 2026
55db61d
Hide venue phone/email by default; admin contact toggle; satellite AI…
claude Jun 8, 2026
78ee0f5
Default model to Haiku, default limit to 0 (all venues) for satellite…
claude Jun 8, 2026
d5ede15
analyze_venues: set map_visibility from AI findings, replacing classi…
claude Jun 8, 2026
e146c89
analyze_venues: retry on 429 with exponential backoff, default concur…
claude Jun 8, 2026
2075b1d
analyze_venues: fetch all venues regardless of map_visibility
claude Jun 8, 2026
8e028bf
Map: desktop sidebar, venue type filter+badge, fix retry waits
claude Jun 9, 2026
6d9b523
Fix admin venue editor: use async/await instead of .catch()/.finally(…
claude Jun 9, 2026
b0917c1
analyze_venues: Sonnet default, AI detects sports[], merges into spor…
claude Jun 9, 2026
796addb
feat(scraper): save Mapbox satellite images to Supabase Storage
claude Jun 9, 2026
bd1e391
fix(ui): quick-wins v4 — UX/a11y audit fixes
claude Jun 9, 2026
c47d63a
fix(ui): v5 mobile audit — nav unification, status colors, copy & map…
claude Jun 9, 2026
4b3e815
fix(ux): wypisz się + usuń podpisy filtrów sportowych
claude Jun 9, 2026
9482e16
fix(ux): wypisz się dla organizatora, walidacja formularza, popup pot…
claude Jun 9, 2026
f7b271a
fix(ui): wyraźny chip płatności — Zapłacił/Nie zapłacił
claude Jun 9, 2026
1ea5364
VenueExplorer: address/website in cards, map zoom, mobile fixes
claude Jun 9, 2026
d4a1b1c
Admin: widoczność na mapie bezpośrednio w tabeli obiektów
claude Jun 10, 2026
8496840
UI refresh: otwarte gry, twoje mecze, hero, kreator meczu
claude Jun 10, 2026
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
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
76 changes: 76 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# ============================================================
# 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 i znacznikach SEO.
# np. https://bojo.app (opcjonalny, domyślnie localhost)
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.
105 changes: 105 additions & 0 deletions .github/workflows/analyze-venues-satellite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
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)

on:
schedule:
# Pierwszy piątek miesiąca, 03:00 UTC (niski ruch, tani czas)
- cron: '0 3 1-7 * 5'
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 }}
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