Skip to content

Rikuron/Project-Vexed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

78 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Vexed logo

Turn your daily frustrations into someone's next mission.

A collaborative problem-solving platform where real-world frustrations meet developer talent. Posters submit challenges. Solvers build solutions. Everyone wins.

React Vite TanStack Firebase Tailwind CSS


πŸ“Έ Screenshots

Sign In Poster Dashboard Problem Discovery Solver Analytics
Sign In Poster Landing Browse Solver Dashboard

🧩 The Core Loop

For Posters β€” The Problem Owners

Posters submit real-world frustrations ("Vexations") through a guided form. Every submission is automatically processed by an AI moderation & categorization pipeline that:

  • Screens for policy violations, explicit content, and low-substance input
  • Classifies the problem into a Sector (e.g., Health, Finance, Environment, AI/ML)
  • Generates tags, severity ratings, technical complexity, and a developer-focused summary
  • Suggests a relevant tech stack and key challenges

For Solvers β€” The Developers

Developers browse a dynamic discovery feed of categorized problems. They can:

  • Claim vexations to work on
  • Submit solutions with image uploads and detailed write-ups
  • Track streaks and activity analytics on a personalized dashboard
  • Build a public portfolio showcasing completed solutions

πŸ—οΈ Technical Architecture

Stack

Layer Technology
UI Framework React 19
Build Tool Vite 7
Routing & SSR TanStack Router + TanStack Start (Nitro)
Backend / DB Firebase (Firestore, Auth, Storage)
Server Functions Nitro-based server functions via createServerFn
AI Integration OpenRouter API (MiniMax M2.5) β€” categorization & moderation
Styling Tailwind CSS 4 + Custom Vexed Design System
Icons Lucide React
Testing Vitest + Testing Library

Design System β€” Vexed

The UI is built on a custom dark-mode-first design system defined in src/styles.css, featuring:

  • A deep indigo/purple palette (vexed-primary, vexed-highlight1–3, vexed-accent1–4)
  • Dark backgrounds (vexed-bg1–4) designed for extended screen time
  • Inter font family with system fallbacks
  • Orbital loading animations and hidden-scrollbar utilities

Project Structure

src/
β”œβ”€β”€ components/           # Modular, reusable UI components
β”‚   β”œβ”€β”€ cards/            #   β€” Card-based display components (11 cards)
β”‚   β”œβ”€β”€ forms/            #   β€” Submit, edit, and verification modals (6 forms)
β”‚   β”œβ”€β”€ auth/             #   β€” Auth context & service
β”‚   β”œβ”€β”€ Sidebar.tsx       #   β€” Main navigation sidebar
β”‚   β”œβ”€β”€ MobileHeader.tsx  #   β€” Responsive mobile header
β”‚   β”œβ”€β”€ MobileBottomNav.tsx
β”‚   β”œβ”€β”€ PosterLandingPage.tsx
β”‚   β”œβ”€β”€ SolverDashboard.tsx
β”‚   └── LoadingScreen.tsx
β”œβ”€β”€ routes/               # File-based routing (TanStack Router)
β”‚   β”œβ”€β”€ index.tsx          #   β€” Role-based home (Poster vs. Solver)
β”‚   β”œβ”€β”€ browse.tsx         #   β€” Problem discovery feed
β”‚   β”œβ”€β”€ submit.tsx         #   β€” Vexation submission flow
β”‚   β”œβ”€β”€ portfolio.tsx      #   β€” Public solver portfolio
β”‚   β”œβ”€β”€ signIn.tsx         #   β€” Authentication page
β”‚   β”œβ”€β”€ complete-profile.tsx
β”‚   β”œβ”€β”€ my/               #   β€” User-specific pages
β”‚   β”‚   β”œβ”€β”€ vexations.tsx  #     β€” My submitted vexations
β”‚   β”‚   β”œβ”€β”€ claimed.tsx    #     β€” My claimed problems
β”‚   β”‚   └── saved.tsx      #     β€” Bookmarked vexations
β”‚   β”œβ”€β”€ vexation/$id.tsx   #   β€” Vexation detail page
β”‚   └── solution/$id.tsx   #   β€” Solution detail page
β”œβ”€β”€ lib/                  # Core business logic
β”‚   β”œβ”€β”€ ai.server.ts       #   β€” Server-only AI functions (API key never leaks)
β”‚   β”œβ”€β”€ firebase.ts        #   β€” Firebase app initialization
β”‚   β”œβ”€β”€ auth/              #   β€” AuthContext + authService
β”‚   β”œβ”€β”€ db/                #   β€” Firestore CRUD abstractions
β”‚   β”‚   β”œβ”€β”€ vexations.ts
β”‚   β”‚   β”œβ”€β”€ solutions.ts
β”‚   β”‚   β”œβ”€β”€ activities.ts
β”‚   β”‚   β”œβ”€β”€ users.ts
β”‚   β”‚   └── storage.ts
β”‚   β”œβ”€β”€ constants/         #   β€” App-wide constants
β”‚   └── utils/             #   β€” Shared utilities
β”œβ”€β”€ types/                # TypeScript type definitions
β”‚   β”œβ”€β”€ vexation.ts
β”‚   β”œβ”€β”€ solution.ts
β”‚   β”œβ”€β”€ user.ts
β”‚   └── activity.ts
└── styles.css            # Vexed design system tokens

Key Design Decisions

  • Role-based routing β€” The home page (/) dynamically renders SolverDashboard or PosterLandingPage based on the user's role.
  • Server function isolation β€” AI calls run exclusively on the server via createServerFn. The OPENROUTER_API_KEY is accessed through process.env and never bundled into the client.
  • Clean data layer β€” All Firestore operations are abstracted in src/lib/db/, keeping components free of database logic.
  • AI-powered moderation β€” Both new submissions and edits pass through policy validation before persisting.

πŸš€ Getting Started

Prerequisites

  • Node.js β‰₯ 20
  • npm (included with Node)
  • A Firebase project with Firestore, Authentication, and Storage enabled
  • An OpenRouter API key

1. Clone & Install

git clone <repo-url>
cd vexed
npm install

2. Configure Environment

Create a .env file at the project root:

# Firebase (client-side β€” VITE_ prefix required)
VITE_FIREBASE_API_KEY=your_key
VITE_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
VITE_FIREBASE_APP_ID=your_app_id

# OpenRouter (server-side β€” NO VITE_ prefix)
OPENROUTER_API_KEY=your_openrouter_key

⚠️ Important: Never prefix server-side secrets with VITE_. Doing so exposes them in the client bundle.

3. Start Development Server

npm run dev

The app will be available at http://localhost:3000.

4. Run Tests

npm test

🏭 Production & Deployment

Vexed targets Firebase Hosting with Cloud Functions, compiled via the Nitro preset.

Build

npm run build

This outputs optimized server functions and static assets to .output/.

Set Secrets

firebase functions:secrets:set OPENROUTER_API_KEY

Deploy

firebase deploy

🀝 Contributing

  1. Styling β€” Always defer to src/styles.css as the source of truth for all branding tokens and Vexed design system utilities.
  2. Type safety β€” No unused variables. Strict TypeScript throughout.
  3. Component architecture β€” Keep components modular. DB logic stays in src/lib/db/, AI logic stays in src/lib/ai.server.ts.
  4. See .agent/PROJECT_GUIDELINES.md for the full coding policy.

Vexed Β· Built with πŸ”₯ by passionate developers

Turn your daily frustrations into someone's next mission.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors