Skip to main content

CivicPulse β€” Project Plan

Live plan β€” 75 tracked features across Foundation, Auth, Core, Media, Admin, Safety, Discovery, Growth, and Mobile. Each row includes status, priority, affected files, and whether it uses mock/simulated data.

Status Legend​

StatusMeaning
βœ… DoneImplemented, tested, in production
πŸ”œ PlannedDesigned, not yet started
πŸ“‹ TODOAccepted, queued for next sprint
πŸ”¬ ResearchDesign complete, build deferred

Priority Legend​

PriorityMeaning
P0Blocking β€” ship or nothing works
P1High value, ship this sprint
P2Good to have, next sprint

Foundation​

#TaskStatusPriorityNotesMock?
1Project Scaffold & Toolingβœ… DoneP0Vite 7 + React 19 + Express + DynamoDBNone
2Docker Compose Setupβœ… DoneP1Local dev with LocalStack optionNone
3CI/CD Pipelineβœ… DoneP0GitHub Actions β†’ S3/CloudFront + EC2None
4AWS Infrastructure (Terraform)βœ… DoneP1ECS Fargate + ALB + ECR + CloudFrontNone

Auth​

#TaskStatusPriorityNotesMock?
5Google OAuth Integrationβœ… DoneP0google-auth-library + JWT pairMOCK: 4 hardcoded users (Arjun/Priya/Rohit/Nisha) instead of real OAuth
6JWT Refresh Token Flowβœ… DoneP015min access + 7d httpOnly refreshNone

Feature Flags​

#TaskStatusPriorityNotesMock?
7Feature Flag System (localStorage)βœ… DoneP0useFlags() hook, persists across sessionsNone
8Feature Flags DB Persistenceβœ… DoneP0DynamoDB config table + public /api/flags 60s cacheNone

Core​

#TaskStatusPriorityNotesMock?
9Issue Reportingβœ… DoneP0Title/desc/category/city/priority + DynamoDBNone
10Issue List & Filteringβœ… DoneP0City / category / status / search filtersMOCK: 7 pre-seeded issues (picsum.photos URLs)
11Issue Detail Viewβœ… DoneP0Gallery + share + status + chatMOCK: INITIAL_ISSUES + MOCK_MESSAGES
12Community Chat (WebSocket)βœ… DoneP0Socket.IO + DynamoDB history + typing indicatorsMOCK: Hardcoded chat + simulated "Sanjay M." user
13Voting / Upvotesβœ… DoneP1One vote per user per issueMOCK: Local React state, no backend persistence in dev

Media​

#TaskStatusPriorityNotesMock?
14Photo Upload with EXIFβœ… DoneP0Sharp resize + GPS/date/camera from EXIF + S3MOCK: base64 dataURL in dev, picsum.photos CDN
15Video Upload with FFmpegβœ… DoneP1fluent-ffmpeg thumbnail + progressMOCK: setInterval simulates upload %
16Geo-Taggingβœ… DoneP0EXIF GPS or manual capture β†’ issue card chipMOCK: Hardcoded lat/lng for 5 Indian cities

Scoring & Leaderboard​

#TaskStatusPriorityNotesMock?
17Civic Contribution Scoreβœ… DoneP1Reports + votes + chat + eventsMOCK: Scores hardcoded in MOCK_USERS
18Leaderboardβœ… DoneP1City-filtered rankingMOCK: Static MOCK_USERS data

Discovery​

#TaskStatusPriorityNotesMock?
19X/Twitter Feed Importβœ… DoneP1API v2 Bearer token search + import to issues. X_HANDLE / VITE_X_HANDLE env vars control which account is monitored. Live mode badge in Social Wall. tweetUrl stored on converted issues for "View on X β†—" link in Detail. /test-x developer page.MOCK: 5 hardcoded MOCK_TWEETS β€” falls back when no Bearer Token or credits
57Location-Based Issue Browsingβœ… DoneP0useUserLocation + Haversine + Near Me sort + distance badgesMOCK: Geo coords hardcoded in INITIAL_ISSUES
58Nearby Issues in Report Formβœ… DoneP1Count issues within 500m when GPS capturedMOCK: Compares against INITIAL_ISSUES geo

Admin Portal​

#TaskStatusPriorityNotesMock?
20Admin Route & Authβœ… DoneP0/admin β€” separate JWT, sessionStorageNone
21Superadmin Seed Scriptβœ… DoneP0backend/scripts/seed-superadmin.js β€” run onceNone
22Admin CRUD (Superadmin Only)βœ… DoneP0Invite/remove admins, set rolesNone
23No-Access Screenβœ… DoneP0Ban icon + clear message for non-adminsNone
24Feature Flags Admin UIβœ… DoneP0Toggle flags live β†’ DynamoDBNone
25Site Content Admin UIβœ… DoneP1Title, tagline, contact, GitHub URLNone
26Donation Config Admin UIβœ… DoneP0Upload QR (base64), set UPI IDNone
27Notifications Admin UIβœ… DoneP0Broadcast push to all or by cityNone
68Separate Admin Bundle (MPA)βœ… DoneP0Vite MPA β€” admin/index.html β†’ admin-main.jsx β†’ BrowserRouter basename="/admin" β€” no shared JS with main appNone
69Ward / Officials Data (CRUD)βœ… DoneP1JSON file storage at backend/data/ward-officials.json, full CRUD in WardDataView, CSV import/exportMOCK: JSON flat file instead of DynamoDB
70Public Submission Queueβœ… DoneP1POST /api/ward-officials/submit β†’ pending queue β†’ approve/reject in adminNone
71Ward Lookup for Issue Assignmentβœ… DoneP1GET /api/ward-lookup?city&pincode&category β†’ AssignmentPanel in Detail view, deep-links for X/WhatsApp/emailMOCK: No officials seeded by default
72Admin Portal Link on Sign-in Cardβœ… DoneP2Subtle πŸ”’ Admin Portal link at bottom of auth card + Support Us buttonNone

Landing Page​

#TaskStatusPriorityNotesMock?
30Supported By Sectionβœ… DoneP1Logo grid + "Your logo here" CTAMOCK: SVG lettermark placeholder
31Donate Sectionβœ… DoneP0QR + UPI + donor wallMOCK: Hardcoded donor array + placeholder QR SVG
32Collaborate Sectionβœ… DoneP1GitHub / Claude / beta team cardsNone
73Landing Section Reorderβœ… DoneP2Supported By + Support Us moved above Features for social proof above foldNone
74Support Us Button in Landing Navβœ… DoneP2Bypasses login, sets guestMode=true and navigates to support viewNone

Support Page​

#TaskStatusPriorityNotesMock?
75Support Page Guest Accessβœ… DoneP1Support page reachable without login via landing nav or sign-in card; guestMode=true shows full contentNone
76Get Started CTA for Guestsβœ… DoneP1Gradient banner with "Get Started β€” It's Free" + "Browse Issues First" buttons shown to non-logged-in visitorsNone
77How Can I Help Sectionβœ… DoneP13-column grid: Citizen Reporter / NGO / Corporate CSR β€” each with action bullets and email/browse CTANone
78Upcoming Projects Sectionβœ… DoneP1Schools (accountability + world-class goal) and Hospitals (hygiene/dignity audit) cards with feature tags, Q3/Q4 pilot goals, Volunteer + CSR Sponsor CTAsNone

Donors​

#TaskStatusPriorityNotesMock?
33Donor Managementβœ… DoneP0Add/edit/remove from adminNone
34Twitter Profile Picturesβœ… DoneP1API v2 400Γ—400 avatar fetch + DynamoDB cacheMOCK: Placeholder avatars in dev

Analytics & Notifications​

#TaskStatusPriorityNotesMock?
35Google Analytics 4βœ… DoneP0gtag.js + anonymize_ipNone
36Custom Event Trackingβœ… DoneP110 civic events, no PIINone
37Service Workerβœ… DoneP0Network-first + push handlerNone
38usePushNotifications Hookβœ… DoneP0VAPID subscription managementNone
39Push Bell in Navβœ… DoneP0Bell/BellOff toggleNone
40Backend Notification Serviceβœ… DoneP0web-push v3.6.7None
41Notification API Routesβœ… DoneP0Subscribe/unsubscribe/send/broadcastNone
42Push Subscriptions DynamoDB Tableβœ… DoneP0Auto-remove stale 410 GoneNone

UI/UX​

#TaskStatusPriorityNotesMock?
28Icon Library Migrationβœ… DoneP1Lucide React (ISC) β€” Camera, Bell, Shield etc.None
29Font Auditβœ… DoneP1Inter + Plus Jakarta Sans β€” OFL-1.1 confirmedNone

Testing & Security​

#TaskStatusPriorityNotesMock?
43Frontend Tests (Vitest)βœ… DoneP019 tests β€” AdminLogin, useFlags, DonorWallNone
44Backend Tests (Jest + Supertest)βœ… DoneP030 tests β€” auth, config, donors (DynamoDB mocked)None
45Test CI Integrationβœ… DoneP0Blocks deploy on failureNone
46OWASP ZAP Scanβœ… DoneP1Advisory mode on stagingNone
47Security Audit Scriptβœ… DoneP1npm audit --audit-level=high in CINone
48Admin Rate Limitingβœ… DoneP010 attempts / 15 min / IPNone
49Timing Attack Preventionβœ… DoneP0Dummy bcrypt compare on unknown emailNone

Safety / Content Moderation​

#TaskStatusPriorityNotesMock?
55Image Flagging (Phase 1)βœ… DoneP0Flag button on photos/videos, reason picker, flagged overlayMOCK: mediaFlags in React state β€” resets on reload
56Issue Flagging (Phase 1)βœ… DoneP0Flag button on issues (separate from upvote)MOCK: issueFlags in React state β€” resets on reload
59Duplicate DetectionπŸ”¬ ResearchP2Haversine + dHash + Jaccard design β€” parkedN/A
60Content Moderation Phase 1 β€” NSFWJSπŸ”œ PlannedP0Client-side TF.js, ~7MB modelN/A
61Content Moderation Phase 2 β€” RekognitionπŸ”œ PlannedP1Backend gate before S3 saveN/A

Mobile​

⚠️ TODO β€” Next Major Initiative: A native mobile app is the single highest-leverage feature remaining. The web PWA works on mobile browsers, but a native app unlocks background location, camera roll access, push without browser prompt, and App Store / Play Store distribution. See Roadmap for full mobile spec.

#TaskStatusPriorityNotesMock?
62Camera Capture with GPS InjectionπŸ”œ PlannedP1getUserMedia + live GPS overlayN/A
63Mobile App β€” React Native + ExpoπŸ“‹ TODOP0Full spec in Roadmap. Stack: Expo Router + React Native + NativeWind. Auth: same JWT pair. API: same backend.N/A
64Mobile App β€” Phase 1 ScaffoldπŸ“‹ TODOP0Expo Router + auth + issues list (read-only) + report form (camera + GPS) β€” launch target Q2 2025N/A
79Mobile App β€” Phase 2 Full FeatureπŸ“‹ TODOP1Chat, voting, notifications (FCM), offline queue for reports, map viewN/A
80App Store / Play Store SubmissionπŸ“‹ TODOP1ASO, privacy policy, screenshots, review guidelines complianceN/A

Growth​

#TaskStatusPriorityNotesMock?
65Social Media Validation KitπŸ“‹ TODOP1Satori OG images + one-click X/WhatsApp/Instagram shareN/A
66Marketing IntegrationsπŸ“‹ TODOP2Mailchimp waitlist + PostHog + Hotjar + UTM trackingN/A
67Referral & Viral LoopπŸ“‹ TODOP2Ref codes + city badge PNGs + social proof on detailN/A

Rankings​

#TaskStatusPriorityNotesMock?
81City Rankings Pageβœ… DoneP1Bar chart sorted by civic score, resolution %, speed; all 10 cities always shown (including zero-issue cities)MOCK: Derived from INITIAL_ISSUES
82Contributor Leaderboardβœ… DoneP1Ranked cards with score breakdown, badges, sort by score/reports/resolved/upvoted; click to see full breakdownMOCK: MOCK_CONTRIBUTORS (6 entries) in mockData.json

Source of truth: civicpulse-project-plan.csv on GitHub. This page is regenerated from that CSV whenever a session completes.