BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Find and add free Brazilian Jiu-Jitsu open mats near you — filter by day, gi/no-gi, price and rating, crowd-verified by the grappling community.
Sports & fitnessGitHub @rjsrealtorOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Find free (and fee-based) Brazilian Jiu-Jitsu open mats near you. Anyone can browse listings without an account; signing in (free) lets you add open mats, rate them, and report changes — including flagging a listing as members-only, which removes it from the default results.
Built with Next.js 14 (App Router) + Supabase (Postgres, Auth, Row Level Security). No paid services required to run this.
This README assumes zero existing accounts and walks through everything from scratch. It'll take about 20–30 minutes the first time.
mat-finder), generate a
database password (save it somewhere, you likely won't need it again),
and pick a region close to you. Free tier is fine.supabase/schema.sql from this project, copy its entire contents,
paste into the SQL editor, and click Run. This creates all tables,
security policies, the ratings view, and the apply_report function.supabase/seed.sql → Run.
This adds 15 starter open mat listings across the US so the app isn't
empty on day one.https://xxxxx.supabase.co)eyJ...)Keep this tab open — you'll paste these into Vercel in step 3.
By default Supabase requires users to click a confirmation link before signing in. That's fine for production, but if you want to test sign-up instantly: Authentication → Providers → Email → toggle off Confirm email. You can turn it back on later.
Create a free account at github.com if you don't have one.
Create a new empty repository (no README/gitignore — this project
already has them), e.g. mat-finder.
From inside this project folder on your computer:
cd matfinder
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/<your-username>/mat-finder.git
git push -u origin main
Go to vercel.com and sign up — choose Continue with GitHub so it can see your repo.
Click Add New… → Project, find your mat-finder repo, click
Import.
Vercel auto-detects Next.js — no build settings to change.
Before deploying, expand Environment Variables and add:
| Name | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | your Supabase Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | your Supabase anon/public key |
NEXT_PUBLIC_SITE_URL | leave blank for now, fill in after step 5 |
Click Deploy. In ~1–2 minutes you'll get a live URL like
https://mat-finder-xyz.vercel.app.
NEXT_PUBLIC_SITE_URL to that URL, then Deployments → ⋯ → Redeploy
on the latest deployment so it picks up the change.https://<your-app>.vercel.app/auth/callback
under Redirect URLs.That's it — the site is live and free. Vercel's free tier and Supabase's free tier both comfortably cover a new app with modest traffic.
If you want to run it on your own machine before/instead of deploying:
cd matfinder
cp .env.local.example .env.local
# fill in .env.local with your Supabase URL + anon key
npm install
npm run dev
Then open http://localhost:3000.
listings — the open mats themselves. Nobody can UPDATE a listing
directly (not even signed-in users) — all edits go through the
apply_report function so every change is logged.ratings — one row per (listing, user); a user can update their own
rating but not anyone else's. listings_with_rating is a view that
joins and averages these for display.reports — an audit log of every "closed" / "members only" /
"correction" report submitted, plus the effect it had. The
apply_report Postgres function (SECURITY DEFINER) is the only thing
allowed to write it, so a report is always both logged and applied
atomically.status = 'closed' or visitor_policy = 'members_only'
is hidden from the default view — visitors can still reveal it with the
"Show closed / members-only" checkbox, mainly so someone can see why
it's flagged.profiles/auth groundwork here is what a payments feature
would build on.postgis or plain lat/lng columns plus a
browser geolocation prompt would be the next natural feature.app/ Next.js App Router pages
page.tsx Home page (renders ListingsApp)
login/page.tsx Sign in / sign up
auth/callback/ Handles Supabase email-confirmation redirect
components/ React components (all client-side)
lib/supabase/ Browser + server Supabase client helpers
lib/types.ts Hand-written TS types matching the schema
supabase/schema.sql Full database schema, RLS policies, RPC function
supabase/seed.sql 15 starter listings
middleware.ts Refreshes the Supabase auth session on each request