MedGryd
Planner, question bank, patient simulator, board plan, OMM protocols and grades — one account, built by medical students.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Student super-app for UCAC Nkolbisson — anciens sujets, logements, pressing, and the weekly programme, built as an installable PWA.
Implemented from the Campusly Prototype.dc.html Claude Design handoff (see ../README.md,
../chats/chat1.md and ../project/ at the repo root for the original design brief and
click-through prototype this app was built from).
@neondatabase/serverless)public/sw.js) + web app manifest for installability and an
offline fallbacknpm install.env.example to .env and fill in:
DATABASE_URL — a Neon Postgres connection string (neon.tech, free tier is fine).AUTH_SECRET — generate with npx auth secret.AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET — from a Google Cloud OAuth client
(console.cloud.google.com → APIs & Services → Credentials → OAuth client ID → Web
application). Add http://localhost:3000/api/auth/callback/google (and your production URL
equivalent) as an authorized redirect URI.ADMIN_EMAILS — comma-separated emails that get the admin role the first time they sign
in with Google. Admins can reach /admin (subject moderation, room stock, programme
publishing).BLOB_READ_WRITE_TOKEN — from a Vercel Blob store (Vercel dashboard → Storage → Create
Blob store). Needed for the "Proposer un sujet" and admin "Publier le programme" uploads to
work; without it those actions fail with a clear error instead of silently doing nothing.npm run db:push
There is no seed script: the demo data it created (placeholder papers, Génie
informatique/Génie civil/Gestion classes) was deleted once real UCAC papers went in, and
re-running it would have brought them back. Add real rows through /admin instead.npm run dev and open http://localhost:3000.The prototype was a single clickable .dc.html mock with all state held in memory and no real
backend. This app is the real thing, so a few things were adapted rather than copied literally:
09:41 status
bar, and a drawn-on home-indicator pill — that was Claude Design's preview chrome, not part of
the product. Real phones (and the installed PWA) provide their own; this app only reserves
env(safe-area-inset-*) space for the notch and home indicator./sujets?filiere=...
and /logements?dist=... are shareable/bookmarkable and drive real server-side Drizzle
queries, rather than filtering an in-memory array.components/Sheet.tsx + PickerButton.tsx) for
class/filter/form-field pickers, since that was a deliberately iterated-on piece of the design
per the chat transcript./sujets/[id]/plein,
/programme/plein) instead of client-only overlay state, so the back button and deep links
work naturally.beforeinstallprompt API on Android/Chrome
instead of being decorative; on iOS (which has no such API) only the manual Safari steps show,
which is more accurate than the prototype always showing an install button.state, so they actually survive a reload.src/
app/ Routes (App Router). Tab-bar screens live at the top level
(/, /sujets, /logements, /pressing, /programme); /sujets/proposer,
/installer and /admin intentionally hide the tab bar (see lib/nav.ts).
components/ Shared UI: Sheet/PickerButton, TabBar, Toast, icons, admin widgets…
db/ Drizzle schema and client.
lib/ Data access (data.ts), mutations (actions.ts, all Server Actions),
constants, small utils.
auth.ts NextAuth config (Google + Drizzle adapter).
public/sw.js Minimal offline-fallback service worker.
Any Next.js host works; Vercel is the path of least resistance since Blob storage is already a
Vercel product. Set the same env vars there and run npm run db:push once against the production
DATABASE_URL.