Join the Agent Deck Discord Server!
Discord에서 Agent Deck 커뮤니티 확인, 357명과 자유 음성·텍스트 채팅 이용
같은 과의 Pan-Atlantic University 동문과 연결하고, 멘토링 예약·실시간 공간 참여·네트워크를 확장하세요
Connect with Pan-Atlantic University alumni from your course. Book mentorship sessions, join live spaces, and grow your network.
소셜TypeScript · CSSGitHub @oghenetejirinowumi온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기PAU Network bridges the gap between Pan-Atlantic University students and alumni. Filter mentors by course, view profiles, and seamlessly book career guidance sessions. Built during a 6-hour hackathon.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗PAU Network connects Pan-Atlantic University students with alumni from their own course. Students filter alumni by department, view LinkedIn-style profiles, book 30-minute mentorship sessions, send message requests, and join live Q&A spaces. Alumni publish availability, post to the timeline, host spaces, and earn badges, tiers and awards for helping.
Built in 6 hours for the Technology Innovation Club Mini Hackathon (Challenge 06: Alumni networking).
All people in the seed data are fictional. Employers are real Nigerian companies, used only for realism.
PAU-Network/
├── backend/ Express 5 + TypeScript REST API and Socket.IO server
│ ├── prisma/
│ │ ├── schema.prisma Data model (single source of truth)
│ │ ├── migrations/ SQL migrations (includes partial unique index + check constraints)
│ │ ├── seed.ts Demo users, work history, 20 months of activity, spaces, posts, messages
│ │ └── seed-awards.ts Computes historical monthly/yearly awards from the points ledger
│ ├── prisma.config.ts Prisma 7 config (CLI uses DIRECT_URL)
│ └── src/
│ ├── app.ts Express app, routes mounted under /api/v1
│ ├── server.ts HTTP + Socket.IO entry point
│ ├── config/env.ts Validated environment variables
│ ├── lib/ prisma client (driver adapter), JWT, errors, validation, shared selects
│ ├── middleware/ authenticate, requireRole, error handler
│ ├── realtime/ Socket.IO rooms: user:<id>, space:<id>
│ └── modules/ One folder per feature: <feature>.routes.ts (+ .service.ts / .config.ts)
│ ├── auth users profile departments
│ ├── availability bookings
│ ├── conversations posts spaces
│ ├── gamification awards notifications
└── frontend/ Next.js 15 (App Router) + Tailwind CSS v4
└── src/
├── theme.ts ALL colours live here (see "Theming")
├── app/ Pages: feed, alumni, profile/[userId], settings, spaces, spaces/[spaceId],
│ messages, messages/[conversationId], bookings, availability, achievements, awards
├── components/ AppShell, ui kit, PostCard, BookingModal, EmojiPicker, Toast
└── lib/ api client, session + socket context, types, formatters, image resizing
Request flow: browser → REST /api/v1/* (JWT bearer token) → Prisma 7 (@prisma/adapter-pg) → PostgreSQL (Neon). State changes emit Socket.IO events (resource:action-past-tense, e.g. space:hand-raised) so open tabs update live.
Audio/video in sessions and spaces uses Jitsi Meet rooms (no API key). Raised hands, speakers, questions, upvotes and emoji reactions run on our own Socket.IO server.
| Thing | Convention | Example |
|---|---|---|
| Prisma models | PascalCase, singular | SpaceQuestion |
| Database tables | snake_case, plural | space_questions |
| Fields / JSON keys | camelCase | graduationYear |
| Database columns | snake_case | graduation_year |
| Enums | PascalCase type, SCREAMING_SNAKE values | BookingStatus.PENDING |
| Primary / foreign keys | id (UUID) / <relation>Id | authorId |
| Booleans | is / has prefix | isVerified, hasOpenSlots |
| Timestamps | <event>At, UTC ISO 8601 | createdAt, startsAt |
| Counters | <thing>Count | commentCount |
| REST paths | plural kebab-case nouns, actions as sub-resources | POST /bookings/:bookingId/accept |
| Socket events | resource:action-past-tense | space:question-created |
| Responses | { data, meta? } / { error: { code, message, details? } } |
Every colour is defined once in frontend/src/theme.ts. The root layout turns it into CSS variables, and globals.css maps them to Tailwind classes (bg-primary, text-muted, border-line, bg-tier-gold, …). Change a hex value in theme.ts and the whole app updates. To add a new colour, add it to theme.ts and add one --color-<name>: var(--<name>); line to @theme inline in globals.css.
Requirements: Node 20+.
# 1. Backend
cd backend
cp .env.example .env # paste your Neon DATABASE_URL and DIRECT_URL
npm install
npx prisma migrate deploy
npm run db:seed # demo data; every account's password is demo1234
npm run dev # http://localhost:4000/api/v1
# 2. Frontend (new terminal)
cd frontend
cp .env.example .env.local
npm install
npm run dev # http://localhost:3000
No Neon yet? npx prisma dev starts a local Postgres; put its URL in both DATABASE_URL and DIRECT_URL and set DATABASE_POOL_MAX=1.
Demo logins (password demo1234): [email protected] (CS student), [email protected] (alumni, Paystack), [email protected] (admin). The login page has one-click demo buttons.
Create an app in the LinkedIn Developer Portal and enable Sign In with LinkedIn using OpenID Connect. Add this exact authorized redirect URL to the app:
http://localhost:4000/api/v1/auth/linkedin/callback
Set LINKEDIN_CLIENT_ID and LINKEDIN_CLIENT_SECRET in backend/.env. The default callback URL and frontend URL are for local development; set LINKEDIN_REDIRECT_URI, FRONTEND_URL, and CORS_ORIGINS for your deployment. The app requests only the openid, profile, and email scopes. Existing accounts are signed in by their verified LinkedIn email; new users confirm their PAU role, department, and study or employment details during registration.
Apply the new LinkedIn identity column before running the updated backend with cd backend && npm run db:deploy.
Spaces use LiveKit Cloud for real-time audio. Create a LiveKit Cloud project and set LIVEKIT_URL, LIVEKIT_API_KEY and LIVEKIT_API_SECRET in backend/.env (the URL starts with wss://). Restart the backend after configuration. The backend issues short-lived room tokens only to participants who have joined a live space; hosts and promoted speakers may publish microphone audio, while listeners may only subscribe. Tokens do not permit video or data publishing. No Jitsi account or moderator login is required.
Users who click Remind me are emailed once 1 hour before and again 15 minutes before a scheduled space starts. Configure RESEND_API_KEY and EMAIL_FROM in backend/.env; the sender address must be verified in Resend. Apply pending migrations with cd backend && npm run db:deploy and restart the backend. Reminder emails link to the space in the frontend. If the backend is unavailable during a reminder window, pending emails are sent when it resumes, while the space is still scheduled to start.
DATABASE_URL and the direct URL for DIRECT_URL.render.yaml. Set DATABASE_URL, DIRECT_URL and CORS_ORIGINS (your Vercel URL).frontend and NEXT_PUBLIC_API_URL=https://<your-render-app>.onrender.com/api/v1.POST /api/v1/awards/compute as an admin on the 1st of each month (and on 1 January for yearly awards), e.g. from a cron job.