Skip to content

changelog

Changelog API for the Dojo footer's "What's Changed" button.

ChangelogEntryOut

Bases: ChangelogEntry

is_new instance-attribute

Python
is_new: bool

Whether this entry's version is newer than the last version the user explicitly acknowledged (see POST /mark-seen).

bullets instance-attribute

Python
bullets: list[str]

Each top-level - bullet, its marker included, with any of its indented sub-bullets appended as-is - a small, self-contained (possibly nested) markdown list per entry.

ChangelogResponse

Bases: BaseModel

latest_version instance-attribute

Python
latest_version: str | None

The newest version named in the changelog, or None if it couldn't be fetched.

update_available instance-attribute

Python
update_available: bool

Whether latest_version is newer than installed_version - independent of is_new/acknowledgment, and true across restarts until the user actually upgrades.

is_localhost instance-attribute

Python
is_localhost: bool

Whether this request came from the machine running Dojo - the What's Changed toggle only writes to settings.toml when this is true, same restriction as the Settings panel.

mark_changelog_seen async

Python
mark_changelog_seen(
    body: MarkSeenRequest,
) -> dict[str, str]

Acknowledges body.version (the modal's own latest_version, echoed back on close), so it and everything older stop being flagged is_new and stop triggering the auto-open, on this launch and every future one, until a genuinely newer version appears.

Source code in src/mujoco_mojo/utils/layers/dojo/routers/changelog.py
Python
@router.post("/mark-seen")
async def mark_changelog_seen(body: MarkSeenRequest) -> dict[str, str]:
    """Acknowledges `body.version` (the modal's own `latest_version`, echoed back on close), so it and everything older stop being flagged `is_new` and stop triggering the auto-open, on this launch and every future one, until a genuinely newer version appears."""
    await run_in_threadpool(write_last_seen_version, body.version)
    return {"status": "ok"}