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.