The syntax of every tag, by group.
{case value} {when 'a'} ... {when 'b', 'c'} ... {/case}
{case value} {when 'a'} ... {else} ... {/case}
{false}
{false} ... {/false}
{false} ... @else@ ... {/false}
{if condition} ... {/if}
{if condition} ... {else} ... {/if}
{if condition} ... {elseif condition} ... {else} ... {/if}
{ifchanged value} ... {/ifchanged}
{ifchanged value, value} ... {/ifchanged}
{ifchanged value} ... @else@ ... {/ifchanged}
{null}
{null} ... {/null}
{null null='name'} ... {/null}
{switch 'odd', 'even'}
{switch 'red', 'green', 'blue'}
{branch} ... {recurse} ... {/branch}
{branch} ... @else@ ... {/branch}
{break}
{break 'name'}
{cease}
{cease 'name'}
{continue}
{continue 'name'}
{recurse}
{tree 'rows'} ... {recurse} ... {/tree}
{tree data='rows', children='items'} ... {branch} ... {recurse} ... {/branch} ... {/tree}
{tree 'rows'} ... @else@ ... {/tree}
{until condition} ... {/until}
{until} ... {/until condition}
{while condition} ... {/while}
{while} ... {/while condition}
{at 'field@store'}
{at "path.key='value'.field@store"}
{bool 'name'} expression {/bool}
{bool 'name', value}
{name} ... @else@ ... {/name}
{content 'name'} ... {/content}
{content 'name', 'text'}
{content} ... {/content 'name'}
{count 'name'} ... {/count}
{count 'name'} ... @else@ ... {/count}
{data 'name'} ... {/data}
{data 'name', type='csv'} ... {/data}
{data 'name', source}
{data} ... {/data 'name'}
{set $name = value}
{set $name = value, $other = value}
{array "* from table where ..."} ... {/array}
{array "* from orders", name='orders'} ... {/array}
{check "table where ..."} ... {/check}
{check "users where email='x@y.z'"} ... @else@ ... {/check}
{collection 'name'} ... {/collection}
{collection 'name', slug=$slug} ... @else@ ... {/collection}
{collection 'name', html} ... {/collection}
{field "column from table where ..."}
{field "count(*) from orders", name='orderCount'}
{record "* from table where ..."} ... {/record}
{record "* from users where id=5", name='user'} ... @else@ ... {/record}
{ajax 'name'}
{ajax 'name', fragment='fragmentName'}
{ajax 'name', app='other'}
{ajax 'name', $colour = 'red'}
{code} ... {/code}
{code sandbox} ... {/code}
{code reset} ... {/code}
{code clean} ... {/code}
{code function='name'} ... {/code}
{echo $snippet | code}
{get 'name'}
{get 'name', $colour = 'red'}
{live 'name'} ... <button pad-click="event" pad-value="value">...</button> ... {/live}
{live 'name'} ... <form pad-submit="event">...</form> ... {/live}
{live 'name'} ... <select name="field" pad-change="event">...</select> ... {/live}
{pad} ... {/pad}
{pad data='store', name='rows'} ... {/pad}
{pad $name = 'value'} ... {/pad}
{pad} ... {/pad | upper}
{page 'dir/name'}
{page 'products/42'}
{page 'name', include=false}
{page 'name', sandbox}
{page 'name', reset}
{page 'name', clean}
{page 'name', function='name'}
{page 'name', app='other', ajax=false}
{restart 'name'}
{restart 'name', $message = 'Saved'}
{sandbox} ... {/sandbox}
{sandbox function='name'} ... {/sandbox}
{echo $snippet | sandbox}
{csrf}
{csrf token}
{flash} {$message} {$type} {/flash}
{flash} ... @else@ ... {/flash}
{flash 'error'} {$message} {/flash}
{form 'name'} ... {/form}
{form 'name', method='get', class='search'} ... {/form}
{form 'name', error='Please correct the errors below.'} ... {/form}
{form 'name', client, error} ... {/form}
{input 'name'}
{input 'email', type='email', label='E-mail', value='', id='mail', placeholder='you@example.org', required}
{input 'terms', type='checkbox', label='I agree', value='yes', checked}
{input 'email', type='email', label='E-mail', rules='required|email'}
{nonce}
{textarea 'message'}
{textarea 'message', label='Message', value='', id='msg', rows=6, required}
{textarea 'message', label='Message', rows=6, rules='required|max:2000'}
{validator}
{auth} ... {/auth}
{auth} Hello {$name} {else} ... {/auth}
{auth} ... @else@ ... {/auth}
{can 'ability'} ... {/can}
{can 'ability', $value} ... {else} ... {/can}
{rows}{can 'ability', $rows} ... {/can}{/rows}
{cannot 'ability', $value} ... {/cannot}
{cannot 'ability', $value} ... {else} ... {/cannot}
{feature 'flag'} ... {/feature}
{feature 'flag'} ... {else} ... {/feature}
{guest} ... {/guest}
{guest} ... {else} ... {/guest}
{dir $path} {$dir} {/dir}
{exists $path} ... {/exists}
{exists $path} ... @else@ ... {/exists}
{file dir='exports', name='orders', ext='csv'} ... {/file}
{file dir='reports', name='daily', ext='html', date, stamp, id=8} ... {/file}
{files 'dir', base='app'} {$item} {$file} {$ext} {/files}
{files dir='dir', base='data', mask='*.txt', exclude='old*', recursive, onlyFiles, includeHidden} ... {/files}
{files 'dir', base='app', onlyDirs} ... {/files}
{curl 'https://example.com/data.json'}
{curl url='https://example.com/data.json', ttl=600}
{curl 'https://example.com/api', post='a=1&b=2', user='name', password=$secret}
{curl 'SELF://shop/?orders', $status='open'}
{curl 'https://example.com/api', get=$query, cookies=$jar, headers=$headers, options=$curlOptions}
{mail to=$email, template='order', subject='Order confirmation'}
{mail to=$email, subject='Welcome', from='shop@example.com', cc='a@example.com', bcc='b@example.com', replyTo='help@example.com'} ... {/mail}
{asset 'file'}
{asset 'file', tag}
{cache 'name'} ... {/cache}
{cache 'name', ttl=300, vary=$value} ... {/cache}
{anytag cache=3600, vary=$value} ... {/anytag}
{close}
{echo expression}
{echo expression | pipe | pipe}
{flush}
{foo}
{pad:foo}
{ignore} ... {/ignore}
{nocache} ... {/nocache}
{cache 'name', ttl=300} ... {nocache} ... {/nocache} ... {/cache}
{open}
{output 'type'}
{reactData id='products'}
{reactData id='products', provider='catalog', type='array'}
{spaceless} ... {/spaceless}
{tidy} ... {/tidy}
{trans 'key'}
{trans 'key', count=$n}
{trans 'key', name=$value, other=$value}
{vite 'src/main.js'}
{vite 'src/main.jsx', 'src/admin.js', react}
{attrs name=$value, other=$value}
{attrs required, aria-expanded=$open}
{attrs $array}
{classes 'fixed names', name=condition, other=condition}
{classes $array}
{countdown '2026-12-31 00:00'}
{countdown $moment, units=3, past='We are live!', live}
{countdown $moment, now='2026-10-08 12:00', format='j M Y'}
{diff $old, $new}
{diff $old, $new, lines, from='Monday', to='Friday'}
{diff $old, $new, side, from='before', to='after'}
{emoji 'rocket'}
{emoji ':tada:', label='Party!'}
{excerpt $text, words=40}
{excerpt $text, words=24, highlight=$q, ellipsis='...'}
{excerpt $html, words=30, html}
{highlight 'lang'} ... {/highlight}
{highlight 'lang', lines, mark='3, 5-7'} ... {/highlight}
{highlight file='_data/products.json'}
{lorem}
{lorem words=4}
{lorem sentences=2, seed=7}
{lorem paragraphs=3, sentences=4, varied}
{markdown $text}
{markdown} ... {/markdown}
{markdown html} ... {/markdown}
{markdown ignore} ... {/markdown}
{source}
{source 'page', files='_lib/orders.php, www:orders.js'}
{source only='_tags/card.pad, www:card.js'}
{timeago $moment}
{timeago $moment, now='2026-10-08 12:00', format='j M Y'}
{toc}
{toc levels='2-4', title='On this page', list='ul'}
{barcode 'number'}
{barcode $code, type='code128', height=60, scale=2, title='text', plain, color='#000', background='#fff'}
{calendar}
{calendar '2026-10', data='name', date='field', title='field', link='field', query='month', sunday}
{calendar '2026-10', data='name'} ... {days} ... {events} ... {/events} ... {/days} ... {/calendar}
{chart 'bar', data='name', label='field', value='field, field', stacked, title='text', width=600, height=300}
{chart 'line', sequence='fibonacci', rows=12}
{chart 'pie', data='name', label='field', value='field'}
{chart 'scatter', data='name', x='field', y='field', size='field', color='field', trend}
{chart 'gauge', value=72, from=0, to=100, bands='60, 85', target=80, unit='%'}
{chart 'bar', label='field', value='field', type='csv'} ... {/chart}
{diagram direction='LR', edges='curved', title='text'} A[Start] --> B{Ready?} {/diagram}
{diagram type='sequence', title='text'} Shop ->> Bank: Charge {/diagram}
{map 'world', data='name', key='field', value='field', scale='quantile', title='text', width=720, height=400}
{map 'europe', key='field', value='field'} ... {/map}
{qr 'text'}
{qr $url, size=160, level='M', title='text', color='#000', background='#fff'}
{sparkline data='name', label='field', value='field', title='text', width=120, height=32}
{sparkline sequence='fibonacci', rows=12}
{sparkline type='json'} ... {/sparkline}
{timeline data='name', date='field', label='field', text='field', color='field', format='Y', title='text', width=720, height=300}
{timeline data='name', from='field', to='field', date='field', label='field'}
{timeline date='field', label='field', vertical} ... {/timeline}
{avatar 'name'}
{avatar $name, size=48, shape='square', label='text'}
{country 'NL'}
{country $code, name}
{gravatar $email}
{gravatar $email, size=64, default='identicon', alt='text'}
{gravatar $email, fallback='avatar', alt='text'}
{icon 'arrow-right'}
{icon 'trash', size=20, stroke=2, label='text'}
{identicon $email}
{identicon $value, size=64, title='text'}
{img 'photos/harbour.jpg', width=400, height=300, alt='text'}
{img 'photos/dunes.jpg', width=300, height=300, fit='contain', format='webp', quality=70, alt=''}
{pdf file='name', size='A4', landscape, font='helvetica', title='text'} ... {/pdf}
{pdf preview, file='name'} ... {/pdf}
{pdf download}
{placeholder '600x300', text='text'}
{placeholder ratio='16:9', width=640, fluid}
{progress 72}
{progress $done, max=100, label='text', color='success', size='small'}
{progress 3, max=5, steps, label='text'}
{rating 4.5}
{rating $score, max=5, size=20, icon='heart', label='text'}
{video 'https://www.youtube.com/watch?v=id', title='text'}
{video 'https://vimeo.com/id#t=1m30s', title='text', poster='photos/still.jpg', ratio='16:9'}
{video 'clips/sunrise.webm', title='text', poster='photos/sunrise.jpg'}
{accordion} {tab 'label'} ... {/tab} {tab 'label'} ... {/tab} {/accordion}
{accordion single, open=1} ... {/accordion}
{accordion open} ... {/accordion}
{carousel} {tab 'caption'} ... {/tab} {tab} ... {/tab} {/carousel}
{carousel label='Name'} ... {/carousel}
{copy 'text'}
{copy $value, label='Copy command'}
{copy label='Copy'} ... {/copy}
{datatable data='name', columns='a, b, c', labels='A, B, C', totals='c'}
{datatable data='name', format="c:currency('EUR')", sortable, striped, caption='Caption'}
{datatable data='name', rows=10, query='prefix_'}
{datatable totals='amount'} month,amount ... {/datatable}
{jsonview $value}
{jsonview $value, open=1, title='Label'}
{jsonview data='name'}
{jsonview} {"id": 42, "paid": true} {/jsonview}
{modal 'name'} ... {/modal}
{modal 'name', title='Heading', button='Button text'} ... {/modal}
{poll 'name', options='Yes, No'}
{poll 'name', options='PHP, Python, Go', title='Question?', button='Vote', results}
{tab 'label'} ... {/tab}
{tabs} {tab 'label'} ... {/tab} {tab 'label'} ... {/tab} {/tabs}
{tabs active='label'} ... {/tabs}
{chess 'fen'}
{chess 'fen', flip, highlight='e2, e4', arrow='e2-e4, g8-f6', size=320, title='Name'}
{crossword} WORD: clue ... {/crossword}
{crossword solution, title='Name'} WORD: clue ... {/crossword}
{sudoku 'puzzle'}
{sudoku 'puzzle', solve, title='Caption'}
{block 'name'} default content {/block}
{block 'name'} {parent} more content {/block}
{define 'name'} ... {#parm} ... @content@ ... {/define}
{define 'name'} {parms title, tone='info'} ... {slot 'footer'}@content@{/slot} {/define}
{name parm='value'}
{name parm='value'} content {slot 'footer'}fill{/slot} {/name}
{define:name ...}
{extends 'layout'}
{extends $layout}
{fragment 'name'} ... {/fragment}
{macro 'name', required, optional='default'} ... {$required} {$optional} ... {/macro}
{name 'value'}
{name 'value', 'other'}
{name required='value', optional=$x}
{name 'value'} content for @content@ {/name}
{macro:name ...}
{meta title='Title', name=value}
{meta layout='layout', cache=600, access='admin', sitemap=false}
{block 'name'} {parent} ... {/block}
{parms name}
{parms title, subtitle='', tone='info'}
{push 'name'} ... {/push}
{push 'name', once='key'} ... {/push}
{push 'name', once} ... {/push}
{shadow} ... {/shadow}
{shadow css='file.css, www:other.css', mode='closed', focus} ... {/shadow}
{slot 'name'} default content {/slot}
{slot 'name'} <footer>@content@</footer> {/slot}
{slot 'name'/}
{assert condition}
{assert condition, 'message'}
{debug}
{debug $value, $other}
{debug label=$value}
{error 'message'}
{exception 'message'}
{exit}
{action store, reverse} ... {/action}
{action reverse, store} ... {/action}
{action store, first=2} ... {/action}
{action sum, '31..40'} ... {/action}
{action:reverse store} ... {/action:reverse}
{action:shift store, 2} ... {/action:shift}
{flag '1..10', even} ... {/flag}
{flag prime, from=10, rows=12} ... {/flag}
{flag:prime rows=10} ... {/flag:prime}
{flag store, prime} ... {/flag}
{keep '1..50', square} ... {/keep}
{keep palindrome, from=100, rows=5} ... {/keep}
{keep:prime from=10, rows=4} ... {/keep:prime}
{keep store, even} ... {/keep}
{make '1..5', add=10} ... {/make}
{make '1..5', add=10, multiply=2} ... {/make}
{make '1..6', prime} ... {/make}
{make:fibonacci rows=8} ... {/make:fibonacci}
{make store, square} ... {/make}
{pull 'store'} ... {/pull}
{pull} ... {/pull}
{pull:store} ... {/pull:store}
{pull 'store', reverse, first=3} ... {/pull}
{pull 'store', keep, prime} ... {/pull}
{remove '1..10', prime} ... {/remove}
{remove prime, rows=5} ... {/remove}
{remove:odd rows=5} ... {/remove:odd}
{remove store, even} ... {/remove}
{resume reverse}
{resume add=10}
{resume keep, prime}
{resume first=3}
{sequence '1..10'} ... {/sequence}
{sequence range='1..100', increment=5} ... {/sequence}
{sequence list='3;1;2'} ... {/sequence}
{sequence prime, rows=10, name='p'} ... {/sequence}
{sequence fibonacci, from=1, to=20, stop=100, skip=2} ... {/sequence}
{sequence random, minimal=1, maximal=100, rows=5, unique, randomly} ... {/sequence}
{sequence '1..20', keep, prime, sum} ... {/sequence}
{sequence '1..20', keep='prime', action='first|3'} ... {/sequence}
{sequence prime, rows=10, push='primes', toData='primeList'}
{sequence pull='primes', reverse} ... {/sequence}