Solo
$19a seat, a month
- Replays included
- 5,000
- Overage a replay
- $0.010
- Retention
- 7 days
- Seats
- 1
Over the included volume. 35,000 replays would add $350 to the seat.
Record and replay for backend services
Aperture records every call, query, and job your service makes, then replays one of them against the code you are editing.
Free for 14 days on up to 5,000 replays, no card
$ aperture replay tr_8f21c4
→ 41 spans, 3 services, 1.2 MB
→ clock pinned 14:02:11.338Z
→ seeds restored
POST /checkout/confirm 500
| db.carts.find id=$1 → 1 row
| flag:split_tender = on
| job:reprice ran 92 s earlier
| charge.create timeout 30 s
breakpoint at pricing.rb:212
Fyre Logistics cut the median time to reproduce a customer-reported bug from three days to 41 minutes, over 214 incidents. Priya Raman, staff engineer, Fyre Logistics
Your error tracker names the line that threw. It does not name the row that sat in the table, the header the caller sent, or the job that ran ninety seconds earlier and left the cache in the shape that broke it. Those four facts are the bug. The line is where it surfaced.
11 calls behind the median failing endpoint at Fyre, across four services
A trace is a file. Attach it to the ticket. Whoever picks the ticket up starts where you stopped, with the same rows, the same clock, and the same flag values you had.
# the trace, as it arrives in the ticket
tr_8f21c4.aperture 1.2 MB captured 14:02:11.338Z retention 30 d
service checkout-api v2026.31.4 commit 9d3ac1e
entry POST /checkout/confirm status 500 842 ms
tenant meridian-freight-intl
redacted card_number, cvv, authorization header
1.2 MB median trace, compressed. Bodies over 256 KB are stored by hash and fetched on replay
0 lines of instrumentation. Aperture attaches to the runtime, not to your code
Edit the code, replay the same trace, and the only variable that moved is the one you moved. Outbound calls answer from the recording, so a third party being down on Tuesday does not change Tuesday's answer.
1.4 %median CPU cost while recording
42 msto first span on replay
30 daysretention, then the trace is gone
6runtimes supported, Ruby through .NET
Every plan records without a meter. You pay for a replay once, whoever starts it.
Seats renew on the day you start and you can cancel any one of them at any time. Cancelling stops the next charge and leaves the seat working to the end of the month you have already paid for. Self-hosted runs for a year and renews the same way.
Drag to see what each plan costs at your volume. Overage lands on the next invoice.
$19a seat, a month
Over the included volume. 35,000 replays would add $350 to the seat.
$79a seat, a month
Over the included volume. 0 replays would add $0 to the seat.
$4,800a year, unmetered
Install the agent on one service and record a single endpoint. If the first bug you replay already has a fix, you lose an afternoon.
| What sits on what | Carries | Ratio |
|---|---|---|
| White on deep teal | the main button | 7.55:1 |
| Grey on white | every muted line | 7.56:1 |
| Teal on white | links, numerals, focus ring | 5.44:1 |
| Pale grey on near-black | the dark band | 16.28:1 |
| Light teal on near-black | the dark accent | 13.71:1 |
| Near-black on light teal | the dark main button | 13.71:1 |
| Grey on near-black | the dark muted line | 7.68:1 |
| Red on white | the over-volume state | 4.92:1 |
Two rules, not one. The faint line that separates rows is far too pale to read text against, so it separates rows and does nothing else. Muted text is a step darker than the accessibility standard strictly asks for, because a second, newer standard reads that lighter step as usable only at large sizes. And of Tailwind's twenty-six hues, only six are readable on white at the middle of their scale. Teal is not one of them, so this page uses it two steps deeper.