Data Tables
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.
| 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. |
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).
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.
[
{ "endpoint": "/api/v1/users", "method": "GET", "status": "stable" },
{ "endpoint": "/api/v1/groups", "method": "POST", "status": "beta" }
]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.
Endpoint,Method,Status
/api/v1/users,GET,stable
/api/v1/groups,POST,betaAn array of objects, same structure as JSON. Keys are transformed and sorted the same way.
- endpoint: /api/v1/users
method: GET
status: stable
- endpoint: /api/v1/groups
method: POST
status: betaThe 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 |
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 |
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 |
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 |
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 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
CautionEnablingmarkdownifyalso causes raw HTML in data values to be rendered as HTML, not escaped. Only use this with trusted data sources.
If your column names contain commas or colons, use \, and \: escape sequences in the columns, hide, labels, and sort parameters.
{{< 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 |
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 |
{{< 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" >}} |
- 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
markdownifyflag applies to all cells. There is no way to enable it for individual columns. - Column ordering. JSON and YAML columns are sorted alphabetically. Use
columnsto 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.