Prompt Template Filler

Substitute values into a template's placeholders. It sounds trivial, but filling them in by hand means eventually sending one to a model with a placeholder still in it, then spending a while wondering why the answer is off. Counting the unfilled slots is what this tool is actually for.

Mark slots with double braces

Fill the slots (5)

Filled

5 slots are still empty — role, tone, lang, audience, textEmpty slots are left in place rather than blanked. Removing them would let a half-filled prompt reach the model unnoticed.

You are {{role}}.

Rewrite the following in a {{tone}} tone, in {{lang}}.
The audience is {{audience}}.

---
{{text}}

117 characters

How a slot is written

A name inside double curly braces is a slot. Inner whitespace is ignored, so {{ name }} and {{name}} are the same slot, and a name may contain ASCII letters, digits, underscores, dots and hyphens — non-Latin letters do not form a slot. {{user.name}} does not reach into an object — it is one name, user.name. Names are case-sensitive, and single braces or ${name} are not treated as slots.

Unfilled slots stay as they are

An empty value counts as unfilled. The slot is left exactly as written in the template, its name is listed above, and the border of its value field turns amber. When the same name appears several times, the count is shown and one value fills them all. The character count under the result is characters, not tokens.

Values go in verbatim

Substitution runs in a single pass. If a value itself contains {{another}}, it is not expanded again and stays as literal text. There is no escaping and no conditionals or loops — this is not Mustache or Jinja, only slot replacement. Because values are inserted untouched, remember that if you drop user input into a slot, any instructions inside it become part of the prompt.

The slot list is rebuilt from the template

The value fields are regenerated from the names in the template every time you edit it. Rename a slot and its value has to be entered again; delete a slot and its field disappears. When the same prompt is reused with only the product name or the tone changed, marking those spots as slots means only the values need swapping. Values are not saved and are gone when the page is closed.

What does not count as a slot

A name may use ASCII letters, digits, underscores, dots and hyphens. Written in another script, {{이름}}, or with a space, {{first name}}, it is not a slot: it stays as text and is not counted as unfilled. Triple braces {{{x}}} are read as a slot with one extra brace each side, so the value comes out wrapped in single braces. There is no escape syntax; to keep {{ as text, a space inside the name is one way.

Value fields are single-line

Values go into single-line fields, so they cannot hold a line break. For a slot that needs several paragraphs — the text to translate, a sample conversation — write the text into the template body and keep slots for the words that change. The character count below is the JavaScript string length, so one emoji counts as two.

Frequently asked questions

What happens to placeholders I do not fill?

They are left in place rather than removed. Replacing them with an empty string means sending an incomplete prompt without noticing. The count of unfilled slots is shown above the output.

How do I write a placeholder?

A name wrapped in double braces becomes a slot. Repeat the same name and one value fills every occurrence.

What if I leave one unfilled?

It counts the ones still empty and tells you. That is the point of the tool — a filled prompt looks fine at a glance, and one leftover slot sent to a model quietly produces a wrong answer.

Are `{{Name}}` and `{{name}}` the same slot?

No. Names are case-sensitive, so you get two value fields, and filling one leaves the other reported as unfilled. If you meant the same value, make the names match in the template.

Does anything I paste get sent to a server?

No. Everything runs inside your browser and nothing is uploaded or stored. That is why you can use it on things you would not normally paste into a web page, like an internal config file or a production query. It also works with your network disconnected.