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.
| Sign In | Poster Dashboard | Problem Discovery | Solver Analytics |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
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
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
| 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 |
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
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
- Role-based routing β The home page (
/) dynamically rendersSolverDashboardorPosterLandingPagebased on the user's role. - Server function isolation β AI calls run exclusively on the server via
createServerFn. TheOPENROUTER_API_KEYis accessed throughprocess.envand 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.
- Node.js β₯ 20
- npm (included with Node)
- A Firebase project with Firestore, Authentication, and Storage enabled
- An OpenRouter API key
git clone <repo-url>
cd vexed
npm installCreate 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 withVITE_. Doing so exposes them in the client bundle.
npm run devThe app will be available at http://localhost:3000.
npm testVexed targets Firebase Hosting with Cloud Functions, compiled via the Nitro preset.
npm run buildThis outputs optimized server functions and static assets to .output/.
firebase functions:secrets:set OPENROUTER_API_KEYfirebase deploy- Styling β Always defer to
src/styles.cssas the source of truth for all branding tokens and Vexed design system utilities. - Type safety β No unused variables. Strict TypeScript throughout.
- Component architecture β Keep components modular. DB logic stays in
src/lib/db/, AI logic stays insrc/lib/ai.server.ts. - See
.agent/PROJECT_GUIDELINES.mdfor the full coding policy.
Vexed Β· Built with π₯ by passionate developers
Turn your daily frustrations into someone's next mission.




