Skip to content
Skip to content
Skip to content

Case study

Live payment data on a table of 200,000 rows that still answers a click at once.

INP on the transactions tablefrom 380 msto 48 ms

Client
Kestrel Pay
Year
2024
Role
Senior frontend developer
Kind
Product
A laptop with the dark Kestrel Pay dashboard and the same screen on a phone

The problem

Merchants keep the Kestrel dashboard open all day. Every new payment re-rendered the whole table, and by the afternoon a filter click took a third of a second to answer.

The approach

  • Rows are virtualised and keyed by payment id; a live update touches one row, never the list.
  • Filters run in a worker and return in chunks, so typing never waits for a sort.
  • The socket batches updates per frame instead of per message.
A developer at a monitor at dusk beside a desk lamp
A developer at a monitor at dusk beside a desk lamp
Two developers working late on laptops, city lights outside
Two developers working late on laptops, city lights outside

The result

Interaction to Next Paint on the busiest view fell from 380 ms to 48 ms at the 75th percentile. Memory after eight hours open is flat.

Built with

ReactTypeScriptTanStack VirtualWebSocket

Case study

Live payment data on a table of 200,000 rows that still answers a click at once.

INP on the transactions tablefrom 380 msto 48 ms

Client
Kestrel Pay
Year
2024
Role
Senior frontend developer
Kind
Product
A laptop with the dark Kestrel Pay dashboard and the same screen on a phone

The problem

Merchants keep the Kestrel dashboard open all day. Every new payment re-rendered the whole table, and by the afternoon a filter click took a third of a second to answer.

The approach

  • Rows are virtualised and keyed by payment id; a live update touches one row, never the list.
  • Filters run in a worker and return in chunks, so typing never waits for a sort.
  • The socket batches updates per frame instead of per message.
A developer at a monitor at dusk beside a desk lamp
A developer at a monitor at dusk beside a desk lamp
Two developers working late on laptops, city lights outside
Two developers working late on laptops, city lights outside

The result

Interaction to Next Paint on the busiest view fell from 380 ms to 48 ms at the 75th percentile. Memory after eight hours open is flat.

Built with

ReactTypeScriptTanStack VirtualWebSocket

Case study

Live payment data on a table of 200,000 rows that still answers a click at once.

INP on the transactions tablefrom 380 msto 48 ms

Client
Kestrel Pay
Year
2024
Role
Senior frontend developer
Kind
Product
A laptop with the dark Kestrel Pay dashboard and the same screen on a phone

The problem

Merchants keep the Kestrel dashboard open all day. Every new payment re-rendered the whole table, and by the afternoon a filter click took a third of a second to answer.

The approach

  • Rows are virtualised and keyed by payment id; a live update touches one row, never the list.
  • Filters run in a worker and return in chunks, so typing never waits for a sort.
  • The socket batches updates per frame instead of per message.
A developer at a monitor at dusk beside a desk lamp
A developer at a monitor at dusk beside a desk lamp
Two developers working late on laptops, city lights outside
Two developers working late on laptops, city lights outside

The result

Interaction to Next Paint on the busiest view fell from 380 ms to 48 ms at the 75th percentile. Memory after eight hours open is flat.

Built with

ReactTypeScriptTanStack VirtualWebSocket

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Start a project

Three quick picks so the first reply is useful. You finish the message on the contact page.

What do you need?

Rough budget

brief.tsdraft, not sent

Brief so far: nothing picked yet

or write to hello@sorenhale.dev

Nothing is sent from this page. Your picks are kept in this browser tab and wait for you on the contact form.

Footer

Local time, Oslo

Footer

Local time, Oslo

Footer

Local time, Oslo

Create a free website with Framer, the website builder loved by startups, designers and agencies.