World Vibe Web
The distributed app store for vibe-coded projects. Browse, discover, and install open-source apps from across GitHub.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Artist-owned fashion ecosystem: influence map, artist directory, collaborate board, preorder shop, public royalty ledger.
npm install
cp .env.example .env.local # already filled in for the collective Supabase project
npm run dev # http://localhost:3000
.env.local points at the live Supabase project (evwcqfpidsrdepreygnw, us-east-1) which already holds the seed data.
Set DATA_SOURCE=json to run from src/data/*.json with no database.
For preorders to write orders, add SUPABASE_SERVICE_ROLE_KEY (Supabase dashboard → Project Settings → API). Never ship it to the client.
src/app/ — Home, /map, /artists, /artists/[slug], /collaborate, /shop, /shop/[slug], /about, /mesrc/components/InfluenceMap.tsx — MapLibre map: craft-coloured pins → artist sidebar → click a garment → influence arcs light up + process timeline scrubber → walk the graph via contributors; trace-forward to derivatives.src/app/api/map/pins and src/app/api/works/[id]/lineage — the two JSON endpoints the map consumes.src/lib/data.ts — async data layer. Reads Supabase (tables + map_pins, work_funding, artist_earnings views + lineage_json() RPC); falls back to src/data/*.json when DATA_SOURCE=json.src/app/api/preorder + src/components/PreorderButton.tsx — mock checkout that calls the place_preorder() RPC: creates the collector, the order, and accrues ledger rows for every confirmed contributor. Stripe later replaces only the front half (Checkout Session → webhook → same RPC).src/data/ — fictional seed data (20 artists, 24 works, 47 contributions, 12 influences, 79 timeline events, 52 orders, 233 ledger rows). Regenerate with python3 seed/generate.py.supabase/schema.sql — Postgres schema matching the JSON 1:1, PostGIS pins, recursive lineage function, public append-only ledger.Riso / neon / cosmic — Afrofuturism × Asian futurism × Y2K. Palette in globals.css (--magenta --yellow --indigo --cyan --gold --red on deep indigo #0b0a1a, warm paper ink). Paper grain and halftone overlays, riso color-offset headlines (.riso, .riso-yellow), neon signage (.neon, NeonSign), and procedural cultural motifs in src/components/motifs.tsx (KenteStrip, AdinkraGrid, GlyphColumn, RisoSun, Tunnel, Stars). These are abstractions in the palette, not reproductions — swap in artists' real work as it arrives. Custom classes live in @layer components so Tailwind utilities (e.g. absolute) always win.
Chakra Petch (nav) and Space Grotesk (body) load from Google Fonts. Neue Machina Inktrap (display) and Departure Mono (readouts) are licensed — drop the .woff2 files into public/fonts/ and uncomment the @font-face block in src/app/globals.css.
Scaffold uses CARTO dark raster tiles (free, attribution required). For the retro-topographic look, make a style in MapTiler and replace STYLE in InfluenceMap.tsx with the style URL.
Magic-link sign-in (/login, Supabase Auth, no password). One account, three roles stored in profiles.role:
/me: orders, become-an-artist form./me/studio: earnings, credit inbox (accept/decline credits others declare on you), publish works with media upload + contributor splits that must total 100. Publishing unlocks once a curator approves the profile./admin: approve artist applications, override pending credits, create/advance drops, mark accrued royalties paid, export accrued CSV.Make yourself curator once (Supabase → SQL editor):
update profiles set role = 'curator' where email = '[email protected]';
(An allowlist trigger for this was blocked by a permission check during the build; one line does the job.)
Onboarding at /me/onboard — five steps saved as you go (upsert_my_artist RPC): Identity (name, name in own script → neon signs, pronouns, languages, roles, city pin via OpenStreetMap geocoder, bio, portrait → map pin, cover, links) · Lineage (relationship to tradition, heritage statement, mentors, 1–5 influence places → personal arcs on the map via artist_influences) · Craft & terms (specialties, materials, techniques, maker capacity, open-to, rate basis/range, currency, availability, default license) · Work (press/links for curators) · Agreement (versioned text in agreements, acceptance timestamped). Submits as pending; curator approves in /admin with the lineage statement visible.
Public profile /artists/[slug]: cover, portrait, native-name neon, lineage block, terms, works, credits, public ledger. Map: ?artist=<id> deep-links and draws their influence arcs.
src/lib/email.ts (Resend). Events: profile submitted, profile approved, you were credited, credit accepted, order confirmed. Logs to console until RESEND_API_KEY + EMAIL_FROM are set. Client components call /api/notify after an RPC succeeds; the server re-derives recipients from the DB.
/api/connect creates a Stripe Connect Express account per artist and returns an onboarding link (button in the studio). Until Stripe keys exist, payouts stay manual from the curator CSV.
PreorderButton tries /api/checkout (Stripe Checkout) first and falls back to /api/preorder (mock, writes a real order) when STRIPE_SECRET_KEY is unset. Webhook: /api/stripe/webhook → place_preorder(..., stripe_session_id), idempotent on session id. Local test: stripe listen --forward-to localhost:3000/api/stripe/webhook.
Live in Supabase. supabase/schema.sql is the reference; the applied migrations are:
collective_schema_v0, map_views_and_lineage_json, place_preorder_rpc, auth_profiles_roles_and_studio_rpcs, artist_profiles_v2. RLS: public read on everything except collectors; writes go through RPCs with the service role.
SUPABASE_SERVICE_ROLE_KEY → mock preorders + webhook can write.respond_to_credit / curator_set_* RPCs)./collaborate (the licenses table + RLS are ready; needs the request/accept UI).<Art> gradients on public pages with work.media[] once artists upload.collectors.user_id at checkout so orders key on the account, not the email hash.