Yuki Dashboard
Yuki is the online accounting package I use for my company, and its standard UI doesn’t have the health-check views I want. I built a small .NET 10 Blazor Server app for myself that talks to Yuki’s SOAP webservices and shows the gaps: open invoices with no linked payment, payments with no linked invoice, contacts with missing or malformed VAT numbers, and what changed recently. It’s not a public product; it’s a tool I run to keep an eye on my own books.
Wrapping the SOAP services. Yuki exposes 11 SOAP webservices for accounting, contacts, VAT and more. I generated a strongly-typed C# client for each with dotnet-svcutil and wrapped them behind one authenticated session, cached for 15 minutes so every page doesn’t re-authenticate.
Never hitting Yuki straight from the UI. Yuki rate-limits each domain to 1,000 calls a day, so the dashboard never calls Yuki directly. A background worker syncs administrations, outstanding creditor items, unmatched bank transactions and contacts into a local SQLite cache on a fixed interval, and every call it makes is counted against a daily budget stored in that same database; once the budget’s spent, calls stop until the next day. Pages only ever read the cache, and a “Force sync now” button lets me trigger a run early when the budget allows it.
Live without a refresh. The app runs Blazor Server’s interactive render mode, so the UI is a persistent SignalR connection rather than static pages. When a background sync finishes, it raises an event that pushes straight to the open dashboard and re-renders the figures, no reload needed.
Telegram alerts and deep links. When a sync finds a purchase invoice or bank transaction it hasn’t seen before, it can post a Telegram message, gated behind a per-type toggle so I’m not pinged on every run, only on genuinely new findings. Every row in the dashboard also links back into my real Yuki portal for that record, so a flagged invoice is one click from being fixed at the source.
Running it. It’s behind OpenID Connect sign-in restricted to a specific group, builds and ships as a container through my self-hosted Forgejo Actions to my own registry, and runs with a health check endpoint and its cache in a named Docker volume.
Technologies: C#, .NET 10, Blazor Server, SignalR, Entity Framework Core, SQLite, System.ServiceModel.Http, dotnet-svcutil, Yuki SOAP webservices, OpenID Connect, Docker, Forgejo Actions, Renovate, Telegram Bot API.
You May Also Like

How This Blog Is Served
The machinery behind the words you're reading: Hugo, an unprivileged nginx, a strict CSP, and a deploy script.

Keeping the Old Addresses Alive
Nobody migrates email in one day. Fetchmail, a receive-only alias domain, and permanent redirects bridge the old world into the new one.

Making Roundcube Not Look Like 2012
Webmail is the face of the platform, so it got a Gmail-shaped skin, real calendar and contacts integration, and some money spent on polish.





