A production-grade, community-driven Q&A and FAQ platform engineered for institutional portals, university hubs, and knowledge-sharing communities. Featuring a moderated answer pipeline, reputation & badge gamification, AI-powered summaries, multi-language translation, voice-enabled search, text-to-speech accessibility, real-time leaderboards, and a cinematic dark/light developer aesthetic.
🚀 Getting Started · ✨ Features · 🏆 Gamification · 🏗️ Architecture · 📄 License
|
Fine-grained RBAC with three permission tiers:
|
Enterprise-grade content quality assurance:
|
|
Full gamification engine to drive engagement:
|
Hands-free voice input powered by the Web Speech API:
|
|
Built-in accessibility for content consumption:
|
Break language barriers with real-time translation:
|
|
Instant search suggestions as you type:
|
Community-driven content moderation:
|
|
AI-powered question deduplication:
|
Automatic content quality filtering:
|
|
100% free, privacy-first NLP summaries:
|
Cinematic dual-theme experience:
|
| Action | Points |
|---|---|
| Ask a Question | +5 |
| Post an Answer | +10 |
| Answer Gets Upvoted | +10 |
| Question Gets Upvoted | +5 |
| Accepted Answer | +30 |
| Daily Login | +2 |
| Downvote Received | -2 |
|
Beginner Contributor — 10 pts |
Knowledge Sharer — 100 pts |
Expert Contributor — 500 pts |
| Badge | Criteria |
|---|---|
| 👑 Community Leader | Top reputation holder in the community |
| 🔥 Top Contributor of the Month | Most active contributor in the current month |
| 🚀 Fast Responder | Consistently answers within minutes |
| 💡 Innovation Guru | Answers with highest quality ratings |
Visual progress bars show users how close they are to their next badge:
Knowledge Sharer Badge
████████░░ 80/100 Points
Expert Contributor Badge
██░░░░░░░░ 120/500 Points
Live rankings of top contributors displayed platform-wide:
🏅 1. Vishal Soni 1,250 pts 👑🥇🔥
🏅 2. Arnav 980 pts 🥇🥈
🏅 3. Aryan 870 pts 🥈🥈
🏅 4. Priya 650 pts 🥈
🏅 5. Rahul 420 pts 🥉
- Question owners can mark one answer as the accepted answer
- ✅ Green checkmark appears on the accepted answer
- Accepted answer is pinned to the top of the answer list
- The answerer receives +30 reputation points
- Improves content discoverability for future visitors
Every registered user gets a comprehensive profile showcasing:
| Metric | Description |
|---|---|
| 🏆 Total Reputation | Cumulative reputation points earned |
| 🎖️ Badges Earned | All bronze, silver, gold, and special badges |
| ❓ Questions Asked | Total questions submitted |
| 💬 Answers Posted | Total answers contributed |
| ✅ Accepted Answers | Number of answers marked as accepted |
| 📊 Ranking Position | Current leaderboard position |
| 🎯 Progress to Next Badge | Visual progress bar |
┌──────────────────────────────────────────────────────────────────┐
│ CLIENT (SPA) │
│ React 19 · Vite 8 · Tailwind CSS v4 · Framer Motion 12 │
├────────┬────────┬────────┬────────┬────────┬────────┬────────────┤
│ Auth │Question│ Answer │ Search │ Voice │Translation│
│Context │ Hook │ Hook │ Hook │STT/TTS │ Engine │
├────────┴────────┴────────┴────────┴────────┴───────────┤
│ Reputation Engine · Badge System · Leaderboard │
├──────────────────────────────────────────────────────────────────┤
│ Supabase JS Client (v2.106+) │
│ ┌──────────┬──────────┬──────────┐ │
│ │ Auth │ Database │ Storage │ │
│ │ (JWT) │ (REST) │ (S3-API) │ │
└──────────────┴──────────┴──────────┴──────────┴──────────────────┘
│
┌───────────────────────────┴──────────────────────────────────────┐
│ SUPABASE BACKEND │
│ PostgreSQL · Row-Level Security · Edge Functions · Realtime │
├──────────────────────────────────────────────────────────────────┤
│ 8+ Tables · 5+ RPC Functions · 16+ RLS Policies · 9+ Indexes │
│ Cascade Deletes · Composite Constraints · Auto Triggers │
└──────────────────────────────────────────────────────────────────┘
cs44-main/
├── .env.example
├── .gitignore
├── eslint.config.js
├── index.html
├── package-lock.json
├── package.json
├── PROJECT_STRUCTURE.md
├── README.md
├── vite.config.js
├── public/
│ ├── favicon.svg
│ └── icons.svg
├── supabase/
│ ├── .gitignore
│ ├── config.toml
│ ├── migration.sql
│ ├── schema.sql
│ └── schema_flagging.sql
└── src/
├── App.jsx
├── index.css
├── initOrt.js
├── main.jsx
├── assets/
│ ├── hero.png
│ ├── react.svg
│ └── vite.svg
├── config/
│ └── supabase.js
├── contexts/
│ ├── AuthContext.jsx
│ ├── NotificationContext.jsx
│ └── ThemeContext.jsx
├── hooks/
│ ├── useAdmin.js
│ ├── useAnswers.js
│ ├── useAuth.js
│ ├── useCategories.js
│ ├── useFileUpload.js
│ ├── useFlags.js
│ ├── useNotifications.js
│ ├── useQuestions.js
│ ├── useSearch.js
│ ├── useSpeechToText.js
│ ├── useTextToSpeech.js
│ ├── useTranslation.js
│ ├── useTypeahead.js
│ └── useUpvote.js
├── lib/
│ ├── duplicateDetector.js
│ ├── embeddingUtils.js
│ ├── fuzzySearch.js
│ ├── searchVoiceAnswer.js
│ ├── spamDetector.js
│ ├── spamDetector.test.js
│ └── translationService.js
├── pages/
│ ├── AdminDashboard.jsx
│ ├── AskQuestionPage.jsx
│ ├── FaqPage.jsx
│ ├── ForgotPasswordPage.jsx
│ ├── HomePage.jsx
│ ├── LeaderboardPage.jsx
│ ├── LoginPage.jsx
│ ├── ModerationQueue.jsx
│ ├── NotFoundPage.jsx
│ ├── ProfilePage.jsx
│ ├── QuestionDetailPage.jsx
│ ├── SearchPage.jsx
│ └── SignupPage.jsx
└── components/
├── admin/
│ ├── BulkActions.jsx
│ ├── MetricsCards.jsx
│ ├── ModerationActions.jsx
│ └── ModerationTable.jsx
├── answers/
│ ├── AnswerCard.jsx
│ ├── AnswerForm.jsx
│ └── AnswerList.jsx
├── auth/
│ ├── ForgotPassword.jsx
│ ├── LoginForm.jsx
│ ├── ProtectedRoute.jsx
│ └── SignupForm.jsx
├── layout/
│ ├── Footer.jsx
│ ├── Layout.jsx
│ ├── Navbar.jsx
│ └── Sidebar.jsx
├── notifications/
│ ├── NotificationBell.jsx
│ └── NotificationPanel.jsx
├── questions/
│ ├── CategoryPills.jsx
│ ├── DuplicateWarning.jsx
│ ├── QuestionCard.jsx
│ ├── QuestionFeed.jsx
│ └── QuestionForm.jsx
├── search/
│ ├── SearchBar.jsx
│ ├── SearchResults.jsx
│ └── TrendingSearches.jsx
├── translation/
│ ├── LanguageSelector.jsx
│ ├── TranslationBadge.jsx
│ └── TranslationButton.jsx
└── ui/
├── Avatar.jsx
├── BackToTop.jsx
├── Badge.jsx
├── BadgeUnlockModal.jsx
├── badgeIcons.js
├── Button.jsx
├── Card.jsx
├── EmptyState.jsx
├── FilePreview.jsx
├── Input.jsx
├── Modal.jsx
├── ReportModal.jsx
├── Skeleton.jsx
├── SpamFeedback.jsx
├── ThemeToggle.jsx
├── Toast.jsx
└── Tooltip.jsx
| Layer | Technology | Version | Purpose |
|---|---|---|---|
| Frontend Framework | React | 19 | Component architecture with hooks |
| Build Tool | Vite | 8 | Lightning-fast HMR and optimized production builds |
| Styling | Tailwind CSS | v4 | CSS-first utility engine with design tokens |
| Animations | Framer Motion | 12 | Spring-physics transitions & micro-interactions |
| Icons | Lucide React | 1.17 | Consistent, tree-shakeable icon library |
| Forms | React Hook Form | 7 | Performant form state management |
| Routing | React Router | 7 | Client-side navigation with route guards |
| Backend & DB | Supabase | PostgreSQL | Auth, Database, Storage, Realtime |
| Search Engine | Fuse.js | 7 | Client-side fuzzy matching & similarity scoring |
| Voice Input | Web Speech API | Native | Browser speech-to-text recognition |
| Audio Output | SpeechSynthesis API | Native | Browser text-to-speech playback |
| AI/NLP Engine | Transformers.js (@xenova/transformers) | v2 | Client-side AI summary generation |
The PostgreSQL database is organized into 8+ core tables with strict relational constraints, Row-Level Security (RLS) policies, and cascade delete rules:
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ auth.users │────▶│ users │ │ categories │
│ (Supabase Auth) │ │ id, name, email │ │ id, name, icon │
└──────────────────┘ │ role, avatar │ └────────┬─────────┘
│ reputation, rank │ │
└───────┬──────────┘ │
│ │
┌─────────────┼─────────────────────────┘
│ │
┌─────▼─────────────▼──────┐
│ questions │
│ id, title, description │
│ category, tags, views │
│ upvotes, attachment_url │
│ flags │
└──────┬───────────┬───────┘
│ │
┌────────────▼──┐ ┌────▼───────────────┐
│ answers │ │ question_upvotes │
│ id, content │ │ question_id, │
│ verification │ │ user_id (PK) │
│ is_accepted │ └────────────────────┘
│ admin_note │
└──────┬─────────┘
│
┌──────▼─────────────┐ ┌──────────────────┐
│ answer_upvotes │ │ notifications │
│ answer_id, │ │ id, user_id, │
│ user_id (PK) │ │ message, is_read │
└────────────────────┘ └──────────────────┘
┌──────────────────────┐
│ search_analytics │
│ id, search_term, │
│ user_id, created_at │
└──────────────────────┘
| Feature | Implementation |
|---|---|
| Auto User Profiles | Database trigger on auth.users INSERT automatically creates a public.users row |
| Cascade Deletes | Deleting a question removes all associated answers, upvotes, and notifications |
| Duplicate Vote Prevention | Composite primary keys on upvote tables enforce one-vote-per-user |
| Trending Analytics | RPC function get_trending_searches() returns top 10 search terms from the past 7 days |
| Toggle Upvotes | RPC functions atomically insert/delete upvote records and update counters |
| 16+ RLS Policies | Fine-grained row-level security ensuring users only access authorized data |
| Reputation Tracking | Points calculated from user actions and stored for leaderboard rankings |
The useSpeechToText hook wraps the native Web Speech Recognition API to provide hands-free voice input across the platform:
| Feature | Details |
|---|---|
| Continuous Recognition | Keeps listening until manually stopped |
| Interim Results | Shows real-time transcription as you speak |
| Multi-Language | Defaults to en-US, configurable via lang parameter |
| Error Recovery | Graceful handling of microphone permission errors |
| Used In | Search bar, Ask Question (title + description), FAQ search |
The useTextToSpeech hook uses the native SpeechSynthesis API for audio content playback:
| Feature | Details |
|---|---|
| One-Tap Playback | Single button to play/stop on any content |
| Unique Tracking | Each content item has a unique speech ID to track active playback |
| Auto Cleanup | Speech synthesis is cancelled on component unmount |
| Used In | Question cards, FAQ answer panels |
| Requirement | Minimum Version |
|---|---|
| Node.js | v18+ |
| npm | v9+ |
| Supabase Account | Free Tier |
1. Clone & Install
git clone https://github.com/vicharanashala/cs44
cd cs44-main
npm install
NOTE
During npm install, the NLP dependency @xenova/transformers is installed. The first time a user generates an AI answer summary, the browser will automatically fetch and cache the required model (Xenova/all-MiniLM-L6-v2) locally.2. Database Setup
- Create a new project on the Supabase Dashboard
- Navigate to SQL Editor → New Query → Blank Query
- Copy the entire contents of
supabase/schema.sqland paste into the editor, then click Run to set up the core Q&A platform schema, triggers, RLS policies, indexes, and seed data. - Open another new query tab, copy the entire contents of
supabase/migration.sqland click Run to set up the Reputation, Badge, and Leaderboard triggers, RPC functions, and achievement definitions. - In your Supabase Dashboard, go to Database → Replication → Source (select tables), and enable Realtime for
reputation_logsanduser_badgesso points notifications and badge unlock popups trigger instantly in real-time.
3. Storage Configuration
- In the Supabase Dashboard, go to Storage
- Click New Bucket → name it
attachments - Toggle Public Bucket to ON → Click Create
4. Environment Configuration
cp .env.example .envUpdate .env with your Supabase project credentials:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key-here5. Launch Development Server
npm run devOpen http://localhost:5173 in your browser.
6. Production Build
npm run build
npm run preview # Preview the production build locallyTo activate the admin moderation dashboard:
- Create an account on the running application via Sign Up
- Open the Supabase Dashboard → Table Editor →
userstable - Locate your user row and change the
rolecolumn fromusertoadmin - Refresh your browser — the Admin link will appear in the navigation bar
| Capability | Description |
|---|---|
| 📊 Platform Metrics | Total questions, answers, pending reviews, user counts, and reputation stats |
| ✅ Bulk Moderation | Approve, reject, or flag multiple answers at once |
| 🗑️ Question Deletion | Delete any question with premium animated confirmation dialogs |
| 🚩 Flag Review Queue | Review and resolve community-flagged content |
| 📝 Admin Notes | Attach feedback notes to reviewed answers |
| 🔔 Auto-Notifications | Authors are notified of verification decisions in real-time |
| 🏆 Reputation & Badges | Perform manual point adjustments (+/-), manually award or revoke badges for any member via an interactive management modal, and view live Leaderboard Analytics and recent reputation log feeds. |
| # | Feature | Description |
|---|---|---|
| 1 | 🔐 Role-Based Access Control | Guest, User, and Admin permission tiers |
| 2 | 🛡️ Moderated Answer Pipeline | Admin-verified answers with 4-state workflow |
| 3 | 🏆 Reputation System | Points for actions (ask, answer, upvote, accepted) |
| 4 | 🎖️ Badge System | Bronze, Silver, Gold, and Special achievement badges |
| 5 | 🔥 Leaderboard | Live rankings of top contributors |
| 6 | ✅ Accepted Answers | Question owners mark the best answer (+30 pts) |
| 7 | 📈 Progress Tracker | Visual progress bars toward next badge |
| 8 | 🎙️ Voice Search (Voice Chat) | Hands-free voice input across the platform |
| 9 | 🔊 Text-to-Speech | Listen to questions and FAQ answers |
| 10 | 🌐 Translation | Multi-language translation for questions & answers |
| 11 | 🔍 Type-Ahead | Autocomplete search suggestions as you type |
| 12 | 🚩 Content Flagging | Flag inappropriate questions or answers |
| 13 | 🧠 Duplicate Detection | Fuse.js fuzzy matching with similarity scores |
| 14 | 🚫 Spam Detector | Heuristic auto-flagging of spam content |
| 15 | 🔮 AI Summarizer | Client-side NLP extractive summaries |
| 16 | 📎 File Attachments | Upload images and documents to questions/answers |
| 17 | 🔔 Real-Time Notifications | In-app notification bell with live updates |
| 18 | 🎨 Obsidian & Paper Themes | Cinematic dark/light theme system |
| 19 | ✨ Spring-Physics Animations | Framer Motion transitions & micro-interactions |
| 20 | 🌌 Cosmic Particle Backdrops | Floating particle emitter with ambient nebulas |
| Name of Member | Contributions |
|---|---|
| Pinjar Ayesha Anjuma [Team Lead] | Team coordination, Multilingual Translation |
| Atul Mishra | Type-Ahead Autocomplete |
| Vishal Soni | Database Architect, Reputation and badge system |
| Harsh Kumar | Smart Duplicate Detection |
| Sunnam Durga Malleshwari | Heuristic Spam Detector |
| Devendra Sagar | Content Flagging |
| Harsh Aggarwal | Conceptual data modeling, Question count Updation |
| Dikshya Soni | Voice Search (Voice Chat) |
| Ansuman Dash | Design collaborator |
| Golu Kumar | Strategic Stakeholder |
| Bandarapu Ushaswini | Quality Assurance |
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m "feat: add amazing feature" - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
This project is licensed under the MIT License — see the LICENSE file for details.