# Update
The built-in **update** tag renders a single **release-note** — one entry on a
timeline rail: a version or date **label** on the left, and the entry's **Markdown**
body beside it. Give it a `label` (the version or date), an optional `description`
(a dimmed sub-label — a date under a version, say), and an optional `tags` cloud.
Close it with `{% endUpdate %}`.
Reach for it when you want to hand-author a short **"What's new"** note on a page, or
stack a run of them into a release log. It is **distinct** from the
[Changelog](/components/extras/changelog/) tag: `{% changelog %}`
reads a whole **YAML data file** and owns the tag-filter cloud and RSS feed, while
`{% update %}` is a **single inline entry** you write in the page.
Use it as `{% update %}` in Markdown, or call it from Python
logic (loops, snippets) via `component('aardvark', 'update', …)`.
## Demonstrations
### A single entry
A `label` on the rail, the Markdown body beside it:
Added a **dark-mode** toggle and a per-page table of contents. See the
[theming guide](/theming/) for the new CSS variables.
Source: Markdown
```aardvark
{% update label="v1.4.0" %}
Added a **dark-mode** toggle and a per-page table of contents. See the
[theming guide](/theming/) for the new CSS variables.
{% endUpdate %}
```
Source: Python
```python
component('aardvark', 'update', label='v1.4.0', children=(
'Added a **dark-mode** toggle and a per-page table of contents. See the '
'[theming guide](/theming/) for the new CSS variables.'))
```
### A run of entries (a release log)
Stack several — each is its own entry, and the rail joins them into one continuous
timeline. Entries render in the order you write them, so put the newest first:
- New `search` endpoint with typo-tolerant matching.
- The dashboard now remembers your last filter.
Fixed a race in the billing reconciler that could double-count a refund.
Renamed the `token` parameter to `apiKey` across every endpoint. See the
[migration notes](/) before upgrading.
Source: Markdown
```aardvark
{% update label="v2.1.0" description="2026-07-03" tags="feature, api" %}
- New `search` endpoint with typo-tolerant matching.
- The dashboard now remembers your last filter.
{% endUpdate %}
{% update label="v2.0.1" description="2026-06-18" tags="fix" %}
Fixed a race in the billing reconciler that could double-count a refund.
{% endUpdate %}
{% update label="v2.0.0" description="2026-06-01" tags="breaking" %}
Renamed the `token` parameter to `apiKey` across every endpoint. See the
[migration notes](/) before upgrading.
{% endUpdate %}
```
Source: Python
```python
component('aardvark', 'update', label='v2.1.0', description='2026-07-03',
tags='feature, api', children=(
'- New `search` endpoint with typo-tolerant matching.\n'
'- The dashboard now remembers your last filter.'))
component('aardvark', 'update', label='v2.0.1', description='2026-06-18',
tags='fix', children=(
'Fixed a race in the billing reconciler that could double-count a refund.'))
component('aardvark', 'update', label='v2.0.0', description='2026-06-01',
tags='breaking', children=(
'Renamed the `token` parameter to `apiKey` across every endpoint. See the '
'[migration notes](/) before upgrading.'))
```
### A custom bullet and accent color
`bullet` sets the rail glyph — a Tabler icon name (lazily fetched), an emoji, or short
text — and `color` accents this entry's bullet and line:
Shipped the new onboarding flow. 🎉
Source: Markdown
```aardvark
{% update label="v1.5.0" bullet="rocket" color="grape" %}
Shipped the new onboarding flow. 🎉
{% endUpdate %}
```
Source: Python
```python
component('aardvark', 'update', label='v1.5.0', bullet='rocket', color='grape',
children='Shipped the new onboarding flow. 🎉')
```
## Attributes
| Attribute | Valid values | Description |
| --- | --- | --- |
| `label` | Any string | The rail heading — the version or date (e.g. `v1.2.0`, `2026-07-03`). Optional; omit for an unlabelled entry. |
| `description` | Any string | An optional dimmed sub-label under the label (a date beneath a version, say). |
| `tags` | Comma-separated string | An optional badge cloud under the label (e.g. `tags="feature, fix"`). |
| `bullet` | Tabler icon name, emoji, or short text | The rail glyph. A bare Tabler name is fetched lazily; anything else renders verbatim; unset uses Mantine's default dot. |
| `color` | Any Mantine color | Accent for this entry's bullet and line. Defaults to your site's primary color. |
| `attr` | `{…}` | Raw HTML attributes forwarded onto the rendered island root (see below). |
| *(body)* | Markdown | The entry content, written between `{% update %}` and `{% endUpdate %}` (`children=` from Python). |
## Update vs. Changelog
Both draw a timeline, but they solve different problems:
| | `{% update %}` | `{% changelog %}` |
| --- | --- | --- |
| Source of entries | Authored inline, one tag per entry | A YAML data file |
| Best for | A short "What's new" note, a hand-written release log | A full, filterable changelog with a feed |
| Tag filtering | A static badge cloud (display only) | An interactive filter cloud |
| RSS feed / On-this-page | No | Yes |
## CSS Selectors
Each `update` carries `data-aardvark-island="Update"` on its wrapper, and the rendered
Mantine Timeline exposes its parts as `mantine-Timeline-*` classes — target either to
style it from your theme CSS.
```css
[data-aardvark-island="Update"] {
/* style every update entry on the page */
}
.aardvark-update-version {
/* the version/date label on the rail */
}
.aardvark-update-body {
/* the Markdown body */
}
.mantine-Timeline-itemBullet {
/* the rail bullet */
}
```
## Injecting Attributes
`attr={…}` forwards raw HTML attributes (including event handlers) straight onto the
rendered island root.
Added keyboard shortcuts across the app.
Source: Markdown
```aardvark
{% update label="v1.6.0" attr={'data-analytics': 'release-note', 'aria-label': 'v1.6.0 release note'} %}
Added keyboard shortcuts across the app.
{% endUpdate %}
```
Source: Python
```python
component('aardvark', 'update', label='v1.6.0',
children='Added keyboard shortcuts across the app.',
attr={'data-analytics': 'release-note', 'aria-label': 'v1.6.0 release note'})
```