Skip to content

Latest commit

Β 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

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 Native Expo Supabase TypeScript Cloudinary


🎯 Why U-Buzz?

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

✨ 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 Tuning β€” windowSize={3}, removeClippedSubviews, getItemLayout
  • On-the-fly Transcoding β€” f_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
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

πŸ—ƒ 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.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-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

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

🎨 Design System

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

πŸ”’ 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