Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
Rank the festival sets you saw, one head-to-head at a time.
LifestyleTypeScript · CSSGitHub @priyasha-aOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Pick a music festival you went to, check off the sets you saw, and rank them with
head-to-head comparisons (binary insertion, like the Beli app). Solo shows can be logged too
(just the artist, plus optional venue, city, month and openers) and ranked against each other.
Built with Next.js and Supabase. Mobile-first.
Stop it with Ctrl + C. (npm.cmd rather than npm because PowerShell blocks npm's script.)Read the full README ↗Pick a music festival you went to, check off the sets you saw, and rank them with head-to-head comparisons (binary insertion, like the Beli app). Solo shows can be logged too (just the artist, plus optional venue, city, month and openers) and ranked against each other.
Built with Next.js and Supabase. Mobile-first.
npm.cmd install # first time only
npm.cmd run dev # then open http://localhost:3000
Stop it with Ctrl + C. (npm.cmd rather than npm because PowerShell blocks npm's script.)
Easiest: the admin page. Sign in as an admin and open /admin (or Account → Admin). There you can see
festival requests (most-requested first), add a festival, or edit/hide any existing one. Saving writes it to
the festivals table in Supabase and it's live on the next page load — no code change or publishing needed.
A database copy with the same id as a built-in festival replaces it. To make someone an admin, run in the
Supabase SQL Editor:
insert into public.admins (user_id) select id from auth.users where email = '[email protected]';
In code (the built-in starting set): lineups also live in src/lineups/, one file per
festival, with every year of that festival in the same file. These ship with the app and are used whenever
the database has no copy of them (or can't be reached).
A new year of a festival that's already there (e.g. EDC 2027): open its file
(src/lineups/edc.ts), copy an existing block like export const edc2026 = { ... }, rename it
(edc2027), and change the details. Then add it to src/lineups/index.ts:
import it at the top and add it to the ALL_FESTIVALS list.
A brand-new festival: copy any file in src/lineups/ (e.g. wobbleland.ts) to a new name,
edit it, and add it to index.ts the same way.
Each festival looks like this:
export const edc2027 = {
id: "edc-las-vegas-2027", // unique; used in the web address. Never change it once people have rankings.
name: "EDC Las Vegas",
year: 2027,
startDate: "2027-05-14", // first day, YYYY-MM-DD. Used to sort newest first.
location: "Las Vegas, NV",
dates: "May 14–16", // shown on the card, written however you like
gradient: "from-yellow-300 via-pink-500 to-fuchsia-600", // card colors (Tailwind classes)
partial: true, // true shows a "lineup may be incomplete" note; remove if complete
lineup: [
"Headliner One",
"Headliner Two",
// ...one artist per line, in quotes, each followed by a comma
],
} satisfies Festival;
Festivals users asked for: when someone adds a festival that isn't listed (the "Festival not listed?
Add it yourself" button), a row lands in Supabase → Table Editor → festival_requests. After adding the
official version here, anyone who added their own copy sees a "now in Set Rank — Switch?" banner, matched
by year plus name. If people typed a different name (e.g. "Movement" for "Movement Detroit"), add it to
the festival's aliases: ["Movement"] so they still get matched.
Fixing a typo in an artist's name is fine, but anyone who already checked that artist will lose the check for them (names are how picks are saved).
| What | Where |
|---|---|
| Home page (your festivals + all festivals) | src/app/page.tsx, src/components/MyFestivals.tsx, src/components/FestivalPicker.tsx |
| "Which sets did you see?" checklist | src/app/festival/[id]/page.tsx, src/components/ArtistChecklist.tsx |
| Festival ranking screen | src/app/festival/[id]/rank/page.tsx, src/components/SetRanker.tsx |
| Solo shows (list, ranking, add form, home card) | src/app/shows/, src/components/ShowsRanker.tsx, src/components/AddShowForm.tsx, src/components/MyShows.tsx, src/lib/shows.ts |
| Head-to-head screen and ranked list (shared) | src/components/RankingUI.tsx, src/lib/useRanking.ts |
| Ranking algorithm (binary insertion) | src/lib/ranking.ts |
| Saving and syncing (browser + Supabase) | src/lib/storage.ts, src/lib/supabase.ts |
| Sign in / account page | src/app/account/page.tsx, src/components/AccountPanel.tsx |
| Colors, fonts, page width | src/app/globals.css, src/app/layout.tsx |
| Database table and security rules | supabase/schema.sql |
supabase/schema.sql in its SQL Editor. (It's safe to
re-run the whole file whenever it changes, e.g. after new tables are added.)http://localhost:3000/** and your live address)..env.local (and in Vercel's Environment Variables):NEXT_PUBLIC_SUPABASE_URL=...
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=...
Without them the app still works, saving only in the browser.