Paste this into your page. Change the last path segment to pick a category.
<iframe src="https://stacktab.thecompound.tech/embed/hosting"
title="Hosting costs, StackTab"
loading="lazy" width="100%" height="600"
style="border:1px solid #e2e2e4;border-radius:6px"></iframe>loading="lazy" keeps the widget off the critical path, so a reader who never scrolls to it never fetches it.
height is fixed because an iframe cannot size itself. The measured heights are in the table below. Give it less and it scrolls inside its own frame.
Add /light or /dark to the end of the path to pin the palette. With neither, the widget follows the reader’s own system setting, which will not match a page that ignores that setting.
This is the live widget, at 600 pixels, which is about the width of a blog column. Below 560 pixels it drops the two scale columns you are not looking at and keeps the one you are.
Rendered from /embed/hosting/dark, pinned to match this page. The figures move when a vendor’s pricing page moves, on this page and on yours at the same time.
The path is /embed/<category>, then up to two options in any order: a user count, and light or dark. With no theme segment the widget follows the reader’s own system setting.
| Categories | database, auth, payments, hosting |
|---|---|
| User count | Any whole number. It defaults to 10,000. A count that is not 1,000, 10,000 or 100,000 gets a column of its own in front of the three. |
| Height | Measured 2026-09-20 in containers of 420, 600 and 1400 pixels. Hosting, auth and payments need 600. Database has one more service and needs 680. A user count outside the three tiers adds a column, and up to 30 pixels in a narrow container. |
| Theme | light, dark, or nothing. |
| Examples | /embed/payments/embed/auth/1000/embed/database/25000/light |
The options are path segments rather than query parameters because this site refuses a document request carrying two or more query parameters, and an iframe load is a document request. A path cannot trip that.
The widget is one HTML document with its stylesheet inline. It loads no script, no web font, no image and no second request. Its table stops growing at 860 pixels, so a full width frame centres it rather than stretching it. Measured over the wire with brotli on 2026-09-20:
| This widget | 1,735 bytes, in one request. 6,413 bytes before compression. |
|---|---|
| /calculator/hosting | 341,366 bytes, across 28 requests, on the same measurement. |
The calculator page carries the React runtime, two web fonts and every usage field. The widget carries a table, so it does not need any of that.
It does not run JavaScript, set a cookie, or measure the reader. The preset links are links, and clicking one navigates the iframe.
It does not ship a frozen copy of the rates. Every load reads the same catalogue the calculator reads, so a widget on a page written a year ago prints today’s figures and today’s read date.
It does not take the usage fields. Paying share, egress, seats and the rest stay on the full calculator, and the widget states its assumptions under “What 10,000 users assumes”.