Skip to content

Repository files navigation

U-Buzz Logo

U-Buzz 🐝

Your Campus. Your Buzz.

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 🇨🇲

React NativeExpoSupabaseTypeScriptCloudinary


🎯 Why U-Buzz?

Global platforms like TikTok and Instagram leave campus communities invisible. U-Buzz fixes that with three hard constraints:

ProblemU-Buzz's Solution
🌐 Global algorithms drown local voicesCampus-only feed — IUGET content only
📱 Mobile data is expensive in CameroonCloudinary-powered 1 Mbps / 720p cap saves data
🔐 No student ID verification API at IUGETHonor-system matricule format (IU2024) + privacy masking (IU****24)
📢 Admin notices get buried in the feedDedicated admin announcements channel with PDF attachments

✨ Features

📱 Core Experience

  • Vertical Video Feed — TikTok-style full-screen scroll with "For You" and "Following" tabs
  • Double-tap to Like — Heart burst animation at touch point
  • Real-time Comments — Supabase Realtime WebSocket sync across all devices
  • Video Upload — Direct multipart upload to Cloudinary (max 30MB / 60s)

🔒 Campus Safety

  • Matricule Validation — Regex-enforced ^IU[0-9]{4,}$ format on client + DB
  • Privacy Masking — Matricules displayed as IU****45 in search results
  • Admin Channel — RLS-protected announcements only admins can post
  • Report System — Admin-accessible report queue for abusive content

👤 Social Graph

  • Follow / Unfollow — Curated following feed
  • Profile Grid — 3-column 9:16 thumbnail gallery
  • Edit Profile — Avatar upload via Cloudinary with face-crop
  • Badge Notifications — Unread announcement red dot

⚡ Performance

  • FlatList TuningwindowSize={3}, removeClippedSubviews, getItemLayout
  • On-the-fly Transcodingf_auto,q_auto,br_1m,w_720 Cloudinary params
  • Skeleton Loaders — Pulsing gradient placeholders
  • ChunkedSecureStore — Splits JWT tokens exceeding Android's 2KB limit

🛠 Tech Stack

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
Loading
LayerTechnology
Mobile AppReact Native 0.81 + Expo 54 (Managed Workflow)
LanguageTypeScript 5.9
NavigationReact Navigation v7 (Stack + Bottom Tabs)
Backend / AuthSupabase (PostgreSQL, Auth, Realtime)
Media CDNCloudinary (unsigned uploads, on-the-fly transformations)
StylingNativeWind (Tailwind CSS for React Native)
Video Playerexpo-video (AVPlayer on iOS, ExoPlayer on Android)
Secure Storageexpo-secure-store + custom ChunkedSecureStoreAdapter
Animationsreact-native-reanimated + react-native-gesture-handler

🗃 Database Schema

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"
Loading

Key Design Decisions

  • is_admin flag on users table controls announcement CRUD via RLS policies
  • handle_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_id stored alongside secure_url for future deletion/management

🚀 Getting Started

Prerequisites

  • Node.js 18+
  • Expo CLI (npm install -g expo-cli)
  • A Supabase project
  • A Cloudinary account with an unsigned upload preset

1. Clone the repo

git clone https://github.com/daikictrl/uBuzz.git
cd uBuzz

2. Install dependencies

cd frontend
npm install

3. Configure environment variables

Copy the example env file and fill in your credentials:

cp .env.example .env
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.coEXPO_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-keyEXPO_PUBLIC_CLOUD_NAME=your-cloudinary-cloud-nameEXPO_PUBLIC_PRESET_NAME=your-unsigned-upload-preset

4. Apply database migrations

Run 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

5. Run the app

npx expo start

Scan the QR code with Expo Go on your device, or press a for Android emulator / i for iOS simulator.


📂 Project Structure

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

📈 Development Progress

PhaseFeatureStatus
1Project Scaffold + Supabase Setup + Auth Screen✅ Done
2Home Feed — Vertical Video Scroll✅ Done
3Upload Screen + Cloudinary Pipeline✅ Done
4Comments Bottom Sheet + Realtime Sync✅ Done
5Profile Screen + Edit Profile✅ Done
6Follows System + Feed Filter✅ Done
7Admin Dashboard + Announcements Channel✅ Done
8Polish + Production Hardening🚧 In Progress

🎨 Design System

U-Buzz uses a dark-first glassmorphism design language:

TokenValueUsage
Background#0A0A0FApp base
Surface#16161ECards, bottom sheets
Primary Purple#8B5CF6CTAs, upload button
Secondary Pink#EC4899Likes, hearts, notifications
Trust Blue#3B82F6Verified badges, links
Glass Highlightrgba(255,255,255,0.08)Card borders

🔒 Security Notes

  • 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 .env and eas.json files are excluded from this repository — never commit them
  • Matricule numbers are masked in search results (IU****45) to protect student privacy

📝 License

This project is for educational and campus use at IUGET, Douala, Cameroon.


Made with 🐝 for IUGET students · Powered by Supabase & Cloudinary