This release focuses on performance and cache reliability. Page navigation and API polling are now significantly faster thanks to a write-through process cache that eliminates redundant database queries on every request. Several longstanding cache-consistency bugs have been fixed – horizon masks, heatmap files, and outlook caches now stay in sync across workers, routes, and multi-user sessions.
Performance
Navigation Speed-up
Object lists and location data are now cached per user in a write-through process cache (BoundedCache, 500 slots). Previously, every page load and API poll re-queried the database for all locations and astro objects. Derived values (selected location, coordinates, time arrays) are still computed fresh each request, so the cache never serves stale calculations.
Bug Fixes
- Horizon mask not applied to observable duration – The nightly-curves cache was serving stale pre-mask values because location writes didn’t invalidate it. All write paths that modify locations now bust
nightly_curves_cacheso the horizon mask is always recalculated. - Dashboard object list duplicated on date change – Switching the simulation-mode date could leave stale rows in the table. The
<tbody>is now cleared before the first streaming chunk arrives. - Heatmap cache files unreadable by API – The background worker and API endpoint used different filename constructions for the same coordinate grid cell, so heatmap data was computed but never served. Both sides now use the same
get_outlook_cache_path()helper. - Horizon mask cache not busted on new location – Only updates to an existing location triggered a cache refresh. Creating a new location now also invalidates the nightly-curves and observable-objects caches.
Improvements
- Coordinate-grid cache keys – Outlook and heatmap cache filenames now use
lat_cell,lon_cellgrid coordinates instead of the location display name. This eliminates collision risk when two locations share the same name at different coordinates. - Nova AI ranker: Bortle + moon exclusion – LSB broadband targets (large diffuse galaxies) are now fully excluded under combined Bortle 7–9 and >50% moon conditions, rather than merely demoted. This prevents the ranker from recommending targets that can’t produce good results under heavy light pollution and moonlight.
- Nova AI ranker: no result floor – Removed the minimum-5-results floor. If conditions genuinely don’t support viable targets, the ranker now returns fewer results instead of padding the list with non-viable objects.
- Inspiration grid expanded – The inspiration tab now shows 20 tiles (up from 12).
Visual
- About modal border-radius clipping – Fixed WebKit/Safari bug where
overflow: scrollon the modal container clipped the rounded corners. Scrolling moved to the inner body element. Added--radius-xl(16 px) token.
Under the Hood
- Dead cache variables removed – 8 unused cache variables from the YAML-era config system have been deleted from
nova/config.py. - Cache key consistency audit – All writer/reader pairs for observable-objects, nightly-curves, heatmap, and outlook caches verified to use identical key construction.
- User provisioning from defaults – New users are now seeded from
config_default.yamlinstead of copying the guest-user DB row, making the provisioning path testable and deterministic.
Upgrade Notes
- No database migration required – all changes are backwards-compatible.
- No new dependencies.
- Docker – no changes to the Dockerfile or entry point. Pull the new image and restart as usual.
Thanks for using Nova DSO Tracker! As always, feedback is welcome – please report any issues on GitHub.