MedGryd
Planner, question bank, patient simulator, board plan, OMM protocols and grades — one account, built by medical students.
Campusly — l'appli étudiante de l'UCAC Nkolbisson : anciens sujets d'examens, logements vérifiés autour du campus, pressings partenaires et programme de la semaine.
Translation pending
EducationJavaScript · TypeScriptGitHub @haruna-rashid-yakubuConnection unstableOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.