cputools
File, document, media & data tools — one HTTPS call, sub-cent, no server to run.
ffmpeg, pandoc, qpdf, tesseract, DuckDB and more — wrapped behind a pay-per-call API. No instance to provision, no engine to package, no idle cost. Pay only for the calls you make, or pay with a wallet (x402) and never create an account.
Build vs. buy: the math
The real question isn’t “is per-call cheap” — it’s “cheaper than running it myself, all-in?” Here’s the model. Run your own numbers; we’ll tell you when you should self-host.
What running it yourself costs / month
- Instance — an always-on box sized for your peak, idle 24/7 (~$20–60/mo modest; more for LibreOffice/ffmpeg memory).
- Engine packaging + maintenance — wrapping ffmpeg/pandoc/qpdf/tesseract/DuckDB is real work: dependency hell, the Lambda 250 MB limit, version bumps, CVE patching.
- Scaling + reliability — spikes, cold starts, retries, the ops pager.
What we cost
price_per_MB × MB_processed, ~$0.0002/MB at launch (min 1 MiB/op),
$0 when idle, zero maintenance — we own the engine packaging,
patching, and scaling.
monthly_us = price_per_MB × total_MB_per_month (+ $0 idle, + $0 maintenance)
monthly_diy = instance_$/mo + (maintenance_hrs × $/hr) + amortized_setup_$
self-host wins only when monthly_diy < monthly_us Worked example (illustrative): 10,000 document conversions/mo at min-1 MiB ≈ $2/mo with us, vs a ~$30/mo idle VM + a couple maintenance hours — we win by ~20×, before counting the eng-hours to package LibreOffice. At low or spiky volume we win decisively (you pay nothing between bursts; they pay for an idle box).
When you SHOULD run your own
At sustained high throughput, the per-MB adds up and a dedicated, fully-utilized instance can be cheaper per unit. If you’re pushing large, steady volume every day, model the crossover with the formula above — and if self-host wins, run it. (We also offer scratch-tier reuse + chained ops to cut per-call MB.) We’d rather you do the math than oversell.
The open source we stand on
cputools is a thin, paid convenience layer over open-source engines built by others. We disclose every engine, link its project, and credit its license — transparency is the point. If an engine’s license requires attribution, this page is it. (This table is generated from the worker’s real dependency surface — not hand-written.)
Vendored in the worker
| Engine | Version | What it powers | Project | License |
|---|---|---|---|---|
| ffmpeg | 7.0.2 | audio/video transcode, trim, loudnorm, subtitles, overlay, concat, frames, probe | ffmpeg.org | LGPL-2.1-or-later / GPL-2.0-or-later (build-dependent) |
| pandoc | 3.10 | document conversion (markdown/HTML/docx/odt/rtf/epub/LaTeX), citations | pandoc.org | GPL-2.0-or-later |
| qpdf | 10.6.3 (libqpdf 28.6.3) | PDF encrypt, compress/linearize, repair | qpdf.sourceforge.io | Apache-2.0 |
| poppler (pdftoppm) | libpoppler 123 | PDF → PNG/JPEG page render | poppler.freedesktop.org | GPL-2.0-or-later |
| tesseract | 4.1.1 (libtesseract 4.0.1, eng) | OCR — scanned PDF/image → text | github.com/tesseract-ocr/tesseract | Apache-2.0 |
| DuckDB | vendored CLI | SQL over files (data ops) | duckdb.org | MIT |
npm libraries (versions read live from the build)
| Library | Version | What it powers | Project | License |
|---|---|---|---|---|
| sharp | 0.33.5 | image convert/resize/crop/grayscale/trim, HTML→image, OG cards | sharp.pixelplumbing.com | Apache-2.0 |
| pdf-lib | 1.17.1 | PDF merge/split/pages/rotate/watermark/metadata | pdf-lib.js.org | MIT |
| qrcode | 1.5.4 | QR code generation | github.com/soldair/node-qrcode | MIT |
| bwip-js | 4.11.1 | barcode generation | github.com/metafloor/bwip-js | MIT |
| exceljs | 4.4.0 | Excel read/write (xlsx I/O) | github.com/exceljs/exceljs | MIT |
| diff | 9.0.0 | text diff / patch / merge | github.com/kpdecker/jsdiff | BSD-3-Clause |
Upstream services (not vendored)
Office → PDF, legacy/exotic Office rescue (PDF-output-only) — Reached via the self-hosted Gotenberg HTTP upstream — not a binary vendored in our worker (Brief 188 / D216).
We didn’t write ffmpeg or pandoc — we packaged them, kept them patched, and put a pay-per-call wire in front so you don’t have to.
The tools, by what you need to do
Each job is one consolidated call (one call, many formats). Follow a link for the full list and the live per-op price on the working catalog.
Quickstart
Two ways in, same surface. Inputs are {inline: base64} (≤4 MB)
or {inputKey} from an upload-url (≤50 MB); every op returns the
uniform output envelope. Exact per-op prices live on the
API reference and
/v1/catalog.
curl -X POST https://api.relaystation.ai/v1/pdf/merge \
-H 'X-Payment: <base64 x402 authorization>' \
-H 'Idempotency-Key: <unique>' \
-H 'Content-Type: application/json' \
-d '{"inputs":[{"inline":"<base64 pdf>"},{"inline":"<base64 pdf>"}]}' curl -X POST https://api.relaystation.ai/v1/pdf/merge \
-H 'Authorization: Bearer rs_live_…' \
-H 'Idempotency-Key: <unique>' \
-H 'Content-Type: application/json' \
-d '{"inputs":[…]}'