Jinja2 templating that knows your backend.
The free extension ships syntax highlighting and variable checking today. Pro adds backend-resolved variables for Flask, Django, FastAPI, and Express — and is in active development.
Free is MIT and stays free. Pro is on the way — no Marketplace listing yet.
Free vs. Pro
Free is the foundation. Pro adds the backend-aware layer that eliminates false "undefined variable" warnings.
- Syntax highlightingDistinct colors for {% %} tags, {{ }} variables, and pipe filters inside HTML, style, and script blocks.
- 10 built-in snippetsfor, if, ife, block, extends, include, set, macro, with, filter — all expandable in any HTML/Jinja2 file.
- Jinja2 comment togglingCmd+/ or Ctrl+/ wraps the selection in {# …
- Variable checking (JHE0001)Flags undefined Jinja2 variables. Recognizes {% set %} and {% for %} bindings; allowlist suppresses backend-injected names.
- Variable PanelSidebar webview listing every variable used or set in the current template, with one-click jump to its origin.
- 5 built-in themesDark Default, Light Default, Dark/Light High Contrast, and Xuby Selection — plus full editor.tokenColorCustomizations support.
- English & Spanish UILocalized command titles, settings, and panel copy in EN and ES.
- Backend variable resolutionResolves variables from Flask, Django, FastAPI, Express, Nunjucks, and standalone Jinja2 render calls — no more false "undefined" warnings.
- Go to backend definitionF12 or Cmd+Click on any template variable jumps straight to the line in your Python or JavaScript source where it's declared.
- Cross-file template trackingResolves {% extends %} chains, {% include %} children, and inherited {% set %} variables — so child templates stop flagging variables defined in their base.
- Imported macro resolutionBoth {% import "macros.html" as ns %} and {% from "macros.html" import card, modal as m %} are tracked across files.
- Template path navigationF12 / Cmd+Click on any extends, include, or import path opens the resolved file. Auto-discovers templates/ roots; configurable.
- Variable origin on hoverHover any variable to see whether it came from a backend call, an inherited base template, or an imported macro — with a click-to-jump link.
- Smart lightbulb actionsWhen JHE0001 fires but Pro finds the name elsewhere in the template hierarchy, the quick-fix offers "Go to inherited definition".
Features that pay for themselves
The differentiators — what makes a Pro license worth it on a real project.
Variable checking (JHE0001)
Flags undefined Jinja2 variables. Recognizes {% set %} and {% for %} bindings; allowlist suppresses backend-injected names.
Variable checking runs on save (or on demand) and surfaces a JHE0001 diagnostic for any name your template references but never defines. The analyzer follows {% set %} assignments and loop variables, so you only see real misses — not false alarms on locals.
Names that come from your backend can be added to a workspace allowlist with one click via the Save variable quick fix.
Backend variable resolution
Resolves variables from Flask, Django, FastAPI, Express, Nunjucks, and standalone Jinja2 render calls — no more false "undefined" warnings.
Pro parses your backend source to learn which variables each template actually receives. Flask render_template(), Django render(), FastAPI TemplateResponse, Express/Nunjucks res.render(), and standalone Jinja2 are all recognized.
Variables passed from the backend are no longer flagged as undefined, and the Variable Panel shows their origin alongside template-local bindings.
Go to backend definition
F12 or Cmd+Click on any template variable jumps straight to the line in your Python or JavaScript source where it's declared.
Hover a variable, click the link (or hit F12), and Pro takes you to the exact render_template / render / TemplateResponse call site that supplies it. Works across files, across frameworks, and across multi-render templates that receive different variables from different routes.
Cross-file template tracking
Resolves {% extends %} chains, {% include %} children, and inherited {% set %} variables — so child templates stop flagging variables defined in their base.
Pro builds a workspace-level template graph and walks the entire {% extends %} chain for each file. Variables defined in a base template are visible in every child; loop and block scopes are tracked correctly.
Two graph diagnostics catch structural problems early:
JHE1101— unresolved template path in extends/include/importJHE1102— circular extends chain
See it in your editor
Free is shipping today. Pro is in development — these screenshots are from the live build.
View full size
Distinct colors for {% %}, {{ }}, and pipe filters — ships in the free extension today.
View full size
JHE0001 catches undefined names; one-click "Save variable" adds it to your allowlist.
View full size
F12 or Cmd+Click on any variable jumps to the render_template line that supplies it.
View full size
Every backend-provided variable, grouped by name, with jump-to links per call site.
Pricing
Pay for what saves you time. Cancel any time.
Free
The MIT extension. Everything you need for single-template work.
- Syntax highlighting + 10 snippets
- Variable checking (JHE0001)
- Variable Panel sidebar
- 5 themes + token customization
- EN / ES localization
Pro
In developmentBackend-aware intelligence for real projects with multi-file templates. In development — not yet for sale.
- Everything in Free
- Backend variable resolution (Flask · Django · FastAPI · Express · Nunjucks)
- Go to backend definition (F12 / Cmd+Click)
- Cross-file extends/include/import tracking
- Template-graph diagnostics (JHE1101 · JHE1102)
- 7-day offline grace · single machine, swappable
Team
Coming soonShared variable registries, audit reports, and monorepo support.
- Everything in Pro
- Shared workspace variable registry
- Documentation & audit reports
- Monorepo template-root config
- Priority support
Pro and Team are not yet for sale — drop your email and we'll write when they launch. 14-day refund applies on first purchase.
Frequently asked
The questions we get most. Email us if you don't see yours.