IUGET's exclusive campus short-video social platform β think TikTok, but private, data-conscious, and built for the student body of Institut Universitaire des Grandes Ecoles des Tropiques, Douala π¨π²
Global platforms like TikTok and Instagram leave campus communities invisible. U-Buzz fixes that with three hard constraints:
| Problem | U-Buzz's Solution |
|---|---|
| π Global algorithms drown local voices | Campus-only feed β IUGET content only |
| π± Mobile data is expensive in Cameroon | Cloudinary-powered 1 Mbps / 720p cap saves data |
| π No student ID verification API at IUGET | Honor-system matricule format (IU2024) + privacy masking (IU****24) |
| π’ Admin notices get buried in the feed | Dedicated admin announcements channel with PDF attachments |
|
|
|
|
graph TD
A[React Native / Expo Frontend] -->|REST Upload| B((Cloudinary CDN))
A -->|Supabase Client SDK| C((Supabase Backend))
C -->|PostgreSQL + RLS| D[(Database)]
C -->|WebSocket Realtime| A
| Layer | Technology |
|---|---|
| Mobile App | React Native 0.81 + Expo 54 (Managed Workflow) |
| Language | TypeScript 5.9 |
| Navigation | React Navigation v7 (Stack + Bottom Tabs) |
| Backend / Auth | Supabase (PostgreSQL, Auth, Realtime) |
| Media CDN | Cloudinary (unsigned uploads, on-the-fly transformations) |
| Styling | NativeWind (Tailwind CSS for React Native) |
| Video Player | expo-video (AVPlayer on iOS, ExoPlayer on Android) |
| Secure Storage | expo-secure-store + custom ChunkedSecureStoreAdapter |
| Animations | react-native-reanimated + react-native-gesture-handler |
erDiagram
users ||--o{ videos : "uploads"
users ||--o{ likes : "likes"
users ||--o{ comments : "writes"
users ||--o{ follows : "follower/following"
users ||--o{ announcements : "posts (admin only)"
videos ||--o{ likes : "receives"
videos ||--o{ comments : "has"
videos ||--o{ reports : "reported"
announcements ||--o{ announcement_documents : "attaches"
is_adminflag onuserstable controls announcement CRUD via RLS policieshandle_new_user()trigger auto-creates a public profile on every Supabase Auth signup- Unique matricule constraint enforces one-account-per-student at the DB level
- Cloudinary
public_idstored alongsidesecure_urlfor future deletion/management
- Node.js 18+
- Expo CLI (
npm install -g expo-cli) - A Supabase project
- A Cloudinary account with an unsigned upload preset
git clone https://github.com/daikictrl/uBuzz.git
cd uBuzzcd frontend
npm installCopy the example env file and fill in your credentials:
cp .env.example .envEXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
EXPO_PUBLIC_CLOUD_NAME=your-cloudinary-cloud-name
EXPO_PUBLIC_PRESET_NAME=your-unsigned-upload-presetRun the SQL files in /backend/migrations/ in order against your Supabase project:
001_create_tables.sql
004_user_trigger.sql
006_announcements.sql
007_announcement_document.sql
npx expo startScan the QR code with Expo Go on your device, or press a for Android emulator / i for iOS simulator.
uBuzz/
βββ frontend/ # React Native (Expo) application
β βββ src/
β β βββ components/ # Reusable UI components
β β β βββ CommentsSheet.tsx
β β β βββ EditProfileSheet.tsx
β β β βββ SkeletonCard.tsx
β β β βββ VideoCard.tsx
β β βββ screens/ # Full screens
β β β βββ AuthScreen.tsx
β β β βββ HomeScreen.tsx
β β β βββ UploadScreen.tsx
β β β βββ ProfileScreen.tsx
β β β βββ AnnouncementsScreen.tsx
β β β βββ AdminDashboardScreen.tsx
β β βββ navigation/ # React Navigation setup
β β βββ lib/ # Utilities (validation, badges)
β β βββ services/ # Cloudinary upload services
β βββ assets/ # App icons & splash screen
βββ backend/
β βββ migrations/ # PostgreSQL migration files
βββ context/ # Architecture & code standards docs
| Phase | Feature | Status |
|---|---|---|
| 1 | Project Scaffold + Supabase Setup + Auth Screen | β Done |
| 2 | Home Feed β Vertical Video Scroll | β Done |
| 3 | Upload Screen + Cloudinary Pipeline | β Done |
| 4 | Comments Bottom Sheet + Realtime Sync | β Done |
| 5 | Profile Screen + Edit Profile | β Done |
| 6 | Follows System + Feed Filter | β Done |
| 7 | Admin Dashboard + Announcements Channel | β Done |
| 8 | Polish + Production Hardening | π§ In Progress |
U-Buzz uses a dark-first glassmorphism design language:
| Token | Value | Usage |
|---|---|---|
| Background | #0A0A0F |
App base |
| Surface | #16161E |
Cards, bottom sheets |
| Primary Purple | #8B5CF6 |
CTAs, upload button |
| Secondary Pink | #EC4899 |
Likes, hearts, notifications |
| Trust Blue | #3B82F6 |
Verified badges, links |
| Glass Highlight | rgba(255,255,255,0.08) |
Card borders |
- The Supabase anon key is intentionally public-facing (designed for client-side use)
- All sensitive write operations are protected by Row Level Security (RLS) policies
- Announcement creation and deletion are admin-only via RLS
- The
.envandeas.jsonfiles are excluded from this repository β never commit them - Matricule numbers are masked in search results (
IU****45) to protect student privacy
This project is for educational and campus use at IUGET, Douala, Cameroon.
Made with π for IUGET students Β· Powered by Supabase & Cloudinary