CrowdShield is a modern cyber threat intelligence dashboard built with React, Convex, and Tailwind CSS. It combines public live feeds, community-sourced scam reports, analyst workflows, and admin operations into a single SaaS-style security product.
- Public threat feed with AI-assisted scam analysis
- User-driven report submission and validation
- Analyst workspace with dashboards, geo intelligence, campaigns, analytics, and alerts
- Admin portal for user management, reports moderation, subscriptions, announcements, and newsletters
- Convex backend for auth, data storage, and real-time queries
- React 19 + TypeScript
- Vite
- Tailwind CSS v4
- React Router v7
- motion/react for UI animation
- Convex for backend database + auth
- @convex-dev/auth for OAuth and session handling
- Recharts for analytics visualization
- Lucide React for icons
src/— frontend app codeapp/— pages, components, context, screens, and routingcomponents/— shared UI + Convex auth providerlib/— route helpers
convex/— backend schema, auth, data queries, and mutationsauth.ts— Convex auth setup and callbacksschema.ts— Convex schema and auth user tableusers.ts— viewer role query and admin helperssubscriptions.ts— subscription logic
.env.local— local Convex environment variables
/— Landing page/feed— Live public threat feed/submit— Submit a report/near-me— Location-based threat insights/pricing— Pricing, subscription info, and demo flows/signin— Google sign-in page
/analyst— Analyst home dashboard/analyst/feed— Analyst live feed/analyst/geo— Geo intelligence map/analyst/campaigns— Campaign tracking/analyst/analytics— Data analytics and charts/analyst/alerts— Alerts center
/admin— Admin overview dashboard/admin/users— User management/admin/reports— Reports moderation/admin/subscriptions— Subscription overview/admin/messages— Support inbox/admin/announcements— Broadcast announcements/admin/newsletter— Newsletter management
- Node.js 20+ recommended
- npm
- Convex CLI installed globally for local backend development if needed
cd crowdshield
npm install
cp .env.local.example .env.local
# update .env.local if needed
npm run devYour local app expects Convex values in .env.local:
CONVEX_DEPLOYMENT=dev:clear-jellyfish-418
VITE_CONVEX_URL=https://clear-jellyfish-418.convex.cloud
VITE_CONVEX_SITE_URL=https://clear-jellyfish-418.convex.siteReplace the values with your own Convex deployment config if you are running a different instance.
The app uses Convex for auth and storage:
convex/auth.tsconfigures Convex OAuth with Google and sets user defaultsconvex/schema.tsdefines theusers,reports,subscriptions, andinvitationstablesconvex/users.tsexposesviewerRoleand admin mutation helpersconvex/subscriptions.tsexposes subscription creation and lookup
- Google OAuth sign-in via
@convex-dev/auth - Auth state is provided through
ConvexAuthProvider - Protected analyst/admin routes use the app role from
viewerRole
- Build the app:
npm run build- Deploy the frontend to your chosen host (Vercel, Netlify, etc.)
- Ensure Convex env variables are configured in production
- The project currently routes with role-aware redirects for public, analyst, and admin users
- The
src/proxy.tsmiddleware is configured to protect analyst/admin paths while leaving public pages accessible - The Convex backend stores user roles in the
userstable under therolefield
- Open an issue for bugs or feature requests
- Create feature branches for changes
- Keep UI and backend logic separated
- Run
npm run lintandnpm run buildbefore submitting a PR
This project does not currently specify a license.