尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證The operating system for an independent music career. AI-powered tools built around Sound Vault — a complete discography hub for independent artists.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
The operating system for an independent music career — built around Sound Vault. Sound Vault is the heart of Funūn. It's the place where an artist's entire discography lives — every single, snippet, EP, album, and unreleased project they've ever made. Not just the releases that are out. Everything. Every tool, every community interaction, every pitch, and every opportunity flows through Sound Vault. It's the first platform that treats an artist's creative output as a permanent, structured archive — not a list of uploads.檢視完整 README ↗
The operating system for an independent music career — built around Sound Vault.
Sound Vault is the heart of Funūn. It's the place where an artist's entire discography lives — every single, snippet, EP, album, and unreleased project they've ever made. Not just the releases that are out. Everything.
Every tool, every community interaction, every pitch, and every opportunity flows through Sound Vault. It's the first platform that treats an artist's creative output as a permanent, structured archive — not a list of uploads.
┌─────────────────────────┐
│ │
Tool Library ──►│ SOUND VAULT │◄── The Antenna
(feeds assets) │ │ (live matches)
│ Singles · Snippets │
Community ────►│ EPs · Albums │───► The Pitch
(peer review) │ Unreleased │ (industry pros)
│ │
│ Full discography │
│ Legal documentation │
│ Submission history │
│ Vault Readiness Score │
└─────────────────────────┘
| Type | What it is | Key tools |
|---|---|---|
| Single | One track, full release package | DropReady, PitchPlug, SplitSheet |
| Snippet | 15–60 second social media clip | LyricCard Studio, SoundBait, DropReady |
| EP | 3–6 track project | DropCalendar, EPK.fyi, PitchPlug |
| Album | Full project, complete discography entry | All tools, full legal gate |
| Unreleased | Demos, works in progress, shelved ideas | SplitSheet, CopyrightKit |
Snippets are a first-class project type — short-form content specifically built for social media promotion, with their own readiness checklist and tool connections. No other platform treats social media content as a structured creative project.
Every project in Sound Vault has a calculated 0–100 readiness score. The score gates all submissions — artists cannot distribute, pitch industry professionals, or apply to Antenna opportunities below the required threshold. Each missing item links directly to the tool that generates it.
| Item | Points | Tool |
|---|---|---|
| Audio files uploaded | 10 | — |
| Artwork / visual asset | 10 | LyricCard Studio |
| Split sheets signed | 15 | SplitSheet |
| Copyright registered | 15 | CopyrightKit |
| ISRC codes assigned | 10 | — |
| PRO registration confirmed | 10 | RoyaltyAudit |
| Producer agreements signed | 10 | HireRight |
| EPK complete | 10 | EPK.fyi |
| Metadata optimised | 10 | PressBit / DistroAdvisor |
| Total | 100 |
Snippets have a simplified readiness checklist — visual asset, caption copy, and platform strategy. No distribution documentation required.
funun/
│
├── app/
│ ├── (marketing)/ # Public pages
│ │ ├── page.tsx # Homepage
│ │ ├── pricing/
│ │ ├── features/
│ │ └── for-industry/
│ │
│ ├── (auth)/
│ │ ├── signin/
│ │ ├── signup/
│ │ └── onboarding/
│ │
│ ├── (artist)/
│ │ ├── dashboard/ # Active projects overview
│ │ ├── vault/ # SOUND VAULT — full discography
│ │ │ ├── page.tsx # All projects, all types
│ │ │ ├── new/ # Create new vault project
│ │ │ └── [projectId]/ # Individual project room
│ │ │ ├── page.tsx # Overview + Vault Readiness Score
│ │ │ ├── tracks/ # Audio + metadata
│ │ │ ├── assets/ # Artwork + visuals
│ │ │ ├── documents/ # Legal docs
│ │ │ ├── tools/ # Tool outputs for this project
│ │ │ ├── distribute/ # Send to distributors
│ │ │ ├── pitch/ # Pitch to industry
│ │ │ └── campaign/ # Promo calendar
│ │ ├── tools/[toolSlug]/
│ │ ├── community/
│ │ ├── antenna/
│ │ └── settings/
│ │
│ ├── (industry)/
│ │ ├── dashboard/
│ │ ├── inbox/
│ │ ├── search/
│ │ └── profile/
│ │
│ └── api/
│ ├── vault/ # Vault project CRUD
│ ├── tracks/
│ ├── assets/
│ ├── documents/
│ ├── tools/[toolSlug]/
│ ├── submissions/
│ ├── pitches/
│ ├── community/
│ ├── antenna/
│ ├── stripe/
│ └── user/
│
├── lib/
│ ├── supabase/
│ ├── stripe/
│ ├── anthropic/
│ ├── tools/
│ ├── vault/ # Vault readiness + utilities
│ ├── storage/
│ └── matching/
│
├── types/index.ts
├── supabase/migrations/
├── middleware.ts
└── package.json
| Layer | Technology |
|---|---|
| Frontend | Next.js 15 (App Router) + TypeScript + Tailwind |
| Auth | Supabase Auth |
| Database | Supabase (PostgreSQL) with RLS |
| File Storage | Supabase Storage (audio up to 250MB, artwork up to 10MB) |
| Payments | Stripe (subscriptions + pitch credits) |
| AI | Anthropic API — server-side only |
| Resend | |
| Hosting | Vercel |
| Tier | Price | Tools | Pitches/month | Community | Antenna |
|---|---|---|---|---|---|
| Free | $0 | 3 core tools | 2 | Read only | — |
| Pro | $19/mo | All 28 tools | 20 | Full access | Matched only |
| Studio | $29/mo | All 28 tools | Unlimited | Full + Pete's Table | Full access |
| Founding | $99 lifetime | All tools forever | Unlimited | Full + Pete's Table | Full access |
Prerequisites: Node.js 18.18+ (Next.js 15), npm, and a Supabase account/project.
# 1. Clone and install
git clone https://github.com/PeteyFranchise/funun.git
cd funun
npm install
# 2. Configure environment
cp .env.example .env.local
# Then open .env.local and fill in real values (see "Environment variables" below).
# Never commit .env.local — it is gitignored.
# 3. Sync the database schema (optional for UI work; required for backend)
npx supabase link --project-ref YOUR_PROJECT_REF
npm run db:push # applies supabase/migrations
npm run db:types # regenerates types/supabase.ts
# 4. Run the dev server
npm run dev # http://localhost:3000
All keys live in .env.example. Copy it to .env.local and fill in
values from the respective dashboards. Secrets are never committed — ask Pete for
them via a secure channel (password manager / encrypted message), not over GitHub.
| Variable | Source |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API |
ANTHROPIC_API_KEY | Anthropic Console (server-side only) |
STRIPE_*, NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | Stripe Dashboard |
RESEND_API_KEY, RESEND_FROM_EMAIL | Resend Dashboard |
DDEX_DPID | DDEX Party ID (optional; placeholder used if unset) |
NEXT_PUBLIC_APP_URL | http://localhost:3000 locally · https://funun.studio in prod |
NEXT_PUBLIC_VAULT_DEMO | leave unset/false; true enables demo mode (no real backend) |
| Command | What it does |
|---|---|
npm run dev | Start the local dev server |
npm run build | Production build |
npm run lint | Lint with ESLint |
npm run db:push | Apply Supabase migrations |
npm run db:types | Regenerate Supabase TypeScript types |
Production auto-deploys from main via Vercel, so don't push directly to main.
Branch, open a PR, and merge once it builds green:
git checkout -b feature/your-change
# ...commit work...
git push -u origin feature/your-change
# open a PR against main
Email/password auth via Supabase Auth, with confirmation and password-reset emails delivered through Resend (custom SMTP configured in the Supabase dashboard). All keys come from environment variables — no secrets are committed.
| Flow | Page | Supabase call |
|---|---|---|
| Sign up | /signup | signUp({ email, password, options: { emailRedirectTo } }) — sends a confirmation email; session stays null until the user verifies |
| Email confirmation | /auth/callback | exchangeCodeForSession(code) — verifies the ?code= link, then redirects into the app |
| Sign in | /signin | signInWithPassword({ email, password }) |
| Sign out | SignOutButton | signOut() |
| Forgot password | /forgot-password | resetPasswordForEmail(email, { redirectTo: .../auth/callback?next=/update-password }) |
| Set new password | /update-password | updateUser({ password }) (reached via the recovery link → /auth/callback → here) |
Route protection lives in middleware.ts: /vault, /dashboard,
/settings, /collaborators, /split-sheets, /launchpad, and /admin require a session;
/signin, /signup, and /forgot-password bounce signed-in users to /vault;
/update-password stays reachable during the temporary recovery session.
| Variable | Where it goes | Source |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | .env.local (browser-exposed) | Supabase → Project Settings → API → Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | .env.local (browser-exposed) | Supabase → Project Settings → API → anon public key |
SUPABASE_SERVICE_ROLE_KEY | .env.local (server-only, never exposed) | Supabase → Project Settings → API → service_role key |
NEXT_PUBLIC_APP_URL | .env.local | http://localhost:3000 locally · https://funun.studio in prod — used to build reset-email redirect URLs |
Authentication → Emails → SMTP: Resend, verified sender [email protected]
(display name Funún), host smtp.resend.com, port 465, username resend, password =
a Resend API key.
Authentication → URL Configuration:
https://funun.studio (production). This is the fallback redirect and the
{{ .SiteURL }} template variable in the auth emails — never leave it as localhost on a
production project.https://funun.studio/auth/callback
https://funun.studio/update-password
http://localhost:3000/auth/callback # dev only
http://localhost:3000/update-password # dev only
Supabase matches the base path and ignores the ?next=… query string, so the /auth/callback
entry covers /auth/callback?next=/update-password. The /update-password entries are a
defensive fallback for the hash-fragment recovery flow.Signup + email confirmation
/signup, register with a real inbox you control.<[email protected]>./auth/callback, the session is created, and you land in /vault.Password reset
/signin → Forgot password? → /forgot-password./auth/callback exchanges the code →
you land on /update-password with an active recovery session./vault. Sign out and sign back in
with the new password to confirm.Verify email delivery
Built by Pete — multi-platinum songwriter, 15 years in the music industry.