PAD Showcase
PAD · tags

Tags that draw,
format and interact.

Diagrams, maps, timelines, avatars and icons as SVG; tables, diffs, tables of contents and JSON views; thumbnails, video and PDF; tabs, modals and carousels without JavaScript of your own; chess boards and puzzles. Every one rendered on the server from a tag.

  • 32 tags
  • 65 examples

Avatar

Initials in a circle, coloured by a hash of the name - no image needed
Ada Lovelace AL Ada Lovelace AL Ada Lovelace AL Grace Hopper GH linus.torvalds@example.org LT The artist P
Sizes and shapes Circles and rounded squares from 24 to 72 pixels; an e-mail address counts by the words before its @.
  • Herbert Jebbink HJ Herbert Jebbink
    Founder and engine
  • Ada Lovelace AL Ada Lovelace
    Sequences
  • Grace Hopper GH Grace Hopper
    Compilers and tooling
  • Alan Turing AT Alan Turing
    Expression evaluator
  • Émile Zola ÉZ Émile Zola
    Translations
  • Margaret Hamilton MH Margaret Hamilton
    Error handling
A team list Every member gets a circle with their initials - the colour comes from a hash of the name, the text colour from its contrast.

Diagram

Flowcharts and sequence diagrams from a few lines of text, laid out on the server
OAuth sign-in User to Browser: Sign in; Browser to Provider: Authorize; Provider to Browser: Redirect with a code; Browser to App: GET /callback; App to Provider: Exchange the code; Alt: Code is valid; Provider to App: Access token; App to Browser: Signed in; Else: Expired; App to Browser: Try again; Note: The token never reaches the browser User User Browser Browser App App Provider Provider alt [Code is valid] [Expired] User → Browser: Sign in 1. Sign in Browser → Provider: Authorize 2. Authorize Provider → Browser: Redirect with a code 3. Redirect with a code Browser → App: GET /callback 4. GET /callback App → Provider: Exchange the code 5. Exchange the code Provider → App: Access token 6. Access token App → Browser: Signed in 7. Signed in App → Browser: Try again 8. Try again Note: The token never reaches the browser The token never reaches the browser
Signing in with a provider A sequence diagram - lifelines, numbered messages, replies dashed, an alt frame with its else and a note.
Handling an order Order placed → In stock?; In stock? → Order from supplier (no); Order from supplier → In stock? (delivered); In stock? → Take payment (yes); Take payment → Paid?; Paid? → Send a reminder (no); Send a reminder → Take payment; Paid? → Orders database (yes); Orders database → Shipped Order placed → In stock? In stock? → Order from supplier (no) Order from supplier → In stock? (delivered) In stock? → Take payment (yes) Take payment → Paid? Paid? → Send a reminder (no) Send a reminder → Take payment Paid? → Orders database (yes) Orders database → Shipped no delivered yes no yes Order placed In stock? Order from supplier Take payment Paid? Send a reminder Orders database Shipped
An order, start to finish A flowchart in Mermaid-style lines - a stadium, decisions, a database and dashed loops back, ranked and routed on the server.
Deploy pipeline Commit → Build; Build → Tests; Build → Lint; Build → Audit; Tests → Green?; Lint → Green?; Audit → Green?; Green? → Live (yes); Green? → Commit (no) Commit → Build Build → Tests Build → Lint Build → Audit Tests → Green? Lint → Green? Audit → Green? Green? → Live (yes) Green? → Commit (no) yes no Commit Build Tests Lint Audit Green? Live
A deploy pipeline, left to right direction=LR and curved edges: a build fans out to three checks with &, and all of them have to pass before the release.

Icon

Around eighty interface icons drawn as lines in the colour of the text

See every icon

Done Information Warning Failed

Icons in buttons and links An icon beside text is decoration; one alone gets label= and is read out. size= and stroke= change its scale and weight.
  • arrow-right
  • arrow-left
  • arrow-up
  • arrow-down
  • chevron-right
  • chevron-left
  • chevron-up
  • chevron-down
  • external
  • refresh
  • sort
  • maximize
  • minimize
  • check
  • x
  • plus
  • minus
  • check-circle
  • x-circle
  • info
  • alert
  • help
  • star
  • heart
  • bookmark
  • flag
  • tag
  • zap
  • home
  • menu
  • grid
  • list
  • more-horizontal
  • more-vertical
  • search
  • filter
  • settings
  • log-in
  • log-out
  • link
  • user
  • users
  • mail
  • message
  • send
  • share
  • phone
  • bell
  • calendar
  • clock
  • globe
  • map-pin
  • sun
  • moon
  • cloud
  • file
  • folder
  • copy
  • edit
  • trash
  • download
  • upload
  • printer
  • image
  • camera
  • cart
  • play
  • pause
  • stop
  • lock
  • unlock
  • key
  • eye
  • eye-off
  • power
  • code
  • terminal
  • database
  • bar-chart
Every icon The whole set, listed by padIconNames () - lines on a 24 by 24 grid in the colour of the text.

Identicon

A symmetric 5 by 5 pattern from a SHA-256 hash - every account its own picture
Identicon herbert@example.com
2009-03-14
Identicon ada@example.org
2015-12-10
Identicon grace@example.net
2018-07-01
Identicon alan@example.com
2021-06-23
Identicon Ada@Example.org
the same address, other spelling
Accounts at a glance An identicon per e-mail address: trimmed and lower-cased first, so every spelling of one address is one picture.
User 1 User 2 User 3 User 4 User 5 User 6 User 7 User 8 User 9 User 10 User 11 User 12 User 13 User 14 User 15 User 16 User 17 User 18 User 19 User 20
A wall of identicons Twenty user ids, twenty patterns - each mirrored left to right, each in a colour of its own.

Map

Choropleth maps of the world and its regions, a colour step per value
Forest, % of land area, 2021 Suriname: 97.4; Guyana: 93.5; Brazil: 59.1; Peru: 56.4; Colombia: 52.9; Venezuela: 52.3; Ecuador: 50.2; Bolivia: 46.6; Paraguay: 39.9; Chile: 24.5; Uruguay: 11.9; Argentina: 10.4 Aruba Barbados Costa Rica Curaçao Fiji Falkland Islands France Grenada S. Geo. and the Is. Honduras Kiribati Saint Lucia Nicaragua Netherlands New Zealand Panama Trinidad and Tobago St. Vin. and Gren. Argentina: 10.4 Bolivia: 46.6 Brazil: 59.1 Chile: 24.5 Colombia: 52.9 Ecuador: 50.2 Guyana: 93.5 Peru: 56.4 Paraguay: 39.9 Suriname: 97.4 Uruguay: 11.9 Venezuela: 52.3 10.4 97.4 no value
Forest in South America A regional view keyed by ISO alpha-3 codes, the rows as JSON in a data store.
Population in millions, 2023 India: 1,428; China: 1,410; United States of America: 340; Indonesia: 277; Pakistan: 240; Nigeria: 224; Brazil: 216; Bangladesh: 173; Russia: 144; Mexico: 128; Ethiopia: 127; Japan: 124; Philippines: 117; Egypt: 113; Democratic Republic of the Congo: 102; Vietnam: 99; Iran: 89; Turkey: 85; Germany: 84; Thailand: 72; United Kingdom: 68; Tanzania: 67; France: 65; South Africa: 60; Italy: 59; Kenya: 55; Myanmar: 54; Colombia: 52; South Korea: 52; Sudan: 48; Uganda: 48; Spain: 48; Argentina: 46; Algeria: 45; Iraq: 45; Afghanistan: 42; Canada: 39; Poland: 37; Morocco: 37; Saudi Arabia: 37; Ukraine: 37; Angola: 37; Uzbekistan: 35; Peru: 34; Malaysia: 34; Mozambique: 34; Ghana: 34; Yemen: 34; Nepal: 31; Venezuela: 28; Madagascar: 30; Cameroon: 28; Australia: 26; North Korea: 26; Niger: 27; Mali: 23; Kazakhstan: 20; Chile: 20; Romania: 19; Netherlands: 18; and 20 more Andorra United Arab Emirates Antigua and Barb. Anguilla Albania Armenia American Samoa Austria Aruba Åland Azerbaijan Bosnia and Herzegovina Barbados Belgium Burkina Faso Bulgaria Bahrain Burundi Benin St-Barthélemy Bermuda Brunei Bahamas Bhutan Belarus Belize Central African Republic Congo Switzerland Côte d'Ivoire Cook Is. Costa Rica Cabo Verde Curaçao Cyprus Czechia Djibouti Denmark Dominica Dominican Republic Estonia Western Sahara Eritrea Fiji Falkland Islands Micronesia Faeroe Is. Gabon Grenada Georgia Guernsey Gambia Guinea Equatorial Guinea Greece S. Geo. and the Is. Guam Guinea-Bissau Guyana Hong Kong Heard I. and McDonald Is. Honduras Croatia Haiti Hungary Ireland Israel Isle of Man Br. Indian Ocean Ter. Jersey Jamaica Jordan Kyrgyzstan Cambodia Kiribati Comoros St. Kitts and Nevis Kuwait Cayman Is. Laos Lebanon Saint Lucia Liechtenstein Sri Lanka Liberia Lesotho Lithuania Luxembourg Latvia Monaco Moldova Montenegro St-Martin Marshall Is. North Macedonia Macao N. Mariana Is. Montserrat Malta Mauritius Maldives Malawi New Caledonia Norfolk Island Nicaragua Nauru Niue Oman Panama Fr. Polynesia St. Pierre and Miquelon Pitcairn Is. Puerto Rico Palestine Portugal Palau Qatar Serbia Rwanda Solomon Islands Seychelles Singapore Saint Helena Slovenia Slovakia Sierra Leone San Marino Senegal Suriname South Sudan São Tomé and Principe El Salvador Sint Maarten Syria Eswatini Turks and Caicos Is. French Southern Territories Togo Tajikistan Timor-Leste Turkmenistan Tunisia Tonga Trinidad and Tobago Taiwan Uruguay Vatican St. Vin. and Gren. British Virgin Is. U.S. Virgin Is. Vanuatu Wallis and Futuna Is. Samoa Kosovo Zimbabwe Afghanistan: 42 Angola: 37 Argentina: 46 Australia: 26 Bangladesh: 173 Bolivia: 12 Brazil: 216 Botswana: 3 Canada: 39 Democratic Republic of the Congo: 102 Chile: 20 Cameroon: 28 China: 1,410 Colombia: 52 Cuba: 11 Germany: 84 Algeria: 45 Ecuador: 18 Egypt: 113 Spain: 48 Ethiopia: 127 Finland: 6 France: 65 United Kingdom: 68 Ghana: 34 Greenland: 0.06 Guatemala: 18 Indonesia: 277 India: 1,428 Iraq: 45 Iran: 89 Iceland: 0.4 Italy: 59 Japan: 124 Kenya: 55 North Korea: 26 South Korea: 52 Kazakhstan: 20 Libya: 7 Morocco: 37 Madagascar: 30 Mali: 23 Myanmar: 54 Mongolia: 3 Mauritania: 5 Mexico: 128 Malaysia: 34 Mozambique: 34 Namibia: 3 Niger: 27 Nigeria: 224 Netherlands: 18 Norway: 5 Nepal: 31 New Zealand: 5 Peru: 34 Papua New Guinea: 10 Philippines: 117 Pakistan: 240 Poland: 37 Paraguay: 7 Romania: 19 Russia: 144 Saudi Arabia: 37 Sudan: 48 Sweden: 10 Somalia: 18 Chad: 18 Thailand: 72 Turkey: 85 Tanzania: 67 Ukraine: 37 Uganda: 48 United States of America: 340 Uzbekistan: 35 Venezuela: 28 Vietnam: 99 Yemen: 34 South Africa: 60 Zambia: 21 0.06 1,428 no value
People per country The world in seven steps by rank - scale=quantile - from an array in the page's PHP; hover a country for its number.
Share of renewable energy in final energy use, 2022 (%) Iceland: 85; Norway: 75.8; Sweden: 66; Finland: 47.9; Latvia: 43.3; Denmark: 41.6; Estonia: 38.5; Portugal: 34.7; Austria: 33.8; Lithuania: 29.6; Croatia: 29.4; Slovenia: 25; Romania: 24.1; Greece: 22.7; Spain: 22.1; Germany: 20.8; France: 20.3; Cyprus: 19.4; Italy: 19.1; Bulgaria: 19.1; Czechia: 18.2; Slovakia: 17.5; Poland: 16.9; Hungary: 15.2; Netherlands: 15; Luxembourg: 14.4; Belgium: 13.8; Malta: 13.4; Ireland: 13.1 Andorra Albania Åland Bosnia and Herzegovina Belarus Switzerland Algeria Faeroe Is. United Kingdom Georgia Guernsey Greenland Isle of Man Iraq Jersey Lebanon Liechtenstein Morocco Monaco Moldova Montenegro North Macedonia Serbia Russia San Marino Syria Tunisia Turkey Ukraine United States of America Vatican Kosovo Austria: 33.8 Belgium: 13.8 Bulgaria: 19.1 Cyprus: 19.4 Czechia: 18.2 Germany: 20.8 Denmark: 41.6 Estonia: 38.5 Spain: 22.1 Finland: 47.9 France: 20.3 Greece: 22.7 Croatia: 29.4 Hungary: 15.2 Ireland: 13.1 Iceland: 85 Italy: 19.1 Lithuania: 29.6 Luxembourg: 14.4 Latvia: 43.3 Malta: 13.4 Netherlands: 15 Norway: 75.8 Poland: 16.9 Portugal: 34.7 Romania: 24.1 Sweden: 66 Slovenia: 25 Slovakia: 17.5 13.1 85 no value
Renewable energy in Europe The europe view of the same outlines, the rows written as CSV between the tags - countries by their English names.

Placeholder

Grey boxes with crossing lines for the images that are not there yet
Medium rectangle Medium rectangle 160 × 250 160 × 250 Mobile banner Mobile banner
Banner sizes The size as width x height, written in the middle unless a text is given.
Hero image Hero image
Product Product

Lamp

Product Product

Chair

Product Product

Table

A page in wireframe A hero at 21:9 and three cards at 4:3, all as wide as their column - the layout stands before the photos do.

Progress

Accessible progress bars and step indicators, styled on the server
45%
75%
Steps and sizes With steps a dot per step, the ones done filled and the current one ringed; size= makes a bar thin or thick.
100%
72%
38%
91%
12%
Uploads in progress A native progress element per file, styled, with its label and percentage - the colour slot says how it goes.

Rating

Stars or hearts for a score, parts of one clipped, said in words
1.25 out of 5 2.5 out of 5 3.75 out of 5 7.3 out of 10 Nine of ten critics recommend it
Hearts and parts icon=heart, a max of ten and scores between whole ones - each said as a number out of the max.
Product Score Reviews
Walnut desk lamp 4.7 out of 5 4.7 214
Linen armchair 4.2 out of 5 4.2 88
Oak side table 3.5 out of 5 3.5 41
Wool rug, 160x230 2.8 out of 5 2.8 17
Ceramic vase 5 out of 5 5 9
Product reviews The average score of each product as stars - a part of a star filled as far as the score goes.

Timeline

Events on a time axis - cards above and below, spans as bars, or a column for long lists
PHP releases Jul 13, 2004: PHP 5.0 - A new object model with the Zend Engine 2; Jun 30, 2009: PHP 5.3 - Namespaces, closures and late static binding; Mar 1, 2012: PHP 5.4 - Traits, the short array syntax and the built-in web server; Dec 3, 2015: PHP 7.0 - A twice as fast engine, scalar type declarations and return types; Nov 28, 2019: PHP 7.4 - Typed properties and arrow functions; Nov 26, 2020: PHP 8.0 - The JIT compiler, named arguments, match and union types; Nov 25, 2021: PHP 8.1 - Enums, readonly properties and fibers; Dec 8, 2022: PHP 8.2 - Readonly classes and standalone null, true and false types; Nov 23, 2023: PHP 8.3 - Typed class constants and json_validate(); Nov 21, 2024: PHP 8.4 - Property hooks and asymmetric visibility Jul 13, 2004: PHP 5.0 - A new object model with the Zend Engine 2 Jul 13, 2004 PHP 5.0 A new object model with the Zend Engine 2 Jun 30, 2009: PHP 5.3 - Namespaces, closures and late static binding Jun 30, 2009 PHP 5.3 Namespaces, closures and late static binding Mar 1, 2012: PHP 5.4 - Traits, the short array syntax and the built-in web server Mar 1, 2012 PHP 5.4 Traits, the short array syntax and the built-in web server Dec 3, 2015: PHP 7.0 - A twice as fast engine, scalar type declarations and return types Dec 3, 2015 PHP 7.0 A twice as fast engine, scalar type declarations and return types Nov 28, 2019: PHP 7.4 - Typed properties and arrow functions Nov 28, 2019 PHP 7.4 Typed properties and arrow functions Nov 26, 2020: PHP 8.0 - The JIT compiler, named arguments, match and union types Nov 26, 2020 PHP 8.0 The JIT compiler, named arguments, match and union types Nov 25, 2021: PHP 8.1 - Enums, readonly properties and fibers Nov 25, 2021 PHP 8.1 Enums, readonly properties and fibers Dec 8, 2022: PHP 8.2 - Readonly classes and standalone null, true and false types Dec 8, 2022 PHP 8.2 Readonly classes and standalone null, true and false types Nov 23, 2023: PHP 8.3 - Typed class constants and json_validate() Nov 23, 2023 PHP 8.3 Typed class constants and json_validate() Nov 21, 2024: PHP 8.4 - Property hooks and asymmetric visibility Nov 21, 2024 PHP 8.4 Property hooks and asymmetric visibility
Twenty years of PHP The vertical form for a long list - dates on the left, cards on the right - the rows as JSON between the tags.
Website relaunch 2026 Jan 5, 2026 – Feb 13, 2026: Research (Phase); Jan 5, 2026: Kick-off - Goals and budget agreed (Milestone); Feb 2, 2026 – Mar 27, 2026: Design (Phase); Mar 16, 2026 – Jun 12, 2026: Build (Phase); Mar 27, 2026: Design signed - The board approves the look (Milestone); Apr 20, 2026 – Jun 19, 2026: Content (Phase); May 15, 2026: Beta - Open to staff (Milestone); May 25, 2026 – Jun 26, 2026: Testing (Phase); Jul 1, 2026: Launch - The new site goes live (Release) Phase Milestone Release Jan 2026 Feb 2026 Mar 2026 Apr 2026 May 2026 Jun 2026 Jul 2026 Jan 5, 2026: Kick-off - Goals and budget agreed (Milestone) Jan 5, 2026 Kick-off Goals and budget agreed Mar 27, 2026: Design signed - The board approves the look (Milestone) Mar 27, 2026 Design signed The board approves the look May 15, 2026: Beta - Open to staff (Milestone) May 15, 2026 Beta Open to staff Jul 1, 2026: Launch - The new site goes live (Release) Jul 1, 2026 Launch The new site goes live Jan 5, 2026 – Feb 13, 2026: Research (Phase) Research Feb 2, 2026 – Mar 27, 2026: Design (Phase) Design Mar 16, 2026 – Jun 12, 2026: Build (Phase) Build Apr 20, 2026 – Jun 19, 2026: Content (Phase) Content May 25, 2026 – Jun 26, 2026: Testing (Phase) Testing
A project plan Spans from= and to= drawn as bars under a month axis, milestones as cards, coloured by kind with a legend - the rows from the page's PHP.
Milestones of spaceflight 1957: Sputnik 1 - First satellite; 1961: Vostok 1 - Gagarin in orbit; 1962: Friendship 7 - Glenn orbits the Earth; 1965: Voskhod 2 - The first spacewalk; 1969: Apollo 11 - People on the Moon; 1971: Salyut 1 - First space station; 1981: STS-1 - First Space Shuttle flight; 1990: Hubble - A telescope in orbit; 1998: Zarya - The ISS begins; 2012: Curiosity - A rover lands on Mars 1960 1970 1980 1990 2000 2010 1957: Sputnik 1 - First satellite 1957 Sputnik 1 First satellite 1961: Vostok 1 - Gagarin in orbit 1961 Vostok 1 Gagarin in orbit 1962: Friendship 7 - Glenn orbits the Earth 1962 Friendship 7 Glenn orbits the Earth 1965: Voskhod 2 - The first spacewalk 1965 Voskhod 2 The first spacewalk 1969: Apollo 11 - People on the Moon 1969 Apollo 11 People on the Moon 1971: Salyut 1 - First space station 1971 Salyut 1 First space station 1981: STS-1 - First Space Shuttle flight 1981 STS-1 First Space Shuttle flight 1990: Hubble - A telescope in orbit 1990 Hubble A telescope in orbit 1998: Zarya - The ISS begins 1998 Zarya The ISS begins 2012: Curiosity - A rover lands on Mars 2012 Curiosity A rover lands on Mars
The space age Ten moments on a time axis with round year ticks - the cards alternate above and below and step outward where they would collide.

Countdown

The time left until a moment, in words inside a time element - ticking live when asked
  • Jazz in the park
  • Pottery workshop
  • City half marathon
  • Film night
  • New year concert
Upcoming events The two largest units by default, a past= text for an event that has started, and the full moment in the title on hover.

Version 3.0 launches in

Tuesday 3 November, 09:21

A launch countdown Three units of the time left, counting down every second in the browser with the live option - the server writes the same words first.

Country

A country flag and its English name from an ISO 3166 code - alpha-2, alpha-3 or the name
🇳🇱 🇫🇷 🇮🇹 🇪🇸 🇸🇪 🇳🇴 🇨🇦 🇲🇽 🇦🇷 🇿🇦 🇰🇪 🇪🇬 🇮🇳 🇨🇳 🇰🇷 🇦🇺 🇳🇿 🇫🇯
Flags from alpha-3 codes Three-letter codes - as passports and the Olympics use them - give the same flags; alone, each flag is an image named by its country.
  1. Netherlands 18,230
  2. United States 12,904
  3. Germany 8,711
  4. United Kingdom 6,120
  5. Belgium 4,385
  6. Japan 2,017
  7. Brazil 1,460
  8. Côte d’Ivoire 312
Visitors by country The flag and the name from a two-letter code, with name - the flag is then decoration and the name is what a screen reader says.

Data table

A complete table from rows: headers, aligned numbers, totals, sorting and paging links
Marketing budget, third quarter
Channel Budget Spent
Search ads €12,000.00 €11,380.40
Social media €8,500.00 €9,120.15
Newsletter €1,500.00 €960.00
Trade fair €15,000.00 €14,215.80
Print €3,000.00 €2,410.25
Total €40,000.00 €38,086.60
A table from inline CSV As a pair the content is the data - CSV, JSON, YAML or XML - here a budget with a pipe formatting the amounts and a totals row.
Orders this week
Number Date Customer Items Total
10412 5 Oct 2026 Atelier Graphique 3 1,245.50
10413 5 Oct 2026 Signal Gift Stores 1 89.90
10414 6 Oct 2026 Mini Wheels Co. 12 4,310.00
10415 6 Oct 2026 Land of Toys Inc. 5 642.25
10416 7 Oct 2026 Baane Mini Imports 2 318.00
10417 8 Oct 2026 Euro+ Shopping 8 2,975.75
Total 31 9,581.40
Orders with totals Columns picked and labelled, numbers right-aligned with the same decimals, a totals row, and header links that sort on the server.
Largest cities by population
City Country Population Area (km²)
Bangkok Thailand 5,494,932 1,569
Beijing China 21,893,095 16,411
Cairo Egypt 10,044,894 3,085
Delhi India 11,034,555 1,484
Dhaka Bangladesh 10,278,882 306
Istanbul Türkiye 15,655,924 5,461
Jakarta Indonesia 10,562,088 662
Kinshasa DR Congo 16,315,534 9,965
Paged and sortable The largest cities, eight rows a page with page links below - sorting and paging are plain links, so they work without JavaScript.

Diff

What changed between two texts - words or lines, inline or side by side
Monday → Friday
1 1 Milk
2 2 Eggs
3 - Bread
3 + Sourdough bread
4 - Butter
5 4 Coffee
6 5 Apples
6 + Pears
7 + Cheese
Line by line A shopping list in one column - the old and the new line number, a sign, the line.
PAD templates drive the application: aevery page is a template, and the template asks for itsthe data it needs. There are no controllers, no routes and no routing tablesglue code - you create a file and it is a page. Most tags areEvery tag is rendered on the server, so they workit works without JavaScript, in print and in e-mail.
Two versions of a paragraph An edited paragraph word by word - struck what went, marked what came.
total.php - before total.php - after
1 function total ( $rows ) { 1 function total ( $rows, $tax = 0.21 ) {
2 2
3 $sum = 0; 3 $sum = 0;
4 4
5 foreach ( $rows as $row ) 5 foreach ( $rows as $row )
6 $sum += $row ['price']; 6 $sum += $row ['price'] * $row ['quantity'];
7 7
8 return $sum; 8 return round ( $sum * ( 1 + $tax ), 2 );
9 9
10 } 10 }
Side by side Two versions of a function next to each other, line numbers on both sides and the changed words marked.

Emoji

Emoji by their GitHub and Slack shortcodes, each a labelled image for screen readers - and a pipe for text
  • Ana: The build is green ✅ shipping it 🚀
  • Bram: Nice work 👏 👏
  • Chen: Coffee at 10:30:00? ☕
  • Dewi: Count me in ✋ - and :not_a_code: stays as it is
Shortcodes in text The emoji pipe turns every shortcode in a text into its emoji - one it does not know, or a time like 10:30:00, stays as written.

Release 3.0 is out - charts, tables and a faster first render.

A reaction bar Reactions under a post, each emoji from its shortcode in a span with role img and its name as the label a screen reader says.

Excerpt

A long text cut to whole words around the search words, the matches marked

Results for cache

Fragment cache

… from the database, a report over a year of orders. The fragment cache keeps the rendered text of such a section for a number …

Remote data

… seconds. When the source fails afterwards, the last good copy in the cache is served and the failure is logged, so a slow or …

Page cache

With the page cache switched on in the configuration, a whole page is kept after its first rendering, with an ETag, and a browser …

Search results Each result cut to 24 words around the first match of the query, every match marked.

Templates that drive

2026-09-14 Most frameworks start in a controller. The controller fetches the data, decides what to show and hands it to a template, which is the last …

Charts without JavaScript

2026-10-01 A chart is a picture, and a picture can be drawn on the server. The chart tag writes inline SVG: bars, lines, pies and forty …

Teasers from HTML The first 25 words of each post body - its tags dropped with html, an ellipsis where it goes on.

JSON viewer

A JSON answer or a PHP array as a tree to fold open and shut, coloured by type, with counts on folded nodes
GET /api/orders/10417 {…} 8 keys
  • "id": 10417
  • "status": "open"
  • "paid": false
  • "customer": {…} 3 keys
    • "name": "Euro+ Shopping"
    • "country": "ES"
    • "vip": true
    }
  • "lines": […] 2 items
    • 0: {…} 4 keys
      • "sku": "S18_1749"
      • "name": "1917 Grand Touring Sedan"
      • "qty": 2
      • "price": 136
      }
    • 1: {…} 4 keys
      • "sku": "S24_2840"
      • "name": "1958 Chevy Corvette"
      • "qty": 6
      • "price": 35.29
      }
    ]
  • "coupon": null
  • "total": 2975.75
  • "created": "2026-10-08T09:42:11Z"
}
An API response The JSON between the tags, its braces needing no ignore - two levels open, the deeper ones folded with the number of keys or items they hold.
settings {…} 5 keys
  • "shop": {…} 3 keys
    • "name": "Mini Wheels Co."
    • "currency": "EUR"
    • "locales": […] 3 items
      • 0: "en"
      • 1: "nl"
      • 2: "de"
      ]
    }
  • "mail": {…} 4 keys
    • "transport": "smtp"
    • "host": "mail.example.com"
    • "port": 587
    • "tls": true
    }
  • "cache": {…} 3 keys
    • "pages": true
    • "ttl": 600
    • "store": "apcu"
    }
  • "features": {…} 3 keys
    • "reviews": true
    • "wishlist": false
    • "giftcards": null
    }
  • "version": "3.0.2"
}
A PHP array A page array shown as the JSON it would be - one level open, so the sections show folded with their sizes until clicked.

Lorem ipsum

Placeholder text in words, sentences or paragraphs - the same text for the same seed

Lorem ipsum dolor sit

Lorem ipsum dolor sit amet, consectetur adipiscing elit semper diam. Per nec dictumst montes facilisis at sapien interdum cubilia lectus ad ligula.

Quis facilisis sociosqu tortor iaculis sagittis. Mus sollicitudin fusce, faucibus ultricies hac class massa condimentum nascetur facilisis scelerisque inceptos. Varius hendrerit risus euismod dui ornare efficitur. Tempus aptent eu etiam facilisis quisque felis. Eros sed sollicitudin euismod congue vitae eget ridiculus.

Auctor nostra mus habitant, interdum quam. Neque at ornare hendrerit pellentesque quisque dictumst himenaeos mauris enim, quam tempor. Tincidunt efficitur ullamcorper efficitur potenti cras convallis curae. Primis integer himenaeos mollis elementum vitae. Fringilla auctor est mollis viverra lectus augue at metus erat.

Magnis tempor taciti habitant condimentum luctus risus vivamus parturient. Donec nunc justo morbi, porta fames. Torquent non turpis nostra fusce id quis malesuada est. Nec aenean feugiat viverra tempus netus, dictumst varius dis hendrerit eget.

A page before its copy A heading, a lead of two sentences and three paragraphs - the layout filled before the text is written.
Augue varius

Etiam sodales nostra bibendum magna habitasse consequat nisl nullam feugiat nullam curabitur. Nunc dui ultrices, nec dis lacinia.

Libero semper

Arcu ultrices nec faucibus, torquent id consequat felis, arcu rutrum curae montes. Risus sed lacus cursus, blandit ad.

Venenatis luctus

Iaculis sapien aliquet netus rhoncus vulputate volutpat vestibulum. Maximus lacinia quam, posuere phasellus sociosqu ullamcorper aliquam blandit pretium.

Praesent varius

Ligula cursus fermentum senectus, commodo primis. Nascetur volutpat class pharetra penatibus placerat, dis fermentum. Semper phasellus eleifend non.

Felis lobortis

Egestas facilisis arcu pulvinar in, gravida sollicitudin iaculis habitant penatibus, mus aliquet nunc aliquet. Inceptos integer fringilla lobortis.

Potenti mollis

Erat sagittis iaculis parturient, vehicula platea, at phasellus ad massa nulla cursus mollis. Urna fringilla dui curabitur facilisis.

A seed per card The same tags with another seed in every card - varied text, and the same again on every request.

Time ago

How long ago a moment was, in a time element that keeps the exact moment for machines and on hover
  1. Maya ·

    Is there a way to export the report as a spreadsheet?

  2. Jonas ·

    The CSV answer of the same page does exactly that.

  3. Priya ·

    Tried it today - one line in the page and it works.

  4. Tomás ·

    Can the columns be chosen?

  5. Maya ·

    Yes: list them in the page, in the order you want.

  6. Ken ·

    Thanks, everyone!

A comment thread Each comment says how long ago it was posted; hover a time for the full date, and the datetime attribute carries the exact moment.

Table of contents

The headings of the page, nested and linked - filled in after the whole page has rendered

Choosing the beans

Fresh beans matter more than any machine. Buy whole beans roasted in the last few weeks, and only as much as you drink in a fortnight.

Light or dark roast

A light roast keeps the fruit and acidity of its origin; a dark roast trades them for body and the bitter-sweet taste of the roast itself.

Single origin or blend

A blend is made to taste the same all year. A single origin tastes of one farm and one harvest - and changes with it.

Grinding

Grind just before brewing. A burr grinder gives even particles; a blade grinder gives dust and boulders that brew at different speeds.

Grind size by method

Coarse for a French press, medium for filter, fine for espresso - finer grinds extract faster.

Brewing

Use water just off the boil, around 94 °C, and about 60 grams of coffee per litre.

Pour-over

Bloom the grounds with a little water for thirty seconds, then pour slowly in circles.

French press

Steep four minutes, press gently, and pour it all out at once so it does not go bitter.

Storing what is left

An airtight tin in a dark cupboard. Not the fridge: the beans take on its smells.

A long article The contents stand above the headings it lists: it is filled in once the page has rendered, and every heading gets an id to link to.

Installation

Clone the repository and point the web server at www/.

Requirements

PHP 8.1 or newer; a database only when the application uses one.

Extensions

mbstring is required, intl is used when it is there.

First run

Open the hello application to see a page and its template.

Configuration

Settings stand in _config/config.php and in .env files.

Error handling

Choose what happens when something goes wrong: a page, a log line or a dump.

Deployment

Copy the files; there is no build step.

Contents in a sidebar Three heading levels as a bulleted list beside the text - levels= picks the levels, list= the kind of list, and a heading with its own id keeps it.

Gravatar

The picture of an e-mail address, or a local avatar for privacy
Herbert Jebbink
Herbert Jebbink
The page cache halves the time of the home page.
Ada Lovelace
Ada Lovelace
Could the sequence tags take a step of their own?
Grace Hopper
Grace Hopper
A bug report with a template line number - lovely.
Comments with Gravatars The picture each address registered at gravatar.com - only its SHA-256 hash leaves the page, lazily, without a referrer.
Herbert Jebbink HJ Herbert Jebbink
Herbert Jebbink
The page cache halves the time of the home page.
Ada Lovelace AL Ada Lovelace
Ada Lovelace
Could the sequence tags take a step of their own?
Grace Hopper GH Grace Hopper
Grace Hopper
A bug report with a template line number - lovely.
No request to a third party fallback= draws the picture on the server instead - the initials of the name, or the identicon of the address - so no visitor is sent to Gravatar.

Thumbnails

Resized, cached pictures with GD - one size on the page, twice that for a sharp screen
Sailing boats in the harbour at dawn Sand dunes under a pale sun Rows of tulips running to a windmill
Three pictures, one size Landscape and portrait photos cut to the same 4:3 box around their centre, each with a 2x copy for a sharp screen.

PDF documents

A template rendered as a PDF by a writer in plain PHP - fonts, tables, pictures
Harbour Supplies

Invoice 2026-114

Harbour Supplies
Kaai 3, 1781 AA Den Helder
info@harbour.example

To: Noordkaap Sailing School
Havenkade 12
1781 AB Den Helder

Issued 8 October 2026 - due 7 November 2026

Item Qty Price Amount
Mooring rope, 12 mm, per 20 m 4 € 38,50 € 154,00
Fender, inflatable, large 6 € 27,95 € 167,70
Life jacket 150 N, adult 10 € 64,00 € 640,00
Shackle, stainless, 8 mm 24 € 3,20 € 76,80
Delivery to the harbour 1 € 45,00 € 45,00
Subtotal € 1.083,50
VAT 21% € 227,54
Total € 1.311,04

Please pay within 30 days to NL91 ABNA 0417 1643 00, quoting invoice 2026-114.

An invoice as PDF An order rendered on a sheet, the same template one click away as an A4 PDF made in plain PHP.

Video embeds

YouTube and Vimeo as a poster and a play button - the player loads only when asked
Vimeo with a poster of your own A Vimeo address, a start time from the link and a local picture as the poster.

Accordion

Questions that open on a click - every item a details element, one open at a time if asked

Questions about your order

When will my order arrive?

Orders placed before 22:00 on a working day are delivered the next day in the Netherlands and Belgium, within three working days elsewhere in the EU.

Can I return something?

Yes - within 30 days, unused and in its box. Print the label from your account and drop the parcel at any pick-up point; the refund follows within five days.

Is there a warranty?

Two years on every appliance, five years on the heating element of our kettles.

How do I pay?

iDEAL, Bancontact, credit card, PayPal, or on account for business customers.

Frequently asked questions A FAQ where opening a question closes the one that was open - the first one open at the start.

Copy

A text with a copy-to-clipboard button - selectable by hand when scripting is off

Put this in apps/shop/.env:

padSqlDriver=sqlite
padSqlDatabase=shop/shop.sqlite
padSqlSetup=_install/schema.sql
A snippet as content The pair form - the content is rendered first, so a value of the page goes into the text that is copied.

Add the package to your project:

composer require pad/pad:^11.0

Or start a fresh application with the command-line tool:

pad new shop && pad serve 8000
Install command A command with a copy button - the text a value, escaped, and selected whole with one click.

Poll

A vote among a few answers, once per visitor - the results as bars, with or without scripting
Which language do you reach for first?
Favourite language A vote among four answers, once per visitor - the results as bars after the vote.

Tabs

Panels behind a row of tabs - radio buttons and CSS, the arrow keys move between them

€ 9 a month - for one person and a side project

  • One site
  • 10 GB storage
  • E-mail support

€ 29 a month - for a team that ships every week

  • Ten sites
  • 100 GB storage
  • Chat support
  • Daily backups

€ 79 a month - for an agency with many clients

  • Unlimited sites
  • 1 TB storage
  • Phone support
  • Hourly backups
  • Staging
A tab per row The tabs made in a loop - one per plan of the data, its features inside.

Aurora electric kettle

A 1.7 litre kettle in brushed steel that boils a full jug in under four minutes and keeps it warm for half an hour. The lid opens with one touch, the water window lights up blue while it heats.

Capacity 1.7 litres
Power 2200 W
Keep warm 30 minutes at 80 °C
Weight 1.1 kg

Marieke - 5 of 5
Quiet, fast, and the light is a nice touch.

Tom - 4 of 5
Boils quickly. The lid is a little stiff.

Aisha - 5 of 5
The keep-warm setting is perfect for tea.

Product page Overview, specifications and reviews of a kettle behind three tabs - the specifications shown first.

Chess board

A chess position from FEN as SVG - pieces, coordinates, marked squares and arrows
Chess position, Black to move White: king e1; queen d1; rooks a1, h1; bishops c1, f1; knights b1, g1; pawns a2, b2, c2, d2, e4, f2, g2, h2. Black: king e8; queen d8; rooks a8, h8; bishops c8, f8; knights b8, g8; pawns a7, b7, c7, d7, e7, f7, g7, h7. Black to move. castling KQkq. en passant e3. marked e2, e4. arrow c7 to c5. arrow e7 to e5. a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8
After 1.e4, seen by Black The full FEN of the position after the king's pawn opening, the board flipped for the side to move.
Morphy against the Duke of Brunswick and Count Isouard, Paris 1858: 17.Rd8 mate White: king c1; rook d8; bishop g5; pawns a2, b2, c2, e4, f2, g2, h2. Black: king e8; queen e6; rook h8; bishop f8; knight b8; pawns a7, e5, f7, g7, h7. Black to move. castling k. marked d1, d8. arrow g5 to d8. a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8
The Opera game Morphy mates in Paris, 1858 - the last move marked, the bishop that guards the rook as an arrow.

Crossword

Words and clues in, a numbered grid and the Across and Down lists out
PHP crossword 10 words on a grid of 13 by 10 squares 2 1 3 4 5 6 7 8 9

Across

  1. The dependency manager most projects install (8)
  2. The stricter switch, an expression since 8.0 (5)
  3. Late binding keyword, or a property of the class (6)
  4. A framework with Eloquent and Blade (7)

Down

  1. A type with a fixed set of cases, new in 8.1 (4)
  2. An ordered map, the workhorse of PHP (5)
  3. An anonymous function that captures variables with use (7)
  4. A language construct that outputs one or more strings (4)
  5. Hands a value out of a generator and pauses it (5)
  6. The value of a variable that has none (4)
A PHP crossword Ten words about PHP laid out on the server - the empty grid to print, with the clues beside it.
PHP crossword, solved 10 words on a grid of 13 by 10 squares, filled in: 3 across COMPOSER, 6 across MATCH, 8 across STATIC, 9 across LARAVEL, 1 down ENUM, 2 down ARRAY, 3 down CLOSURE, 4 down ECHO, 5 down YIELD, 7 down NULL U 2 A N 1 E 3 C O M P O S E R L R 4 E O H 5 Y 6 M A T C 7 N 8 S T A T I C Y H U U E O A 9 L R A V E L L E D

Across

  1. The dependency manager most projects install (8) COMPOSER
  2. The stricter switch, an expression since 8.0 (5) MATCH
  3. Late binding keyword, or a property of the class (6) STATIC
  4. A framework with Eloquent and Blade (7) LARAVEL

Down

  1. A type with a fixed set of cases, new in 8.1 (4) ENUM
  2. An ordered map, the workhorse of PHP (5) ARRAY
  3. An anonymous function that captures variables with use (7) CLOSURE
  4. A language construct that outputs one or more strings (4) ECHO
  5. Hands a value out of a generator and pauses it (5) YIELD
  6. The value of a variable that has none (4) NULL
With the solution The same words with solution - the letters in the grid and the answers behind the clues.

Sudoku

A puzzle as a grid, givens bold - and solved on the server by backtracking
Arto Inkala, 2012
8 1 2 7 5 3 6 4 9
9 4 3 6 8 2 1 7 5
6 7 5 4 9 1 2 8 3
1 5 4 2 3 7 8 9 6
3 6 9 8 4 5 7 2 1
2 8 7 1 6 9 5 3 4
5 2 1 9 7 4 3 6 8
4 3 8 5 2 6 9 1 7
7 9 6 3 1 8 4 5 2
The hardest one Arto Inkala's "world's hardest sudoku", written in nine lines and solved in a blink.
5 3 empty empty 7 empty empty empty empty
6 empty empty 1 9 5 empty empty empty
empty 9 8 empty empty empty empty 6 empty
8 empty empty empty 6 empty empty empty 3
4 empty empty 8 empty 3 empty empty 1
7 empty empty empty 2 empty empty empty 6
empty 6 empty empty empty empty 2 8 empty
empty empty empty 4 1 9 empty empty 5
empty empty empty empty 8 empty empty 7 9
The puzzle The classic example puzzle, its givens bold and the open cells ready to print.
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
Solved on the server The same puzzle with solve - the backtracking solver fills in every open cell, in another colour.