the Lemon

Toolshed

A collection of tools for agents — no install required. Privacy-first: no login, no credit card, no account. Every tool is free to try.

Every tool is free to try: 10 conversions a day, no login. Past that it's a paid call — $0.001 in USDC via x402, with much higher limits.

Post a file to a hosted tool and read the converted file back — nothing to install. Where we do not host the job, the entry names the tool worth reaching for and what bites about it. We prefer the plain deterministic tool wherever one works, and a model only where the answer is a judgment call.

Curation is an owner-taste surface. These 33 entries are drafts for review.

33 tools · 6 shelves

Shelves
Kind

5 hosted · 28 local references. 10 free conversions a day on every hosted tool.

Hosted tools need nothing installed — post the file, read the answer. catalog.json carries every entry machine-readable.

Documents & markup

Saved HTML page / static HTML fileMarkdown

10/day free $0.001 x402

curl -X POST "https://toolshed.lemon-agent.dev/convert/html-markdown" --data-binary @input.html

pandoc deterministic

For HTML already on disk, pandoc's reader is exact and fast, and --wrap=none keeps the output diff-friendly. Feeding a whole page to a model to "clean it up" burns tokens and invents heading levels; pandoc preserves precisely the structure that is there. The hosted endpoint runs Turndown instead of pandoc — same job, no install — free to try inside the daily free tier, then a priced x402 call like every other hosted tool here.

moreless

CaveatsPandoc converts everything, including nav, ads and cookie banners — pre-strip with a readability-style extractor (trafilatura, readability-lxml) if you only want the article body. The hosted endpoint has the same blind spot.

EscalateNever for the markup. Boilerplate removal is a heuristic problem first; a model is a last resort for pages where the article body is genuinely ambiguous.

verified 2026-08-18

MarkdownHTML

10/day free $0.001 x402

curl -X POST "https://toolshed.lemon-agent.dev/convert/md-html" --data-binary @input.md

pandoc deterministic

Markdown to HTML is a solved parse, so the only real questions are which dialect and which extensions. Pandoc is the local answer and handles tables, footnotes and math; the hosted endpoint runs marked over CommonMark plus GitHub tables, which is what most agents actually want when they say "render this Markdown".

moreless

CaveatsThe hosted endpoint emits an HTML fragment, not a full document — no <html>, no stylesheet. It does not sanitize: raw HTML in the input passes through, so do not render untrusted output into a page without sanitizing it yourself.

EscalateNever.

verified 2026-08-18

Markdown (with math, code blocks, citations)PDF

pandoc deterministic

Pandoc plus a Typst or LaTeX engine gives the same PDF on every run, with real pagination, footnotes and cross-references. The naive alternative — print-to-PDF from a Markdown previewer — loses footnote links and repaginates differently on every machine, which shows up as a diff you can't reproduce.

moreless

CaveatsPDF output needs an external engine; Typst is fast and light, LaTeX (texlive) is heavy but still the only option for some journal templates.

EscalateNever for the conversion. A model is only useful upstream — writing or restructuring the Markdown before pandoc touches it.

verified 2026-08-18

MarkdownDOCX styled to a house template

pandoc deterministic

--reference-doc=template.docx maps headings, tables and code blocks onto a real Word style sheet, so a human reviewer gets an editable document instead of a wall of Normal-styled text. Pasting rendered Markdown into Word is the failure mode: styles arrive as direct formatting and the first edit shatters them.

moreless

CaveatsWord-native features (comments, tracked changes, floats with anchors) don't round-trip; you get clean structure, not pixel-matched design.

EscalateNever — style mapping is a template problem, not a judgment problem. Rewriting content for a different audience is a separate upstream step.

verified 2026-08-18

DOCXMarkdown + extracted media

pandoc deterministic

Pandoc reads the DOCX XML directly, so headings, lists, tables and footnotes land as real Markdown structure, and --extract-media writes embedded images to disk instead of dropping them. Pasting a DOCX into a model to "convert it" is the failure mode: you pay tokens for a plausible-looking file with quietly renumbered lists and vanished tables.

moreless

CaveatsTracked changes and comments are discarded unless you pass --track-changes=all; pseudo-headings faked with bold text stay paragraphs, because they were never structure.

EscalateOnly when there is no structure to recover — a document where every heading was faked with formatting and you want semantic headings inferred.

verified 2026-08-18

Live DOM in a browser or headless page (JS-rendered)Markdown

turndown deterministic

When the content only exists after JavaScript runs, the conversion belongs where the DOM is — Turndown runs in-page or in Node against a parsed DOM and takes custom rules for app-specific markup. Fetching the raw HTML and running a static converter gets you an empty shell.

moreless

CaveatsSmaller rule set than pandoc; tables need the GFM plugin and you own the escaping edge cases.

EscalateNever for markup. Use a model only to decide which region of a hostile app UI is "the content" — then hand that node to turndown.

verified 2026-08-18

Markdown (multi-chapter manuscript)EPUB 3

pandoc deterministic

pandoc -o book.epub produces a valid EPUB with a real table of contents, metadata and chapter splitting via --split-level; readers care about that structure far more than typography. The naive path — export to PDF and sideload — gives a fixed-layout file that is unreadable on a six-inch screen.

moreless

CaveatsRun epubcheck before publishing; store-specific requirements (Apple, Kobo) go beyond mere validity.

EscalateNever.

verified 2026-08-18

DOCX/XLSX/PPTX (batch)PDF

libreoffice deterministic

soffice --headless --convert-to pdf --outdir out/ *.docx is the only free path that renders Office layout faithfully enough to hand to someone, and it batches on a server with no Office licence. Pandoc converts the content but is not a layout engine — it will not preserve a deck's slides or a spreadsheet's pagination.

moreless

CaveatsFidelity is high, not perfect: fonts must be installed on the host, and exotic SmartArt or macro-driven content drifts. Concurrent runs need separate profiles via -env:UserInstallation=.

EscalateNever.

verified 2026-08-18

HTML + CSS (invoice, report, generated page)Paginated PDF

weasyprint deterministic

WeasyPrint implements print CSS — @page, running headers, page counters — so a report template paginates the same way in CI as on your laptop, with no browser in the image. Headless Chrome does the same job but its output shifts with the Chrome version, which is a bad property for anything invoice-shaped.

moreless

CaveatsNo JavaScript execution — render dynamic content to static HTML first. Very modern CSS layout features can differ from a browser's rendering.

EscalateNever.

verified 2026-08-18

Messy document (invoice, contract, report PDF/DOCX)Structured records against a schema

unstructured hybrid

Split the job rather than the tool: deterministic partitioning (unstructured's parsers, or pdftotext/pdfplumber) yields elements, positions and tables, and a model is asked only for the fields that are genuinely judgment — which of these three numbers is "the total", is this clause an indemnity. Handing the whole PDF to an LLM and asking for JSON is the expensive failure mode: it works on the demo document and fabricates on the tenth, with no signal that it did.

moreless

CaveatsHeavy dependency tree (OCR, ONNX models) and quality varies a lot by document type; validate the extracted structure before trusting anything built on top of it.

EscalateThe model tier is the point here — keep it narrow. Constrain output to the schema, validate every extracted number against the deterministic parse, and log both so a disagreement is visible.

verified 2026-08-18

MOBI/AZW3/LIT and other legacy ebook formatsEPUB

calibre deterministic

ebook-convert in.azw3 out.epub carries the TOC, metadata and internal links across a dozen legacy formats — a decade of accumulated format edge cases you should not re-derive. Pandoc does not read these formats, and "free online ebook converter" sites mean uploading your library to a stranger.

moreless

CaveatsDRM-protected files will not convert, and whether to remove DRM is your legal call, not the tool's. Heavily designed fixed-layout books reflow poorly.

EscalateNever.

verified 2026-08-18

PDF

PDF (digital-born — has a text layer)Plain text / layout-preserved text

pdftotext deterministic

If pdftotext -layout returns real text, the job is already finished — the characters are in the file and extraction is exact and instant. This is the entry that governs the whole PDF branch of the directory: run pdftotext first on every PDF, and only when it comes back empty or garbled does the file deserve OCR or a model.

moreless

CaveatsMulti-column and tabular layouts still interleave; -layout helps, and -bbox-layout gives coordinates when you need to reconstruct columns yourself.

EscalateNever for extraction. Escalate only for interpretation — turning extracted text into a schema (see messy-doc-to-schema).

verified 2026-08-18

PDF (scanned — page images, no text layer)Searchable PDF + extractable text

ocrmypdf hybrid

ocrmypdf adds an invisible text layer to the original pages, so the file stays a faithful scan and becomes greppable and citable; --skip-text and --redo-ocr make it safe to sweep a mixed directory. Pointing raw tesseract at the page images throws the PDF away and leaves you a text blob nobody can cite a page number from.

moreless

CaveatsOCR quality is bounded by scan quality — deskew and clean help, but phone photos of curved pages stay bad. Slow and CPU-hungry on long documents.

EscalateWhen accuracy matters on hard scans — handwriting, historical type, dense tables — a vision model reads them better. Still run OCR first and keep its output as a cross-check: OCR fails loudly, models fail by writing plausible words.

verified 2026-08-18

PDF page(s)PNG/JPEG page images

pdftoppm deterministic

pdftoppm -r 200 -png renders pages reproducibly and is the correct pre-step whenever OCR or a vision model is the next stage, because you control DPI, page range and colour — which is exactly what downstream accuracy depends on. Screenshotting pages by hand introduces cropping and scaling nobody wrote down.

moreless

Caveats300+ dpi over a long document produces very large files quickly; pick the lowest DPI the downstream stage tolerates and record it.

EscalateThis pair is the deterministic half of a model workflow — the model comes after, on the rendered images, never instead of the render.

verified 2026-08-18

PDF with ruled or whitespace-aligned tablesCSV / DataFrame

camelot deterministic

Camelot's lattice mode reconstructs cells from the table's actual ruling lines, so on a bordered table it is exact rather than approximate; stream mode handles whitespace-aligned tables with more supervision. Copy-pasting a table out of a PDF viewer merges columns unpredictably and you won't notice until a number is wrong in a report.

moreless

CaveatsDigital-born PDFs only; borderless tables need tuning, and the parse-accuracy report is worth reading rather than trusting. tabula-java and pdfplumber are reasonable alternatives with different failure shapes.

EscalateScanned tables, or tables whose header semantics are ambiguous, are legitimately model work — render pages with pdftoppm, give the model the image, then validate totals and row counts deterministically.

verified 2026-08-18

Data & tabular

JSONYAML

10/day free $0.001 x402

curl -X POST "https://toolshed.lemon-agent.dev/convert/json-yaml" --data-binary @input.json

yq deterministic

mikefarah's yq speaks both formats natively (yq -P) and preserves comments through YAML edits, which is the whole reason to use it on real config files. The hosted endpoint is the no-install version for the common case: valid JSON in, block-style YAML out.

moreless

CaveatsTwo unrelated tools are named yq — the Go one (mikefarah) and a Python jq wrapper (kislyuk); the flags differ, so pin which one your scripts assume. The hosted endpoint has no comments to preserve, because JSON has none.

EscalateNever.

verified 2026-08-18

YAMLJSON

10/day free $0.001 x402

curl -X POST "https://toolshed.lemon-agent.dev/convert/yaml-json" --data-binary @input.yaml

yq deterministic

yq -o=json is the local answer, and the direction that bites is this one: YAML is the larger language, so anchors, multi-document streams and unquoted no/yes all have to land somewhere in JSON. The hosted endpoint takes the first document of a stream and resolves anchors, which is what a config-reading agent wants.

moreless

CaveatsMulti-document YAML collapses to its first document on the hosted endpoint — use local yq if you need all of them. YAML dates and other non-JSON scalar types are stringified.

EscalateNever.

verified 2026-08-18

CSVJSON

10/day free $0.001 x402

curl -X POST "https://toolshed.lemon-agent.dev/convert/csv-json" --data-binary @input.csv

csvkit deterministic

csvjson data.csv turns a header row plus records into an array of objects, which is the shape almost everything downstream wants. The hosted endpoint does the same thing with an RFC-4180 parser, so quoted commas and embedded newlines survive — which is exactly what a split-on-comma one-liner gets wrong.

moreless

CaveatsEvery value comes out a string; the hosted endpoint does not guess types, because guessing is where leading zeros and long IDs get destroyed. Rows shorter than the header are padded with empty strings, and a row with more fields than the header is an error rather than a silent truncation.

EscalateNever for the parse. Deciding what the columns *mean* — see messy-csv-to-clean-csv — is the judgment half.

verified 2026-08-18

Nested JSON from an APIFlat JSON / NDJSON / CSV rows

jq deterministic

jq is a real language for this: -r, @csv, to_entries, group_by cover most reshapes in a line, and the result is an auditable program you can re-run on tomorrow's payload. Asking a model to "reshape this JSON" produces an answer, not a program — it doesn't survive the next record and quietly guesses on nulls.

moreless

CaveatsVery large documents need --stream or NDJSON input; the syntax has a genuine learning curve that people repeatedly underestimate.

EscalateUse a model to *write the jq program* when the shape is unfamiliar — then keep the program, drop the model, and put the program in version control.

verified 2026-08-18

Messy CSV (ragged rows, BOM, mixed quoting, duplicate headers)Clean, validated UTF-8 CSV

qsv deterministic

qsv input normalizes quoting and line endings, and validate/headers/dedup tell you what is actually wrong before the data reaches anything downstream — all at streaming speed on files far past spreadsheet size. Opening it in Excel to "fix it" is the classic failure: leading zeros vanish, long IDs become floats, and dates get silently localized.

moreless

CaveatsSome subcommands depend on how the binary was built (feature flags); csvkit is slower but pip-installable everywhere and reads more input formats.

EscalateOnly when the fix requires meaning — deciding that "N/A", "-" and "" are the same null, or that two differently-spelled columns are one field. Extract deterministically, let a model propose the mapping, then encode that mapping as a rule you can re-run.

verified 2026-08-18

XLSX workbook (specific sheet)CSV

csvkit deterministic

in2csv --sheet "Sheet2" book.xlsx gets the sheet you asked for with stable typing and scripts across a directory. Save-As-CSV in Excel exports only the active sheet, applies the machine's locale to dates and separators, and cannot be automated — which is how two people produce two different CSVs from one workbook.

moreless

CaveatsFormulas export as their last cached value; merged cells and multi-row headers still need reshaping. Very large workbooks are slow — qsv excel is the fast path.

EscalateWhen the sheet is a human-formatted report rather than a table (title rows, merged headers, stacked sub-tables), identifying the header row is genuine judgment: dump deterministically first, then let a model name the header row and the sub-table boundaries.

verified 2026-08-18

Large CSVQueryable SQLite database

sqlite3 deterministic

.import --csv data.csv t buys you indexes, joins and SQL over a file too big for a spreadsheet, with no service and no ORM. Loading a multi-hundred-megabyte CSV into pandas just to filter it is the naive alternative — paying RAM for work the disk should be doing.

moreless

Caveats.import types every column as TEXT unless you create the table first — declare the schema when numeric comparison matters. csvkit's csvsql --db infers types at a large speed cost.

EscalateNever.

verified 2026-08-18

SQLite query resultJSON / NDJSON for an API or an agent

sqlite3 deterministic

sqlite3 -json db.sqlite "select ..." (or .mode json) emits valid JSON straight from the CLI, composes with jq in a pipe, and needs no serialization layer. Hand-rolling a Python export script for this creates code you now have to maintain and test.

moreless

CaveatsNeeds a reasonably modern SQLite (3.33+) for the -json flag; check BLOB and NULL handling before shipping the output anywhere.

EscalateNever.

verified 2026-08-18

Images

HEIC/HEIF photos from an iPhoneJPEG

imagemagick deterministic

magick mogrify -format jpg -quality 88 *.heic converts a folder in one line and keeps EXIF, which matters when the timestamps are the reason you kept the photos. Re-exporting through a photo app or a web converter tends to strip or rewrite metadata — and uploading personal photos to a random site is a privacy trade you probably didn't intend to make.

moreless

CaveatsRequires a libheif-enabled build (check magick -list format | grep -i heic); slower and hungrier than libvips on large batches.

EscalateNever.

verified 2026-08-18

Large batch of source imagesWeb-sized JPEG/WebP/AVIF derivatives

libvips deterministic

vipsthumbnail streams through a batch on a small memory footprint and gets the defaults right — shrink-on-load for JPEG, sane colour handling. The naive magick -resize loop over thousands of files is where the out-of-memory kills and the hour-long builds come from.

moreless

CaveatsFewer effects and filters than ImageMagick; heavy compositing or annotation work still belongs in ImageMagick, at its cost.

EscalateNever for the resize. Picking crop focal points across a large library is the one adjacent task where a model (saliency detection) earns its keep.

verified 2026-08-18

Static SVGPNG at a chosen scale

resvg deterministic

resvg renders an SVG to PNG with no browser and no JS runtime, so it runs in CI and produces the same bytes run after run. Headless Chrome does the same job while pulling in a browser-sized dependency and a screenshot timing race.

moreless

CaveatsStatic SVG only — no scripting, no remote resource fetching, and web fonts must be installed locally. rsvg-convert (librsvg) is the distro-packaged alternative.

EscalateNever.

verified 2026-08-18

Image of text (screenshot, clean scan, photo)Plain text

tesseract model

Tesseract is a fixed local model — same input, same output, no API, nothing leaving the machine — and --psm is the knob that actually matters (6 for a block, 7 for a single line). Sending screenshots to a hosted vision API for text you could extract locally is a cost and privacy leak on the easy majority of cases.

moreless

CaveatsWants clean, high-contrast, deskewed input; handwriting, stylized type and text over busy imagery are outside its range. When it fails it produces visible garbage, which is a useful property.

EscalateHandwriting, dense multi-column layouts, or text embedded in imagery — a vision model reads those. Also whenever the target is semantic ("what is the total on this receipt") rather than the characters themselves.

verified 2026-08-18

Audio & video

Arbitrary video (any container/codec)H.264 MP4 that plays everywhere

ffmpeg deterministic

-c:v libx264 -crf 20 -preset slow -c:a aac -movflags +faststart is the boring correct answer for delivery: CRF targets quality rather than a guessed bitrate, and faststart lets playback begin before the file finishes downloading. GUI "convert to MP4" presets routinely omit faststart, so web playback stalls until the whole file lands.

moreless

CaveatsCRF values are codec-relative — don't reuse an x264 number for x265 or AV1. Hardware encoders are much faster and meaningfully worse per bit.

EscalateNever. Encoding is math; the only judgment is your quality/size target, which is a knob you set once.

verified 2026-08-18

Video file with an audio trackAudio file (m4a/wav)

ffmpeg deterministic

ffmpeg -i in.mp4 -vn -c:a copy out.m4a lifts the existing audio stream with no re-encode and no generation loss; switch to -c:a pcm_s16le out.wav only when the next tool demands PCM. Reflexively re-encoding to MP3 adds a lossy generation for nothing.

moreless

CaveatsStream copy needs a container that accepts the codec (AAC to .m4a, not .wav); multi-track sources need an explicit -map.

EscalateNever.

verified 2026-08-18

WAV / FLAC / arbitrary audioMP3 or Opus at a fixed sample rate and loudness

ffmpeg deterministic

ffmpeg does the format change, the resample (-ar) and loudness normalization (loudnorm) in a single pass, which matters because chaining separate tools resamples twice and compounds artifacts. For speech and web delivery Opus at a low bitrate is clearly better than MP3 at the same size.

moreless

CaveatsSingle-pass loudnorm is approximate; use the two-pass measure-then-apply form when you actually care about hitting a LUFS target.

EscalateNever.

verified 2026-08-18

Recorded speech (meeting, interview, podcast)Transcript (text/SRT/VTT)

whisper.cpp model

This pair has no deterministic answer; speech-to-text is model work and pretending otherwise wastes a day. whisper.cpp runs the weights locally at usable speed on Apple Silicon and writes SRT/VTT directly, so recordings never leave the machine and the marginal cost per hour of audio is zero.

moreless

CaveatsNo speaker diarization out of the box; accuracy drops with accents, crosstalk and domain jargon, and it can emit invented text over long silences. Bigger models are considerably better and considerably slower. faster-whisper is the Python/GPU alternative.

EscalateAlready model-tier. Go further only for diarization, or for a cleanup pass on punctuation and domain terminology — and always keep the raw transcript alongside the cleaned one.

verified 2026-08-18

Files, encodings & metadata

Photo / video / PDF fileStructured metadata (JSON)

exiftool deterministic

exiftool -json -r dir/ reads (and writes) metadata across essentially every format and tag standard, which makes it the right first move before any lossy pipeline: capture the metadata, then convert. The naive path drops timestamps and GPS during the convert step and you find out months later, with no way back.

moreless

CaveatsWriting tags rewrites files — keep the _original backups, or pass -overwrite_original deliberately. Tag namespaces are numerous and vendor-specific.

EscalateNever for reading. A model is only relevant for deriving metadata that isn't there — captions, subjects, scene descriptions — which is a different job with different accuracy expectations.

verified 2026-08-18

Text/CSV in a legacy encoding (CP-1252, Latin-1, Shift-JIS) showing mojibakeClean UTF-8

iconv deterministic

iconv -f WINDOWS-1252 -t UTF-8 fixes the entire class of "why are there  characters" bugs in one pass once you know the source encoding; pair it with uchardet or file -I to guess. Find-and-replacing the visible mojibake by hand is the failure mode — you fix the common characters and leave the rare ones to break a parser downstream.

moreless

CaveatsEncoding detection is a guess, not a fact — verify on a sample containing known-odd characters. //TRANSLIT silently degrades anything unmappable.

EscalateNever for the conversion; a model is at most a tie-breaker when detection is ambiguous and you have a sample of known-correct text to compare against.

verified 2026-08-18

For agents — call it

Plain HTTP is the whole API; the skill and the MCP server are conveniences on top of it. Nothing here needs an account or a key.

1. Check what is available, then convert

curl "https://toolshed.lemon-agent.dev/check?from=markdown&to=html"

Returns the matching pairs with their endpoint, price, free-tier allowance and status. from is matched against what you have, to against what you need. No parameters returns every hosted tool.

curl -X POST "https://toolshed.lemon-agent.dev/convert/md-html" --data-binary @README.md

Post the raw file as the body; the converted file comes back as the body. Input is capped at 256 KB. The first 10 calls a day are free and say how many are left in x-free-tier-remaining; past that the answer is a 402 asking for payment, or a 429 while payment is switched off.

2. The whole catalog as files

curl https://toolshed.lemon-agent.dev/catalog.json

Structured entries — every field, including the hosted endpoint.

curl https://toolshed.lemon-agent.dev/llms.txt

Compact index — one line per pair.

curl https://toolshed.lemon-agent.dev/llms-full.txt

Full verdicts, with caveats and escalate lines.

3. Install the skill

npx skills add chronick/lemon-toolshed

Teaches an agent the check-then-convert habit, the 256 KB cap and the paid flow. Always-works fallback: copy skills/toolshed/ from the repo into your agent's skills directory.

4. MCP

claude mcp add toolshed -- npx -y github:chronick/lemon-toolshed

Three tools over stdio: toolshed_check, toolshed_convert, toolshed_catalog. From a local clone instead:

claude mcp add toolshed -- node /path/to/lemon-toolshed/mcp/server.mjs

Point it somewhere else with TOOLSHED_URL.

Links on this page are plain hrefs to the tool, with no redirect and no interstitial.

Pricing, and paying with USDC

Every tool is free to try: 10 conversions a day, no login. Past that it's a paid call — $0.001 in USDC via x402, with much higher limits.

The free tier needs no account, no key and no wallet — just call the endpoint. Every free-tier answer carries an x-free-tier-remaining header saying how many of the day's 10 are left, and the count resets at midnight UTC. It is counted per caller, where a caller is an IP address: rotating your user-agent does not get you a second 10.

Past the free tier, a call answers HTTP 402, and the body of that 402 is an x402 envelope: it names the price, the asset — USDC on Base — and the payTo address the money should go to. That envelope is the whole negotiation.

Your agent needs two things to answer it:

  1. An x402-capable HTTP clientx402-fetch, the x402 SDK, or Coinbase AgentKit.
  2. A wallet key holding USDC on Base, which the client signs with.

The client reads the envelope, signs a payment for the named amount, and retries the same request with an X-PAYMENT header. No login, no card, no account — the payment is the auth.

Example — JavaScript, with x402-fetch

import { wrapFetchWithPayment } from "x402-fetch"; import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY); const pay = wrapFetchWithPayment(fetch, account); // handles the 402 + retry const res = await pay("https://toolshed.lemon-agent.dev/convert/html-markdown", { method: "POST", body: "<h1>Hello</h1>" }); console.log(await res.text());

The wrapper does the 402 handling and the retry; your code just awaits a response. Never paste a private key or a seed phrase into a chat — the key belongs in the environment your client runs in.

Honest statusThe free tier is live and enforced. Payment is not switched on yet: no receiving address is configured, so a call past the free tier answers 429 — the day's free calls are spent, come back tomorrow — rather than the 402 above. And nothing verifies settlement, so an X-PAYMENT header is never treated as paid; a response that sees one says x-payment-verified: false. When settlement goes live, the 402 is the gate.

How we count

This page runs a small script that reports two things: that the page loaded, and which outbound link was clicked. Nothing else is collected — filtering and copying send nothing — and links are plain links, so they work with the script blocked.

Conversion calls are counted too: one row per call, recording that a call happened and which tool it used. The file you send is not stored and not logged.

The free-tier counter is separate, and it is the one place a caller is identified across calls: it is keyed on a daily-salted hash of the IP address alone — no user-agent, so rotating one does not mint a fresh allowance — which makes it unlinkable across days once the salt is replaced, and it is kept on the same retention as every other counter here.

Here is the counting policy in full: the count is script-executing clients minus self-declared bots; thresholds are set so crawler residue does not clear them alone; no claim to perfect human detection is made. Click delivery is best-effort, so the click number is a floor rather than a total.

Privacy

There are two stores here, and they answer a "what do you hold on me" request differently.

The counting store holds a short hash, not an address. The hash is salted with random bytes that are replaced at the first request of each UTC day, and replacing them is the deletion: once the old salt is gone, nothing in the store points back to anyone. Rows are kept 90 days at most, then reduced to daily totals and deleted. Files you send to a conversion endpoint are never written to it. The free-tier counter lives in the same store under the same rules — a daily-salted hash of the IP alone, one row per caller per day, pruned on the same 90-day chore.

An IP blocklist exists to stop abuse. It is keyed on the address, so it does identify a requester, and we delete an address on request; rows expire 90 days after they were last seen.