August 15–26, 2026

A Peplink Integration, a New Support-Ticket System, and a Real Outage I Caused Myself

Since the last post: a full Peplink router-monitoring integration for OmniBridge — connection status, connected devices, cellular signal, backup links, automatic source matching — then a brand-new support-ticket system built from scratch, a real customer bug root-caused and fixed against a real customer's own router, and a production outage I caused myself chasing down "wasted disk space" the wrong way. Full write-up on the Peplink Integration doc and the Sending a Support Report doc if you want the user-facing details.

Building a support-ticket system from nothing

The bigger new thing: a whole new service, software-support, built from scratch to handle diagnostics reports across every JPPS product going forward, not just OmniBridge. A real ticket system (waiting on support, waiting on the customer, or closed) that flips automatically depending on who replied last, a public status page anyone can check with just their ticket link, no account needed, and an admin side with a real login screen.

Then built the other half inside OmniBridge itself: a "Send diagnostics report" button that bundles recent logs and the current setup, with every password, key, and secret removed before it ever leaves the machine, not cleaned up after the fact on the server. Plus a crash handler that automatically files a best-effort report if the app ever crashes, on every platform (before this it only existed on Windows, and even then didn't really work).

That crash handler alone was a small saga on its own. The first version tried to send the report in the background and returned right away, and never actually sent anything, because the whole program shuts down the instant a crash happens, whether or not something it started in the background is still running. The second attempt tried to send it directly instead of in the background, which also didn't work, for a different plumbing reason. The actual fix needed both: start sending it in the background, but hold the crash from finishing until that either succeeds or times out. Confirmed for real by triggering actual crashes against the live service and watching real tickets show up. A second real bug also only showed up by clicking the button in an actual browser against a real running copy: the new "send a report" feature had landed somewhere only licensed users could reach — but an unlicensed install is exactly the kind most likely to need to send one. Neither of those problems showed up in the automated test suite; both would have shipped broken without actually clicking through it by hand.

A real customer bug, root-caused and fixed against their own live data

Then the payoff: a real customer ticket came in through the new system saying no connected devices were showing up for their Peplink router. Two separate bugs, both in how OmniBridge reads the data Peplink sends back: one bad entry in a device's client list was breaking the whole list instead of just skipping that one bad entry, and a router's traffic numbers come back with gaps once its history runs short, which the code wasn't built to tolerate at all.

Rather than trust the fix from automated tests alone, I had a real test router already connected on a remote test machine. Deployed the fixed version there directly, watched the exact errors from the ticket disappear from the logs, and confirmed the exact device named in the ticket was now reporting real data. Shipped the fix, replied to the customer with the root cause and confirmation it was already live on their system, then a small follow-up — a bigger note field on the diagnostics form, and the ticket view reordered so a reply doesn't require scrolling past a wall of logs first — went out right behind it.

A real outage, self-inflicted, while chasing "wasted disk space"

Not every part of this stretch went cleanly. Asked to check the shared server for wasted disk space, I found an oversized 15GB log file and went hunting for what was writing to it by running a heavy command directly against that huge live file — on the same machine running the store, the wiki, this new support system, and the proxy in front of all of it. That used up all the machine's memory and made every one of those services unresponsive for several minutes, a real outage I caused with a single bad command. Flagged it immediately instead of quietly trying to paper over it. Recovery was simple once the machine responded again: freed up some memory on the host and killed the stray process.

The actual cause behind that oversized log was worth finding properly, so I downloaded a copy locally instead of touching the live file again. Our rust-proxy server had a bug where, after hitting a temporary limit on open connections, it would get stuck retrying as fast as possible forever instead of backing off, logging the whole time. Fixed it with a short pause between retries and raised that connection limit, deployed it, and confirmed disk usage dropped back down. Lesson learned the expensive way: never run a heavy command against a huge file on a live production machine again — download it and work on the copy instead.

Smaller things

Documented the whole Peplink integration and the new support system on omnibridge-web's docs section, wrote a scoping-only design spec for a future live-build installable ISO (not started, deliberately just scoped for now), and set up a small cron job on the shared services host to restart one particular LXC automatically at 4 AM daily rather than needing a manual nudge.

← Back to Blog