Community Invest
Community Invest connects generous donors with neighbors facing utility shutoffs. Recipients create public or anonymous campaigns to crowdfund bill payments. Together, we prevent disconnections and strengthen communities.
Project Overview
Community Invest is a neighborhood utility insurance platform that enables:
- Recipients to submit utility bills, create fundraising campaigns, and share their stories
- Contributors to discover campaigns, make donations, and track their impact
- Admins to verify bills, manage payments, and oversee platform operations
Tech Stack
- Frontend: Next.js 15 (App Router), TypeScript, Tailwind CSS, shadcn/ui
- Backend: Convex (real-time database)
- Authentication: Clerk
- Payments: Stripe (payment intents, webhooks)
- Icons: Lucide React
- UI Components: shadcn/ui with accessible design
Getting Started
Prerequisites
- Node.js 18+
- pnpm (recommended) or npm
Installation
Clone the repository
git clone https://github.com/Syed-Ahmed02/ummahhacks.git cd ummahhacksInstall dependencies
pnpm installSet up environment variables Create
.env.localwith:NEXT_PUBLIC_CONVEX_URL=<your-convex-url> NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=<your-clerk-key> CLERK_SECRET_KEY=<your-clerk-secret> STRIPE_SECRET_KEY=<your-stripe-key> NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=<your-stripe-public-key>Run the development server
npm run dev
Open http://localhost:3000 to see the application.
Project Structure
app/
├── (auth)/ # Authentication pages (sign-in, sign-up)
├── (dashboard)/ # Protected dashboard routes
│ ├── my-campaigns/ # Recipient campaign management
│ ├── my-requests/ # Bill request management
│ ├── admin/ # Admin dashboard
│ ├── settings/ # User settings
│ └── ... # Other dashboard sections
├── api/ # API routes (Clerk, Stripe webhooks)
└── campaigns/ # Public campaign viewing
components/
├── campaigns/ # Campaign-related components
│ ├── CampaignCard.tsx
│ ├── CampaignForm.tsx # Campaign details form
│ ├── CampaignTypeSelector.tsx # Public/anonymous selector
│ ├── CampaignImageUploader.tsx # Image upload with validation
│ ├── ImagePreview.tsx # Image preview component
│ ├── CampaignPreview.tsx # Campaign preview
│ ├── CampaignProgress.tsx # Donation progress tracking
│ ├── DonationForm.tsx # Donation submission
│ ├── DonationList.tsx # Display campaign donations
│ ├── PrivacySettings.tsx # Privacy configuration
│ ├── PrivacyNotice.tsx # Privacy notice display
│ ├── LocationBadge.tsx # Location indicator
│ ├── ShareButtons.tsx # Social sharing
│ ├── ShareModal.tsx # Sharing interface
│ └── CampaignDiscoveryPage.tsx # Campaign browsing
├── dashboard/ # Dashboard components
├── landing/ # Landing page sections
├── navigation/ # Navigation & header
├── onboarding/ # Onboarding flow
├── request/ # Bill submission components
├── settings/ # Settings pages
├── shared/ # Shared utilities
└── ui/ # shadcn/ui components
convex/
├── campaigns.ts # Campaign mutations & queries
├── bills.ts # Bill submission logic
├── donations.ts # Donation tracking
├── users.ts # User management
├── payments.ts # Payment processing
├── schema.ts # Database schema
└── ...
lib/
├── campaigns/
│ ├── imageValidation.ts # Image size/type/dimension validation
│ └── imageUpload.ts # Storage integration helpers
├── auth.ts # Authentication helpers
├── utils.ts # Utility functions
└── ...
Key Features
Campaign Creation (Recipient Flow)
- Bill Linking - Link existing bill submissions or create standalone campaigns
- Form Prefilling - Utility details auto-populate when bill is selected
- Campaign Details - Title, description, goal amount, utility information
- Campaign Type - Choose between public (identified) or anonymous campaigns
- Privacy Settings - Control what information is visible to donors
- Image Upload - Add hero image with drag-drop, client-side validation
- Campaign Preview - Review before publishing
- Multi-Step Flow - Guided creation process with progress
Campaign Discovery (Contributor Flow)
- Browse Campaigns - Discover active fundraising campaigns
- Campaign Details - View recipient info, bill details, progress
- Campaign Cards - Summary view with key metrics
- Donation - Make donations via Stripe with optional messaging
- Privacy Respected - See only information recipient chose to share
Bill Management
- Submit utility bills for verification
- Track verification status
- Link bills to campaigns
- View bill payment history
- Bill validation for campaign creation
Impact Tracking
- Donation dashboard for contributors
- Campaign metrics for recipients
- Impact reports and statistics
- Weekly impact summaries
- Donation list with privacy filtering
Database Schema
Key tables:
- users - User profiles with roles (recipient/contributor/admin)
- billSubmissions - Submitted utility bills with verification status
- campaigns - Fundraising campaigns linked to bills with hero images
- campaignDonations - Donation records with payment status and source tracking
- subscriptions - Recurring contribution plans
- pools - Community funding pools
Component Architecture
Campaign Components
Core Campaign Components:
- CampaignForm - Multi-field form for campaign details (title, description, amounts, dates)
- CampaignTypeSelector - Public/anonymous toggle with descriptions and benefits
- CampaignImageUploader - Drag-drop image upload with real-time validation
- ImagePreview - Image preview with loading states and fallback
- CampaignPreview - Full campaign preview before publishing
- LocationBadge - Location indicator component
Discovery Components:
- CampaignCard - Campaign summary card for listing pages
- CampaignDiscoveryPage - Browse and filter campaigns page (350+ lines)
- CampaignProgress - Visual donation progress indicator
Donation Components:
- DonationForm - Donation interface with amount validation and messaging
- DonationList - Display campaign donations with privacy filtering
Privacy & Sharing:
- PrivacySettings - Privacy preference configuration per campaign
- PrivacyNotice - Privacy information display for donors
- ShareButtons - Social sharing functionality (Twitter, Facebook, LinkedIn, email)
- ShareModal - Campaign link sharing interface with copy-to-clipboard
Image Validation (lib/campaigns/imageValidation.ts)
- File size limits (5MB max, configurable)
- Image type checking (JPG, PNG, WebP)
- Dimension validation (minimum 1200x600px)
- Async dimension checking via Image API
- Detailed error messages
Image Upload Helpers (lib/campaigns/imageUpload.ts)
- Storage integration utilities
- URL generation from storage IDs
- Error handling for failed uploads
Campaign Validation
- Required field validation
- Bill ownership verification
- Duplicate campaign prevention
- Type-safe form submission
- Date validation for shutoff dates
- Amount validation (positive numbers)
API Integration
Stripe Integration
- Payment intent creation for donations
- Webhook handling for payment confirmation
- Customer management for recurring contributions
- Refund processing
- Payment status tracking
Convex Queries & Mutations
Campaigns:
createCampaign- Create campaign with optional bill linkinggetCampaignBySlug- Public campaign retrieval (respects privacy)getCampaignById- Full campaign data with owner/admin accessgetUserCampaigns- List user's campaignsgetActiveCampaigns- Browse active campaignsupdateCampaign- Campaign metadata updatescompleteCampaign- Mark campaign as completeupdateCampaignHeroImage- Update hero image after upload
Donations:
createDonation- Create donation recordupdateDonationStatus- Track payment statusgetCampaignDonations- List donations with privacy filteringgetDonationByPaymentIntent- Lookup by Stripe intent ID
Validation:
validateBillForCampaign- Pre-creation bill validationgetUserBillsForCampaignCreation- Get available bills for linking
Development Workflows
Creating a Campaign (Recipient)
1. Navigate to /my-campaigns/create
2. [Bill Step] Select or skip bill linking
- If selected: form fields auto-populate from bill
- Visual confirmation banner shows linked bill
3. [Details Step] Fill in campaign details
- All fields required except heroImage
4. [Type Step] Choose campaign type (public/anonymous)
5. [Privacy Step] Set visibility preferences
- Based on campaign type
6. [Image Step] Upload hero image (optional)
- Client-side validation before upload
7. [Preview Step] Review all information
8. Publish campaign with unique slug
Making a Donation (Contributor)
1. Browse /campaigns or discover page
2. Click on campaign to view details
3. View recipient info (respects privacy settings)
4. Enter donation amount
5. Add optional message
6. Complete Stripe payment
7. Donation recorded and tracked
8. Campaign totals update
Bill Submission (Recipient)
1. Navigate to /submit-bill
2. Upload utility bill document
3. Enter bill details (type, provider, amount, due date)
4. Bill sent for verification
5. Admin reviews and verifies
6. Bill appears in campaign creation options
7. Recipient can link bill to campaign
Testing Checklist
Campaign Creation
- [x] Bill selection prefills form fields correctly
- [x] Form auto-fills: utilityType, utilityProvider, amountDue, shutoffDate, goalAmount
- [x] Visual confirmation shows selected bill
- [x] "Change Bill" button clears all prefilled data
- [x] Campaign type selector works correctly
- [x] Privacy settings respect campaign type (public vs anonymous)
- [x] Image upload validates size (5MB max), type (JPG/PNG/WebP), dimensions (1200x600 min)
- [x] Campaign preview displays all information
- [x] Campaign publishes with unique slug
- [ ] Standalone campaigns (no bill linking) work
- [ ] Campaign creation without bill submission works
Campaign Discovery
- [ ] Campaigns list displays active campaigns
- [ ] Privacy settings respected (names hidden if anonymous)
- [ ] Campaign cards show correct metrics (donations, progress)
- [ ] Pagination works for campaign lists
- [ ] Location display respects privacy settings
- [ ] Sharing buttons work correctly
Donations
- [ ] Donation form validates positive amounts
- [ ] Stripe payment integration works
- [ ] Donation recorded in database
- [ ] Campaign totals update correctly
- [ ] Donation count increments
- [ ] Anonymous donations don't show donor name
- [ ] Payment status transitions correctly (pending → succeeded)
Navigation
- [ ] /my-campaigns link appears in recipient sidebar
- [ ] Navigation between dashboard sections works
- [ ] Proper role-based access control
Recent Updates
Phase 1 Implementation (Completed)
- [x] Campaign creation form with bill prefilling
- [x] Image upload with validation (5MB, type, dimensions)
- [x] Campaign discovery page with filtering
- [x] Privacy settings and configuration
- [x] Donation form with security messaging
- [x] Navigation sidebar updates
- [x] Bill linking and validation
- [x] Multi-step form flow
- [x] Campaign type selection (public/anonymous)
Future Enhancements
- Pool-based funding (community pools)
- Recurring contributions (subscriptions)
- Campaign scheduling
- Advanced analytics dashboard
- SMS notifications
- Multi-language support
- Mobile app
- Image storage/retrieval optimization
- Campaign analytics (views, click-through rates)
- Donor notifications and receipts
Log in or sign up for Devpost to join the conversation.