Release Date: 2026-09-26
New Features
- “In Planning” project status – projects can now be marked as In Planning, in addition to the existing statuses.
- Projects without sessions in the Journal – projects with no sessions yet now appear as stub rows in the Journal table and in the journal object switcher. Clicking a stub row opens the inline Journal tab instead of the report page.
- Project status filter – the journal object switcher’s “In Progress only” checkbox is replaced by a status dropdown, so every status (or all projects) can be shown.
- Ignore duplicate pairs – the “Find Duplicates” tool has a new “Ignore, keep both” button. Ignored pairs no longer show up in later scans.
- Rig Data empty state – the Rig Data tab now explains why it’s empty when you have no rigs or the object has no size, and links to the Rigs or Objects config tab.
- New starter catalog – new installations start with a much larger default object catalog.
Improvements
- Faster first load / dashboard warm-up – each user’s default location is now pre-calculated once per server process and re-warmed every 30 minutes (unchanged users are skipped). In multi-user mode only users seen in the last 7 days are warmed, so dormant and test accounts no longer use up the run limit.
- Outlook updates on pin/unpin – pinning or unpinning an object now updates the Outlook incrementally (only the new or moved objects are calculated) instead of recomputing everything for every location.
- Smarter cache invalidation – editing, importing, merging or deleting objects and projects now clears exactly the affected caches (altitude curves, observable list, Outlook). Heatmap and Outlook cache files are per-location and fingerprinted, so stale results are no longer served after changes. Cache files older than 3 days are cleaned up automatically.
- Batch dashboard calculations are faster (one coordinate transform per object) and the altitude-curve cache holds up to 5000 entries.
- Python 3.13 – the Docker image now uses
python:3.13-slim. scipy updated to 1.18.1; unused packaging/migration tools (py2app, pyinstaller, alembic, Flask-Migrate, bump2version, …) removed fromrequirements.txt. - Translations – fixed a number of mistranslated strings in de/fr/es/zh/ja (e.g. French “Completed” showing as “Copié !”), placeholder format errors in zh/ja, and added missing translations for new strings. A new test now fails on fuzzy catalog entries to keep this from happening again.
- Dashboard status strip labels no longer wrap in longer locales.
Bug Fixes
- Per-location altitude threshold honoured everywhere – the heatmap, Outlook, dashboard highlight, graph page and AI features now all use a location’s own altitude threshold if set. A missing global threshold (e.g. from a YAML import without the key) now falls back to 20° instead of crashing.
- Calculation Precision honoured everywhere – the dashboard batch route (single-user mode) and all Outlook paths now use your Calculation Precision setting instead of a hard-coded 15 minutes.
- DST nights – the dark window was an hour short (autumn) or long (spring) on nights when daylight saving time changes. Dawn is now calculated correctly on the next day.
- 11 PM values after midnight – “at 11 PM” altitude/obstruction values now follow the current observing night (e.g. at 03:00 they refer to the previous evening’s 11 PM) consistently across dashboard, object data, mobile and warm-up.
- Horizon masks with only one point no longer break the “now” and 11 PM obstruction calculations.
- Heatmap – the browser-side heatmap cache is removed. It could show a stale heatmap for up to 24h after changes, cache partial loads, and even show another user’s heatmap on a shared browser. The heatmap also no longer gets squeezed when the window is resized.
- Heatmap worker – one failing task no longer stops the worker for every other user.
- Outlook errors – a failed Outlook calculation is now reported instead of being restarted forever (the desktop spinner never stopped). The desktop Outlook tab shows the error, retries when reopened, and no longer starts duplicate polls.
- Catalog import conflicts with Gunicorn – resolving import conflicts could fail with “No pending conflicts for this user” when the request hit a different worker. Pending conflicts are now shared between workers and survive restarts.
- Imports with invalid timezones –
/import_confignow rejects a file with an invalid timezone before deleting anything, instead of wiping your locations and then skipping the bad one. Other imports skip locations with an invalid timezone instead of saving them. - Default location – exports no longer write
default_location: nullwhile you have locations, and imports accept a null value and always mark exactly one location as default. - General settings save no longer fails when
imaging_criteriaortelemetryis null. - The “Edit Object to Add Content” link now opens the correct Objects config tab.
Heads Up
- The Docker base image moved from Python 3.11 to Python 3.13. If you run Nova from source, use Python 3.13 and reinstall
requirements.txt. - Existing heatmap/Outlook cache files are replaced by new fingerprinted files; expect the first heatmap/Outlook load after upgrading to recalculate.