Reports
Build the exact view you need — any column, any filter, saved and exportable.
Canned
Custom Views
Saved views
Deadlines this month
Open files by coordinator
Funds held > $1M
View builder
Unsaved changes
View name
Columns
7 of 11 selected · drag chips to reorder
Exchange #
Exchanger
Type
Status
Coordinator
45th Day
180th Day
Days to deadline
Funds held
Sale close
Created
Filters
rows must match all filters
Status=Active
45th DaywithinNext 30 days
Coordinator=All
Live preview
Showing 6 of 41 matching files · updates as you change columns and filters
refreshed just now
| Exchange # | Exchanger | Type | Coordinator | 45th Day | Days to Deadline | Funds Held |
|---|---|---|---|---|---|---|
| EX-2026-1187 | Matt Belcher | Delayed | T. Bottenberg | Aug 17, 2026 | 3d | $1,120,000 |
| EX-2026-1204 | Rosa Alvarez | Delayed | T. Bottenberg | Aug 20, 2026 | 6d | $685,000 |
| EX-2026-1216 | Evelyn Cho | Delayed | T. Bottenberg | Aug 26, 2026 | 12d | $925,000 |
| EX-2026-1162 | Dana Whitfield | Reverse | M. Reyes | Aug 28, 2026 | 14d | $2,340,000 |
| EX-2026-1226 | Hank Barrow | Delayed | T. Bottenberg | Sep 4, 2026 | 21d | $1,410,000 |
| EX-2026-1198 | June Calloway | Improvement | D. Park | Sep 9, 2026 | 26d | $760,000 |
Every column, every filter, your view — export anytime.
Build contract — custom report builder
1 · Tokens, never hex. Every colour resolves from
docs/mockups/tokens.css. The [PROPOSED] tokens used here
(--console-rail-*, --admin-*, --hub-id-*,
--hub-purchase-*, the good/warn/bad triad) get added to
packages/web-app/src/index.css under :root and .dark
before this is coded — never inlined at the call site. Light and dark are both designed.2 · Saved views are rows in Supabase, not localStorage. A view is configuration a coordinator relies on across devices and sessions; the column set, filter set, name and ordering are business state and persist server-side under the tenant's RLS policies. A cross-tenant view is impossible by construction, not by a WHERE clause in the query builder.
3 · The preview obeys the caller's row-level permissions. "6 of 41 matching files" is 41 files this user may see. The builder must never widen scope: adding a column or dropping a filter cannot surface a file the coordinator could not already open.
4 · Countdown colour is a summary, never the source of truth. The
cd chip renders days remaining against the statutory 45- and 180-day dates held
on the exchange. It is computed server-side from those dates and is read-only here — no
control in this builder edits a deadline. A clock that has passed renders in the
bad role with an explicit "over" label; it may never render as a satisfied or
green state.5 · Every run and every export writes an audit-log entry — actor, view definition, row count, timestamp. The footer states this, so the implementation must actually emit it. Exports carry the same NPI restrictions as the screen: no SSN, no DOB, ever.
6 · Filters are structured, not free-text. Each token is a
{field, operator, value} triple validated by a Zod schema at the API boundary and
compiled to a parameterised query. Unknown fields are rejected rather than passed through.7 · Scheduling reuses the existing report schedules rather than introducing a second scheduler — the run itself is a Vectr workflow, not an in-app cron.
All exchange numbers, names and amounts on this surface are synthetic demo data.