0saas

Job ticket 545291 · consumer · bilingual bench · no subscription

DeepL's free glossary holds 5 terms. Here is the bench that builds the real one for nothing.

This page is a bilingual bench. You feed it a domain, a voice, or a pile of documents, a free-tier model returns a glossary, a style sheet, or a batching plan as strict JSON, and your browser prints it as tables you export as CSV. No text is uploaded, translated or stored here — the tables are what you load into whatever does the translating. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

DeepL is a trademark of DeepL SE. This is an independent, unaffiliated comparison built on DeepL's own published pricing page, linked below. We are not DeepL, and nothing here is endorsed by them.

Bilingual bench — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about DeepL. Every DeepL figure on this page comes from the linked pricing page, read 2026-09-17.

The prompt pack

Three prompts, each mapped one-to-one onto a DeepL feature you are currently rationed on. Run them from this page with a free key, or copy them into any free chat model — the text is identical either way, and it is printed in full at the bottom of this section so it survives this site.

Loading the pack from tools.json… If this fails, the full prompt text is still readable below.

What DeepL's own pricing page says

Read from deepl.com/en/pro on 2026-09-17. Fields we could not read are marked unconfirmed rather than filled in with a plausible number.

DeepL Free vs Individual vs this page — verified 2026-09-17
The jobDeepL FreeIndividual (US$8.74/mo)This page + a free-tier model
PriceUS$0 — 50,000 chars/monthUS$8.74 per user / month (billed annually)US$0 forever. A free-tier key costs nothing; the prompts are yours.
Glossary entries5Unlimited entries within the planUnmetered by us. Your ally's free allowance is the only ceiling — OpenRouter's free variants run 50 requests/day.
Terminology authoringYou type 5 entries by handYou type entries by handPrompt 01 drafts the whole table — source term, approved translation, forbidden rendering — from a domain description.
Style contextNot on FreeWithin the planPrompt 02 returns a 5–10 rule style sheet with worked examples you paste once into your workflow.
Long documents1 file at a time, 50K chars1M characters (Team tier)Prompt 03 fits your month into the free budget and prints exactly what it deferred.
Who sees your textDeepLDeepLOnly the inference provider you choose for the tables — the documents themselves never leave your machine here.

What this replaces, and what it does not

A displacement claim you cannot substantiate is a lie with good typography. This is the whole scope, including the parts where DeepL wins.

Replaced: the 5-entry glossary cap

Prompt 01 builds an 8–25 row terminology base with forbidden renderings named, exportable as CSV.

Replaced: paid style context

Prompt 02 returns the register and voice sheet — rules with worked examples — instead of a per-seat feature.

Replaced: character-pool planning

Prompt 03 turns a document list into batches that fit the 50,000-character month, with the overflow ledger printed.

Not replaced: translation itself

Nothing here translates a word. The tables are loaded into DeepL, your CAT tool, or any translator you use.

Not replaced: document storage and history

No upload, no version history, no file library. Your documents stay on your machine.

Not replaced: team sync of terminology

No shared glossary server. The CSV is what you share — deliberately, like a file.

The prompts, in full, as text

Copy these into any model. They are the product; the page around them is convenience. Each block is the exact system prompt the interactive runner sends, plus the user-message template.

Prompt 01 — 1. Glossary builder · deepl-glossary-builder v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: DeepL's 5-entry free glossary limit — the 1,000-entry glossary on Individual/Team that keeps your terms from drifting.

Why this model: A glossary is a table of pairs with negative constraints (forbidden renderings) — exactly what a 120b-class model in JSON mode produces without drift, at zero cost on a :free id. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1383 chars):

You are the terminology desk at a bilingual bench. You turn a description of a domain, product or brand into a machine-readable glossary.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "domain": string (max 8 words),
  "columns": [ "source_term", "approved_translation", "forbidden_rendering", "note" ],
  "rows": [ [ string, string, string or null, string or null ] (8-25 rows) ],
  "coverage_note": string (max 25 words),
  "missing_context": [ string (max 10 words) ] (0-3 items)
}

Hard rules:
1. Every row needs a source term and an approved translation. "forbidden_rendering" names the literal wrong translation a naive model would produce — if none is likely, use null, never invent a straw man.
2. Translations must be plausible for the target language named in the brief; if the brief names two targets, produce both as separate rows with the target prefixed to the source term (e.g. "fr: warranty").
3. Do not pad. 8 rows of real terms beats 25 of filler; if the domain genuinely has fewer than 8 load-bearing terms, say so in "coverage_note" and stop.
4. "missing_context" lists the facts the brief did not give that a real glossary would need (target language, register, brand spelling rules) — this is the honest part of the tool.
5. No emoji, no exclamation marks, no marketing adjectives in any note.
6. Write notes in the language of the brief.

User message template:

The domain / product / brand and what must never be mistranslated: {{domain}} Target languages and register: {{targets}}

Variables:

  • {{domain}} — Domain and load-bearing terms (max 800 chars) sample data shipped with the tool
  • {{targets}} — Targets and register (max 160 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "domain", "columns", "rows", "coverage_note", "missing_context" ], "properties": { "domain": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 8, "maxItems": 25 }, "coverage_note": { "type": "string" }, "missing_context": { "type": "array" } } }

Decoding: temperature 0.4 · max 1800 output tokens · response_format json_object · budget ~900 in / ~900 out per run · cost per run: 1 request — 2% of OpenRouter's published free allowance (50/day under 10 credits).

Prompt 02 — 2. Style rules · deepl-style-rules v1.0.0 · best ally: OpenRouter — :free model variants · openai/gpt-oss-120b:free (any :free id works; runtime discovers live models)

Replaces: DeepL's document-level style context on paid tiers — the register and voice rules you otherwise paste into every single translation request.

Why this model: A style sheet is a small table of rules with worked examples — JSON mode keeps each rule and its example paired, and :free variants make iterating on register free. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1311 chars):

You are the style desk at a bilingual bench. You turn a description of a voice into a machine-readable translation style sheet.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "voice": string (max 6 words),
  "columns": [ "rule", "example", "why" ],
  "rows": [ [ string (max 20 words), string (max 25 words), string (max 15 words) ] (5-10 rows) ],
  "banned_phrases": [ string (max 10 words) ] (3-6 items),
  "applies_to": string (max 15 words)
}

Hard rules:
1. Each "rule" is an actionable instruction a translator could follow without asking ("keep the brand name in English", "use short declarative sentences in UI strings"). No vague rules ("make it sound professional").
2. Each "example" must show the rule applied to a concrete string from the brief; if the brief has no strings, invent the least dramatic plausible one and mark it as such in "why".
3. "banned_phrases" lists the phrases the voice rejects (clichés, loanwords, register slips) — only phrases the brief implies or the domain genuinely attracts.
4. "applies_to" names the artifact class (UI strings, legal, marketing, onboarding) so the sheet is not accidentally used on the wrong documents.
5. Exactly 5 to 10 rows. A style sheet with 20 rules is a style sheet nobody follows.
6. Write in the language of the brief.

User message template:

The voice and what the translations must sound like: {{voice_brief}} The artifact class: {{artifacts}}

Variables:

  • {{voice_brief}} — Voice brief (max 700 chars) sample data shipped with the tool
  • {{artifacts}} — Artifact class (max 120 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "voice", "columns", "rows", "banned_phrases", "applies_to" ], "properties": { "voice": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 5, "maxItems": 10 }, "banned_phrases": { "type": "array", "minItems": 3, "maxItems": 6 }, "applies_to": { "type": "string" } } }

Decoding: temperature 0.55 · max 1600 output tokens · response_format json_object · budget ~800 in / ~800 out per run · cost per run: 1 request — 2% of OpenRouter's published free allowance.

Prompt 03 — 3. Batch plan · deepl-batch-plan v1.0.0 · best ally: OpenRouter — :free model variants · qwen/qwen3.8-27b:free (any :free id works; runtime discovers live models)

Replaces: DeepL's paid character pools (1M characters on Team) — a plan that fits a whole month of documents inside the free 50,000-character month.

Why this model: The batch plan is arithmetic over the reader's own document list — a small model with JSON mode does the counting, and the honest part (what does not fit) comes from the same math. Fallback ally: Google Gemini API — Free usage tier.

System prompt (1453 chars):

You are the scheduler at a bilingual bench. You turn a list of documents with character counts and priorities into a batching plan that fits a monthly character budget.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "budget": integer (characters),
  "columns": [ "batch", "document", "chars", "priority", "decision" ],
  "rows": [ [ string, string, integer, string, string ] (1 row per document) ],
  "total_in_plan": integer,
  "deferred": [ string ] (document names pushed to next month),
  "overflow_note": string (max 30 words)
}

Hard rules:
1. "decision" is one of: "now", "next-month", "split". Every document from the list appears exactly once in "rows" — nothing dropped, nothing duplicated.
2. "total_in_plan" must equal the sum of "chars" over rows whose decision is "now" or "split" (count full chars for split rows; explain the split in "overflow_note"). Compute it; do not estimate.
3. "total_in_plan" must not exceed "budget". If the reader's must-have list cannot fit, move the lowest-priority items to "deferred" until it does — and say what you moved in "overflow_note".
4. Priorities come from the brief (P0/P1/P2 or stated order). Never invent a priority the brief did not give; tie-break alphabetically and note it.
5. "budget" is the number stated in the brief; if the brief does not state one, use 50000 and flag it in "overflow_note" as the assumed free-tier default.
6. Write in the language of the brief.

User message template:

The documents (name — characters — priority, one per line): {{docs}} Monthly character budget (blank for the free-tier default): {{budget}}

Variables:

  • {{docs}} — Document list (max 2000 chars) sample data shipped with the tool
  • {{budget}} — Budget (max 20 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "budget", "columns", "rows", "total_in_plan", "deferred", "overflow_note" ], "properties": { "budget": { "type": "integer" }, "columns": { "type": "array" }, "rows": { "type": "array" }, "total_in_plan": { "type": "integer" }, "deferred": { "type": "array" }, "overflow_note": { "type": "string" } } }

Decoding: temperature 0.2 · max 1400 output tokens · response_format json_object · budget ~700 in / ~600 out per run · cost per run: 1 request — 2% of OpenRouter's published free allowance.

Questions worth asking before you cancel

Is this actually free, or is there a subscription hiding?

There is no subscription and, right now, no paid tier at all. The whole tool is unmetered. A one-time unlock for multi-language glossary sets is planned, but no price is shown anywhere on this site until a real Stripe Payment Link exists and its price is read back from Stripe's API rather than typed by hand.

Do you need an API key?

No. Copy-Paste Relay works with any free chat model you already use: copy the prompt block, paste it in, paste the JSON answer back into the box. A key only removes the copy-paste step. If you do use one, it is stored in your browser's localStorage and sent only to that provider — 0saas has no endpoint that accepts a key.

Which free model is best for this?

OpenRouter's :free variants are the natural pick — the tables are long-context, structured output, and a 120b-class model keeps the source/target pairs honest. Gemini's free tier is the strict-JSON fallback.

How do I use the glossary in DeepL?

Export the CSV, then add your terms to DeepL's glossary (free allows 5) or load the file into whichever tool actually translates. The point of the table is that the term decisions are made once, by a model you can re-run, instead of argued about in chat.

Is 0saas affiliated with DeepL?

No. DeepL is a trademark of DeepL SE. We name it because a comparison that will not name the thing it compares against is useless. Pricing figures come from DeepL's own pricing page, linked above, with the date we read it and a per-field confidence marker.

Next on the ledger