Help us improve
Share bugs, ideas, or general feedback.
From power-pages-liquid
Use when working with Microsoft Power Pages Liquid templates — .liquid files, web templates, content snippets, entity lists, entity forms, web forms, FetchXML queries, or Dataverse-backed Power Pages sites. Power Pages Liquid is DotLiquid-based and is NOT Shopify Liquid. NEVER emit Shopify tags ({% paginate %}, {% section %}, {% schema %}, {% layout %}, {% form 'x' %}, {% render %}), Shopify objects (product, collection, cart, customer, shop, linklists), or Shopify filters (asset_url, asset_img_url, img_url, money, money_with_currency, stylesheet_tag, script_tag, handleize, within).
npx claudepluginhub martybonacci/power-pages-liquid-js-pluginHow this skill is triggered — by the user, by Claude, or both
Slash command
/power-pages-liquid:power-pages-liquidThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Microsoft Power Pages (formerly Power Apps Portals) uses a **DotLiquid**-based Liquid dialect that talks to **Dataverse**. It shares the base Liquid grammar with Shopify but has a completely different tag/object/filter vocabulary. The most common failure mode is reaching for Shopify syntax that does not exist here.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Breaks plans, specs, or PRDs into thin vertical-slice issues on the project issue tracker using tracer bullets. Useful for converting high-level work into grabbable implementation tickets.
Share bugs, ideas, or general feedback.
Microsoft Power Pages (formerly Power Apps Portals) uses a DotLiquid-based Liquid dialect that talks to Dataverse. It shares the base Liquid grammar with Shopify but has a completely different tag/object/filter vocabulary. The most common failure mode is reaching for Shopify syntax that does not exist here.
| Don't write | Write instead |
|---|---|
{% paginate products by 10 %} | {% entitylist name:"name" %} (built-in paging) or paginate manually with request.params['page'] + slice |
{% section 'header' %} | {% include 'snippet_name' %} or {% include 'web_template_name' %} |
{% schema %} | (delete) — themes are configured in the Power Pages portal, not in Liquid |
{% layout 'theme' %} | {% extends 'page_template_name' %} (DotLiquid template inheritance) |
{% form 'contact' %} | {% entityform name:'Form Name' %} or {% webform name:'Web Form Name' %} |
{% style %} / {% javascript %} | raw <style> / <script> blocks |
{% render 'x' %} | {% include 'x' %} (Power Pages does not support render) |
product.title, products[...] | Dataverse: {% fetchxml %} or {% entityview %}; rows via entities['cr_product'][id].cr_name |
collection.*, collections[...] | No collections. Query Dataverse tables. |
cart.* | No cart. Custom or Dataverse-backed. |
customer.* | user.* (current portal user / Dataverse contact) |
shop.* | website.*, settings.* |
linklists.main_menu | weblinks['Web Link Set Name'] |
block.settings, section.settings | No Shopify blocks. Use snippet params and web template attributes. |
| asset_url, | asset_img_url, | img_url, | img_tag | Site-relative paths or | url. Write <img> tags explicitly. |
| money, | money_with_currency, | weight_with_unit | Format manually via | string and arithmetic. |
| stylesheet_tag, | script_tag | Raw <link rel="stylesheet"> / <script src=""> tags. |
| handleize, | within | No handles or collection contexts. |
A PreToolUse hook in this plugin hard-blocks Write/Edit/MultiEdit on .liquid files containing any of these. If a write is blocked, the stderr message names the offender and the fix — apply it and retry.
{% entitylist name:"List Name" %}...{% endentitylist %} — render a configured Dataverse entity list (cards, table, filters, paging).{% entityview name:"View Name" entity:"logicalname" %} — render a Dataverse view by name.{% entityform name:"Form Name" %} — render a single-step entity form.{% webform name:"Web Form Name" %} — render a multi-step web form.{% include 'snippet_name' %} — include a content snippet or another web template.{% block name %}...{% endblock %} and {% extends 'page_template' %} — DotLiquid inheritance.{% chart id:"chart-id" viewid:"view-id" %} — embed a Dataverse chart.{% powerbi authentication_type:"..." path:"..." %} — embed a Power BI report.{% editable entity field:"name" %} — inline-editable content for portal authors.{% fetchxml q %}<fetch>...</fetch>{% endfetchxml %} — run a FetchXML query against Dataverse; results in q.results.{% searchindex query:"..." %}...{% endsearchindex %} — Lucene-backed portal search.{% assign %}, {% capture %}, {% if %}, {% for %}, {% case %}, {% comment %}, {% raw %}, {% cycle %} — standard Liquid control flow (supported).See references/tags.md for full signatures and worked examples.
entities['logicalname'][id] — a Dataverse row by GUID.user — current authenticated portal user (a contact). Properties include id, fullname, firstname, lastname, emailaddress1, and any custom attributes; helper methods like user.has_role['Administrators'].page — the current web page (a Dataverse adx_webpage). page.title, page.url, page.parent, page.children.website — the current website (adx_website).request — request info: request.url, request.path, request.path_and_query, request.params['key'].params — alias for request.params.settings — site settings configured in the portal.snippets['Name'] — content snippets (HTML content authored in the portal).sitemap, sitemarkers['Marker Name'] — site navigation and named page anchors.weblinks['Web Link Set Name'] — configured navigation link sets.forloop, tablerowloop — standard loop helpers.See references/objects.md.
liquid — render a string as Liquid (rare, powerful).url, url_escape — site-aware URL helpers.xml_escape, escape, h — output escaping.has_role — boolean check used like {% if user | has_role:'Administrators' %}.boolean, integer, decimal, string — type coercion (DotLiquid-specific).default, date, truncate, truncatewords, replace, remove, append, prepend, split, join, size, first, last, sort, reverse, where, map, upcase, downcase, capitalize, strip, escape, newline_to_br.See references/filters.md.
Pull these when the user's task needs more than the quick reference above.
references/tags.md — every Power Pages tag with full signature and a worked example.references/objects.md — every object with available properties and sample access.references/filters.md — full filter list with DotLiquid notes.references/fetchxml-cookbook.md — common FetchXML query patterns inside {% fetchxml %} blocks.references/shopify-vs-power-pages.md — the anti-pattern crib sheet (mirrors the hook's enforcement list).references/recipes.md — end-to-end recipes (role-gated content, paginated entity lists, web form embed, chart embed, multi-language snippets).product, collection, cart, customer, shop, or linklists? Stop, this is Shopify.{% entitylist %} or {% fetchxml %} — never invent objects.{% extends %} + {% block %}, not {% layout %}.{% include %}, not {% render %} or {% section %}.