Sidebar: show running build version

Display the running build version at the bottom of the sidebar (e.g. v0.2.11
for releases, v0.2.11.3 for dev builds), linking to the changelog. New
version.py exposes display_version(); shared_templates.py registers it as the
app_version Jinja global; main.py adds /api/version.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ivo Oskamp 2026-06-01 14:02:03 +02:00
parent 74de3ddee2
commit 347f959d80
5 changed files with 47 additions and 0 deletions

View File

@ -53,6 +53,12 @@ app.include_router(changelog_router)
app.include_router(search_router) app.include_router(search_router)
@app.get("/api/version")
async def version():
from version import display_version
return JSONResponse({"version": display_version()})
@app.get("/health") @app.get("/health")
async def health(): async def health():
try: try:

View File

@ -1,6 +1,7 @@
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from db import get_db_conn from db import get_db_conn
from version import display_version
def _develop_mode() -> bool: def _develop_mode() -> bool:
@ -16,3 +17,4 @@ def _develop_mode() -> bool:
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="templates")
templates.env.globals["develop_mode"] = _develop_mode templates.env.globals["develop_mode"] = _develop_mode
templates.env.globals["app_version"] = display_version

View File

@ -118,6 +118,18 @@ html {
.sidebar-bottom { margin-top: auto; } .sidebar-bottom { margin-top: auto; }
.sidebar-version {
display: block;
margin-top: 0.5rem;
text-align: center;
font-family: var(--mono);
font-size: 0.68rem;
color: var(--text-dim);
text-decoration: none;
opacity: 0.75;
}
.sidebar-version:hover { opacity: 1; }
.disk-warning { .disk-warning {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@ -289,6 +289,7 @@
</svg> </svg>
<span id="rescan-label">Rescan library</span> <span id="rescan-label">Rescan library</span>
</button> </button>
<a href="/changelog" class="sidebar-version" title="Running Novela build">{{ app_version() }}</a>
</div> </div>
</aside> </aside>

View File

@ -0,0 +1,26 @@
"""Novela version metadata.
The release version is the single source maintained in ``changelog.py``
(``CHANGELOG[0]["version"]``). Dev/test builds append an explicit ``BUILD``
segment that is incremented by ``scripts/bump-dev-build.py`` on every test
build, so operators can see exactly which image build is running in the
sidebar. ``BUILD`` is reset to 0 for releases.
"""
from __future__ import annotations
from changelog import CHANGELOG
BUILD = 2
def _release_version() -> str:
"""Return the semantic release version (e.g. v0.2.11)."""
return CHANGELOG[0]["version"] if CHANGELOG else "v0.0.0"
def display_version() -> str:
"""Return the user-visible Novela version (e.g. v0.2.11 or v0.2.11.3)."""
version = _release_version()
if BUILD > 0:
return f"{version}.{BUILD}"
return version