The Challenge: Prototypes That Couldn’t Scale
When I joined Citizen, the internal tools powering their real-time crime reporting system were barely holding together. These tools—designed to process live police radio feeds, incident reports, and user-generated video—were the backbone of the public-facing Citizen app, which had millions of active users. But internally, the team was struggling daily with tools that were never built for long-term, high-volume use.
Here’s what I walked into:
- Frequent crashes and memory overload, making real-time input nearly impossible.
- Bloated, unmaintainable code that made adding new features nearly unfeasible.
- A UI/UX bottleneck—the tools slowed the team down instead of helping them work efficiently.
- No visibility into efficiency metrics—there was no data to measure or improve core workflows.
The stakes were high: if these tools weren’t fixed, Citizen’s ability to deliver real-time emergency alerts to users would collapse.
I took charge as product manager, designer, and sole developer of a complete rebuild—transforming all three internal tools into fast, reliable, and scalable applications that dramatically improved speed, efficiency, and team morale.
The Solution: A Full Rebuild for Performance, Reliability & Usability
I built three critical internal tools—Audio Parsing, Incident Reporting, and Video Monitoring—all from the ground up, incorporating feedback from the team using them daily.
1. Audio Parsing: Faster Processing for Real-Time Radio Feeds
🚔 Before: A slow, unreliable system for processing live police radio feeds. Clips would pile up in an unorganized queue, causing overlapping reports and delays. The interface was mouse-based and inefficient, forcing workers to manually hunt for relevant clips.
✅ After: A keyboard-driven, speed-optimized tool that let team members scan, sort, and listen to police radio at up to 3x speed while instantly slowing down for difficult-to-hear clips. It auto-sorted clips by location, ensuring workers focused only on their assigned shifts.
2. Incident Reporting: A Smarter, More Visual Way to Log Emergencies
🚨 Before: A simple CRUD app with a bloated UI that frequently crashed due to memory leaks. Inputting details was slow, and team members had no visibility into surrounding incidents while working.
✅ After: I completely redesigned the reporting tool with a floating, movable sidebar UI overlaying a live map—giving workers real-time visibility into nearby incidents.
- Added a dynamic notification radius control, letting workers fine-tune alert reach in seconds.
- Improved real-time syncing with the public-facing app for instant updates.
3. Video Monitoring: More Control & Smarter Moderation
📹 Before: A bloated, crash-prone video processing tool that couldn’t handle live feeds effectively. No easy way for moderators to pause, approve, or reject live video uploads.
✅ After: A performance-first rebuild with built-in buffers for manual video approval, giving the moderation team more control.
- Connected video directly to incident data so moderators could make faster, more informed decisions about approving or rejecting live feeds.
Measuring Impact: A 60% Improvement in "Time to Incident"
Beyond fixing the crashes and usability issues, I wanted a way to quantify how much better the new tools were. I introduced a key efficiency metric: Time to Incident (TTI)—tracking how long it took to process an emergency from radio clip → team input → alert sent to Citizen users.
🔍 How we measured it:
- Retrospectively analyzed logs from the old tools.
- Introduced analytics tracking for each step of the workflow in the new tools.
- Monitored improvements as the team adjusted to the new system.
🚀 Results: Time to Incident dropped by 60%, meaning Citizen users got real-time crime alerts significantly faster—and with more accurate, more complete information.
Eliminating Crashes & Scaling for the Future
The original internal tools were built as quick prototypes—they relied on an outdated Create React App structure with a massive shared Redux memory store across all three tools.
🔧 Key technical improvements I made:
- Rebuilt the entire system in Next.js for better performance and scalability.
- Moved to Vercel for streamlined hosting and deployment.
- Introduced caching & memory optimizations, eliminating browser memory bloat over long shifts.
- Replaced inefficient state management with SWR + a real-time database, allowing faster, more reliable updates.
💡 The result? No more server crashes, no more memory overloads, and a system that scaled seamlessly to handle Citizen’s growing real-time demands.
More Than Just Software: A Team That Finally Felt Heard
One of the biggest successes wasn’t just better performance—it was the culture shift in how the internal team worked.
👥 Before: The team felt overlooked and unheard, stuck with tools that made their difficult jobs harder.
💬 After: I worked directly with them, designing every feature based on their needs. Their feedback shaped the tools in real-time—leading to faster workflows and higher morale.
Their response? They raved about the improvements—not just because the tools were better, but because they finally felt seen and valued.
Key Takeaways
✅ From unreliable to rock-solid: Rebuilt three mission-critical internal tools, eliminating crashes and bottlenecks.
✅ From slow to real-time: Reduced Time to Incident by 60%, getting alerts to millions of users faster.
✅ From frustrating to intuitive: Redesigned UI/UX for faster, keyboard-driven workflows tailored to the team’s needs.
✅ From rigid to scalable: Moved from outdated architecture to modern, optimized infrastructure that could grow with Citizen.
✅ From overlooked to empowered: Built a culture of collaboration and feedback, improving both tools and team morale.
Want to work together?
If you’re looking for a thoughtful, high-impact approach to building scalable, user-focused internal tools, let’s talk. 🚀