MedGryd
의대생이 만든 하나의 계정으로 플래너·문제은행·환자 시뮬레이터·보드 플랜·OMM 프로토콜·성적 관리까지 제공
Campusly는 UCAC Nkolbisson 학생용 앱으로, 기출문제, 캠퍼스 인근 검증 주거, 파트너 프린팅, 주간 프로그램을 제공합니다
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.
교육JavaScript · TypeScriptGitHub @haruna-rashid-yakubu최근 접속 확인 실패운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.