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 ↗DormLoot is a mobile-first student marketplace for giving away, selling, saving and requesting dorm items by campus. It launches at Fordham (Rose Hill and Lincoln Center) and is built to open to other schools later. Students post items with photos, browse and filter by campus, message each other in the app, save listings, and mark their own items sold.
DormLoot is run by students. It is not operated by or affiliated with Fordham University.
Install dependencies:
npm install
Create a local environment file:
cp .env.example .env.local
Fill in your Supabase project values in .env.local, then start the dev server:
npm run dev
Open http://localhost:3000.
To verify a production build locally:
npm run build
| Name | Scope | Required | Purpose |
|---|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | public, browser | yes | Supabase project endpoint |
NEXT_PUBLIC_SUPABASE_ANON_KEY | public, browser | yes | Anon key; access is controlled by Row Level Security |
Both are public browser keys by design. There is no service-role key anywhere in
this project, and none should be added without a specific server-side reason.
Set both in Vercel for Production and Preview. Do not commit .env.local; it is
ignored by .gitignore.
npm run lint # eslint, expected to be clean
npm run build # typecheck plus production build
npm test # component tests and isolated-Postgres policy tests
npm test runs component tests for messaging retries, unread badges, photo
preparation and password recovery, plus two Postgres suites that execute the
real supabase/schema.sql and migration inside pglite:
database-launch.test.cjs (lifecycle and moderation) and
permission-denials.test.cjs (a third unrelated account attempting to read or
modify other students' listings, conversations, reports and photo objects).
To open the UI without a Supabase project, see tools/preview-fixtures. Design conventions are documented in docs/design-system.md.
Run the SQL in supabase/schema.sql from the Supabase SQL editor. It creates:
public.listings for marketplace postspublic.saved_listings for saved itemslisting-imagesAfter running the SQL, make sure email/password authentication is enabled in Supabase Auth. The app expects authenticated users to create listings, save listings, upload images, edit their own listings, delete their own listings, and mark their own listings as sold.
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYnpm run build
The app uses only public Supabase browser credentials, with access controlled by Supabase Row Level Security.
The sign-in form links to /forgot-password. Supabase emails a reset link, and
/reset-password validates the session before letting the user set a new password.
Expired links lead back to the reset request form. Email requests show the same
confirmation for existing and unknown accounts.
In Supabase Authentication → URL Configuration, keep the Site URL set to the
production site and add https://<your-production-domain>/reset-password to Redirect
URLs. For local testing, add http://localhost:3000/reset-password. Keep the recovery
email template's {{ .ConfirmationURL }} link so Supabase verifies the reset token.
The app also handles PASSWORD_RECOVERY on the configured Site URL, in case
Supabase falls back to it. No server or service-role key is needed.
Before release, request a reset for a test account, open the newest email link,
set a matching password of at least 8 characters, sign out, and sign in with the
new password. Also check an expired link, mismatched passwords, and a failed email
request. Build with npm run build to verify TypeScript and all routes.
Messaging now uses server timestamps and a database trigger to save each message and update inbox ordering in the same transaction. Clients reuse message IDs on retry, reconcile lost responses, and refresh via Supabase Realtime, reconnect, tab focus, and a 15-second visible-tab fallback. Send failures preserve the thread and draft. Read markers acknowledge only fetched incoming messages.
Photo creation and editing share preparation: up to five original files, 20 MB each; HEIC/HEIF conversion is loaded on demand, still images are resized to a maximum 1600-pixel edge and encoded as JPEG, and GIFs retain animation up to 5 MB. The storage bucket must enforce a 5 MB upload limit and allow only JPEG, PNG, WEBP and GIF. HEIC originals are converted before reaching storage.
Admins review reports at /admin/reports, also linked from their profile. Removing
a listing hides it from public browsing while retaining its reports and messages.
The owner can see its removed status. An admin can restore it. Ordinary users
cannot read other users' reports or promote themselves to admin.
supabase/migrations/20260919152913_launch_readiness.sql to the existing
Supabase project before deploying the app changes. It changes policies,
grants, triggers, Realtime publication membership, and storage restrictions.
supabase/schema.sql contains the same setup for a new project.supabase/check-launch-readiness.sql. This uses generated fixture accounts
inside a transaction and rolls them all back; it sends no emails.In the Supabase SQL editor, replace the email below with the explicitly selected owner account. This is an administrative operation; it is never run from the app.
do $$
declare chosen_user uuid;
begin
select id into strict chosen_user from auth.users
where lower(email) = lower('REPLACE_WITH_CONFIRMED_OWNER_EMAIL')
and email_confirmed_at is not null;
insert into public.moderators(user_id) values (chosen_user) on conflict do nothing;
end $$;
npm test includes isolated Postgres tests of the real application policies,
triggers, and moderation functions, plus component tests for message retries,
updates, unread badges, report actions and photo preparation. The isolated
database models Supabase-owned auth/storage interfaces; live Realtime transport,
storage HTTP enforcement and device photo decoding need the post-deploy checks.