Data Tables

Overview

The data-table shortcode renders tables from JSON, CSV, or YAML data files stored in the assets/ directory. Tables are fully rendered at build time as static HTML. Setting interactive="true" progressively enhances the table with client-side column sorting – without JavaScript, the table remains fully readable.


Parameters

Parameter Required Default Description
path Yes Path to the data file relative to assets/ (e.g. /data/endpoints.json). The leading / is conventional but optional.
interactive No false Set to true to enable client-side column sorting
sort No Sort column and direction, applied at build time. Works with or without interactive. Format: column_name or column_name:asc or column_name:desc.
columns No all Comma-separated list of columns to display, in the order listed. Also controls column order for JSON/YAML sources where the default is alphabetical.
hide No Comma-separated list of columns to exclude. If both columns and hide are set, columns is applied first.
labels No Column header overrides in key:Label format, comma-separated (e.g. rate_limit:Throttle).
variant No wide Layout width: wide (full content area) or narrow (two-thirds)
theme No bordered Table style: bordered (borders and striped rows) or borderless (clean minimal look)
humanize No true Humanize and title-case JSON/YAML keys for headers (e.g. rate_limit becomes Rate Limit). Has no effect on CSV sources. Set to false for raw keys.
markdownify No false Process cell values as markdown. Enables bold, italic, links, inline code, etc. Raw HTML in data will also be rendered -- use only with trusted data.

Data formats

Place data files anywhere inside your project’s assets/ directory. The path parameter is relative to assets/ and conventionally starts with a / (e.g., /data/endpoints.json).

JSON

An array of objects. Keys become column headers, transformed with humanize and title by default (e.g., rate_limit becomes “Rate Limit”). Columns are sorted alphabetically – use the columns parameter to control display order.

json
[
  { "endpoint": "/api/v1/users", "method": "GET", "status": "stable" },
  { "endpoint": "/api/v1/groups", "method": "POST", "status": "beta" }
]

CSV

Standard CSV with a header row. Headers are used exactly as written – no transformation is applied. Columns appear in file order. Quoted fields with commas and escaped quotes are handled per RFC 4180.

text
Endpoint,Method,Status
/api/v1/users,GET,stable
/api/v1/groups,POST,beta

YAML

An array of objects, same structure as JSON. Keys are transformed and sorted the same way.

yaml
- endpoint: /api/v1/users
  method: GET
  status: stable
- endpoint: /api/v1/groups
  method: POST
  status: beta

Examples

Static table (default)

The simplest usage – renders all columns from a JSON file as a static table. Columns appear in alphabetical order.

{{< data-table path="/data/api-endpoints.json" >}}
Auth Description Endpoint Method Rate Limit Status
Bearer token List all users with optional pagination /api/v1/users GET 100/min stable
Bearer token Get a single user by ID /api/v1/users/{id} GET 200/min stable
Bearer token Create a new user /api/v1/users POST 50/min stable
Bearer token Update an existing user /api/v1/users/{id} PUT 50/min stable
Admin token Delete a user /api/v1/users/{id} DELETE 20/min stable
Bearer token List all groups /api/v1/groups GET 100/min stable
Bearer token List members of a group /api/v1/groups/{id}/members GET 100/min stable
Bearer token Retrieve analytics data with date range filtering /api/v2/analytics GET 30/min beta
Admin token Export analytics data to CSV or PDF /api/v2/analytics/export POST 5/min beta
None Health check endpoint /api/v1/health GET unlimited stable
Admin token Get current server configuration /api/v1/config GET 10/min stable
Admin token Update server configuration /api/v1/config PATCH 5/min stable
Bearer token List SSL/TLS certificates /api/v2/certificates GET 50/min beta
Admin token Upload a new SSL/TLS certificate /api/v2/certificates POST 10/min beta
Bearer token List all upstream server groups /api/v1/upstreams GET 100/min stable

Selecting columns and controlling order

Use columns to choose which columns to display, in the exact order listed. This is especially useful for JSON and YAML sources where the default order is alphabetical.

{{< data-table path="/data/api-endpoints.json" columns="status,endpoint,method" >}}
Status Endpoint Method
stable /api/v1/users GET
stable /api/v1/users/{id} GET
stable /api/v1/users POST
stable /api/v1/users/{id} PUT
stable /api/v1/users/{id} DELETE
stable /api/v1/groups GET
stable /api/v1/groups/{id}/members GET
beta /api/v2/analytics GET
beta /api/v2/analytics/export POST
stable /api/v1/health GET
stable /api/v1/config GET
stable /api/v1/config PATCH
beta /api/v2/certificates GET
beta /api/v2/certificates POST
stable /api/v1/upstreams GET

Hiding columns

Use hide to remove specific columns while keeping all others in their default order. If both columns and hide are set, columns is applied first, then hide removes from that subset.

{{< data-table path="/data/api-endpoints.json" hide="auth,rate_limit" >}}
Description Endpoint Method Status
List all users with optional pagination /api/v1/users GET stable
Get a single user by ID /api/v1/users/{id} GET stable
Create a new user /api/v1/users POST stable
Update an existing user /api/v1/users/{id} PUT stable
Delete a user /api/v1/users/{id} DELETE stable
List all groups /api/v1/groups GET stable
List members of a group /api/v1/groups/{id}/members GET stable
Retrieve analytics data with date range filtering /api/v2/analytics GET beta
Export analytics data to CSV or PDF /api/v2/analytics/export POST beta
Health check endpoint /api/v1/health GET stable
Get current server configuration /api/v1/config GET stable
Update server configuration /api/v1/config PATCH stable
List SSL/TLS certificates /api/v2/certificates GET beta
Upload a new SSL/TLS certificate /api/v2/certificates POST beta
List all upstream server groups /api/v1/upstreams GET stable

Overriding column headers

Use labels to override auto-generated headers. The format is key:Display Label pairs, comma-separated. Unescaped colons in label values are preserved (e.g., key:Prefix: Suffix produces the label “Prefix: Suffix”).

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,rate_limit" labels="endpoint:API Path,rate_limit:Rate Limit (req/min)" >}}
API Path Method Rate Limit (req/min)
/api/v1/users GET 100/min
/api/v1/users/{id} GET 200/min
/api/v1/users POST 50/min
/api/v1/users/{id} PUT 50/min
/api/v1/users/{id} DELETE 20/min
/api/v1/groups GET 100/min
/api/v1/groups/{id}/members GET 100/min
/api/v2/analytics GET 30/min
/api/v2/analytics/export POST 5/min
/api/v1/health GET unlimited
/api/v1/config GET 10/min
/api/v1/config PATCH 5/min
/api/v2/certificates GET 50/min
/api/v2/certificates POST 10/min
/api/v1/upstreams GET 100/min

Raw keys (humanize disabled)

Set humanize="false" to display JSON/YAML keys verbatim instead of applying humanize and title case. This has no effect on CSV sources, which always use headers as-is.

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,status" humanize="false" >}}
endpoint method status
/api/v1/users GET stable
/api/v1/users/{id} GET stable
/api/v1/users POST stable
/api/v1/users/{id} PUT stable
/api/v1/users/{id} DELETE stable
/api/v1/groups GET stable
/api/v1/groups/{id}/members GET stable
/api/v2/analytics GET beta
/api/v2/analytics/export POST beta
/api/v1/health GET stable
/api/v1/config GET stable
/api/v1/config PATCH stable
/api/v2/certificates GET beta
/api/v2/certificates POST beta
/api/v1/upstreams GET stable

CSV source

CSV headers appear exactly as written in the file.

{{< data-table path="/data/release-matrix.csv" >}}
Version Release Date Status NGINX Plus OS Support EOL Date
3.2.0 2025-09-15 current R33 Ubuntu 24.04 / RHEL 9 / Debian 12 2026-09-15
3.1.2 2025-06-10 supported R32 Ubuntu 22.04 / RHEL 9 / Debian 12 2026-06-10
3.1.1 2025-04-22 supported R32 Ubuntu 22.04 / RHEL 9 / Debian 12 2026-04-22
3.1.0 2025-02-01 supported R31 Ubuntu 22.04 / RHEL 9 / Debian 11 2026-02-01
3.0.3 2024-11-18 supported R31 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-11-18
3.0.2 2024-09-05 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-09-05
3.0.1 2024-07-12 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-07-12
3.0.0 2024-05-01 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-05-01
2.9.1 2024-02-15 eol R29 Ubuntu 20.04 / RHEL 8 / Debian 11 2025-02-15
2.9.0 2023-12-01 eol R29 Ubuntu 20.04 / RHEL 8 / Debian 10 2024-12-01

Narrow variant

Use variant="narrow" to constrain the table to two-thirds of the content area.

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,status" variant="narrow" >}}
Endpoint Method Status
/api/v1/users GET stable
/api/v1/users/{id} GET stable
/api/v1/users POST stable
/api/v1/users/{id} PUT stable
/api/v1/users/{id} DELETE stable
/api/v1/groups GET stable
/api/v1/groups/{id}/members GET stable
/api/v2/analytics GET beta
/api/v2/analytics/export POST beta
/api/v1/health GET stable
/api/v1/config GET stable
/api/v1/config PATCH stable
/api/v2/certificates GET beta
/api/v2/certificates POST beta
/api/v1/upstreams GET stable

Borderless theme

Use theme="borderless" for a clean, minimal table without borders or row striping.

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,status" theme="borderless" >}}
Endpoint Method Status
/api/v1/users GET stable
/api/v1/users/{id} GET stable
/api/v1/users POST stable
/api/v1/users/{id} PUT stable
/api/v1/users/{id} DELETE stable
/api/v1/groups GET stable
/api/v1/groups/{id}/members GET stable
/api/v2/analytics GET beta
/api/v2/analytics/export POST beta
/api/v1/health GET stable
/api/v1/config GET stable
/api/v1/config PATCH stable
/api/v2/certificates GET beta
/api/v2/certificates POST beta
/api/v1/upstreams GET stable

Static sort

Use sort to order rows at build time. This works on static tables without interactive.

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,status" sort="endpoint:desc" >}}
Endpoint Method Status
/api/v2/certificates GET beta
/api/v2/certificates POST beta
/api/v2/analytics/export POST beta
/api/v2/analytics GET beta
/api/v1/users/{id} GET stable
/api/v1/users/{id} PUT stable
/api/v1/users/{id} DELETE stable
/api/v1/users GET stable
/api/v1/users POST stable
/api/v1/upstreams GET stable
/api/v1/health GET stable
/api/v1/groups/{id}/members GET stable
/api/v1/groups GET stable
/api/v1/config GET stable
/api/v1/config PATCH stable

Sortable table

Add interactive="true" to enable clickable column headers. Click a header to sort ascending; click again for descending.

{{< data-table path="/data/api-endpoints.json" interactive="true" >}}
Auth Description Endpoint Method Rate Limit Status
Bearer token List all users with optional pagination /api/v1/users GET 100/min stable
Bearer token Get a single user by ID /api/v1/users/{id} GET 200/min stable
Bearer token Create a new user /api/v1/users POST 50/min stable
Bearer token Update an existing user /api/v1/users/{id} PUT 50/min stable
Admin token Delete a user /api/v1/users/{id} DELETE 20/min stable
Bearer token List all groups /api/v1/groups GET 100/min stable
Bearer token List members of a group /api/v1/groups/{id}/members GET 100/min stable
Bearer token Retrieve analytics data with date range filtering /api/v2/analytics GET 30/min beta
Admin token Export analytics data to CSV or PDF /api/v2/analytics/export POST 5/min beta
None Health check endpoint /api/v1/health GET unlimited stable
Admin token Get current server configuration /api/v1/config GET 10/min stable
Admin token Update server configuration /api/v1/config PATCH 5/min stable
Bearer token List SSL/TLS certificates /api/v2/certificates GET 50/min beta
Admin token Upload a new SSL/TLS certificate /api/v2/certificates POST 10/min beta
Bearer token List all upstream server groups /api/v1/upstreams GET 100/min stable

Sortable with a default sort

Combine sort with interactive="true" to set the initial sort column and direction. The sort indicator will reflect the initial state.

{{< data-table path="/data/release-matrix.csv" interactive="true" sort="Version:desc" >}}
Version Release Date Status NGINX Plus OS Support EOL Date
3.2.0 2025-09-15 current R33 Ubuntu 24.04 / RHEL 9 / Debian 12 2026-09-15
3.1.2 2025-06-10 supported R32 Ubuntu 22.04 / RHEL 9 / Debian 12 2026-06-10
3.1.1 2025-04-22 supported R32 Ubuntu 22.04 / RHEL 9 / Debian 12 2026-04-22
3.1.0 2025-02-01 supported R31 Ubuntu 22.04 / RHEL 9 / Debian 11 2026-02-01
3.0.3 2024-11-18 supported R31 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-11-18
3.0.2 2024-09-05 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-09-05
3.0.1 2024-07-12 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-07-12
3.0.0 2024-05-01 eol R30 Ubuntu 22.04 / RHEL 8 / Debian 11 2025-05-01
2.9.1 2024-02-15 eol R29 Ubuntu 20.04 / RHEL 8 / Debian 11 2025-02-15
2.9.0 2023-12-01 eol R29 Ubuntu 20.04 / RHEL 8 / Debian 10 2024-12-01

Borderless with sorting

Combine theme="borderless" with interactive="true" for a minimal sortable table.

{{< data-table path="/data/api-endpoints.json" columns="endpoint,method,status" theme="borderless" interactive="true" sort="endpoint:asc" >}}
Endpoint Method Status
/api/v1/config GET stable
/api/v1/config PATCH stable
/api/v1/groups GET stable
/api/v1/groups/{id}/members GET stable
/api/v1/health GET stable
/api/v1/upstreams GET stable
/api/v1/users GET stable
/api/v1/users POST stable
/api/v1/users/{id} GET stable
/api/v1/users/{id} PUT stable
/api/v1/users/{id} DELETE stable
/api/v2/analytics GET beta
/api/v2/analytics/export POST beta
/api/v2/certificates GET beta
/api/v2/certificates POST beta

Markdown in cells

Set markdownify="true" to process cell values as markdown. Bold, italic, links, and inline code all render as formatted text.

{{< data-table path="/data/edge-cases.json" columns="markdown,normal" markdownify="true" >}}
Markdown Normal
bold and a link nothing special
Supports inline code and emphasis plain text
Caution
Enabling markdownify also causes raw HTML in data values to be rendered as HTML, not escaped. Only use this with trusted data sources.

Special characters

If your column names contain commas or colons, use \, and \: escape sequences in the columns, hide, labels, and sort parameters.

Selecting columns with special characters

{{< data-table path="/data/edge-cases.json" columns="col\:with\:colons,col\,with\,commas,normal" >}}
Col With Colons Col,with,commas Normal
value:with:colons value,with,commas nothing special
another:value a, b, c plain text

Label overrides with special characters

Escape sequences work in both the key and value portions of labels.

{{< data-table path="/data/edge-cases.json" columns="col\:with\:colons,col\,with\,commas,normal" labels="col\:with\:colons:Colons\: In Key,col\,with\,commas:Commas\, In Key,normal:Just Normal" >}}
Colons: In Key Commas, In Key Just Normal
value:with:colons value,with,commas nothing special
another:value a, b, c plain text

Sorting and hiding with special characters

{{< data-table path="/data/edge-cases.json" columns="col\:with\:colons,col\,with\,commas,normal" interactive="true" sort="col\:with\:colons:desc" >}}
Col With Colons Col,with,commas Normal
value:with:colons value,with,commas nothing special
another:value a, b, c plain text
{{< data-table path="/data/edge-cases.json" hide="col\:with\:colons,col\,with\,commas" >}}
HTML Markdown Normal Shortcode
<a href="https://example.com">link</a> **bold** and [a link](https://example.com) nothing special {{< ref "/docs" >}}
<script>alert(1)</script> Supports `inline code` and *emphasis* plain text {{< data-table path="evil" >}}

Limitations

  • Plain text by default. Cell values are rendered as escaped plain text. Markdown syntax, HTML tags, and shortcode invocations appear as literal strings. Set markdownify="true" to opt in to markdown processing.
  • No per-column markdownify. The markdownify flag applies to all cells. There is no way to enable it for individual columns.
  • Column ordering. JSON and YAML columns are sorted alphabetically. Use columns to set a specific order. CSV columns always follow file order.
  • Missing values. If a JSON or YAML row is missing a key that other rows define, the cell renders as empty.