← Blog Nyura Blog
A magnifying glass examining code with bug icons being caught in a net

3 Silent Bugs Squashed: Resilience Engineering at Nyura

Empty display names, hanging AI requests, and invisible file uploads — how Sentry helped us find bugs users never reported.

March 18, 2026 3 min read Cyril Simonnet
EngineeringBug FixesAIReliabilityDark Mode

The Bugs Users Never Report

The most dangerous bugs aren't the ones that crash your app — they're the ones that silently fail. A profile update that saves an empty string instead of null. An AI request that hangs forever when the API is slow. A voice recording upload that fails because the browser didn't detect a MIME type.

These bugs don't throw errors users can see. They don't crash the app. They just... don't work. The user taps a button, waits, and nothing happens. They move on, never knowing something broke. At Nyura, we use Sentry's real-time error monitoring to catch these invisible failures before they affect more users.

Bug #1: The Vanishing Display Name

When a user cleared their display name field and hit save, the code would trim the input and send an empty string to the database. But an empty display name isn't the same as no display name — it causes downstream issues where the app tries to render a greeting like "Hello, " with nothing after it.

The fix was elegant: displayName.trim() || null. If the trimmed name is empty, we store null instead, which means "no name set" — and the app correctly falls back to the email address. One line of code, but it fixed a subtle UX issue that affected anyone who ever tried to clear their name.

Bug #2: The AI Request That Never Returns

Nyura uses Google's Gemini API for task categorization, title improvement, briefings, and more. Our shared utility function gemini-utils.ts handles all these calls — but it had no timeout. If Gemini's API was slow or unresponsive, the fetch would hang indefinitely, and the user would see a spinner that never stopped.

We added an AbortController with a 30-second timeout to every Gemini API call. If the request doesn't complete in 30 seconds, it's aborted and the user gets a clear error message: "AI request timed out. Please try again." This affects 20+ edge functions that rely on Gemini, from auto-categorization to daily briefings to contact bio generation.

Bug #3: The Invisible Upload Failure

When you attach a file to a task comment or save a voice recording, the browser provides a MIME type like image/png or audio/webm. But sometimes — especially with drag-and-drop or unusual file formats — the browser returns an empty string. Supabase Storage would then either reject the upload or save it without a proper content type, making it impossible to serve later.

Our fix adds a MIME type fallback map. If the browser doesn't detect the type, we infer it from the file extension: .pdfapplication/pdf, .jpgimage/jpeg, .webmaudio/webm. Unknown extensions get application/octet-stream, which is always safe. For voice recordings specifically, we default to audio/webm since that's the standard WebCodecs format.

Dark Mode Polish and the Ongoing Performance Quest

Alongside the bug fixes, we continued two initiatives from v4.48.9. First, dark mode polish: Company Intelligence cards had hardcoded text-blue-600 icons that were barely visible on dark backgrounds. We added dark:text-blue-400 variants to 6 icon instances (Factory, Users, MapPin, LinkedIn) and improved contrast on call/meeting note badges.

Second, the transition-all performance sweep continues. After replacing 130+ instances in v4.48.9, we found another 95 in the remaining components — onboarding tours, main header, kanban views, AI assistant, music library, and 20+ utility components. Every single one now uses targeted CSS transitions. The cumulative effect: Nyura monitors fewer CSS properties per frame, freeing up GPU time for what matters — smooth scrolling and responsive interactions.

Try Nyura for free

Available on iOS, Android, and web. No credit card required.

Get Started →