Charts & data viz
Plots, maps, and the frame they all mount inside.
Chart Frame
The shell every chart mounts inside: scales, ticks, tooltips, and legends.
Revenue by channel
2026, thousands of dollars
1,013k
Direct revenue roughly triples over the year while partner and affiliate revenue grow more slowly. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Month | Direct | Partner | Affiliate |
|---|---|---|---|
| Jan | 180k | 96k | 42k |
| Feb | 205k | 121k | 51k |
| Mar | 262k | 118k | 60k |
| Apr | 244k | 152k | no data |
| May | 310k | 149k | no data |
| Jun | 356k | 188k | 74k |
| Jul | 331k | 214k | 88k |
| Aug | 402k | 203k | 96k |
| Sep | 448k | 246k | 91k |
| Oct | 425k | 288k | 118k |
| Nov | 512k | 271k | 132k |
| Dec | 548k | 324k | 141k |
Line Chart
Multi-series lines with monotone spline and step curves.
Request latency
8 Sep 2026, UTC
664ms
The 95th percentile spikes to 664 milliseconds during the afternoon deploy window while the median stays under 150. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Hour | p50 | p95 |
|---|---|---|
| 00:00 | 82ms | 210ms |
| 01:00 | 79ms | 198ms |
| 02:00 | 76ms | 186ms |
| 03:00 | 74ms | 179ms |
| 04:00 | 73ms | 174ms |
| 05:00 | 75ms | 182ms |
| 06:00 | 81ms | 214ms |
| 07:00 | 96ms | 268ms |
| 08:00 | 118ms | 372ms |
| 09:00 | 131ms | 511ms |
| 10:00 | 127ms | 468ms |
| 11:00 | 122ms | 402ms |
| 12:00 | 119ms | 366ms |
| 13:00 | 124ms | 391ms |
| 14:00 | 133ms | 447ms |
| 15:00 | 141ms | 664ms |
| 16:00 | 136ms | 588ms |
| 17:00 | 128ms | 452ms |
| 18:00 | 117ms | 361ms |
| 19:00 | 106ms | 312ms |
| 20:00 | 98ms | 281ms |
| 21:00 | 92ms | 258ms |
| 22:00 | 88ms | 236ms |
| 23:00 | 84ms | 221ms |
Interpolated: this line claims seat counts nobody was ever licensed for.
Seats go from 25 to 250 over eight months in four discrete plan changes. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Licensed seats |
|---|---|
| Jan | 25 seats |
| Feb | 25 seats |
| Mar | 50 seats |
| Apr | 50 seats |
| May | 50 seats |
| Jun | 100 seats |
| Jul | 100 seats |
| Aug | 250 seats |
Area Chart
Area, stacked area, and stream graph off one offset prop.
Sessions by source
Stacked to a zero baseline
2240k
Referral traffic peaks in May and social in August, while organic grows steadily all year. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Organic | Referral | Social | |
|---|---|---|---|---|
| Jan | 42k | 30k | 12k | 22k |
| Feb | 48k | 36k | 14k | 24k |
| Mar | 51k | 48k | 18k | 23k |
| Apr | 58k | 62k | 22k | no data |
| May | 64k | 74k | 30k | no data |
| Jun | 61k | 68k | 44k | 28k |
| Jul | 72k | 52k | 62k | 31k |
| Aug | 80k | 40k | 78k | 34k |
| Sep | 86k | 34k | 70k | 40k |
| Oct | 92k | 30k | 54k | 46k |
| Nov | 104k | 28k | 40k | 52k |
| Dec | 118k | 26k | 34k | 58k |
Bar Chart
Grouped, stacked, and diverging bars in both orientations.
Accounts by plan
One bar per plan, per quarter
Team and Business tiers grow faster than Starter across the period. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Starter | Team | Business |
|---|---|---|---|
| Q1 2025 | 128 accounts | 64 accounts | 18 accounts |
| Q2 2025 | 142 accounts | 86 accounts | 24 accounts |
| Q3 2025 | 151 accounts | 104 accounts | 31 accounts |
| Q4 2025 | 160 accounts | 128 accounts | 44 accounts |
| Q1 2026 | 172 accounts | 149 accounts | 58 accounts |
| Q2 2026 | 181 accounts | 178 accounts | 76 accounts |
Scatter Plot
Scatter, bubble, connected, categorical, and quadrant in one.
Cost per acquisition
By campaign spend, two channels
Search campaigns bring their cost per acquisition down as spend rises; display campaigns do the opposite. Interactive chart. Use the left and right arrow keys to move between data points, up and down to change series, Escape to dismiss the reading. The full data follows as a table.
| Spend | Search | Display |
|---|---|---|
| Search campaign 1 | $63.7 | no data |
| Search campaign 2 | $66.2 | no data |
| Search campaign 3 | $63.9 | no data |
| Search campaign 4 | $59.2 | no data |
| Search campaign 5 | $62.7 | no data |
| Search campaign 6 | $55.8 | no data |
| Search campaign 7 | $52.6 | no data |
| Search campaign 8 | $56.5 | no data |
| Search campaign 9 | $49.4 | no data |
| Search campaign 10 | $54 | no data |
| Search campaign 11 | $45.2 | no data |
| Search campaign 12 | $48.8 | no data |
| Search campaign 13 | $48.2 | no data |
| Search campaign 14 | $44.3 | no data |
| Search campaign 15 | $40.3 | no data |
| Search campaign 16 | $46.9 | no data |
| Search campaign 17 | $37.3 | no data |
| Search campaign 18 | $42.7 | no data |
| Display campaign 19 | no data | $49.2 |
| Display campaign 20 | no data | $55.2 |
| Display campaign 21 | no data | $53.2 |
| Display campaign 22 | no data | $54.1 |
| Display campaign 23 | no data | $55.4 |
| Display campaign 24 | no data | $50.3 |
| Display campaign 25 | no data | $60.4 |
| Display campaign 26 | no data | $60.4 |
| Display campaign 27 | no data | $59.8 |
| Display campaign 28 | no data | $54.8 |
| Display campaign 29 | no data | $59.6 |
| Display campaign 30 | no data | $67.4 |
| Display campaign 31 | no data | $66.1 |
| Display campaign 32 | no data | $60.4 |
| Display campaign 33 | no data | $61 |
| Display campaign 34 | no data | $62.8 |
Pie Chart
Pie, donut, semi-circle, and nightingale off one polar engine.
Spend by department
Quarterly, thousands of dollars
Engineering takes the largest share at roughly two fifths of the total. Use the arrow keys to move between slices and Escape to dismiss the reading. The full data follows as a table.
| Category | Value | Share |
|---|---|---|
| Engineering | $412k | 38% |
| Infrastructure | $268k | 24.7% |
| Sales | $194k | 17.9% |
| Support | $121k | 11.2% |
| Operations | $88k | 8.1% |
Waffle Chart
A grid of countable units, with the fractional cell carried honestly.
Sessions by device
One cell is one percent; fractions carry across cells so the grid stays exact
Mobile takes roughly three fifths of all sessions. Use the arrow keys to move between categories and Escape to dismiss the reading. The full data follows as a table.
| Category | Value | Share |
|---|---|---|
| Mobile | 58.4% | 58.4% |
| Desktop | 31.2% | 31.2% |
| Tablet | 7.9% | 7.9% |
| Other | 2.5% | 2.5% |
Funnel Chart
Stage drop-off as pills or a taper, with width carrying the value.
Payroll by role
$9,124.00
Doctors take forty five percent of a nine thousand dollar monthly payroll, and admin and reception are level at nine hundred and twelve dollars each. Bar width is proportional to the value, not bar area, and colour repeats the same reading. Use the arrow keys to move between stages and Escape to dismiss the reading. The full data follows as a table.
| Stage | Value | From previous | Of first |
|---|---|---|---|
| Doctors | $4,107.00 | 100% | |
| Nurses | $2,008.00 | 49% | 49% |
| Helpers | $1,185.00 | 59% | 29% |
| Admin | $912.00 | 77% | 22% |
| Reception | $912.00 | 100% | 22% |
Distribution Plot
Box, violin, beeswarm, strip, and jitter over one summary engine.
Response time by route
90 requests per route, milliseconds
Box plot of milliseconds across 4 groups. Quartiles use linear interpolation between order statistics, and the whiskers stop at the most extreme observation within one and a half times the interquartile range. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Median | Q1 | Q3 | Min | Max | Observations |
|---|---|---|---|---|---|---|
| Search | 103 | 67 | 170 | 40 | 487 | 90 |
| Checkout | 170 | 130 | 212 | 90 | 313 | 90 |
| Profile | 81 | 52 | 116 | 30 | 180 | 90 |
| Feed | 94 | 68 | 145 | 55 | 630 | 90 |
Histogram
Bars, density, or radial, with the bin-width rule printed under it.
Basket value
480 orders, pounds
480 observations. 14 bins, Freedman-Diaconis, each bin 10 wide. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Pounds | Orders | Share |
|---|---|---|
| 0 to 10 | 7 | 1.5% |
| 10 to 20 | 39 | 8.1% |
| 20 to 30 | 83 | 17.3% |
| 30 to 40 | 100 | 20.8% |
| 40 to 50 | 69 | 14.4% |
| 50 to 60 | 17 | 3.5% |
| 60 to 70 | 12 | 2.5% |
| 70 to 80 | 18 | 3.8% |
| 80 to 90 | 38 | 7.9% |
| 90 to 100 | 27 | 5.6% |
| 100 to 110 | 27 | 5.6% |
| 110 to 120 | 30 | 6.3% |
| 120 to 130 | 10 | 2.1% |
| 130 to 140 | 3 | 0.6% |
14 bins, Freedman-Diaconis, each bin 10 wide, curve smoothed at 10
Ridgeline Plot
Overlapping density curves sharing one value axis.
Daily high by month
60 readings a month, degrees Celsius
Density of degrees across 12 rows, ordered by the order supplied, each ridge climbing 1.8 rows and scaled against the tallest density in the chart. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Degrees | Median | Most common | Min | Max | Observations |
|---|---|---|---|---|---|
| Jan | 9 | 9 | 5 | 15 | 60 |
| Feb | 13 | 15 | 9 | 19 | 60 |
| Mar | 16 | 17 | 12 | 20 | 60 |
| Apr | 19 | 19 | 14 | 24 | 60 |
| May | 21 | 20 | 15 | 25 | 60 |
| Jun | 21 | 21 | 18 | 26 | 60 |
| Jul | 22 | 23 | 17 | 27 | 60 |
| Aug | 21 | 22 | 17 | 27 | 60 |
| Sep | 20 | 19 | 16 | 27 | 60 |
| Oct | 19 | 19 | 14 | 24 | 60 |
| Nov | 16 | 16 | 11 | 21 | 60 |
| Dec | 13 | 13 | 8 | 17 | 60 |
Horizon Chart
A series folded into bands so twenty rows fit on one screen.
Error rate against baseline
Five regions, 120 days, percent
5 rows folded into 3 bands of 6.7% each, with values below zero mirrored back up the lane and hatched. Each lane is reused 3 times, so a deeper band is a bigger number in the same space. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | eu-west-1 | us-east-1 | ap-south-1 | sa-east-1 | af-south-1 |
|---|---|---|---|---|---|
| 1 May | 0.8% | -2.3% | -3.3% | 1.5% | -2.3% |
| 2 May | 0.8% | -5.3% | -3.4% | 4.8% | -3.6% |
| 3 May | -2.2% | -4.7% | -2.3% | 1.9% | -3.8% |
| 4 May | -1.9% | -3.7% | -3.5% | 1.2% | -4.2% |
| 5 May | 0.6% | -2.4% | -6.1% | 0.1% | -4.1% |
| 6 May | 2.6% | -4.7% | -2.7% | 2.6% | -2.3% |
| 7 May | 5.7% | -4.7% | -1.3% | 3.1% | -4.7% |
| 8 May | 7% | -2.9% | -3.4% | 4.9% | -7.8% |
| 9 May | 9.7% | -2.8% | -2.9% | 1.6% | -5.2% |
| 10 May | 9.5% | -5.7% | -0.3% | 1% | -5.1% |
| 11 May | 11.8% | -4.5% | -3.4% | -2.1% | -4.9% |
| 12 May | 9% | -7.3% | -2.5% | -0.5% | -6% |
| 13 May | 6.1% | -9.6% | -4.2% | -0.8% | -3.2% |
| 14 May | 5.3% | -9.9% | -3.5% | -1.4% | -1.8% |
| 15 May | 6.5% | -12.5% | -1% | -4.2% | -3.4% |
| 16 May | 4.6% | -8.9% | -2.2% | -0.8% | -3.9% |
| 17 May | 4.9% | -8.7% | -5% | 0% | -7% |
| 18 May | 6.5% | -8.5% | -3.8% | -0.3% | -8.6% |
| 19 May | 5.9% | -10.3% | -3.7% | -0.2% | -9.2% |
| 20 May | 5% | -11.8% | -3.7% | 0.8% | -6.6% |
| 21 May | 2.7% | -12% | -6.8% | -0.1% | -7.8% |
| 22 May | 0.2% | -9.4% | -10% | 1% | -11% |
| 23 May | 2.9% | -5.7% | -9.6% | -0.5% | -11.3% |
| 24 May | 2.7% | -3.2% | -5.8% | -1.6% | -13.5% |
| 25 May | 5.6% | -5.7% | -6.9% | 0.4% | -10.6% |
| 26 May | 7.5% | -2.3% | -10% | 1.6% | -8.8% |
| 27 May | 8.3% | -0.2% | -6.4% | 3.4% | -8.2% |
| 28 May | 7.8% | -0.4% | -5.3% | 1.3% | -11.3% |
| 29 May | 4.6% | -1.9% | -7% | 4.6% | -8.4% |
| 30 May | 7.8% | 1.1% | -5.6% | 6.6% | -8.1% |
| 31 May | 9.7% | 0.3% | -6% | 4.5% | -8.6% |
| 1 Jun | 12.4% | 1.6% | -3% | 4.2% | -8.3% |
| 2 Jun | 9.7% | 0.4% | -0.3% | 6% | -9.6% |
| 3 Jun | 8.7% | -0.9% | 2.1% | 3.4% | -6.1% |
| 4 Jun | 8.1% | 1.3% | 1.6% | 1.6% | -2.9% |
| 5 Jun | 6.4% | 4.7% | -0.9% | 2.1% | -1.2% |
| 6 Jun | 4.3% | 3.2% | 1.4% | 2.6% | 0.9% |
| 7 Jun | 0.7% | 5.4% | 0% | -0.2% | 0.5% |
| 8 Jun | 0.5% | 4.8% | 3.2% | -1.5% | 1% |
| 9 Jun | -1% | 1.6% | 5.5% | -4.9% | 4% |
| 10 Jun | -3.7% | -1.9% | 4.3% | -5% | 4.6% |
| 11 Jun | -0.8% | 1.1% | 6.8% | -7.5% | 1% |
| 12 Jun | -3.8% | -1.6% | 4.3% | -10% | 3% |
| 13 Jun | -4.8% | -1.9% | 6.8% | -10.4% | 4.4% |
| 14 Jun | -6.9% | -1% | 4.5% | -12.4% | 1.9% |
| 15 Jun | -7.2% | 0.9% | 2.8% | -9.9% | 3.9% |
| 16 Jun | -10.4% | 1.9% | 3% | -6.9% | 6.4% |
| 17 Jun | -13% | 4.7% | -0.2% | -7.4% | 9% |
| 18 Jun | -15% | 5.7% | -2.3% | -6.7% | 8% |
| 19 Jun | -14.8% | 3.2% | -1.4% | -9.5% | 6.2% |
| 20 Jun | -16.5% | -0.2% | -0.5% | -10.8% | 4.1% |
| 21 Jun | -15.7% | -0.1% | -0.6% | -10.9% | 1.1% |
| 22 Jun | -13.1% | -3.4% | -3.7% | -8.6% | 3.8% |
| 23 Jun | -14.3% | -5.2% | -5.9% | -10.2% | 5.7% |
| 24 Jun | -15.2% | -4.1% | -3.3% | -12.2% | 7.9% |
| 25 Jun | -15.4% | -6.1% | -2.4% | -15% | 6% |
| 26 Jun | -12.1% | -2.7% | -2.8% | -17.3% | 2.6% |
| 27 Jun | -10.8% | -3.7% | -3% | -18.3% | 4% |
| 28 Jun | -7.7% | -7% | -6.2% | -20.1% | 1.7% |
| 29 Jun | -4.3% | -9.9% | -3.4% | -18.3% | -1.5% |
| 30 Jun | -3.2% | -9.7% | -6.5% | -19.8% | 1.3% |
| 1 Jul | -3.1% | -12.5% | -5.2% | -16% | 1.2% |
| 2 Jul | -1% | -15.3% | -7.9% | -15.1% | -2% |
| 3 Jul | -1.7% | -11.7% | -5.5% | -13.4% | -3.5% |
| 4 Jul | -0.7% | -14.2% | -6.4% | -15.4% | -6.4% |
| 5 Jul | 1% | -11.6% | -9.4% | -12.8% | -6.7% |
| 6 Jul | 0.7% | -11.6% | -7.3% | -9.7% | -3.8% |
| 7 Jul | 3.7% | -9.6% | -8.6% | -9% | -4.7% |
| 8 Jul | 4% | -8.1% | -9.6% | -5.8% | -3.6% |
| 9 Jul | 6.5% | -5.2% | -7.5% | -6.8% | -3.2% |
| 10 Jul | 4.7% | -5.9% | -4.6% | -4.8% | -0.9% |
| 11 Jul | 5.6% | -5.6% | -3% | -1.8% | 1.6% |
| 12 Jul | 5.5% | -3.9% | -2.7% | -0.3% | 1.4% |
| 13 Jul | 5.5% | -6.1% | -0.1% | -2.9% | -2% |
| 14 Jul | 2% | -7.2% | 2.2% | -4.1% | -3.2% |
| 15 Jul | -0.3% | -4.3% | -0.9% | -6% | -0.5% |
| 16 Jul | -1.2% | -2.5% | 1.6% | -7.5% | 2.6% |
| 17 Jul | -0.8% | -4.6% | 4.8% | -5.2% | -0.5% |
| 18 Jul | -3.3% | -5.6% | 7.2% | -2.3% | -3.3% |
| 19 Jul | -3.1% | -2.7% | 6.3% | -2.8% | -3.7% |
| 20 Jul | -2.6% | -0.7% | 8% | -6.1% | -1% |
| 21 Jul | 0% | -4.1% | 10.6% | -8.3% | -0.7% |
| 22 Jul | 2.6% | -7.2% | 9.1% | -9.1% | -2.3% |
| 23 Jul | 3.7% | -8.8% | 7.5% | -10.9% | -1.5% |
| 24 Jul | 5.4% | -6.2% | 9.5% | -11.1% | -3.1% |
| 25 Jul | 8.4% | -3.1% | 10.8% | -8.9% | -0.4% |
| 26 Jul | 6% | -6.1% | 12.5% | -8.9% | 1.8% |
| 27 Jul | 9.3% | -7.6% | 10.2% | -10.6% | 3.1% |
| 28 Jul | 8.7% | -6.2% | 7.3% | -10% | 2.2% |
| 29 Jul | 9.1% | -4.9% | 4.1% | -13% | 5.5% |
| 30 Jul | 10.9% | -3.9% | 5.5% | -13.8% | 7.3% |
| 31 Jul | 12.8% | -4.5% | 6.6% | -16% | 6.1% |
| 1 Aug | 8.8% | -5% | 3.8% | -12.6% | 4.7% |
| 2 Aug | 5.2% | -4.2% | 3.9% | -11.7% | 2.9% |
| 3 Aug | 3.2% | -5.7% | 5.3% | -14.7% | 1% |
| 4 Aug | 0.9% | -4.6% | 1.6% | -13.2% | 0.3% |
| 5 Aug | 3.2% | -1.8% | 0.1% | -12.5% | -2% |
| 6 Aug | 3.7% | -1.4% | 0.8% | -14.8% | 0.8% |
| 7 Aug | 1.7% | 1.4% | 1.7% | -14% | 2.9% |
| 8 Aug | -0.1% | 1% | 1.5% | -16.3% | 3.6% |
| 9 Aug | -1.1% | 2.7% | -1.7% | -17.5% | 6.9% |
| 10 Aug | -1.7% | 4.7% | -0.8% | -14.9% | 8.2% |
| 11 Aug | -1.5% | 5.2% | -2.3% | -12.1% | 7.1% |
| 12 Aug | -1.7% | 6.4% | -3.3% | -8.5% | 4.9% |
| 13 Aug | 1.2% | 3.6% | -2.1% | -6.3% | 3.2% |
| 14 Aug | -0.7% | 4.9% | -3.7% | -5.6% | 3.5% |
| 15 Aug | -0.1% | 5.8% | -1.1% | -2.5% | 0.2% |
| 16 Aug | -0.3% | 6.6% | 2% | -5.6% | -0.3% |
| 17 Aug | 1.7% | 3.4% | 0.7% | -7.4% | 3.1% |
| 18 Aug | -0.9% | 5.6% | 3.8% | -8.9% | 4.8% |
| 19 Aug | -3.7% | 7.5% | 2.8% | -5.5% | 1.7% |
| 20 Aug | -4.4% | 7.7% | 1.7% | -4.5% | 3.6% |
| 21 Aug | -5.2% | 8.4% | 0.3% | -1.1% | 0.9% |
| 22 Aug | -5.6% | 6.2% | -2.4% | -3.4% | -0.7% |
| 23 Aug | -2.5% | 4.5% | -1.1% | -6.3% | 1.5% |
| 24 Aug | -5.5% | 6.8% | 1.4% | -4.2% | -0.1% |
| 25 Aug | -5.4% | 5.9% | 4.8% | -0.8% | 1.4% |
| 26 Aug | -7.6% | 6.2% | 5.9% | 1% | 4.6% |
| 27 Aug | -10.2% | 2.9% | 4.3% | 1.5% | 3.2% |
| 28 Aug | -11.8% | 6% | 6.3% | 4.2% | 6.6% |
Lollipop Chart
Lollipop, dot, dumbbell, and range off one categorical axis.
Checkout completion by device
Percent of starts, 2026
6 rows, sorted by descending. Stem length is the value, measured from zero. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | 2026 |
|---|---|
| Desktop | 81.2% |
| iOS | 74.6% |
| Android | 68.3% |
| Tablet | 63.9% |
| Kiosk | 52.1% |
| Smart TV | 47.8% |
Bullet Chart
Few's bullet graph: bands behind, measure over, target in front.
Revenue against plan
Q3, thousands, one shared scale
4 measures, each drawn against its qualitative ranges with a target marker. All rows share one axis. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Actual | Target | Scale tops out at |
|---|---|---|---|
| EMEA | 284k | 300k | 340k |
| N America | 331k | 290k | 340k |
| APAC | 198k | 240k | 340k |
| LATAM | 122k | 150k | 340k |
Waterfall Chart
A running total from typed steps, with the arithmetic done for you.
Gross to operating
Q3, thousands
7 steps from 0k to 871k. Each step's bar spans the running total before it and after it; subtotal and total steps stand on zero and report the running total instead of changing it. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Running total | Change | Step type |
|---|---|---|---|
| Gross | 1840k | 1840k | Step |
| Refunds | 1712k | -128k | Step |
| Net | 1712k | 1712k | Subtotal |
| COGS | 1108k | -604k | Step |
| Support | 775k | -333k | Step |
| Resale | 871k | 96k | Step |
| Operating | 871k | 871k | Total |
Slope Chart
Slopegraph, bump chart, or ranked ribbons, with labels that never collide.
Weekly active users by office
2024 against 2026, thousands
5 series across 2 periods, read as slopes. Steeper is a bigger change. Interactive chart. Use the left and right arrow keys to move between data points, up and down to change series, Escape to dismiss the reading. The full data follows as a table.
| Point | Bristol | Leeds | Cardiff | Dundee | Belfast |
|---|---|---|---|---|---|
| 2024 | 62k | 58k | 55k | 41k | 39k |
| 2026 | 71k | 49k | 57k | 63k | 37k |
Radar Chart
A spoke-by-spoke profile that stays honest about axis order.
Cupping scores
SCA form, six attributes. Scale truncated to 6 to 10, the specialty band.
The Yirgacheffe scores higher on aroma and acidity, the Huila on body and balance, and they are within a quarter point on flavour. Read this axis by axis rather than as a shape: the enclosed area depends on the order the axes are listed in, so it is not a quantity. Use the arrow keys to move between axes and Escape to dismiss the reading. The full data follows as a table.
| Axis | Yirgacheffe, natural | Huila, washed |
|---|---|---|
| Aroma | 8.75 | 7.75 |
| Flavour | 8.50 | 8.25 |
| Aftertaste | 8.00 | 8.25 |
| Acidity | 9.00 | 7.75 |
| Body | 7.25 | 8.50 |
| Balance | 8.25 | 8.50 |
Same six scores every time. The enclosed area is 31.9% of the grid in this order, and it moves when you reorder the spokes. Area is a property of the axis order, not of the coffee.
Parallel Coordinates
One axis per variable, with brushing and reordering by keyboard too.
Deploys, last quarter
96 deploys across two services, five variables each
96
Deploys touching more files take longer to review, spend longer in CI, and are the ones that move the 95th percentile latency the wrong way. Each axis is scaled to its own range, so the height of a line means something only against the axis it is crossing. Every axis has a column button that reorders it with the left and right arrow keys, and a pair of filter handles that narrow it with the up and down arrow keys. Escape clears an axis filter. The full data follows as a table.
96 of 96 records shown. Column order: Files, Review, CI, Failed checks, p95 delta.| Record | Files | Review | CI | Failed checks | p95 delta | In filter |
|---|---|---|---|---|---|---|
| Deploy 1200 | 8 changed | 0.2 h | 6.1 min | 2 | -28 ms | yes |
| Deploy 1201 | 2 changed | 1.5 h | 3.8 min | 1 | -14 ms | yes |
| Deploy 1202 | 119 changed | 3.2 h | 12.8 min | 4 | +22 ms | yes |
| Deploy 1203 | 130 changed | 4.9 h | 12.7 min | 4 | +27 ms | yes |
| Deploy 1204 | 108 changed | 2.7 h | 14.5 min | 3 | +3 ms | yes |
| Deploy 1205 | 95 changed | 2.9 h | 12.7 min | 0 | +7 ms | yes |
| Deploy 1206 | 90 changed | 3 h | 9.3 min | 0 | +9 ms | yes |
| Deploy 1207 | 18 changed | 1.2 h | 3.9 min | 2 | -4 ms | yes |
| Deploy 1208 | 106 changed | 2.6 h | 11.2 min | 2 | +13 ms | yes |
| Deploy 1209 | 3 changed | 1.6 h | 4.9 min | 0 | +1 ms | yes |
| Deploy 1210 | 3 changed | 0.2 h | 3.3 min | 1 | -29 ms | yes |
| Deploy 1211 | 135 changed | 3.4 h | 14.1 min | 5 | +18 ms | yes |
| Deploy 1212 | 10 changed | 1.7 h | 3.1 min | 0 | -17 ms | yes |
| Deploy 1213 | 35 changed | 2 h | 3.5 min | 2 | -10 ms | yes |
| Deploy 1214 | 34 changed | 2.5 h | 5.9 min | 1 | +3 ms | yes |
| Deploy 1215 | 28 changed | 1.7 h | 4.1 min | 1 | +15 ms | yes |
| Deploy 1216 | 47 changed | 2.2 h | 7.7 min | 1 | +18 ms | yes |
| Deploy 1217 | 8 changed | 0.8 h | 5.4 min | 1 | -23 ms | yes |
| Deploy 1218 | 74 changed | 3 h | 7.9 min | 5 | +11 ms | yes |
| Deploy 1219 | 76 changed | 3.8 h | 7.2 min | 4 | +21 ms | yes |
| Deploy 1220 | 147 changed | 4.8 h | 16.1 min | 5 | +34 ms | yes |
| Deploy 1221 | 26 changed | 0.8 h | 4 min | 0 | -18 ms | yes |
| Deploy 1222 | 59 changed | 3.3 h | 6.4 min | 0 | +5 ms | yes |
| Deploy 1223 | 4 changed | 1.6 h | 2.8 min | 1 | -12 ms | yes |
| Deploy 1224 | 12 changed | 0.2 h | 6.3 min | 1 | -4 ms | yes |
| Deploy 1225 | 57 changed | 2.1 h | 6.8 min | 1 | -6 ms | yes |
| Deploy 1226 | 5 changed | 1.5 h | 4.6 min | 0 | -26 ms | yes |
| Deploy 1227 | 15 changed | 0.2 h | 5.4 min | 0 | -23 ms | yes |
| Deploy 1228 | 26 changed | 2.4 h | 5 min | 0 | -18 ms | yes |
| Deploy 1229 | 107 changed | 4 h | 14.4 min | 2 | +25 ms | yes |
| Deploy 1230 | 150 changed | 4.2 h | 16.3 min | 2 | +57 ms | yes |
| Deploy 1231 | 86 changed | 3.7 h | 10.4 min | 1 | +11 ms | yes |
| Deploy 1232 | 72 changed | 3 h | 11.6 min | 3 | +12 ms | yes |
| Deploy 1233 | 27 changed | 1 h | 2.9 min | 1 | -16 ms | yes |
| Deploy 1234 | 137 changed | 3.9 h | 15.3 min | 1 | +24 ms | yes |
| Deploy 1235 | 37 changed | 0.7 h | 6.8 min | 1 | +14 ms | yes |
| Deploy 1236 | 95 changed | 2.9 h | 9.9 min | 1 | +28 ms | yes |
| Deploy 1237 | 3 changed | 0.4 h | 5.5 min | 0 | -7 ms | yes |
| Deploy 1238 | 44 changed | 0.9 h | 8 min | 1 | +11 ms | yes |
| Deploy 1239 | 8 changed | 0.5 h | 5.7 min | 1 | -29 ms | yes |
| Deploy 1240 | 17 changed | 1.8 h | 2.6 min | 1 | +7 ms | yes |
| Deploy 1241 | 10 changed | 0.4 h | 2.6 min | 0 | -1 ms | yes |
| Deploy 1242 | 51 changed | 3.1 h | 5.3 min | 1 | +19 ms | yes |
| Deploy 1243 | 5 changed | 0.3 h | 5.6 min | 1 | +3 ms | yes |
| Deploy 1244 | 4 changed | 0.2 h | 4.1 min | 1 | -31 ms | yes |
| Deploy 1245 | 3 changed | 1.4 h | 1.5 min | 0 | -11 ms | yes |
| Deploy 1246 | 149 changed | 3.9 h | 17.7 min | 1 | +48 ms | yes |
| Deploy 1247 | 6 changed | 1.1 h | 1.9 min | 1 | -20 ms | yes |
| Deploy 1248 | 75 changed | 1.6 h | 11.4 min | 1 | +2 ms | yes |
| Deploy 1249 | 3 changed | 0.4 h | 3.9 min | 0 | -25 ms | yes |
| Deploy 1250 | 12 changed | 0.2 h | 5.1 min | 0 | +4 ms | yes |
| Deploy 1251 | 142 changed | 4.1 h | 12.9 min | 4 | +37 ms | yes |
| Deploy 1252 | 6 changed | 0.2 h | 3 min | 0 | -8 ms | yes |
| Deploy 1253 | 21 changed | 0.2 h | 4.3 min | 1 | +3 ms | yes |
| Deploy 1254 | 109 changed | 2.7 h | 12.5 min | 2 | +24 ms | yes |
| Deploy 1255 | 75 changed | 2.4 h | 8.7 min | 2 | +7 ms | yes |
| Deploy 1256 | 7 changed | 0.5 h | 1.9 min | 1 | -21 ms | yes |
| Deploy 1257 | 49 changed | 1.1 h | 8.1 min | 1 | +22 ms | yes |
| Deploy 1258 | 155 changed | 4.7 h | 13.7 min | 1 | +44 ms | yes |
| Deploy 1259 | 44 changed | 2 h | 7.6 min | 1 | -13 ms | yes |
| Deploy 1260 | 22 changed | 0.8 h | 5.1 min | 0 | -27 ms | yes |
| Deploy 1261 | 14 changed | 1.3 h | 2.9 min | 0 | -24 ms | yes |
| Deploy 1262 | 60 changed | 1.1 h | 9 min | 2 | +3 ms | yes |
| Deploy 1263 | 57 changed | 1.8 h | 8.8 min | 1 | -10 ms | yes |
| Deploy 1264 | 13 changed | 1.4 h | 1.7 min | 1 | -6 ms | yes |
| Deploy 1265 | 86 changed | 2.2 h | 9.2 min | 1 | +17 ms | yes |
| Deploy 1266 | 22 changed | 0.5 h | 4.5 min | 0 | -6 ms | yes |
| Deploy 1267 | 26 changed | 0.4 h | 5.3 min | 1 | +4 ms | yes |
| Deploy 1268 | 3 changed | 0.5 h | 3.4 min | 1 | -24 ms | yes |
| Deploy 1269 | 108 changed | 3.6 h | 10.7 min | 5 | +3 ms | yes |
| Deploy 1270 | 47 changed | 0.9 h | 5.6 min | 0 | -10 ms | yes |
| Deploy 1271 | 10 changed | 0.7 h | 1.8 min | 0 | -2 ms | yes |
| Deploy 1272 | 3 changed | 1 h | 5.7 min | 2 | -29 ms | yes |
| Deploy 1273 | 128 changed | 3.9 h | 14.8 min | 5 | +39 ms | yes |
| Deploy 1274 | 37 changed | 1.4 h | 6.8 min | 1 | -16 ms | yes |
| Deploy 1275 | 41 changed | 1.2 h | 8.4 min | 0 | -9 ms | yes |
| Deploy 1276 | 92 changed | 3.9 h | 10.7 min | 5 | +8 ms | yes |
| Deploy 1277 | 9 changed | 1.6 h | 4.7 min | 2 | +5 ms | yes |
| Deploy 1278 | 22 changed | 0.3 h | 6.8 min | 0 | -3 ms | yes |
| Deploy 1279 | 2 changed | 0.7 h | 4.7 min | 1 | -24 ms | yes |
| Deploy 1280 | 98 changed | 2.5 h | 10.8 min | 2 | +37 ms | yes |
| Deploy 1281 | 82 changed | 4 h | 11 min | 0 | +3 ms | yes |
| Deploy 1282 | 9 changed | 1.3 h | 3.2 min | 1 | -16 ms | yes |
| Deploy 1283 | 18 changed | 1.7 h | 2.7 min | 2 | +11 ms | yes |
| Deploy 1284 | 19 changed | 1.3 h | 2.7 min | 1 | -11 ms | yes |
| Deploy 1285 | 130 changed | 4.3 h | 16.1 min | 3 | +23 ms | yes |
| Deploy 1286 | 107 changed | 2.8 h | 10.4 min | 4 | +20 ms | yes |
| Deploy 1287 | 7 changed | 1.2 h | 3.8 min | 1 | -1 ms | yes |
| Deploy 1288 | 139 changed | 3.5 h | 14 min | 5 | +44 ms | yes |
| Deploy 1289 | 132 changed | 5.3 h | 16.3 min | 2 | +31 ms | yes |
| Deploy 1290 | 136 changed | 5.6 h | 15.2 min | 3 | +44 ms | yes |
| Deploy 1291 | 44 changed | 2.3 h | 8.3 min | 1 | -14 ms | yes |
| Deploy 1292 | 113 changed | 3 h | 14 min | 2 | +27 ms | yes |
| Deploy 1293 | 9 changed | 1.9 h | 1.5 min | 1 | -25 ms | yes |
| Deploy 1294 | 13 changed | 1.2 h | 3 min | 1 | -15 ms | yes |
| Deploy 1295 | 8 changed | 1.1 h | 5.8 min | 1 | -3 ms | yes |
Drag down an axis to filter on it, drag a column name to move it, or use the arrow keys on either. Filtering the bottom of the p95 axis leaves the deploys that made latency worse, and they bunch towards the top of the files axis. p95 is inverted so that better is up on all five.
Radial Bar Chart
Bars wrapped around a hub, with the distortion exposed as a dial.
Sessions by browser
Docs site, last 30 days, share of sessions
58.4%
Chrome takes 58.4 percent of sessions, Safari 19.2, and no other browser reaches 10. Each row sits on its own ring, so the outermost row is drawn about 2.67 times longer than the innermost for the same value. Use the arrow keys to move between rows and Escape to dismiss the reading. The full data follows as a table.
| Row | Value | Rank |
|---|---|---|
| Chrome | 58.4% | 1 |
| Safari | 19.2% | 2 |
| Edge | 9.6% | 3 |
| Firefox | 7.1% | 4 |
| Arc | 3.4% | 5 |
| Other | 2.3% | 6 |
At this hub size the outer ring draws the same value 2.67x longer than the inner one. Widening the hub shrinks that; taking the sweep to a full turn removes the gap that the scale is read against. If the rows need to be compared precisely, use a bar chart.
Matrix Chart
Category by category with a sized mark, where an empty cell reads as one.
How the field metrics move together
Pearson r across 41,200 real user sessions
FCP and TTFB move together most closely at 0.81, INP tracks JavaScript bytes at 0.68, and layout shift is close to independent of everything except JavaScript bytes. Marks are scaled by area, and a crossing with no mark means: Mirror of the cell across the diagonal. Use the arrow keys to move around the grid and Escape to dismiss the reading. The full data follows as a table.
| Row | LCP | FCP | TTFB | CLS | INP | JS bytes |
|---|---|---|---|---|---|---|
| LCP | 1.00 | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal |
| FCP | 0.78 | 1.00 | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal |
| TTFB | 0.62 | 0.81 | 1.00 | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal |
| CLS | 0.11 | -0.13 | -0.22 | 1.00 | Mirror of the cell across the diagonal | Mirror of the cell across the diagonal |
| INP | 0.34 | 0.22 | 0.17 | 0.29 | 1.00 | Mirror of the cell across the diagonal |
| JS bytes | 0.55 | 0.37 | 0.09 | 0.41 | 0.68 | 1.00 |
Size is the strength, colour is the direction, so nothing rests on hue alone. The names sit on the diagonal because that is the one run of cells with nothing to say: every metric correlates perfectly with itself, and a name there is in its own row and its own column, so any mark can be traced to both. The lower half is the whole matrix: a correlation matrix is symmetric, so this is everything the data has to say.
CI matrix, with the gaps
Mark size is the median job time in minutes
Ubuntu runs all four Node versions, macOS drops 18, Windows runs only 22 and 24, and Alpine runs 22 alone. Windows jobs take roughly three times as long as Ubuntu. Marks are scaled by area, and a crossing with no mark means: Not in the build matrix. Use the arrow keys to move around the grid and Escape to dismiss the reading. The full data follows as a table.
| Row | Ubuntu | macOS | Windows | Alpine |
|---|---|---|---|---|
| Node 18 | 4.2 min | Not in the build matrix | Not in the build matrix | Not in the build matrix |
| Node 20 | 4.1 min | 6.9 min | Not in the build matrix | Not in the build matrix |
| Node 22 | 3.8 min | 6.4 min | 11.4 min | 5.2 min |
| Node 24 | 3.6 min | 6.1 min | 10.8 min | Not in the build matrix |
Six of the sixteen combinations are missing, and that is the interesting part. A heat map has to paint every cell, so it would show those six as the palest colour on the ramp, which reads as a fast job rather than as no job at all.
Small Multiples
A panel grid on one shared scale, computed before anything draws.
Signups by acquisition channel
26 weeks, one panel per channel, weekly totals
Organic search
1,601Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 1,120 signups |
| Mar | 1,232 signups |
| Mar | 1,261 signups |
| Mar | 1,166 signups |
| Mar | 1,130 signups |
| Apr | 1,160 signups |
| Apr | 1,339 signups |
| Apr | 1,295 signups |
| Apr | 1,283 signups |
| May | 1,235 signups |
| May | 1,336 signups |
| May | 1,392 signups |
| May | 1,393 signups |
| Jun | 1,476 signups |
| Jun | 1,500 signups |
| Jun | 1,453 signups |
| Jun | 1,292 signups |
| Jun | 1,466 signups |
| Jul | 1,386 signups |
| Jul | 1,330 signups |
| Jul | 1,528 signups |
| Jul | 1,573 signups |
| Aug | 1,501 signups |
| Aug | 1,418 signups |
| Aug | 1,436 signups |
| Aug | 1,601 signups |
Direct
865Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 668 signups |
| Mar | 754 signups |
| Mar | 621 signups |
| Mar | 724 signups |
| Mar | 786 signups |
| Apr | 757 signups |
| Apr | 703 signups |
| Apr | 632 signups |
| Apr | 680 signups |
| May | 677 signups |
| May | 645 signups |
| May | 788 signups |
| May | 760 signups |
| Jun | 797 signups |
| Jun | 756 signups |
| Jun | 803 signups |
| Jun | 800 signups |
| Jun | 729 signups |
| Jul | 777 signups |
| Jul | 759 signups |
| Jul | 756 signups |
| Jul | 778 signups |
| Aug | 840 signups |
| Aug | 765 signups |
| Aug | 865 signups |
| Aug | 860 signups |
Newsletter
397Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 257 signups |
| Mar | 257 signups |
| Mar | 202 signups |
| Mar | 264 signups |
| Mar | 273 signups |
| Apr | 260 signups |
| Apr | 269 signups |
| Apr | 255 signups |
| Apr | 305 signups |
| May | 259 signups |
| May | 255 signups |
| May | 243 signups |
| May | 326 signups |
| Jun | 329 signups |
| Jun | 273 signups |
| Jun | 265 signups |
| Jun | 341 signups |
| Jun | 326 signups |
| Jul | 337 signups |
| Jul | 334 signups |
| Jul | 344 signups |
| Jul | 311 signups |
| Aug | 336 signups |
| Aug | 340 signups |
| Aug | 397 signups |
| Aug | 326 signups |
Referral
348Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 348 signups |
| Mar | 301 signups |
| Mar | 253 signups |
| Mar | 265 signups |
| Mar | 323 signups |
| Apr | 261 signups |
| Apr | 332 signups |
| Apr | 288 signups |
| Apr | 305 signups |
| May | 335 signups |
| May | 215 signups |
| May | 326 signups |
| May | 320 signups |
| Jun | 258 signups |
| Jun | 219 signups |
| Jun | 206 signups |
| Jun | 207 signups |
| Jun | 215 signups |
| Jul | 278 signups |
| Jul | 239 signups |
| Jul | 259 signups |
| Jul | 271 signups |
| Aug | 202 signups |
| Aug | 252 signups |
| Aug | 276 signups |
| Aug | 204 signups |
Community
200Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 88 signups |
| Mar | 81 signups |
| Mar | 81 signups |
| Mar | 86 signups |
| Mar | 71 signups |
| Apr | 88 signups |
| Apr | 113 signups |
| Apr | 93 signups |
| Apr | 98 signups |
| May | 122 signups |
| May | 133 signups |
| May | 147 signups |
| May | 125 signups |
| Jun | 131 signups |
| Jun | 146 signups |
| Jun | 146 signups |
| Jun | 151 signups |
| Jun | 168 signups |
| Jul | 179 signups |
| Jul | 173 signups |
| Jul | 162 signups |
| Jul | 163 signups |
| Aug | 200 signups |
| Aug | 188 signups |
| Aug | 182 signups |
| Aug | 200 signups |
Paid social
123Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Signups |
|---|---|
| Mar | 118 signups |
| Mar | 123 signups |
| Mar | 99 signups |
| Mar | 119 signups |
| Mar | 69 signups |
| Apr | 68 signups |
| Apr | 79 signups |
| Apr | 88 signups |
| Apr | 92 signups |
| May | 76 signups |
| May | 57 signups |
| May | 78 signups |
| May | 89 signups |
| Jun | 79 signups |
| Jun | 58 signups |
| Jun | 107 signups |
| Jun | 93 signups |
| Jun | 83 signups |
| Jul | 23 signups |
| Jul | 45 signups |
| Jul | 18 signups |
| Jul | 56 signups |
| Aug | 36 signups |
| Aug | 53 signups |
| Aug | 55 signups |
| Aug | 0 signups |
On the shared scale, community and paid social are almost flat lines near the floor, which is the truth about their volume. Switch to free scales and all six panels fill their boxes and look like the same business.
Treemap
Squarified tiles, circle packing, or marimekko off one layout prop.
Cloud spend
August 2026, five groups, sixteen line items
$86,400
Compute is 35 percent of the bill and instances alone are 21 percent of it. Observability is the smallest group at 9 percent, and its logs line is bigger than every other observability item put together. Area is the value, and a group is drawn as an outline around its own parts rather than filled, so no quantity is painted twice. Use the arrow keys to move between tiles and Escape to dismiss the reading. The full breakdown follows as a table.
| Item | Group | Value | Share |
|---|---|---|---|
| Instances | compute | $18,420 | 21.3% |
| Containers | compute | $6,740 | 7.8% |
| Functions | compute | $4,180 | 4.8% |
| Batch | compute | $1,290 | 1.5% |
| Postgres | data | $11,750 | 13.6% |
| Warehouse | data | $7,300 | 8.4% |
| Cache | data | $2,640 | 3.1% |
| Object | storage | $9,260 | 10.7% |
| Block | storage | $3,410 | 3.9% |
| Archive | storage | $880 | 1% |
| Egress | network | $8,120 | 9.4% |
| CDN | network | $3,050 | 3.5% |
| NAT | network | $1,470 | 1.7% |
| Logs | obs | $4,930 | 5.7% |
| Metrics | obs | $1,820 | 2.1% |
| Traces | obs | $1,140 | 1.3% |
Tiles kept near square, which is the only way their areas can be compared by eye. Groups are outlines, never fills, so nothing is painted twice.
Sunburst Chart
A zoomable radial partition, one ring per level down the tree.
Source by directory
Thousands of lines, excluding lockfiles and generated code
Apps and packages are about a third of the source each, and the largest single directory is the web app's components at 296 thousand lines. Currently showing monorepo, 3 levels deep. Left and right arrows move between items at the same level, down opens an item, up goes back to its parent, Enter zooms into the selected item and Backspace zooms out. The full breakdown follows as a table.
| Item | Path | Value | Share of root |
|---|---|---|---|
| apps | top level | 1,087k | 45.2% |
| web | apps | 714k | 29.7% |
| components | apps / web | 296k | 12.3% |
| routes | apps / web | 184k | 7.7% |
| tests | apps / web | 143k | 5.9% |
| lib | apps / web | 91k | 3.8% |
| admin | apps | 236k | 9.8% |
| components | apps / admin | 112k | 4.7% |
| routes | apps / admin | 78k | 3.2% |
| tests | apps / admin | 46k | 1.9% |
| docs | apps | 137k | 5.7% |
| packages | top level | 653k | 27.2% |
| ui | packages | 416k | 17.3% |
| primitives | packages / ui | 208k | 8.6% |
| charts | packages / ui | 174k | 7.2% |
| tokens | packages / ui | 34k | 1.4% |
| core | packages | 156k | 6.5% |
| icons | packages | 62k | 2.6% |
| config | packages | 19k | 0.8% |
| services | top level | 541k | 22.5% |
| api | services | 376k | 15.6% |
| handlers | services / api | 167k | 6.9% |
| tests | services / api | 121k | 5% |
| db | services / api | 88k | 3.7% |
| worker | services | 94k | 3.9% |
| ingest | services | 71k | 3% |
| infra | top level | 124k | 5.2% |
| terraform | infra | 83k | 3.5% |
| ci | infra | 27k | 1.1% |
| docker | infra | 14k | 0.6% |
Take it to four rings and the outer one is a band of slivers nothing can be read off, which is what happens to every deep sunburst. Click a wedge instead: it becomes the whole turn, and the level you wanted is the level with the most room.
Dendrogram
Clustering joins or a plain tree diagram, with a cut line for groups.
Cities by temperature profile
Average linkage on twelve monthly means. Distance in degrees.
London and Paris are the closest pair at 1.4 degrees, Reykjavik is the last city to join anything, and cutting at 12 degrees leaves four groups. The position of each join along the axis is the distance at which those two branches merged, so branches that join further from the leaves are less alike. Left and right arrows move between siblings, down goes into a branch and up comes back out. The full tree follows as a table.
| Leaf | Path | Joins its sibling at |
|---|---|---|
| Singapore | warm / tropical / equator | 3.1 |
| Bangkok | warm / tropical / equator | 3.1 |
| Lagos | warm / tropical | 5.4 |
| Athens | warm / mediterranean / northmed | 2.6 |
| Madrid | warm / mediterranean / northmed | 2.6 |
| Cairo | warm / mediterranean | 6.2 |
| London | cool / continental / maritime / channel | 1.4 |
| Paris | cool / continental / maritime / channel | 1.4 |
| Berlin | cool / continental / maritime | 3.8 |
| Moscow | cool / continental | 11.7 |
| Reykjavik | cool | 15.9 |
Cutting the tree is how it turns into an answer: at 12 degrees it falls into 4 groups. How many clusters there are is a line across the chart, not a number you pick first.
Population Pyramid
Two bar charts back to back on one shared scale, the shape as the reading.
Population by age and sex
Thousands, five-year bands. Outline is the same region in 1996.
10.15m
The 1996 profile is a triangle with its widest band at 5 to 9. By 2026 the widest band is 50 to 54 and the base has narrowed by a third, so the shape has gone from a pyramid to a barrel. Both sides share one scale, so a bar twice as long is twice the number wherever it is. Youngest bands are at the bottom. Use the up and down arrow keys to move between age bands and Escape to dismiss the reading. The full table follows.
| Age band | Male | Female | Male, 1996 | Female, 1996 |
|---|---|---|---|---|
| 85+ | 74k | 128k | 21k | 44k |
| 80-84 | 112k | 152k | 44k | 71k |
| 75-79 | 178k | 216k | 78k | 108k |
| 70-74 | 241k | 271k | 112k | 140k |
| 65-69 | 292k | 312k | 145k | 168k |
| 60-64 | 330k | 344k | 172k | 186k |
| 55-59 | 358k | 366k | 198k | 206k |
| 50-54 | 371k | 373k | 231k | 234k |
| 45-49 | 366k | 364k | 268k | 266k |
| 40-44 | 352k | 348k | 296k | 291k |
| 35-39 | 344k | 337k | 322k | 313k |
| 30-34 | 331k | 322k | 349k | 337k |
| 25-29 | 318k | 306k | 358k | 344k |
| 20-24 | 302k | 289k | 345k | 330k |
| 15-19 | 285k | 271k | 330k | 314k |
| 10-14 | 271k | 258k | 338k | 322k |
| 5-9 | 258k | 245k | 351k | 334k |
| 0-4 | 240k | 228k | 342k | 326k |
The region grew from 8.63 million to 10.15 million over the thirty years, so on counts the outline sits inside the bars almost everywhere and the change in shape is hard to separate from the change in size.
Sankey Diagram
Flows at a width worth their value, with the crossings sorted out.
Where 3,200 support tickets went
September, by arrival channel and first handler
Tier 1 handled 1,710 of the 3,200 tickets and resolved 1,440 of them. 280 were abandoned before anyone answered. Up and down move between stages in the same column, right follows the largest flow onward, left follows it back, and Enter pins the highlighted path. Every flow follows as a table.
| Flow | From | To | Value | Share |
|---|---|---|---|---|
| Email to Bot reply | Bot reply | 300 | 9.4% | |
| Email to Tier 1 | Tier 1 | 700 | 21.9% | |
| Email to Tier 2 | Tier 2 | 240 | 7.5% | |
| Live chat to Bot reply | Live chat | Bot reply | 420 | 13.1% |
| Live chat to Tier 1 | Live chat | Tier 1 | 380 | 11.9% |
| Live chat to Tier 2 | Live chat | Tier 2 | 60 | 1.9% |
| Phone to Tier 1 | Phone | Tier 1 | 300 | 9.4% |
| Phone to Tier 2 | Phone | Tier 2 | 110 | 3.4% |
| In-app to Bot reply | In-app | Bot reply | 250 | 7.8% |
| In-app to Tier 1 | In-app | Tier 1 | 330 | 10.3% |
| In-app to Tier 2 | In-app | Tier 2 | 110 | 3.4% |
| Bot reply to Resolved | Bot reply | Resolved | 780 | 24.4% |
| Bot reply to Abandoned | Bot reply | Abandoned | 190 | 5.9% |
| Tier 1 to Resolved | Tier 1 | Resolved | 1440 | 45% |
| Tier 1 to Escalated | Tier 1 | Escalated | 180 | 5.6% |
| Tier 1 to Abandoned | Tier 1 | Abandoned | 90 | 2.8% |
| Tier 2 to Resolved | Tier 2 | Resolved | 430 | 13.4% |
| Tier 2 to Escalated | Tier 2 | Escalated | 90 | 2.8% |
Ordering the columns is the whole job. In the order the data was written the ribbons cross each other 21 times; seven barycentre sweeps get that to 14, and the sweeps are a fixed count on a discrete ordering, so the diagram lands identically on the server and in the browser.
Chord Diagram
One matrix as a circle of ribbons or a line of arcs, same geometry.
Who reviews whose code
Pull requests reviewed across six teams, one quarter
Platform reviewed 282 pull requests for other teams and had 153 reviewed for them. Web is the mirror of that, 156 reviewed against 203 received. Arrow keys move between groups, Enter pins the highlighted group and its bands, Escape clears it. Every pair follows as a table.
| Pair | One way | The other way | Total | Share |
|---|---|---|---|---|
| Web and Mobile | 18 | 14 | 32 | 3.7% |
| Web and Platform | 46 | 88 | 134 | 15.6% |
| Web and Data | 9 | 11 | 20 | 2.3% |
| Web and Design sys | 62 | 57 | 119 | 13.8% |
| Web and QA | 21 | 33 | 54 | 6.3% |
| Mobile and Platform | 39 | 71 | 110 | 12.8% |
| Mobile and Data | 6 | 5 | 11 | 1.3% |
| Mobile and Design sys | 44 | 38 | 82 | 9.5% |
| Mobile and QA | 17 | 26 | 43 | 5% |
| Platform and Data | 52 | 34 | 86 | 10% |
| Platform and Design sys | 31 | 12 | 43 | 5% |
| Platform and QA | 40 | 22 | 62 | 7.2% |
| Data and Design sys | 7 | 4 | 11 | 1.3% |
| Data and QA | 19 | 15 | 34 | 3.9% |
| Design sys and QA | 9 | 11 | 20 | 2.3% |
Both layouts are one set of numbers. Every group gets a run of space worth its total, that run is split one segment per partner, and a band joins the two segments of a pair. The circle wraps the run around; the arc lays it flat. The circle fits more groups in, the line keeps them in an order you chose.
Network Diagram
Clusters solved from the graph Laplacian, not settled by a simulation.
Service traffic at peak
Requests per second between eighteen services
The gateway carries the most traffic at 2,140 requests per second. The observability services form a cluster of their own, joined to the rest by four thin links. Arrow keys walk the nodes from the most connected to the least, Enter pins one and its links, Escape clears it. Nodes can be dragged. On a keyboard, Shift with an arrow key moves the selected node eight pixels, and Backspace returns it to where the layout put it. Every link follows as a table.
| Link | From | To | req/s |
|---|---|---|---|
| gateway to storefront | gateway | storefront | 900 |
| gateway to search | gateway | search | 640 |
| gateway to auth | gateway | auth | 520 |
| gateway to metrics | gateway | metrics | 80 |
| storefront to catalog | storefront | catalog | 480 |
| storefront to cart | storefront | cart | 310 |
| storefront to media | storefront | media | 260 |
| storefront to auth | storefront | auth | 200 |
| cart to checkout | cart | checkout | 190 |
| cart to inventory | cart | inventory | 120 |
| checkout to payments | checkout | payments | 170 |
| checkout to fraud | checkout | fraud | 150 |
| checkout to inventory | checkout | inventory | 110 |
| checkout to auth | checkout | auth | 130 |
| payments to fraud | payments | fraud | 90 |
| payments to logs | payments | logs | 60 |
| catalog to pricing | catalog | pricing | 300 |
| catalog to media | catalog | media | 240 |
| catalog to inventory | catalog | inventory | 210 |
| catalog to logs | catalog | logs | 40 |
| search to catalog | search | catalog | 420 |
| search to pricing | search | pricing | 160 |
| search to metrics | search | metrics | 50 |
| auth to sessions | auth | sessions | 480 |
| auth to profiles | auth | profiles | 260 |
| sessions to profiles | sessions | profiles | 140 |
| inventory to metrics | inventory | metrics | 35 |
| metrics to logs | metrics | logs | 300 |
| metrics to alerts | metrics | alerts | 220 |
| metrics to tracing | metrics | tracing | 140 |
| logs to tracing | logs | tracing | 180 |
| alerts to tracing | alerts | tracing | 90 |
Neither layout is a simulation. Clusters are the two eigenvectors of the normalised graph Laplacian just above the trivial one, which is the exact answer to the problem a spring layout approaches by shaking. Nobody told it about the four groups in the legend of your head; it separated them from the traffic numbers alone. Hops is a breadth-first tree with each subtree given a wedge worth its leaf count. Both land on the same pixels every run. Drag any node to pull it clear, or hold Shift and use the arrow keys: two services sitting on top of each other means the layout found their neighbourhoods near identical, and it is still you who has to read it. A moved node keeps a dashed outline and the link underneath puts everything back, so what the layout said is never lost. On hops, a node slides around its own ring and no further, because there the radius is the number of hops and dragging across rings would be editing the data rather than the view.
Flowchart
Shapes carry the meaning and no arrow can cross a box, by construction.
What happens to a push
Fourteen steps, three decisions, one way back
- start or end
- step
- decision
- defined elsewhere
- input or output
- 3 arrows routed outside the columns, which is what a jump or a retry looks like
A push builds, runs the suite, goes to staging and gets promoted. All three failure branches meet at the same place, and a first failure gets one retry. Down follows the flow, up goes back one step, left and right move between boxes at the same level, and Enter pins a box to highlight every route that reaches it. The steps and the arrows follow as a table.
| Step | Kind | Leads to |
|---|---|---|
| Push to main | start or end | Install and build |
| Install and build | step | Build green? |
| Build green? | decision | Run the suite (yes), Post the log (no) |
| Run the suite | step | Suite passes? |
| Suite passes? | decision | Deploy to staging (yes), Post the log (no) |
| Deploy to staging | step | Smoke test |
| Smoke test | defined elsewhere | Healthy? |
| Healthy? | decision | Promote to production (yes), Post the log (no) |
| Promote to production | step | Live |
| Live | start or end | nothing |
| Post the log | input or output | First failure? |
| First failure? | decision | Retry once (yes), Stopped (no) |
| Retry once | step | Install and build |
| Stopped | start or end | nothing |
Shape is the encoding: a stadium starts and ends, a diamond asks, a parallelogram moves something in or out, a barred box is defined somewhere else. Nothing here is carried by fill colour, so it survives a greyscale print. Arrows that need to travel further than the gap below them take a lane outside the columns, which is why none of them crosses a box.
Venn Diagram
A fixed Venn, or an Euler solved from set sizes with its error stated.
410 bugs, and what they touched
One quarter of front end issues, by area
Circle areas are the set sizes and every pair sits at the distance that makes their overlap the right size. Three circles cannot satisfy all seven regions at once, so what is left over lands on the middle: the worst region is off by 1.8% of the total.
219 bugs touched layout, 190 touched accessibility and 144 touched performance. 15 touched all three. Arrow keys move between combinations, largest first, and Escape clears the selection. Every combination follows as a table.
| Combination | Count | Share |
|---|---|---|
| Accessibility only | 96 | 23.4% |
| Performance only | 74 | 18% |
| Accessibility and Performance, in all of them | 21 | 5.1% |
| Layout only | 112 | 27.3% |
| Accessibility and Layout, in all of them | 58 | 14.1% |
| Performance and Layout, in all of them | 34 | 8.3% |
| Accessibility and Performance and Layout, in all of them | 15 | 3.7% |
Switch between the two and watch the accessibility and performance circles pull apart: only 36 of the 334 bugs in them are shared, and the Euler solve puts that on the page. The Venn shows the same seven numbers at seven fixed sizes, which is the right chart when the question is which combinations exist rather than how big they are.
Choropleth Map
A dotted map painted by value: equal, quantile, or natural break classes.
Support tickets by state
One quarter, raw count
5 classes by natural breaks, tickets. Fit 96.1%.
California raised 4,820 tickets and Wyoming raised 70, so the map is mostly a map of where the seats are. Arrow keys walk the areas from the largest value to the smallest and then through the ones with no data. Escape clears the selection. The class buttons below the map isolate one class at a time. Every area follows as a table.
| Area | tickets | Rank | Class |
|---|---|---|---|
| California | 4820 | 1 | 4820 |
| Texas | 3610 | 2 | 2510 to 4820 |
| Florida | 2740 | 3 | 2510 to 4820 |
| New York | 2510 | 4 | 2510 to 4820 |
| Pennsylvania | 1640 | 5 | 1120 to 2510 |
| Illinois | 1580 | 6 | 1120 to 2510 |
| Ohio | 1520 | 7 | 1120 to 2510 |
| Georgia | 1310 | 8 | 1120 to 2510 |
| North Carolina | 1290 | 9 | 1120 to 2510 |
| Michigan | 1240 | 10 | 1120 to 2510 |
| New Jersey | 1120 | 11 | 1120 to 2510 |
| Virginia | 1040 | 12 | 520 to 1120 |
| Washington | 940 | 13 | 520 to 1120 |
| Arizona | 920 | 14 | 520 to 1120 |
| Massachusetts | 880 | 15 | 520 to 1120 |
| Tennessee | 860 | 16 | 520 to 1120 |
| Indiana | 840 | 17 | 520 to 1120 |
| Maryland | 720 | 18 | 520 to 1120 |
| Missouri | 715 | 19 | 520 to 1120 |
| Wisconsin | 700 | 20 | 520 to 1120 |
| Colorado | 690 | 21 | 520 to 1120 |
| Minnesota | 680 | 22 | 520 to 1120 |
| South Carolina | 640 | 23 | 520 to 1120 |
| Alabama | 610 | 24 | 520 to 1120 |
| Louisiana | 550 | 25 | 520 to 1120 |
| Kentucky | 540 | 26 | 520 to 1120 |
| Oregon | 520 | 27 | 520 to 1120 |
| Oklahoma | 470 | 28 | 70 to 520 |
| Connecticut | 430 | 29 | 70 to 520 |
| Utah | 400 | 30 | 70 to 520 |
| Iowa | 380 | 31 | 70 to 520 |
| Nevada | 370 | 32 | 70 to 520 |
| Arkansas | 360 | 33 | 70 to 520 |
| Kansas | 350 | 34 | 70 to 520 |
| Mississippi | 340 | 35 | 70 to 520 |
| New Mexico | 255 | 36 | 70 to 520 |
| Nebraska | 250 | 37 | 70 to 520 |
| West Virginia | 220 | 38 | 70 to 520 |
| Idaho | 215 | 39 | 70 to 520 |
| New Hampshire | 175 | 40 | 70 to 520 |
| Maine | 170 | 41 | 70 to 520 |
| Rhode Island | 130 | 42 | 70 to 520 |
| Montana | 128 | 43 | 70 to 520 |
| Delaware | 120 | 44 | 70 to 520 |
| South Dakota | 110 | 45 | 70 to 520 |
| North Dakota | 90 | 46 | 70 to 520 |
| Vermont | 80 | 47 | 70 to 520 |
| Wyoming | 70 | 48 | 70 to 520 |
The three methods fit this column equal interval 92.7%, quantile 67.4% and natural breaks 96.1%, a spread of 28.6 points, and the worst of them puts 36 of the 48 states in one class. That is what a skewed column does to a classification: equal intervals put most of the map in the palest shade, and quantiles score worst of all because ranking throws away the distance between the middle and the top. The measure is the larger decision either way. Texas is 1,187 dots and Rhode Island is 3, so a count drawn by area gives the first 396 times the ink whatever the number says, and no palette fixes that.
Hex Bin Plot
Bins raw x and y pairs into hexagons itself, where heat-map takes a matrix.
Response time against payload
2,400 API requests over one hour
Two populations: cache hits sit flat along the bottom whatever the payload, and misses climb with it. Arrow keys walk the cells from the densest to the emptiest, Escape clears the selection. Every cell follows as a table.
| Cell | payload KB | ms | Points |
|---|---|---|---|
| 1 | 6.6 | 15 | 516 |
| 2 | 9.7 | 16 | 385 |
| 3 | 4.6 | 15 | 230 |
| 4 | 13 | 16 | 215 |
| 5 | 16 | 17 | 118 |
| 6 | 25 | 93 | 71 |
| 7 | 28 | 94 | 64 |
| 8 | 23 | 85 | 48 |
| 9 | 32 | 103 | 47 |
| 10 | 35 | 103 | 43 |
| 11 | 21 | 85 | 41 |
| 12 | 18 | 18 | 41 |
| 13 | 22 | 92 | 38 |
| 14 | 29 | 101 | 36 |
| 15 | 40 | 112 | 34 |
| 16 | 37 | 111 | 32 |
| 17 | 30 | 94 | 31 |
| 18 | 38 | 105 | 27 |
| 19 | 42 | 113 | 26 |
| 20 | 5.1 | 12 | 24 |
| 21 | 44 | 121 | 23 |
| 22 | 47 | 121 | 23 |
| 23 | 26 | 86 | 22 |
| 24 | 34 | 111 | 21 |
| 25 | 8.1 | 12 | 21 |
| 26 | 33 | 95 | 18 |
| 27 | 27 | 100 | 17 |
| 28 | 45 | 113 | 16 |
| 29 | 54 | 130 | 13 |
| 30 | 41 | 119 | 13 |
| 31 | 50 | 122 | 13 |
| 32 | 52 | 131 | 10 |
| 33 | 57 | 132 | 8 |
| 34 | 48 | 115 | 8 |
| 35 | 49 | 129 | 7 |
| 36 | 38 | 119 | 7 |
| 37 | 24 | 100 | 7 |
| 38 | 41 | 105 | 7 |
| 39 | 22 | 18 | 7 |
| 40 | 31 | 110 | 6 |
| 41 | 56 | 138 | 5 |
| 42 | 60 | 141 | 5 |
| 43 | 62 | 143 | 5 |
| 44 | 52 | 123 | 5 |
| 45 | 28 | 87 | 5 |
| 46 | 64 | 147 | 3 |
| 47 | 54 | 139 | 3 |
| 48 | 46 | 127 | 3 |
| 49 | 36 | 96 | 3 |
| 50 | 22 | 77 | 3 |
| 51 | 69 | 156 | 2 |
| 52 | 66 | 153 | 2 |
| 53 | 69 | 150 | 2 |
| 54 | 60 | 133 | 2 |
| 55 | 35 | 121 | 2 |
| 56 | 59 | 126 | 2 |
| 57 | 45 | 106 | 2 |
| 58 | 20 | 91 | 2 |
| 59 | 12 | 12 | 2 |
| 60 | 81 | 173 | 1 |
| 61 | 74 | 164 | 1 |
| 62 | 72 | 151 | 1 |
| 63 | 55 | 126 | 1 |
| 64 | 39 | 97 | 1 |
| 65 | 20 | 77 | 1 |
| 66 | 24 | 79 | 1 |
| 67 | 17 | 12 | 1 |
Around a dozen pixels the two populations separate: a flat cache-hit cloud along the bottom, and a miss population climbing with the payload. This is not the hex shape in the heat map: that one is handed a matrix someone else has already bucketed, and this one is handed 2,400 raw pairs and works out the cells itself. Bin size is the only parameter and it is the whole argument.
Contour Plot
Marching squares over a kernel estimate: rings labelled by share enclosed.
How far people got
3,000 visits to one article, scroll depth against time
Two populations: a bounce cluster in the first seconds at almost no depth, and a read-through cluster near the end of the article after three minutes. Arrow keys move between contour levels from the outside in, Escape clears the selection. Every level follows as a table.
| Contour | Rings | Density |
|---|---|---|
| 90% | 3 | 360 |
| 75% | 2 | 1,333 |
| 50% | 2 | 2,345 |
| 25% | 1 | 5,859 |
Each ring is labelled with the share of visits inside it, solved from the observations rather than from the estimate's own mass. A ring holding half the smoothed density holds about two thirds of the points, so labelling that one 50% would be a false statement about the data. Smoothing is the other decision: tighten it and the sparse middle breaks into islands, loosen it and the two populations merge into one.
OHLC Chart
Candlestick, OHLC bar and barcode off one series, where hollow means up.
Spot price per GPU hour
Sixty sessions, open, high, low and close (synthetic)
A run up through the first month, a break of about a third in the second, and a recovery on much wider daily ranges. Interactive chart. Use the left and right arrow keys to move between data points, Escape to dismiss the reading. The full data follows as a table.
| Point | Open | High | Low | Close | Volume | Move |
|---|---|---|---|---|---|---|
| 1 Jun | $2.42 | $2.43 | $2.37 | $2.40 | $4006.00 | -0.02 |
| 2 Jun | $2.40 | $2.42 | $2.35 | $2.37 | $4670.00 | -0.03 |
| 3 Jun | $2.37 | $2.39 | $2.27 | $2.30 | $6885.00 | -0.07 |
| 4 Jun | $2.30 | $2.36 | $2.27 | $2.36 | $5733.00 | +0.06 |
| 5 Jun | $2.36 | $2.38 | $2.34 | $2.35 | $4446.00 | -0.01 |
| 8 Jun | $2.35 | $2.37 | $2.31 | $2.32 | $4817.00 | -0.03 |
| 9 Jun | $2.32 | $2.35 | $2.27 | $2.28 | $2612.00 | -0.04 |
| 10 Jun | $2.28 | $2.30 | $2.18 | $2.22 | $6108.00 | -0.06 |
| 11 Jun | $2.22 | $2.26 | $2.22 | $2.23 | $4408.00 | +0.01 |
| 12 Jun | $2.23 | $2.34 | $2.23 | $2.34 | $6845.00 | +0.11 |
| 15 Jun | $2.34 | $2.39 | $2.29 | $2.30 | $4229.00 | -0.04 |
| 16 Jun | $2.30 | $2.36 | $2.26 | $2.26 | $1890.00 | -0.04 |
| 17 Jun | $2.26 | $2.33 | $2.21 | $2.30 | $2391.00 | +0.04 |
| 18 Jun | $2.30 | $2.42 | $2.26 | $2.37 | $2472.00 | +0.07 |
| 19 Jun | $2.37 | $2.38 | $2.29 | $2.34 | $2121.00 | -0.03 |
| 22 Jun | $2.34 | $2.35 | $2.26 | $2.27 | $5282.00 | -0.07 |
| 23 Jun | $2.27 | $2.29 | $2.23 | $2.24 | $3861.00 | -0.03 |
| 24 Jun | $2.24 | $2.25 | $2.14 | $2.18 | $6654.00 | -0.06 |
| 25 Jun | $2.18 | $2.30 | $2.14 | $2.26 | $4874.00 | +0.08 |
| 26 Jun | $2.26 | $2.30 | $2.13 | $2.19 | $5284.00 | -0.07 |
| 29 Jun | $2.19 | $2.33 | $2.17 | $2.30 | $4447.00 | +0.11 |
| 30 Jun | $2.30 | $2.39 | $2.28 | $2.38 | $3691.00 | +0.08 |
| 1 Jul | $2.38 | $2.40 | $2.36 | $2.37 | $1833.00 | -0.01 |
| 2 Jul | $2.37 | $2.40 | $2.31 | $2.35 | $6485.00 | -0.02 |
| 3 Jul | $2.35 | $2.38 | $2.17 | $2.17 | $6459.00 | -0.18 |
| 6 Jul | $2.17 | $2.18 | $2.00 | $2.00 | $5534.00 | -0.17 |
| 7 Jul | $2.00 | $2.02 | $1.89 | $1.92 | $3558.00 | -0.08 |
| 8 Jul | $1.92 | $1.95 | $1.88 | $1.88 | $3856.00 | -0.04 |
| 9 Jul | $1.88 | $1.91 | $1.80 | $1.84 | $3246.00 | -0.04 |
| 10 Jul | $1.84 | $1.92 | $1.64 | $1.67 | $2473.00 | -0.17 |
| 13 Jul | $1.67 | $1.70 | $1.52 | $1.55 | $2051.00 | -0.12 |
| 14 Jul | $1.55 | $1.57 | $1.37 | $1.44 | $2184.00 | -0.11 |
| 15 Jul | $1.44 | $1.47 | $1.36 | $1.41 | $3758.00 | -0.03 |
| 16 Jul | $1.41 | $1.44 | $1.39 | $1.40 | $2851.00 | -0.01 |
| 17 Jul | $1.40 | $1.40 | $1.36 | $1.38 | $4644.00 | -0.02 |
| 20 Jul | $1.38 | $1.42 | $1.33 | $1.34 | $2705.00 | -0.04 |
| 21 Jul | $1.34 | $1.41 | $1.26 | $1.33 | $4385.00 | -0.01 |
| 22 Jul | $1.33 | $1.37 | $1.33 | $1.36 | $1871.00 | +0.03 |
| 23 Jul | $1.36 | $1.39 | $1.35 | $1.37 | $4757.00 | +0.01 |
| 24 Jul | $1.37 | $1.38 | $1.30 | $1.34 | $6754.00 | -0.03 |
| 27 Jul | $1.34 | $1.42 | $1.33 | $1.40 | $5684.00 | +0.06 |
| 28 Jul | $1.40 | $1.45 | $1.39 | $1.45 | $2120.00 | +0.05 |
| 29 Jul | $1.45 | $1.51 | $1.42 | $1.50 | $4037.00 | +0.05 |
| 30 Jul | $1.50 | $1.50 | $1.44 | $1.46 | $4232.00 | -0.04 |
| 31 Jul | $1.46 | $1.49 | $1.44 | $1.47 | $5519.00 | +0.01 |
| 3 Aug | $1.47 | $1.53 | $1.45 | $1.52 | $3429.00 | +0.05 |
| 4 Aug | $1.52 | $1.60 | $1.50 | $1.59 | $6120.00 | +0.07 |
| 5 Aug | $1.59 | $1.62 | $1.53 | $1.54 | $6303.00 | -0.05 |
| 6 Aug | $1.54 | $1.58 | $1.53 | $1.58 | $5518.00 | +0.04 |
| 7 Aug | $1.58 | $1.60 | $1.56 | $1.58 | $3138.00 | +0 |
| 10 Aug | $1.58 | $1.65 | $1.56 | $1.65 | $3831.00 | +0.07 |
| 11 Aug | $1.65 | $1.66 | $1.61 | $1.63 | $2214.00 | -0.02 |
| 12 Aug | $1.63 | $1.76 | $1.61 | $1.73 | $5261.00 | +0.1 |
| 13 Aug | $1.73 | $1.75 | $1.69 | $1.72 | $5269.00 | -0.01 |
| 14 Aug | $1.72 | $1.79 | $1.71 | $1.79 | $2383.00 | +0.07 |
| 17 Aug | $1.79 | $1.86 | $1.77 | $1.85 | $4383.00 | +0.06 |
| 18 Aug | $1.85 | $1.94 | $1.83 | $1.90 | $3411.00 | +0.05 |
| 19 Aug | $1.90 | $1.96 | $1.89 | $1.95 | $6196.00 | +0.05 |
| 20 Aug | $1.95 | $1.98 | $1.87 | $1.93 | $6601.00 | -0.02 |
| 21 Aug | $1.93 | $2.01 | $1.90 | $2.01 | $3589.00 | +0.08 |
25 of 60 sessions closed up. A hollow body is a rise and a filled one is a fall, so the direction survives without colour.
The same four numbers, three marks. The candle is the readable one and needs the most room; the OHLC bar keeps the open and survives being three pixels wide; the barcode drops the open and is what is left at hundreds of sessions. The first two keep the direction off colour entirely, hollow on a rise and filled on a fall. The barcode cannot, and says so.
Gantt Chart
Dates computed from dependencies, with the critical path and the float drawn.
Shipping one release
Twelve tasks, dependencies, and the path that sets the date
Twenty eight days end to end. 8 of the twelve tasks are on the critical path; the docs have 13 days of float. The critical path is Spec the API, then Design pass, then Build the UI, then Test suite, then Fix what they find, then Release notes, then Package and sign, then Ship it. Arrow keys move between tasks and Escape clears the selection. Every task follows as a table.
| Task | Starts | Ends | Days | Float | Waits for |
|---|---|---|---|---|---|
| Spec the API | day 0 | day 3 | 3 | none, critical | nothing |
| Design pass | day 3 | day 8 | 5 | none, critical | Spec the API |
| Server routes | day 3 | day 7 | 4 | 1 | Spec the API |
| Build the UI | day 8 | day 16 | 8 | none, critical | Design pass, Server routes |
| Write the docs | day 8 | day 12 | 4 | 13 | Design pass |
| Test suite | day 16 | day 21 | 5 | none, critical | Build the UI |
| Accessibility audit | day 16 | day 19 | 3 | 2 | Build the UI |
| Performance pass | day 16 | day 19 | 3 | 2 | Build the UI |
| Fix what they find | day 21 | day 25 | 4 | none, critical | Test suite, Accessibility audit, Performance pass |
| Release notes | day 25 | day 27 | 2 | none, critical | Write the docs, Fix what they find |
| Package and sign | day 25 | day 27 | 2 | none, critical | Fix what they find |
| Ship it | day 27 | day 28 | 1 | none, critical | Release notes, Package and sign |
Nothing here was placed by hand: every date comes from a duration and a list of what a task waits for. 28 days end to end, and 4 of the twelve tasks could slip without moving that, one of them by 13 days. Turn the float off and the plan looks like twelve equally urgent bars, which is how most Gantt charts are drawn and the reason they are not much use. This is also the difference from the resource scheduler, where blocks are dragged to where a person decides they go.
Word Cloud
Spiral packing with the ink proportional to the count, not the type size.
What this library talks about
Every word in its own 185 component descriptions
Real is the most common word at 18 uses, then card at 16 and live at 12. A cloud cannot be read off, so the ranked list is the chart. Arrow keys walk the words from the most common to the least and Escape clears the selection. Every word follows as a table.
| Word | uses | Rank | Share |
|---|---|---|---|
| real | 18 | 1 | 8.2% |
| card | 16 | 2 | 7.3% |
| live | 12 | 3 | 5.5% |
| panel | 10 | 4 | 4.5% |
| button | 9 | 5 | 4.1% |
| icon | 9 | 6 | 4.1% |
| bars | 7 | 7 | 3.2% |
| bar | 6 | 8 | 2.7% |
| dot | 6 | 9 | 2.7% |
| drag | 5 | 10 | 2.3% |
| focus | 5 | 11 | 2.3% |
| full | 5 | 12 | 2.3% |
| gradient | 5 | 13 | 2.3% |
| hover | 5 | 14 | 2.3% |
| preview | 5 | 15 | 2.3% |
| sliding | 5 | 16 | 2.3% |
| table | 5 | 17 | 2.3% |
| value | 5 | 18 | 2.3% |
| axis | 4 | 19 | 1.8% |
| behind | 4 | 20 | 1.8% |
| cursor | 4 | 21 | 1.8% |
| field | 4 | 22 | 1.8% |
| glow | 4 | 23 | 1.8% |
| grid | 4 | 24 | 1.8% |
| highlight | 4 | 25 | 1.8% |
| input | 4 | 26 | 1.8% |
| page | 4 | 27 | 1.8% |
| picker | 4 | 28 | 1.8% |
| radial | 4 | 29 | 1.8% |
| rows | 4 | 30 | 1.8% |
| scroll | 4 | 31 | 1.8% |
| spring-in | 4 | 32 | 1.8% |
| status | 4 | 33 | 1.8% |
| tooltip | 4 | 34 | 1.8% |
| actions | 3 | 35 | 1.4% |
| arcs | 3 | 36 | 1.4% |
| avatar | 3 | 37 | 1.4% |
| built | 3 | 38 | 1.4% |
| cards | 3 | 39 | 1.4% |
| cell | 3 | 40 | 1.4% |
Ink tracks the count here, which means a long word is set smaller than a short one of the same frequency. It looks wrong and it is the honest version: what the eye measures is the patch of dark, not the height of the letters. Even at its best this chart cannot be read off, which is why the ranked table is under it and why the tooltip gives the number. It is here because people ask for it.
Gauge Chart
A reading against a scale, as a filled arc or a settling needle.
Net promoter score
Against a scale with named bands, not a percentage complete
The score sits in the ahead-of-target band. 74 on a scale from 0 to 100, in the Ahead of target band, against a target of 65.
Mini Chart
One series as bars, a line, or a radial ring, crossfading between.
Region Map
A dotted Equal Earth world map with markers, arcs, and live daylight.
Global footprint
Click a region to drill in
01
Builders
124,890
02
Apps shipped
48,217
03
Tokens (7d)
2.18B
04
p50 latency
42ms
05
Uptime (90d)
99.99%
Globe Map
A draggable orthographic globe with great-circle arcs and inertia.
Edge network
Drag to spin, live daylight
US State Map
A dotted Albers map of the lower 48, every dot tagged with its state.
Accounts by state
Click a state to drill in
Heat Map
A density grid as hexes, squares, or dots across eight colour ramps.
Foot traffic
Market St grid, last 24h
32,134
all cells
Commit Graph
A contribution heatmap paged by two-week sprints, drillable to the day.
Commit activity
9165 commits in sprints 22 to 26
Open a sprint for its own heat map