Jinja Renderer

Renders a Jinja-style template against local JSON data. Supports a documented subset: variables, dotted paths, filters, if/elif/else, and for loops. There is no code execution, no eval, and no macros/include/extends.

Private by architecture: All processing is 100% client-side memory. Your data never leaves this browser tab.
Template
0 lines · 0 charsTemplate (Jinja subset)
JSON data
root must be a JSON object
0 lines · 0 charsJSON Context
Rendered output
Ctrl/Cmd+Shift+C
0 charsOutput

Examples

1. Visual Component (HTML + CSS)

<style>
  .card { font-family: sans-serif; padding: 20px; background: #18181b; color: #fff; border-radius: 12px; }
  .name { font-size: 18px; font-weight: bold; color: #f97316; margin: 0; }
  .tag { display: inline-block; padding: 2px 8px; background: #27272a; border-radius: 4px; font-size: 12px; margin: 2px; }
</style>
<div class="card">
  <h3 class="name">{{ user.name }}</h3>
  <p>{{ user.role|upper }}</p>
  <div>
    {% for skill in user.skills %}
    <span class="tag">{{ skill }}</span>
    {% endfor %}
  </div>
</div>

2. Plain Text (Email / Notification)

Hello {{ name|upper }}!
{% if items %}
{% for item in items %}- {{ item }}
{% endfor %}
{% else %}
No items.
{% endif %}

FAQ

Which filters are supported?
upper, lower, trim, length, first, last, join(sep), default(value), and safe (opts a single value out of escaping).
What is not supported?
Macros, {% include %}, {% extends %}, arithmetic expressions, and arbitrary Python-style expressions. Unsupported syntax produces a clear error naming what was rejected, rather than silently misbehaving.
Is anything executed?
No. There is no eval or dynamic code execution anywhere in the renderer; it is a small hand-written interpreter for the subset above.
Should I turn off HTML escaping?
Only for non-HTML output (plain text, code, config files) or when generating raw styled HTML where tags and CSS should not be escaped. For user-facing HTML templates with untrusted variables, leave escaping on.