Operations 2.0
The second version of the dashboards: all eight in a single application, with accounts,
groups, and per-dashboard permissions. Each person signs in and sees only what their group
is allowed to; data is requested with their session, not from open webhooks.
My roleDesign, development, and operation
Used byOperations, finance, and management
Sources16, behind one authenticated webhook
StatusIn progress, alongside version 1
Why it exists
The first version was eight independent HTML files, each with its own copy of the rules,
its own way of filtering, and its own open webhooks. It worked, but every fix had to be
ported by hand to several dashboards, and there was no way to decide who sees what.
- One app with a sidebar: Job Status, Shipment Closing, Business Unit, CVBAT,
NetSuite→CargoWise Payment Reconciliation, KPIs, the floor display, and
Pre-inspection at origin. Plus a page showing the status of each data source.
- Invoice documents. Matches each CargoWise invoice against its files in Drive,
shows what is missing and why, and lets you link a document that arrived without its
invoice number.
- Client contacts. Inside CVBAT: who receives each client's invoices, and which
clients are still missing that information.
- Accounts and permissions. Password sign-in, email invitations, groups with
authorized dashboards, and an Admin panel with a history of every change.
- Each person arranges their own panel. The cards on each page can be moved and
resized, and the layout is saved to their account.
- Rules live once and every dashboard imports them instead of copying them.
- It refreshes itself. Every two minutes it checks when each table was updated,
downloads only what changed, and flags in the sidebar when a source goes stale.
While it is being built it runs alongside version 1: every data fix made to the old one is
ported to the new one, and users won't notice the switch until it is ready.
Where the data comes from
01CargoWise · NetSuitescheduled reports
02WatchersVM · Python
03MySQL RDShistory
04n8nsession · permission · source
05Browserlocal cache
A single webhook receives which source is requested plus the session token, checks
that the person's group may see some dashboard that uses that source, and only then
fetches the data. External accounts get shipments without amounts.
The browser keeps the last download: the app opens instantly with it and refreshes in the
background. If a download arrives with far fewer rows than the previous one, it is not
accepted until the next one confirms it.
Build decisions
- Parity tests. Every ported rule is compared against version 1 with real data:
shipment by shipment, the new one must produce exactly the same result.
- Design before code. Every screen was first approved on a design canvas with
real data; nothing was coded without that sign-off.
- Color only as a signal. Ink at different opacities for everything, and color only
when something is wrong, close, or fine. It follows the system theme.
- Everything lives in the link. Filters, tab, and view are shared by copying the
address.
- Currencies are never added together. The two companies bill in USD and MXN; each
figure stays in its currency.
What's different in this demo
It is the same file that runs in production, with the data layer replaced by a generator.
The rules and calculations are the real ones.
- The session signs in by itself as admin, so every dashboard and the Admin panel
are visible. Changes made there (permissions, groups, notes, the panel layout) last until you reload.
- People, clients, amounts, and job numbers are fictional.
- Excel export is disabled in the demo.
- Drive links do not open any files: the documents here are samples.
TypeScriptViteAutomated testsn8n
MySQL · AWS RDSPythonAirtable