All projects
Trading workflow · Case studyLive demo

Trade Request

Structured trade requests from advisors, a trader queue with a pre-approval checklist, an asset-location engine that turns each request into an execution plan, and a drift monitor that compares every account with its model portfolio.

Role
Design and engineering
Users
Advisors and traders
Stack
React · Express · Postgres
The drift monitor: 93 accounts compared with their model portfolios, with counts of accounts out of tolerance and uninvested, and a table of accounts ranked by how far they have drifted.The drift monitor: 93 accounts compared with their model portfolios, with counts of accounts out of tolerance and uninvested, and a table of accounts ranked by how far they have drifted.

Overview

Structured trade requests from advisors, a trader queue with a pre-approval checklist, an asset-location engine that turns each request into an execution plan, and a drift monitor that compares every account with its model portfolio.

The problem

Trade requests arrived by chat and email with missing details. Traders re-keyed them into spreadsheets, chased follow-up questions, and had no single record of who approved what and when.

What I built

  • A request form that adapts to the request type and will not submit an incomplete request.
  • A searchable trading queue with the status, advisor and submitter of every request.
  • A pre-approval checklist and an audit trail on every request, so each approval shows what was checked and who decided.
  • An asset-location engine that places cash and fixed income in the account where each is taxed least.
  • A drift monitor that compares every account with its model portfolio, can rank accounts by unrealized gain so the cheapest fixes come first, and lets a trader mark known exceptions.
  • A compliance PDF for every request, and a firm-wide compliance report: what was asked, what was approved and by whom.
  • Domain types shared between client and server, so a renamed field fails the build on both sides.

In the app

Key decisions

Structured requests only

Free-text requests were the root problem. Each request type has its own required fields and validation.

The engine is a pure function

Asset location takes holdings and a model and returns a plan. With no database access it is simple to test against fixtures.

Approval before execution

Nothing is traded from a request directly. A trader approves a plan, and the approval is part of the record.

One deployable unit

Express serves the built React app, which keeps hosting simple and inexpensive.

Architecture

Production
Advisor / Traderbrowser
React SPAforms · queue · plans
Express APIengine · drift · PDF
Postgresrequests · approvals
Public demo
Cloudflare Workertrade.jeremyhamann.dev
Containersame app · demo build
Neon Postgressynthetic seed · nightly reset

React · Vite · Express · Postgres · TypeScript · Zod

The demo

The demo runs the production app’s code on a fictional firm. The data warehouse, the model provider’s feeds and Slack are replaced by stand-ins that answer in their real formats inside the container, and every Slack message and email lands in an in-app Outbox instead of being sent. A nightly reset restores the data and replays two weeks of drift checks, so the history always looks current.

See it running

Sign in as any demo user. Nothing you do leaves the demo, and it resets every night.

Open live demo