A skill your agent uses when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages.

MITAuto-check passedBackend & APIs

Install Frappe Syntax Jinja

skills CLI
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-syntax-jinja -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-syntax-jinja --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/source/syntax/frappe-syntax-jinja .claude/skills/frappe-syntax-jinja && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
frappe-syntax-jinja
GitHub stars
188
Token cost
~3.2k tokens
SKILL.md length
633 words
Files
11 (incl. references)
Skills in repo
61
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages.

  • Works in 6 steps: Use _() for ALL user-facing strings → Use get_formatted() for currency, date,… → Use default() filter for… → …
  • Writing Jinja templates for ERPNext/Frappe Print Formats
  • SKILL.md covers When to Use This Skill, Decision Tree: Which Template…, Quick Reference: Jinja Syntax and Context Objects by Template Type, plus 6 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Frappe Syntax Jinja is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages. Covers template syntax, context variables, filters, macros, and v16 Chrome PDF rendering. Prevents common mistakes with doc context and child table iteration. Keywords: Jinja, print format, email template, portal page, template syntax, PDF, v14-v16, template syntax, Jinja example, print format code, how to show child table in print.

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including reference files (for example `references/anti-patterns.md`, `references/context-objects.md` and `references/examples.md`). Compatibility notes: Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

It sits in Backend & APIs, covering Transactional email. The repository describes itself as: 60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations. The licence is MIT.

When your agent uses it

  • Writing Jinja templates for ERPNext/Frappe Print Formats
  • Email Templates

Example prompts

  • “/frappe-syntax-jinja”

Requirements

  • Python 3
  • Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Use _() for ALL user-facing strings
  2. Use get_formatted() for currency, date, and numeric fields
  3. Use default() filter for optional/nullable fields
  4. Pass parent doc to child row get_formatted("field", doc)
  5. Use frappe.db.get_value() when you need only one field
  6. Keep calculations in Python controllers, not Jinja templates

What it can do on your machine

Read from SKILL.md and the folder at commit 36cfa80. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are jinja, python, css and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

    From compatibility in the SKILL.md frontmatter.

Context cost

Frappe Syntax Jinja loads about 3.2k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 114 tokens; SKILL.md has 633 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~114
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~20k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Impertio-Studio/Frappe_Claude_Skill_Package at commit 36cfa80, republished under its MIT licence (© Impertio-Studio). 633 words, ~3,190 tokens.

Download SKILL.mdSave it as .claude/skills/frappe-syntax-jinja/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
frappe-syntax-jinja
description
Use when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages. Covers template syntax, context variables, filters, macros, and v16 Chrome PDF rendering. Prevents common mistakes with doc context and child table iteration. Keywords: Jinja, print format, email template, portal page, template syntax, PDF, v14-v16, template syntax, Jinja example, print format code, how to show child table in print.
compatibility
Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.
license
MIT
metadata.author
OpenAEC-Foundation
metadata.version
2.0

Frappe Jinja Templates Syntax

Deterministic Jinja reference for Print Formats, Email Templates, Notification Templates, and Portal Pages in Frappe v14/v15/v16.


When to Use This Skill

USE when:

  • Creating or modifying Print Formats (Jinja-based)
  • Writing Email Templates with dynamic fields
  • Building Portal Pages (www/*.html) with Python controllers
  • Writing Notification Templates (system/email/SMS)
  • Registering custom Jinja methods or filters via hooks.py

DO NOT USE for:

  • Report Print Formats — they use JavaScript templating ({%= %}), NOT Jinja
  • Client Scripts — see frappe-syntax-clientscripts
  • Server Scripts — see frappe-syntax-serverscripts

Decision Tree: Which Template Type?

Need a printable document?
├─ YES → Is it for a Query/Script Report?
│        ├─ YES → Use JS Template ({%= %}), NOT Jinja
│        └─ NO  → Use Jinja Print Format
└─ NO  → Is it for email?
         ├─ YES → Is it triggered by workflow/notification?
         │        ├─ YES → Notification Template (Jinja)
         │        └─ NO  → Email Template (Jinja)
         └─ NO  → Is it a web page?
                  ├─ YES → Portal Page (www/*.html + .py controller)
                  └─ NO  → frappe.render_template() for ad-hoc rendering

Quick Reference: Jinja Syntax

SyntaxPurposeExample
{{ }}Output expression{{ doc.name }}
{% %}Control statement{% if doc.status == "Paid" %}
{# #}Comment{# This is a comment #}
{{ _("text") }}Translation{{ _("Invoice") }}
{{ val | filter }}Filter{{ name | default("N/A") }}
CRITICAL: Jinja vs JS Template Syntax
AspectJinja (Print Formats)JS Template (Report Print Formats)
Output{{ expression }}{%= expression %}
Code block{% statement %}{% js_code %}
LanguagePythonJavaScript
Contextdoc, frappedata, filters

NEVER use Jinja syntax in Report Print Formats. NEVER use {%= %} in standard Print Formats.


Context Objects by Template Type

Print Formats
ObjectDescription
docThe document being printed (full Document object)
frappeFrappe module (whitelisted methods only)
frappe.utilsUtility functions
_()Translation function
doc.items, doc.taxesChild table accessors (by fieldname)
Email Templates
ObjectDescription
docThe linked document (when triggered from a DocType)
frappeFrappe module (limited)
_()Translation function
Notification Templates
ObjectDescription
docThe document that triggered the notification
frappeFrappe module
_()Translation function
Portal Pages (www/*.html)
ObjectDescription
frappeFrappe module
frappe.session.userCurrent authenticated user
frappe.form_dictQuery parameters from URL
frappe.langCurrent language code
Custom contextSet via get_context(context) in .py controller

Full details: references/context-objects.md


Essential Methods (Whitelisted in Jinja)

Formatting: ALWAYS Use for Display
jinja
{# ALWAYS use get_formatted() for fields in Print Formats #}
{{ doc.get_formatted("posting_date") }}
{{ doc.get_formatted("grand_total") }}

{# Child table rows — ALWAYS pass parent doc for currency context #}
{% for row in doc.items %}
    {{ row.get_formatted("rate", doc) }}
    {{ row.get_formatted("amount", doc) }}
{% endfor %}

{# General formatting with explicit fieldtype #}
{{ frappe.format(value, {'fieldtype': 'Currency'}) }}
{{ frappe.format_date(doc.posting_date) }}
Document Retrieval
jinja
{# Full document — use only when multiple fields needed #}
{% set customer = frappe.get_doc("Customer", doc.customer) %}

{# Single field — ALWAYS prefer over get_doc for one field #}
{% set abbr = frappe.db.get_value("Company", doc.company, "abbr") %}

{# List of records (no permission check) #}
{% set tasks = frappe.get_all("Task",
    filters={"status": "Open"},
    fields=["title", "due_date"],
    order_by="due_date asc",
    page_length=10) %}

{# List with permission check (portal pages) #}
{% set orders = frappe.get_list("Sales Order",
    filters={"customer": doc.customer},
    fields=["name", "grand_total"]) %}
Translation: REQUIRED for All User-Facing Strings
jinja
<h1>{{ _("Invoice") }}</h1>
<p>{{ _("Total: {0}").format(doc.get_formatted("grand_total")) }}</p>
System & Session
jinja
{{ frappe.get_url() }}
{{ frappe.get_fullname() }}
{{ frappe.get_fullname(doc.owner) }}
{{ frappe.db.get_single_value("System Settings", "time_zone") }}
{% if frappe.session.user != "Guest" %}...{% endif %}

Full method reference: references/methods-reference.md


Control Structures

Conditionals
jinja
{% if doc.status == "Paid" %}
    <span class="paid">{{ _("Paid") }}</span>
{% elif doc.status == "Overdue" %}
    <span class="overdue">{{ _("Overdue") }}</span>
{% else %}
    <span>{{ doc.status }}</span>
{% endif %}
Loops with Child Tables
jinja
{% for item in doc.items %}
<tr>
    <td>{{ loop.index }}</td>
    <td>{{ item.item_name }}</td>
    <td>{{ item.get_formatted("amount", doc) }}</td>
</tr>
{% else %}
<tr><td colspan="3">{{ _("No items") }}</td></tr>
{% endfor %}
Loop Variables
VariableDescription
loop.index1-indexed position
loop.index00-indexed position
loop.firstTrue on first iteration
loop.lastTrue on last iteration
loop.lengthTotal number of items
Variables
jinja
{% set total = 0 %}
{% set name = doc.customer_name | default("Unknown") %}

Filters

FilterExampleNotes
default{{ val | default("N/A") }}ALWAYS use for optional fields
length{{ items | length }}Count items
join{{ names | join(", ") }}Join list to string
truncate{{ text | truncate(100) }}Truncate with ellipsis
escape{{ input | escape }}HTML-escape (default behavior)
safe{{ html | safe }}Render raw HTML — NEVER for user input
round{{ num | round(2) }}Round number
lower / upper{{ text | upper }}Case conversion

Full filter reference: references/filters-reference.md


Custom Jinja Methods & Filters via hooks.py

Show full SKILL.md (251 more words)Show less
hooks.py Registration
python
# hooks.py
jenv = {
    "methods": [
        "myapp.jinja.methods"       # Module with callable functions
    ],
    "filters": [
        "myapp.jinja.filters"       # Module with filter functions
    ]
}
Custom Method
python
# myapp/jinja/methods.py
import frappe

def get_company_logo(company):
    """Returns company logo URL. Called as get_company_logo() in Jinja."""
    return frappe.db.get_value("Company", company, "company_logo") or ""
jinja
<img src="{{ get_company_logo(doc.company) }}" alt="Logo">
Custom Filter
python
# myapp/jinja/filters.py
def nl2br(text):
    """Convert newlines to <br> tags. Used as {{ text | nl2br }}."""
    return (text or "").replace("\n", "<br>")
jinja
{{ doc.notes | nl2br | safe }}

Details: references/methods.md


Print Format Patterns

Minimal Print Format Template
jinja
<style>
    .print-header { background: #f5f5f5; padding: 15px; }
    .item-table { width: 100%; border-collapse: collapse; }
    .item-table th, .item-table td { border: 1px solid #ddd; padding: 8px; }
    .text-right { text-align: right; }
</style>

<div class="print-header">
    <h1>{{ doc.select_print_heading or _("Invoice") }}</h1>
    <p>{{ doc.name }} — {{ doc.get_formatted("posting_date") }}</p>
</div>

<table class="item-table">
    <thead>
        <tr>
            <th>#</th>
            <th>{{ _("Item") }}</th>
            <th class="text-right">{{ _("Qty") }}</th>
            <th class="text-right">{{ _("Amount") }}</th>
        </tr>
    </thead>
    <tbody>
        {% for row in doc.items %}
        <tr>
            <td>{{ loop.index }}</td>
            <td>{{ row.item_name }}</td>
            <td class="text-right">{{ row.qty }}</td>
            <td class="text-right">{{ row.get_formatted("amount", doc) }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

<p><strong>{{ _("Grand Total") }}: {{ doc.get_formatted("grand_total") }}</strong></p>
Page Breaks
css
/* v14/v15 (wkhtmltopdf) */
.page-break { page-break-before: always; }

/* v16 (Chrome PDF) — ALWAYS prefer break-* in v16 */
.page-break { break-before: page; }

Full examples: references/examples.md | Patterns: references/patterns.md


V16: Chrome PDF Rendering

Aspectv14/v15 (wkhtmltopdf)v16 (Chrome)
CSS SupportLimited CSS3Full modern CSS
Flexbox/GridPartialFull support
Page breakspage-break-*break-* preferred
FontsSystem fonts onlyWeb fonts supported
V16 Configuration
json
// site_config.json
{
    "pdf_engine": "chrome",
    "chrome_path": "/usr/bin/chromium"
}

Portal Page Pattern

www/projects/index.html
jinja
{% extends "templates/web.html" %}
{% block title %}{{ _("Projects") }}{% endblock %}

{% block page_content %}
<h1>{{ _("Projects") }}</h1>
{% for project in projects %}
    <h3>{{ project.title }}</h3>
    <p>{{ project.description | default("") | truncate(150) }}</p>
{% else %}
    <p>{{ _("No projects found.") }}</p>
{% endfor %}
{% endblock %}
www/projects/index.py
python
import frappe

def get_context(context):
    context.title = "Projects"
    context.no_cache = True
    context.projects = frappe.get_all("Project",
        filters={"is_public": 1},
        fields=["name", "title", "description"],
        order_by="creation desc")
    return context

Full structure: references/structure.md | Templates: references/templates.md


Critical Rules

ALWAYS
  1. Use _() for ALL user-facing strings
  2. Use get_formatted() for currency, date, and numeric fields
  3. Use default() filter for optional/nullable fields
  4. Pass parent doc to child row get_formatted("field", doc)
  5. Use frappe.db.get_value() when you need only one field
  6. Keep calculations in Python controllers, not Jinja templates
NEVER
  1. Execute database queries inside loops (N+1 problem)
  2. Use | safe on user-supplied input (XSS vulnerability)
  3. Use Jinja syntax in Report Print Formats (they require JS {%= %})
  4. Use frappe.get_doc() when frappe.db.get_value() suffices
  5. Hardcode strings without _() translation wrapper
  6. Disable safe_render without security review

Anti-patterns with fixes: references/anti-patterns.md


Reference Files

FileContents
references/syntax.mdJinja syntax reference (tags, filters, tests, loops)
references/methods.mdCustom Jinja methods/filters via hooks
references/context-objects.mdAvailable objects per template type
references/filters-reference.mdAll standard and custom Frappe filters
references/methods-reference.mdAll frappe.* methods available in Jinja
references/examples.mdComplete Print Format, Email, Portal examples
references/anti-patterns.mdCommon mistakes and correct alternatives
references/templates.mdTemplate structure patterns
references/patterns.mdConditional rendering, loops, child tables
references/structure.mdFile structure for template types

See Also

  • frappe-syntax-hooks — jenv configuration in hooks.py
  • frappe-impl-printformat — Print Format implementation patterns
  • frappe-errors-serverscripts — Server-side error handling

© Impertio-Studio, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files (references) in skills/source/syntax/frappe-syntax-jinja of Impertio-Studio/Frappe_Claude_Skill_Package.

  • SKILL.md
  • references/anti-patterns.md
  • references/context-objects.md
  • references/examples.md
  • references/filters-reference.md
  • references/methods-reference.md
  • references/methods.md
  • references/patterns.md
  • references/structure.md
  • references/syntax.md
  • references/templates.md

Open the folder on GitHubat commit 36cfa80

Compare with similar skills

Frappe Syntax Jinja next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Frappe Syntax Jinja compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Frappe Syntax Jinja this skillImpertio-Studio/Frappe_Claude_Skill_Package188—~3.2kAutomated safety check: PassMIT
Stripe Projectsfossasia/eventyay1.7k5 repos~2kAutomated safety check: NotesApache-2.0
WooCommerce Email Editor Developmentwoocommerce/woocommerce11k—~893Automated safety check: PassCustom licence
Email Best Practicesviclafouch/meme-studio1107 repos~787Automated safety check: PassNone
Kindleheartleo/zlib667—~1.4kAutomated safety check: NotesMIT
React Emailviclafouch/meme-studio1102 repos~3.6kAutomated safety check: PassMIT

Similar skills

  • Stripe Projects

    fossasia/eventyay

    A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.

    1.7k GitHub starsUsed in 5 repos~2k tokens
    Backend & APIsAuto-check: notes
  • Sets up a local environment for the WooCommerce block email editor, with a watcher, Mailpit email capture and build and test commands for its PHP and JS packages.

    11k GitHub stars~893 tokensUpdated today
    Backend & APIsAuto-check passed
  • Email Best Practices

    viclafouch/meme-studio

    A skill your agent uses when building email features, emails going to spam, high bounce rates, setting up SPF/DKIM/DMARC authentication, implementing email capture, ensuring compliance (CAN-SPAM…

    110 GitHub starsUsed in 7 repos~787 tokens
    Backend & APIsAuto-check passed
  • Kindle

    heartleo/zlib

    Send a downloaded book file to a Kindle via the zlib CLI, and walk the user through the one-time SMTP/Amazon setup it needs.

    667 GitHub stars~1.4k tokensUpdated 2 days ago
    Documents & OfficeAuto-check: notes
  • React Email

    viclafouch/meme-studio

    A skill your agent uses when creating HTML email templates with React components - welcome emails, password resets, notifications, order confirmations, newsletters, or transactional emails.

    110 GitHub starsUsed in 2 repos~3.6k tokens
    Backend & APIsAuto-check passed
  • Pinme Email

    glitternetwork/pinme

    A skill your agent uses when a PinMe project (Worker TypeScript) needs to integrate email sending (sendemail).

    3.7k GitHub stars~1.2k tokensUpdated 28 days ago
    Backend & APIsAuto-check passed

More from Impertio-Studio/Frappe_Claude_Skill_Package

All 61 skills in this repo
  • Frappe Ops Website Deploy

    Impertio-Studio/Frappe_Claude_Skill_Package

    Deploy HTML/CSS websites to ERPNext/Frappe (v15/v16) as Web Pages via the REST API.

    188 GitHub stars~2.5k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Architect

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when designing multi-app Frappe architectures, deciding whether to split functionality into separate apps, or implementing cross-app communication patterns.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Debugger

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when debugging Frappe errors, using bench console for live inspection, analyzing tracebacks, or reading Frappe log files.

    188 GitHub stars~2.9k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Interpreter

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when receiving vague or unclear ERPNext/Frappe development requests that need interpretation.

    188 GitHub stars~3.2k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Migrator

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when migrating a Frappe app between major versions, detecting breaking API changes, or resolving post-migration errors.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check: notes
  • Frappe Agent Validator

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when reviewing or validating Frappe/ERPNext code against best practices and common pitfalls.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check passed

Questions about Frappe Syntax Jinja

What does Frappe Syntax Jinja do?

A skill your agent uses when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages. Frappe Syntax Jinja is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when writing Jinja templates for ERPNext/Frappe Print Formats, Email Templates, and Portal Pages.

When should I use Frappe Syntax Jinja?

Frappe Syntax Jinja fits situations like: writing Jinja templates for ERPNext/Frappe Print Formats; email Templates.

How do I install Frappe Syntax Jinja in Claude Code?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-syntax-jinja -a claude-code`. Or copy the skill folder (skills/source/syntax/frappe-syntax-jinja in Impertio-Studio/Frappe_Claude_Skill_Package) into .claude/skills/frappe-syntax-jinja in your project. Claude Code loads it when a task matches its description.

How do I install Frappe Syntax Jinja in Codex?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-syntax-jinja -a codex`. Or copy the skill folder (skills/source/syntax/frappe-syntax-jinja in Impertio-Studio/Frappe_Claude_Skill_Package) into .agents/skills/frappe-syntax-jinja in your project. Codex loads it when a task matches its description.

Can I use Frappe Syntax Jinja in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-syntax-jinja -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frappe-syntax-jinja, .gemini/skills/frappe-syntax-jinja, .github/skills/frappe-syntax-jinja and .opencode/skills/frappe-syntax-jinja in your project.

What does Frappe Syntax Jinja need to run?

SKILL.md names no scripts, command-line tools or credentials: Frappe Syntax Jinja is instructions for the agent only. Our summary lists: Python 3. Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16..

Does Frappe Syntax Jinja access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Frappe Syntax Jinja safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Frappe Syntax Jinja use?

Frappe Syntax Jinja is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Frappe Syntax Jinja use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 17k tokens, read only when the agent opens those files.

What are the alternatives to Frappe Syntax Jinja?

Skills that share tags, products or a category with Frappe Syntax Jinja: Stripe Projects (fossasia/eventyay, 1.7k stars), WooCommerce Email Editor Development (woocommerce/woocommerce, 11k stars), Email Best Practices (viclafouch/meme-studio, 110 stars) and Kindle (heartleo/zlib, 667 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Frappe Syntax Jinja?

Impertio-Studio (a GitHub organization) maintains it in Impertio-Studio/Frappe_Claude_Skill_Package, which has 188 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on September 17, 2026.

Source: Impertio-Studio/Frappe_Claude_Skill_Package on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.