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β
| Status | Meaning |
|---|---|
| β Done | Implemented, tested, in production |
| π Planned | Designed, not yet started |
| π TODO | Accepted, queued for next sprint |
| π¬ Research | Design complete, build deferred |
Priority Legendβ
| Priority | Meaning |
|---|---|
| P0 | Blocking β ship or nothing works |
| P1 | High value, ship this sprint |
| P2 | Good to have, next sprint |
Foundationβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 1 | Project Scaffold & Tooling | β Done | P0 | Vite 7 + React 19 + Express + DynamoDB | None |
| 2 | Docker Compose Setup | β Done | P1 | Local dev with LocalStack option | None |
| 3 | CI/CD Pipeline | β Done | P0 | GitHub Actions β S3/CloudFront + EC2 | None |
| 4 | AWS Infrastructure (Terraform) | β Done | P1 | ECS Fargate + ALB + ECR + CloudFront | None |
Authβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 5 | Google OAuth Integration | β Done | P0 | google-auth-library + JWT pair | MOCK: 4 hardcoded users (Arjun/Priya/Rohit/Nisha) instead of real OAuth |
| 6 | JWT Refresh Token Flow | β Done | P0 | 15min access + 7d httpOnly refresh | None |
Feature Flagsβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 7 | Feature Flag System (localStorage) | β Done | P0 | useFlags() hook, persists across sessions | None |
| 8 | Feature Flags DB Persistence | β Done | P0 | DynamoDB config table + public /api/flags 60s cache | None |
Coreβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 9 | Issue Reporting | β Done | P0 | Title/desc/category/city/priority + DynamoDB | None |
| 10 | Issue List & Filtering | β Done | P0 | City / category / status / search filters | MOCK: 7 pre-seeded issues (picsum.photos URLs) |
| 11 | Issue Detail View | β Done | P0 | Gallery + share + status + chat | MOCK: INITIAL_ISSUES + MOCK_MESSAGES |
| 12 | Community Chat (WebSocket) | β Done | P0 | Socket.IO + DynamoDB history + typing indicators | MOCK: Hardcoded chat + simulated "Sanjay M." user |
| 13 | Voting / Upvotes | β Done | P1 | One vote per user per issue | MOCK: Local React state, no backend persistence in dev |
Mediaβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 14 | Photo Upload with EXIF | β Done | P0 | Sharp resize + GPS/date/camera from EXIF + S3 | MOCK: base64 dataURL in dev, picsum.photos CDN |
| 15 | Video Upload with FFmpeg | β Done | P1 | fluent-ffmpeg thumbnail + progress | MOCK: setInterval simulates upload % |
| 16 | Geo-Tagging | β Done | P0 | EXIF GPS or manual capture β issue card chip | MOCK: Hardcoded lat/lng for 5 Indian cities |
Scoring & Leaderboardβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 17 | Civic Contribution Score | β Done | P1 | Reports + votes + chat + events | MOCK: Scores hardcoded in MOCK_USERS |
| 18 | Leaderboard | β Done | P1 | City-filtered ranking | MOCK: Static MOCK_USERS data |
Discoveryβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 19 | X/Twitter Feed Import | β Done | P1 | API 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 |
| 57 | Location-Based Issue Browsing | β Done | P0 | useUserLocation + Haversine + Near Me sort + distance badges | MOCK: Geo coords hardcoded in INITIAL_ISSUES |
| 58 | Nearby Issues in Report Form | β Done | P1 | Count issues within 500m when GPS captured | MOCK: Compares against INITIAL_ISSUES geo |
Admin Portalβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 20 | Admin Route & Auth | β Done | P0 | /admin β separate JWT, sessionStorage | None |
| 21 | Superadmin Seed Script | β Done | P0 | backend/scripts/seed-superadmin.js β run once | None |
| 22 | Admin CRUD (Superadmin Only) | β Done | P0 | Invite/remove admins, set roles | None |
| 23 | No-Access Screen | β Done | P0 | Ban icon + clear message for non-admins | None |
| 24 | Feature Flags Admin UI | β Done | P0 | Toggle flags live β DynamoDB | None |
| 25 | Site Content Admin UI | β Done | P1 | Title, tagline, contact, GitHub URL | None |
| 26 | Donation Config Admin UI | β Done | P0 | Upload QR (base64), set UPI ID | None |
| 27 | Notifications Admin UI | β Done | P0 | Broadcast push to all or by city | None |
| 68 | Separate Admin Bundle (MPA) | β Done | P0 | Vite MPA β admin/index.html β admin-main.jsx β BrowserRouter basename="/admin" β no shared JS with main app | None |
| 69 | Ward / Officials Data (CRUD) | β Done | P1 | JSON file storage at backend/data/ward-officials.json, full CRUD in WardDataView, CSV import/export | MOCK: JSON flat file instead of DynamoDB |
| 70 | Public Submission Queue | β Done | P1 | POST /api/ward-officials/submit β pending queue β approve/reject in admin | None |
| 71 | Ward Lookup for Issue Assignment | β Done | P1 | GET /api/ward-lookup?city&pincode&category β AssignmentPanel in Detail view, deep-links for X/WhatsApp/email | MOCK: No officials seeded by default |
| 72 | Admin Portal Link on Sign-in Card | β Done | P2 | Subtle π Admin Portal link at bottom of auth card + Support Us button | None |
Landing Pageβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 30 | Supported By Section | β Done | P1 | Logo grid + "Your logo here" CTA | MOCK: SVG lettermark placeholder |
| 31 | Donate Section | β Done | P0 | QR + UPI + donor wall | MOCK: Hardcoded donor array + placeholder QR SVG |
| 32 | Collaborate Section | β Done | P1 | GitHub / Claude / beta team cards | None |
| 73 | Landing Section Reorder | β Done | P2 | Supported By + Support Us moved above Features for social proof above fold | None |
| 74 | Support Us Button in Landing Nav | β Done | P2 | Bypasses login, sets guestMode=true and navigates to support view | None |
Support Pageβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 75 | Support Page Guest Access | β Done | P1 | Support page reachable without login via landing nav or sign-in card; guestMode=true shows full content | None |
| 76 | Get Started CTA for Guests | β Done | P1 | Gradient banner with "Get Started β It's Free" + "Browse Issues First" buttons shown to non-logged-in visitors | None |
| 77 | How Can I Help Section | β Done | P1 | 3-column grid: Citizen Reporter / NGO / Corporate CSR β each with action bullets and email/browse CTA | None |
| 78 | Upcoming Projects Section | β Done | P1 | Schools (accountability + world-class goal) and Hospitals (hygiene/dignity audit) cards with feature tags, Q3/Q4 pilot goals, Volunteer + CSR Sponsor CTAs | None |
Donorsβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 33 | Donor Management | β Done | P0 | Add/edit/remove from admin | None |
| 34 | Twitter Profile Pictures | β Done | P1 | API v2 400Γ400 avatar fetch + DynamoDB cache | MOCK: Placeholder avatars in dev |
Analytics & Notificationsβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 35 | Google Analytics 4 | β Done | P0 | gtag.js + anonymize_ip | None |
| 36 | Custom Event Tracking | β Done | P1 | 10 civic events, no PII | None |
| 37 | Service Worker | β Done | P0 | Network-first + push handler | None |
| 38 | usePushNotifications Hook | β Done | P0 | VAPID subscription management | None |
| 39 | Push Bell in Nav | β Done | P0 | Bell/BellOff toggle | None |
| 40 | Backend Notification Service | β Done | P0 | web-push v3.6.7 | None |
| 41 | Notification API Routes | β Done | P0 | Subscribe/unsubscribe/send/broadcast | None |
| 42 | Push Subscriptions DynamoDB Table | β Done | P0 | Auto-remove stale 410 Gone | None |
UI/UXβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 28 | Icon Library Migration | β Done | P1 | Lucide React (ISC) β Camera, Bell, Shield etc. | None |
| 29 | Font Audit | β Done | P1 | Inter + Plus Jakarta Sans β OFL-1.1 confirmed | None |
Testing & Securityβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 43 | Frontend Tests (Vitest) | β Done | P0 | 19 tests β AdminLogin, useFlags, DonorWall | None |
| 44 | Backend Tests (Jest + Supertest) | β Done | P0 | 30 tests β auth, config, donors (DynamoDB mocked) | None |
| 45 | Test CI Integration | β Done | P0 | Blocks deploy on failure | None |
| 46 | OWASP ZAP Scan | β Done | P1 | Advisory mode on staging | None |
| 47 | Security Audit Script | β Done | P1 | npm audit --audit-level=high in CI | None |
| 48 | Admin Rate Limiting | β Done | P0 | 10 attempts / 15 min / IP | None |
| 49 | Timing Attack Prevention | β Done | P0 | Dummy bcrypt compare on unknown email | None |
Safety / Content Moderationβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 55 | Image Flagging (Phase 1) | β Done | P0 | Flag button on photos/videos, reason picker, flagged overlay | MOCK: mediaFlags in React state β resets on reload |
| 56 | Issue Flagging (Phase 1) | β Done | P0 | Flag button on issues (separate from upvote) | MOCK: issueFlags in React state β resets on reload |
| 59 | Duplicate Detection | π¬ Research | P2 | Haversine + dHash + Jaccard design β parked | N/A |
| 60 | Content Moderation Phase 1 β NSFWJS | π Planned | P0 | Client-side TF.js, ~7MB model | N/A |
| 61 | Content Moderation Phase 2 β Rekognition | π Planned | P1 | Backend gate before S3 save | N/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.
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 62 | Camera Capture with GPS Injection | π Planned | P1 | getUserMedia + live GPS overlay | N/A |
| 63 | Mobile App β React Native + Expo | π TODO | P0 | Full spec in Roadmap. Stack: Expo Router + React Native + NativeWind. Auth: same JWT pair. API: same backend. | N/A |
| 64 | Mobile App β Phase 1 Scaffold | π TODO | P0 | Expo Router + auth + issues list (read-only) + report form (camera + GPS) β launch target Q2 2025 | N/A |
| 79 | Mobile App β Phase 2 Full Feature | π TODO | P1 | Chat, voting, notifications (FCM), offline queue for reports, map view | N/A |
| 80 | App Store / Play Store Submission | π TODO | P1 | ASO, privacy policy, screenshots, review guidelines compliance | N/A |
Growthβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 65 | Social Media Validation Kit | π TODO | P1 | Satori OG images + one-click X/WhatsApp/Instagram share | N/A |
| 66 | Marketing Integrations | π TODO | P2 | Mailchimp waitlist + PostHog + Hotjar + UTM tracking | N/A |
| 67 | Referral & Viral Loop | π TODO | P2 | Ref codes + city badge PNGs + social proof on detail | N/A |
Rankingsβ
| # | Task | Status | Priority | Notes | Mock? |
|---|---|---|---|---|---|
| 81 | City Rankings Page | β Done | P1 | Bar chart sorted by civic score, resolution %, speed; all 10 cities always shown (including zero-issue cities) | MOCK: Derived from INITIAL_ISSUES |
| 82 | Contributor Leaderboard | β Done | P1 | Ranked cards with score breakdown, badges, sort by score/reports/resolved/upvoted; click to see full breakdown | MOCK: MOCK_CONTRIBUTORS (6 entries) in mockData.json |
Source of truth:
civicpulse-project-plan.csvon GitHub. This page is regenerated from that CSV whenever a session completes.