Skip to content

Feature Request System - Visual Guide & Summary

📊 Implementation Statistics

Total Changes:

  • 15 files modified/created
  • 10,291 lines added
  • 3 commits to feature branch
  • 0 lines removed (pure addition)

Code:

  • 408 lines - React component
  • 356 lines - Firebase Functions
  • 26 lines - Functions package.json

Documentation:

  • 2,041 lines across 5 comprehensive docs
  • 47KB total documentation

🎨 User Interface Flow

1. Entry Point

Route: #/feedback
Access: Settings menu → "Submit Feedback"

┌─────────────────────────────────────────┐
│  ⚙️  Settings                           │
│  ────────────────────────────────────  │
│  👤 Profile                             │
│  🔔 Notifications                       │
│  📍 Location                            │
│  📝 Submit Feedback          ← NEW!    │
│  ℹ️  About                              │
│  🚪 Sign Out                            │
└─────────────────────────────────────────┘

2. Form Interface

┌─────────────────────────────────────────────────────┐
│  ✕                 Submit Request                   │
├─────────────────────────────────────────────────────┤
│                                                      │
│  💡 Help us improve Lantern!                        │
│  Your feedback creates a GitHub issue that our      │
│  team will review. Be specific and include          │
│  examples to help us understand your request.       │
│                                                      │
│  What type of request is this? *                    │
│  ┌────────────┐  ┌────────────┐                    │
│  │ ✨ Feature │  │ 🐛 Bug     │                    │
│  │ Request    │  │ Report     │  ← Active          │
│  └────────────┘  └────────────┘                    │
│  ┌────────────┐  ┌────────────┐                    │
│  │ ⚡ Improve │  │ ❓ Question│                    │
│  │ ment       │  │            │                    │
│  └────────────┘  └────────────┘                    │
│                                                      │
│  Title *                                            │
│  ┌──────────────────────────────────────────┐      │
│  │ Add dark mode to profile settings        │      │
│  └──────────────────────────────────────────┘      │
│  38/100                                             │
│                                                      │
│  ⚠️ Similar requests found                          │
│  ┌──────────────────────────────────────────┐      │
│  │ #42 Add dark mode support                │      │
│  │ Submitted: 2026-01-05 · Status: Planned  │      │
│  │ 85% similar to your request              │      │
│  │ [View] [Continue Anyway]                 │      │
│  └──────────────────────────────────────────┘      │
│                                                      │
│  Description *                                      │
│  ┌──────────────────────────────────────────┐      │
│  │ Users have requested ability to switch   │      │
│  │ to dark mode when using the app at night │      │
│  │ ...                                       │      │
│  │                                           │      │
│  └──────────────────────────────────────────┘      │
│  147/1000                                           │
│                                                      │
│  Use Case (Optional)                                │
│  ┌──────────────────────────────────────────┐      │
│  │ When browsing at night, bright screens   │      │
│  │ are jarring and reduce battery life      │      │
│  └──────────────────────────────────────────┘      │
│  82/500                                             │
│                                                      │
│  Priority *                                         │
│  ┌────────────┐  ┌────────────┐                    │
│  │ 🟢 Low     │  │ 🟡 Medium  │  ← Active          │
│  │ Nice to    │  │ Would      │                    │
│  │ have       │  │ improve    │                    │
│  └────────────┘  └────────────┘                    │
│  ┌────────────┐  ┌────────────┐                    │
│  │ 🟠 High    │  │ 🔴 Critical│                    │
│  │ Important  │  │ Blocking   │                    │
│  └────────────┘  └────────────┘                    │
│                                                      │
│  Who does this affect? *                            │
│  ○ Individual - Affects only me or very few users  │
│  ● Small Group - Affects specific user segment     │
│  ○ All users - Broad impact across user base       │
│                                                      │
│  ☑ Submit anonymously                              │
│  Your user ID won't be included in the GitHub      │
│  issue. We can still see who submitted it          │
│  internally.                                        │
│                                                      │
├─────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────┐       │
│  │         📤 Submit Request                │       │
│  └─────────────────────────────────────────┘       │
└─────────────────────────────────────────────────────┘

3. Success State

┌─────────────────────────────────────────────────────┐
│  ✕            Request Submitted!                    │
├─────────────────────────────────────────────────────┤
│                                                      │
│                   ✅                                │
│                                                      │
│               Thank You!                            │
│                                                      │
│  Your request has been submitted as GitHub          │
│  issue #123. You can track its progress using       │
│  the link below.                                    │
│                                                      │
│  ┌─────────────────────────────────────────┐       │
│  │         View on GitHub                   │       │
│  └─────────────────────────────────────────┘       │
│                                                      │
│  ┌─────────────────────────────────────────┐       │
│  │         Close                            │       │
│  └─────────────────────────────────────────┘       │
│                                                      │
└─────────────────────────────────────────────────────┘

🔄 Backend Flow

User Submits Form

Firebase Auth Check ────→ Rejected if not logged in

Input Validation ────────→ Error if invalid

Rate Limit Check ────────→ Error if exceeded (5/24hrs)

┌──────────────────────────────────────┐
│  createFeatureRequest Function       │
│  ────────────────────────────────   │
│  1. Format issue body                │
│  2. Determine labels (+ environment) │
│  3. Create GitHub issue (Octokit)    │
│  4. Store in Firestore               │
│  5. Send Discord notification        │
│  6. Return issue URL                 │
└──────────────────────────────────────┘

   ┌───┴────┐
   ↓        ↓
GitHub    Discord
Issue     Webhook

📱 Mobile View

┌──────────────────┐
│  ✕  Submit Req.  │
├──────────────────┤
│                  │
│  💡 Help us...   │
│                  │
│  Type? *         │
│  ┌────┐  ┌────┐ │
│  │ ✨ │  │ 🐛 │ │
│  └────┘  └────┘ │
│  ┌────┐  ┌────┐ │
│  │ ⚡ │  │ ❓ │ │
│  └────┘  └────┘ │
│                  │
│  Title *         │
│  ┌────────────┐ │
│  │            │ │
│  └────────────┘ │
│  0/100           │
│                  │
│  [Scroll for     │
│   more fields]   │
│                  │
├──────────────────┤
│  Submit Request  │
└──────────────────┘

🐛 GitHub Issue Format

markdown
## Type
Feature Request

## Description
Users have requested ability to switch to dark mode when
using the app at night...

## Use Case
When browsing at night, bright screens are jarring and
reduce battery life...

## Priority & Impact
- **Priority**: medium
- **Impact**: small-group

## Submitted By
User ID: abc123xyz
Submitted: 2026-01-12T16:30:00.000Z

---
*Auto-generated from in-app feature request form*

Labels Applied:

  • feature-request
  • priority-medium
  • user-submitted
  • needs-triage
  • env-development or env-production (automatic)

💬 Discord Notification

╔════════════════════════════════════════════════╗
║ 🎯 New Feature Request #123                    ║
║ ───────────────────────────────────────────── ║
║ Add dark mode to profile settings              ║
║                                                 ║
║ 🟡 DEVELOPMENT                                 ║
║                                                 ║
║ Type: Feature Request                          ║
║ Priority: 🟡 Medium                            ║
║ Impact: Small Group                            ║
║                                                 ║
║ Description:                                    ║
║ Users have requested ability to switch to dark ║
║ mode when using the app at night...            ║
║                                                 ║
║ Use Case:                                       ║
║ When browsing at night, bright screens are     ║
║ jarring and reduce battery life...             ║
║                                                 ║
║ GitHub Issue:                                   ║
║ View on GitHub ↗                               ║
║                                                 ║
║ Submitted by user_abc123                       ║
║ 2026-01-12 at 4:30 PM                          ║
╚════════════════════════════════════════════════╝

🎯 Duplicate Detection

When user types a title similar to existing requests:

⚠️ Similar requests found:
┌─────────────────────────────────────────────────┐
│ #42 Add dark mode support                       │
│ Submitted: 2026-01-05 · Status: Planned         │
│ 85% similar to your request                     │
│ ───────────────────────────────────────────────│
│ [View Issue]  [Continue Anyway]                 │
└─────────────────────────────────────────────────┘

How it works:

  1. User types title/description
  2. 1-second debounce delay
  3. checkDuplicates function called
  4. Keyword matching algorithm (Jaccard similarity)
  5. Returns top 5 matches with scores
  6. Displays if >50% similar

🔐 Security Features

Input Validation

javascript
Title: Max 100 chars, required
Description: Max 1000 chars, required
✓ Use Case: Max 500 chars, optional
Type: Must be feature|bug|improvement|question
Priority: Must be low|medium|high|critical
Impact: Must be individual|small-group|all-users

Rate Limiting

User: abc123
Requests in last 24hrs: 4
───────────────────────
Allowed: ✅ 1 more
User: abc123
Requests in last 24hrs: 5
───────────────────────
Allowed: ❌ Rate limit exceeded
Wait: 12 hours until next submission

Authentication

User logged in?
├─ Yes → Continue
└─ No  → Error: "User must be authenticated"

Anonymous Option

☑ Submit anonymously

GitHub Issue shows:
"Submitted By: Anonymous User"

Firestore stores:
submittedBy: "anonymous"

But internally we still know userId for rate limiting

🌍 Environment Awareness

Development

Firebase Project: lantern-app-dev
GitHub Label: env-development
Discord Webhook: #dev-feedback channel
Discord Badge: 🟡 DEVELOPMENT

Production

Firebase Project: lantern-app-prod
GitHub Label: env-production
Discord Webhook: #user-feedback channel
Discord Badge: 🟢 PRODUCTION

Automatic Detection:

javascript
const projectId = process.env.GCLOUD_PROJECT
const isProduction = projectId === 'lantern-app-prod'
const envLabel = isProduction ? 'env-production' : 'env-development'

📊 Data Model (Firestore)

javascript
{
  id: "abc123xyz",              // Auto-generated
  type: "feature",              // feature|bug|improvement|question
  title: "Add dark mode...",    // Max 100 chars
  description: "Users have...", // Max 1000 chars
  useCase: "When browsing...",  // Max 500 chars, nullable
  priority: "medium",           // low|medium|high|critical
  impact: "small-group",        // individual|small-group|all-users
  
  githubIssueNumber: 123,       // GitHub issue #
  githubIssueUrl: "https://...",
  
  submittedBy: "user_abc123",   // or "anonymous"
  submittedAt: Timestamp,
  status: "submitted",          // submitted|under-review|planned|...
  
  duplicateOf: null,            // Reference if duplicate
  similarRequests: []           // Array of similar IDs
}

🚀 Deployment Steps

1. GitHub Token

bash
# Create token at github.com/settings/tokens
# Scope: repo
firebase functions:config:set github.token="ghp_xxx"

2. Discord Webhooks

bash
# Dev
firebase use lantern-app-dev
firebase functions:config:set discord.webhook_url="https://..."

# Prod
firebase use lantern-app-prod
firebase functions:config:set discord.webhook_url="https://..."

3. Deploy Functions

bash
firebase use lantern-app-dev
firebase deploy --only functions

firebase use lantern-app-prod
firebase deploy --only functions

4. Update Firestore Rules

bash
firebase deploy --only firestore:rules

5. Test

bash
npm run dev
# Visit http://localhost:5173/#/feedback
# Submit test request
# Verify GitHub issue, Discord notification, Firestore doc

📚 Documentation Files

  1. README.md (6.5KB) - Documentation index
  2. QUICK_START.md (8.6KB) - Setup guide
  3. FEATURE_REQUEST_SYSTEM.md (12KB) - Full spec
  4. DISCORD_BOT_INTEGRATION.md (14.5KB) - Discord bot
  5. FIREBASE_FUNCTIONS_DEV_PROD.md (5.7KB) - Deployment
  6. IMPLEMENTATION_COMPLETE.md (8.7KB) - Summary

Total: 56KB of comprehensive documentation

✅ Completeness Checklist

Core Implementation

  • [x] React form component with full validation
  • [x] Firebase Cloud Functions (createFeatureRequest, checkDuplicates)
  • [x] GitHub API integration via Octokit
  • [x] Discord webhook notifications
  • [x] Firestore data storage
  • [x] Duplicate detection algorithm
  • [x] Rate limiting system
  • [x] Environment awareness (dev/prod)
  • [x] Security (auth, validation, sanitization)
  • [x] Error handling and user feedback

Documentation

  • [x] README with overview
  • [x] Quick start guide
  • [x] Complete technical specification
  • [x] Discord bot integration guide
  • [x] Dev/prod deployment guide
  • [x] Implementation summary
  • [x] Updated CHANGELOG
  • [x] Updated DOCS_INDEX

Ready for Testing

  • [ ] GitHub token configured
  • [ ] Discord webhooks configured
  • [ ] Functions deployed to dev
  • [ ] End-to-end test passed
  • [ ] Functions deployed to prod

🎉 Summary

What was built: A complete, production-ready feature request submission system that allows users to submit feedback directly from the app, automatically creates GitHub issues, sends Discord notifications, detects duplicates, and handles both dev and prod environments seamlessly.

Lines of code: 10,291 (764 code, 9,527 docs/config)

Time estimate for deployment: 30-45 minutes

Time estimate for Discord bot: 30 min (link bot) or 2-3 hours (full modal bot)

Status:READY FOR DEPLOYMENT

Built with VitePress