{"id":51633568,"url":"https://github.com/quarterback/muzak","last_synced_at":"2026-07-13T11:02:15.662Z","repository":{"id":356871312,"uuid":"1234387388","full_name":"quarterback/muzak","owner":"quarterback","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-10T07:21:52.000Z","size":161,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-10T08:29:21.579Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://muzak-azure.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quarterback.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-10T05:43:35.000Z","updated_at":"2026-05-10T07:21:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/quarterback/muzak","commit_stats":null,"previous_names":["quarterback/muzak"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/quarterback/muzak","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarterback%2Fmuzak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarterback%2Fmuzak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarterback%2Fmuzak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarterback%2Fmuzak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quarterback","download_url":"https://codeload.github.com/quarterback/muzak/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarterback%2Fmuzak/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35420322,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-13T11:02:13.980Z","updated_at":"2026-07-13T11:02:15.650Z","avatar_url":"https://github.com/quarterback.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Put Me On\n\n\u003e putmeon.lol — find your next favorite artist.\n\nA Y2K / web-1.0 indie-music discovery \u0026 collab platform. Tiles, marquees,\nbeveled buttons, real artists in real cities, deep-linked tip jars.\n\n## Try it locally\n\n```sh\n# any static server works\npython3 -m http.server 8080\n# then open http://localhost:8080\n```\n\n## What's in the box\n\n- `index.html` — page shell + all CSS (mobile-responsive at 1024 / 768 / 480)\n- `app.js` — single-file vanilla app: hash routing, state in localStorage,\n  signup flow, d3 + topojson scene map, event delegation, embeds,\n  tip-jar deep links\n- `manifest.webmanifest` + `icon.svg` + `icon-maskable.svg` — PWA install\n  metadata with launch shortcuts\n- `sw.js` — service worker (offline shell + asset caching)\n- `db/schema.sql` — Postgres / Supabase schema for when you're ready to\n  graduate from localStorage to a shared backend\n- `AUTH.md` — sketch of the OAuth + AT Protocol auth integration\n\n## The full demo flow\n\n1. First visit lands on **welcome** — pick a demo account or click\n   **+ create profile**.\n2. Signup form collects: handle, role (listener / artist), city, links,\n   payment handles, and (if artist) a first-track stream URL.\n3. Submit → if you're an artist and pasted a Bandcamp / SoundCloud /\n   Mixcloud / YouTube / Spotify URL, the track is published immediately\n   and you land on your fresh profile page with the **embed playing\n   inline** as a real iframe player.\n4. From there: save tracks, follow artists, post to the collab board,\n   tip (deep-links to artists' Venmo / Cash App / PayPal / Stripe — money\n   never touches the site).\n5. Switch users any time via the **★ tweaks** drawer (bottom-right) →\n   \"switch user\". Log out turns you back into a guest.\n\nEverything is in `localStorage`, so the demo is fully usable end-to-end\non a single device with zero backend.\n\n## Deploy to Vercel (or Netlify)\n\nThe site is pure static, no build step.\n\n```sh\nnpx vercel deploy            # first run prompts to log in + create a project\n# or\nnetlify deploy --dir .\n```\n\nVercel will spin up a preview URL in ~10 seconds. Once it looks right:\n\n```sh\nnpx vercel deploy --prod\n```\n\nThat's the whole deploy. d3 + topojson load from unpkg; the service\nworker only registers under HTTPS, which Vercel/Netlify give you for free.\n\n## Connecting a database (it's not automatic)\n\nVercel hosts static files — it won't touch a database for you. The\nprototype today is **localStorage-only**, so each visitor sees their own\ncopy. To make profiles, tracks, follows, etc. shared across devices and\nusers, you need to swap localStorage for a real backend. Recommended path:\n\n### 1. Create a Supabase project (free tier)\n\n- Go to \u003chttps://supabase.com\u003e, create a project. Copy the **Project URL**\n  and **anon (public) key** from Settings → API.\n\n### 2. Run the schema\n\n- In the Supabase dashboard → SQL Editor → paste the contents of\n  `db/schema.sql` and run. This creates the tables, RLS policies,\n  triggers, and a small seed of demo profiles. The seed block is bracketed\n  with `-- ▼▼▼ SEED DATA — remove before production ▼▼▼` so it's easy to\n  delete when you're ready to launch with real artists only.\n\n### 3. Add env vars in Vercel\n\nVercel project → Settings → Environment Variables:\n\n| Key                    | Value                       | Scope                   |\n|------------------------|-----------------------------|-------------------------|\n| `SUPABASE_URL`         | your project URL            | Production + Preview    |\n| `SUPABASE_ANON_KEY`    | the anon key (it's public)  | Production + Preview    |\n\nFor pure static sites these aren't injected at build — you'll need to\neither use a small build step (a `\u003cscript\u003e` tag that reads from\n`window.SUPABASE_*` populated by `vercel build`) or just paste the values\ndirectly into a small `config.js` you commit (anon keys are safe to\npublish since they only allow what RLS lets through).\n\n### 4. Wire the client\n\nReplace the `localStorage` reads/writes in `app.js` with the Supabase JS\nclient (`@supabase/supabase-js` from a CDN — no bundler needed):\n\n```html\n\u003cscript type=\"module\"\u003e\n  import { createClient } from \"https://esm.sh/@supabase/supabase-js@2\";\n  window.sb = createClient(window.SUPABASE_URL, window.SUPABASE_ANON_KEY);\n\u003c/script\u003e\n```\n\nThen swap functions like `state.tracks` reads for `await sb.from('tracks').select()`,\ninserts go through `sb.from('tracks').insert(...)`. The schema names match\nthe in-memory shape, so it's mostly a search-and-replace job. RLS is on,\nso the anon key only lets users read public rows and modify their own.\n\n### 5. Auth (when you're ready)\n\nSee `AUTH.md` for both the standard OAuth path (Google / GitHub via\nSupabase Auth) and the AT Protocol (Bluesky) path. The schema already has\n`atproto_did` and `atproto_handle` columns on `profiles` for linking\nidentities.\n\n## Replacing demo content with real artists\n\nRight now the front-end ships with seed profiles (saltvane, mira_moss,\nKönigswasser, etc.) so the homepage isn't empty on first visit. Two ways\nto swap them out:\n\n### Quick: hide them in the UI\n\nIn the **★ tweaks** drawer → uncheck **\"show demo content\"**. Every seed\nrow gets `_demo: true` on load; flipping the toggle filters them\neverywhere they're listed. New profiles you create are not flagged, so\nyour real content stays.\n\n### Proper: replace the seed\n\n`SEED` near the top of `app.js` is the source. Edit the `profiles`,\n`tracks`, `collabs`, and `scenes` to match the artists you actually want\nfeatured. Or, if you've moved to Supabase, just clear the seed block from\n`db/schema.sql` and let real signups populate the tables.\n\n## Mobile / PWA\n\nResponsive down to phone widths (1024 / 768 / 480 breakpoints). On iOS /\nAndroid, **Add to Home Screen** installs it as a standalone app with the\nY2K theme color and four launch shortcuts (Crate Digs / Collab Board /\nScene Map / Create Profile). Safe-area insets are respected when running\nstandalone. Service worker requires HTTPS — Vercel and Netlify both\nhandle that automatically.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarterback%2Fmuzak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquarterback%2Fmuzak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarterback%2Fmuzak/lists"}