UniLink is a localized professional network designed specifically for the Nigerian tertiary education context. It bridges the gap between students looking for SIWES/Internships and local organizations looking for talent.
Core Philosophy:
- Students: Move beyond "Job Hunting" to "Career Discovery" using AI and verified academic data.
- Organizations: Move beyond "Resumes" to "Skill-based Hiring" and campus scouting.
- Frontend Library: React 18 (TypeScript)
- Styling: Tailwind CSS (Mobile-first, Stone/Emerald aesthetic)
- Icons: Lucide React
- Backend: Supabase
- Auth: Email/Password (Row Level Security enabled)
- Database: PostgreSQL
- Realtime: WebSocket subscriptions for Chat and Feed
- AI Engine: Google Gemini Flash (
@google/genai) for Career Copilot
/
├── components/
│ ├── Auth.tsx # Entry point. Handles Login/Signup & Role Selection.
│ ├── Navigation.tsx # Responsive shell. Sidebar (Desktop) & Header (Mobile).
│ ├── Feed.tsx # Social stream. Handles posting, liking, commenting.
│ ├── JobBoard.tsx # Dual-mode board: Apply (Student) / Manage (Org).
│ ├── Network.tsx # User discovery. Filters based on viewer role.
│ ├── Profile.tsx # User identity. Edit mode & View mode.
│ ├── CareerAI.tsx # Gemini integration. Generates roadmaps.
│ ├── Messages.tsx # Real-time chat UI.
│ └── Notifications.tsx# Activity log.
├── lib/
│ └── supabase.ts # Singleton Supabase client instance.
├── services/
│ └── geminiService.ts # Abstraction layer for AI prompts.
├── types.ts # TS Interfaces (User, Job, Post, etc.)
└── constants.ts # Mock data for fallback/demo.
File: components/Auth.tsx
- Role Selection (Toggle):
- Users must select Student or Organization before signing up. This sets the
account_typein the database.
- Users must select Student or Organization before signing up. This sets the
- Student Signup:
- Inputs: Full Name, University, Department, Email, Password.
- Logic: Creates a profile with an avatar seed based on the name.
- Organization Signup:
- Inputs: Company Name, Industry, Location, Website, Work Email, Password.
- Logic: Creates a profile designed for business verification.
File: components/Navigation.tsx
- Logic: The sidebar menu changes dynamically based on
account_type. - Student Menu: Feed, Network, Internships, Messages, Career Copilot, Profile.
- Org Menu: Feed, Talent Pool (Network), Manage Jobs, Messages, Company Profile.
- Mobile Experience: Sidebar collapses into a hamburger menu on small screens.
File: components/Feed.tsx
- View Toggle (Student Only):
- Button: "Global" vs "My Campus".
- Logic:
- Global: Shows posts from all universities.
- My Campus: Filters posts where
post.author.university === currentUser.university.
- Create Post:
- Input: Text area + Image Upload.
- Tagging:
- Students: Auto-tagged as "General".
- Orgs: Auto-tagged as "Company Update".
- Interactions:
- Like: Optimistic UI update (updates number immediately) -> Writes to DB.
- Comment: Opens a comment drawer inline. Real-time updates.
File: components/JobBoard.tsx
View A: Student Mode
- Filters:
- SIWES: Specifically for mandatory industrial training.
- Remote: For work-from-home roles.
- Paid: Filters out unpaid opportunities.
- Search: Searches Job Title and Company Name.
- Action: "Apply Now" button (Simulates application sending).
View B: Organization Mode
- Action: "Post Job" (Button).
- Modal: Opens form for Title, Type (SIWES/Internship), Location, Remote/Paid toggle.
- Logic: Job is saved to DB linked to the Org ID.
- Manage: "View Applicants" (Button).
- Modal: Shows a list of students who matched/applied.
- Logic: Displays Match Score, University, and Department for quick screening.
File: components/Network.tsx
- Logic: The list of users displayed depends on the viewer.
- Student View ("Network"):
- Shows other Students (Peers) and Organizations.
- Action: "Connect".
- Organization View ("Talent Pool"):
- Filter: Hides other Organizations. Shows only Students.
- UI: Highlights "University", "Department", and "Skills".
- Action: "Scout Talent" (sends a connection request/message).
File: components/CareerAI.tsx
- Availability: Students Only.
- Input: Automatically pulls
courses,skills, anddepartmentfrom the Student Profile. - Trigger: "Generate My Roadmap" button.
- Process:
- Checks for API Key.
- Sends prompt to Gemini: "Act as a Nigerian career mentor for a student in [Department] taking [Courses]..."
- Fallback: If no API key is set, uses a heuristic engine to generate a static, high-quality response based on the Department keyword (e.g., "Economics" -> Data Analyst path).
- Output: Renders Markdown-formatted roadmap with 3 specific steps (Immediate, SIWES target, Project idea).
File: components/Profile.tsx
- Modes: View vs. Edit.
- Student Fields:
- Badges: Verified skills (visual only).
- Courses: Comma-separated list (e.g., ECO 101, CSC 202). Used for AI generation.
- Skills: Tags.
- Organization Fields:
- Industry: e.g., Fintech, Logistics.
- Location: e.g., Yaba, Lagos.
- Website: External link.
- Edit Action:
- Clicking the "Pen" icon turns text fields into Input/Textarea.
- "Save" commits changes to Supabase
profilestable.
Table: profiles
| Column | Type | Description |
|---|---|---|
id |
uuid | Primary Key, links to auth.users |
account_type |
text | 'student' OR 'organization' |
university |
text | Student only |
department |
text | Student only |
industry |
text | Org only |
courses |
array | List of course codes |
skills |
array | List of skills |
Table: jobs
| Column | Type | Description |
|---|---|---|
id |
uuid | Primary Key |
company |
text | Name of hiring org |
type |
text | 'SIWES', 'Internship', etc. |
is_paid |
bool | Compensation status |
Table: posts
| Column | Type | Description |
|---|---|---|
id |
uuid | Primary Key |
user_id |
uuid | Foreign Key to profiles |
content |
text | Post body |
tag |
text | Context tag |