06 · Market data & agentic trading · Two products, one repository

Stock Scanner

Full-stack architecture and development

9

Named scanner patterns, 6 float · 3 squeeze

6

Node services behind one gateway

7

Test suites, one per service and the app

Case study
Operation

Watching a list of stocks for unusual activity is a full-time job done badly by hand, and the tools that do it tend to blur two very different things: a number that was measured, and a number that was missing. A blank cell filled in with a substitute is worse than no tool at all when money is on the other end of it.

Intervention

Node services behind one gateway push a live grid over a websocket, mark the patterns they recognise, and label every figure with the feed it came from — an unavailable measurement stays blank and a stale row is drawn as stale. A second, deliberately separate product lets a scheduled agent trade a linked brokerage account under rules the account holder sets. The two share no database and are not wired together, so a scanner alert can never become a purchase. The trading half has not yet placed an order against a live broker, and the repository says so on every line.

  • Node.js
  • Express
  • React
  • Vite
  • MUI
  • WebSockets
  • MySQL
  • PostgreSQL
  • Auth0
  • Docker
What is in it
  • The live grid

    A chosen list of stocks, not the whole market, updating in place over a live connection: gap against the previous close, relative volume against the stock’s own normal, momentum in dollars per minute, and change over the last five and ten minutes.

  • Nine named patterns

    Six built on shares outstanding combined with unusual volume, and three squeeze patterns — up 10% in ten minutes, up 5% in five, and a new 52-week high.

  • Trading halts

    Exchange-paused stocks are flagged from the exchange’s own public feed, and when that feed is unreachable the app says so rather than reporting that nothing is halted.

  • Provenance on every number

    Each figure is labelled with the feed it was measured on, so a number taken from a partial feed is never mistaken for a full-market one.

  • Absent is not zero

    A genuinely unavailable measurement is left blank rather than substituted, and a row whose prices have stopped arriving is drawn as visibly stale instead of showing an old price as current.

  • Alerts and personalisation

    An alert when a stock starts matching a pattern, with a per-person mute so silencing a noisy ticker affects only you, plus saved column layouts and saved pattern sets.

  • Backtest

    A pattern run over past daily price history to show what it would have flagged. It uses full-market historical data — broader than the live grid’s — and the page says so, so confidence in one is never carried over to the other.

  • Sign-in and the invite gate

    Hosted sign-in through Auth0, so no password is stored by the app, plus an invite code checked on the server on every request rather than in the browser.

  • Broker credentials

    A linked account is authorised through the broker’s own approval screen — no token or password is ever pasted into the app — and the stored credential is encrypted, with tampering detected rather than silently decrypting to something wrong.

  • Risk set by the account holder

    A conservative, moderate or aggressive risk profile sets the sizing bounds in one choice; the percentage of capital the owner accepts losing is a hard ceiling that closes positions rather than a notification.

  • A schedule that knows the calendar

    The agent does not fire on weekends, on holidays or after an early close, and refuses to run past the last year its holiday table covers rather than guessing.

  • Practice mode

    The whole flow runs against simulated fills with no broker link at all, so nothing has to be connected to real money to be watched.

  • Separation by construction

    The scanner holds no brokerage connection and cannot place an order; the trader never reads scanner signal and never writes market data. They use different databases, with no keys crossing between them.

Get in touch

Let's talk about your project

Thinking about a new project, a problem to solve, or just want to connect? Let's do it!