Banking reports,
delivered through a tunnel.
A Kenyan SACCO on Apache Fineract needed a template-driven report portal that could reach a locked-down core banking database over SSH and email out password-protected PDFs, CSVs, and Excel files to thousands of members — without ever exposing the DB to the public internet.
A Kenyan SACCO — savings and credit co-operative — runs their member accounts on Apache Fineract / Mifos X. The platform is capable, but its native reporting is inflexible: templates ship as XML, they're painful to author, and the output options are limited. Meanwhile, members expect monthly savings statements, loan schedules, and portfolio reports in a form they can read on a phone or print at a shop.
The blocker: the core banking database cannot be exposed to the public internet. That's non-negotiable for the SACCO's regulator, and it should be. Any report tool has to reach the DB through a tunnel, on demand, without leaving the door open.
The team needed:
An admin panel to define reports as templates (SQL + a few conventions). An operator panel to run them — one-off for a single member, or in bulk against a member list. Sensitive-data masking on outputs. Password-protected files. Queued email delivery so a bulk run doesn't block the app. And a full audit trail — who ran what, when, and against which member.
A Laravel engine with a template-driven report generator. Templates are SQL with a couple of Laravel conventions on top. The conventions matter — they're what make the template library maintainable as it grows.
Underscore-prefixed SQL aliases mark header-only variables that don't render as data columns — the template author doesn't have to fight the renderer. FORMAT(value, 2) is the enforced pattern for monetary columns so nothing prints with three decimals or missing thousands separators.
An SSH tunnel service establishes the connection to Fineract's MySQL. The tunnel opens only when a report needs to run, closes when done. The DB stays private; the portal reaches it on demand.
Queued PDF, CSV, and Excel generation via Redis. dompdf for the PDF layer, PhpSpreadsheet for XLSX. Outputs are password-protected on write — the password format is documented and predictable so members can open their own statements without a support call.
Resend handles email delivery. Bulk runs queue up as individual jobs so a single failure doesn't tank the batch. Failed jobs retry with backoff. Every generated file, every email sent, every failed job is logged.
Two panels: admin defines templates, operator runs them. Full audit trail per member per template per run.
What we built it with.
The intelligence layer.
From brief to production.
What shipped.
The core banking DB never touches the internet. We define new templates ourselves — no ticket to the developers. Members get their statements on time, every month, without anyone in the office running scripts.
More from the studio.
Building something similar?
If your problem lives at the intersection of AI, product, and real business constraints, let's talk.
