- User location map with live camera follow: tap "Locate me" to centre the map on your GPS position; the camera follows as you move until you pan away. (#765)
- Site beam visualizer popover: interactive gain/beam-pattern overlay with anchored popover and unified gain fields across antenna types. (#737, #740)
- Site access editor redesign: cleaner layout, padded collaborator popover, and improved modal structure. (#733)
- PanelToolbar component unifying toolbar layout and action alignment across all panels (Navigator, Inspector, chart panel, sidebar). (#616, #751)
- Unified button system:
btn,btn-ghost, andbtn-iconCSS roles + sharedButtoncomponent consolidation; removes mixed legacy button language. (#616, #748)
- Notification bell replaced with Lucide Bell icon (removes emoji dependency). (#616, #763)
- Map pin anchoring and stacking order corrected. (#731)
- Deploy script syntax error. (#732)
- Removed dead UI patterns:
NotificationBanner,OfflineBanner(#759),MapInlineNotice,MapControls,FormActionRow(#760),terrain-alert(#761), stale gallery class refs (#758). require-milestone-on-closeworkflow now honoursno-milestone-close-oklabel. (#764)- README landing page simplified. (#747)
Rolls up all merged work since 0.16.0, including the 0.16.2 shared-site sync hotfix and the release/deploy guardrail fixes.
- A new
/settingspanel with per-field auto-save, plus settings layout, avatar drop-zone, and access-request refinements. (#125, #688, #689, #690, #691) - The live in-app UI gallery plus continued componentization of badge, popover, state-dot, and ActionButton patterns across the shell. (#540, #616)
- Mobile tabbed map overlays and expanded accessibility semantics for mobile tabs and markers. (#171, #430, #431, #433)
- Reorganized map layers.
- Standardized panel/sidebar headers, ActionButton usage, and iconography across the shell, inspector, sidebar, and settings surfaces.
- Continued mobile map, panel, and attribution polish, including synchronized animation timing and viewport-fit behavior.
- Hardened release and deploy automation, CI guardrails, and staging-main workflow rules.
- Improved local test-server startup, change polling, and developer workflow reliability.
- Shared simulations now persist private Site references during sync and reload.
- Panorama/profile sizing, path override handling, and overlay recompute/performance stability were improved.
- Rolled unfinished milestone work forward one step to keep the backlog aligned with the new release boundary.
- Shared simulations now persist private Site references instead of silently skipping the save, so newly added Sites survive sync and reload in shared workspaces.
- Panorama / Horizon mode: single-site 360° terrain viewshed with LOS-clipped rendering, peak labels (elevation + distance), shading modes, FOV controls, and synchronized map lens. (#101)
- Distance-based terrain heatmap coloring in panorama view with red-to-blue gradient; FOV range extended to support full 360° and narrow 15° slices. (#633)
- Adaptive coverage radius for single-site simulations: analysis area automatically expands to match loaded Copernicus terrain tiles (20–100 km range) with manual override control. (#176)
- Norsk Polarinstitutt Svalbard basemap provider: topographic, satellite, and orthophoto presets using official EPSG:3857 WMTS from geodata.npolar.no. (#635)
- Terraform infrastructure-as-code scaffolding for Cloudflare resources. (#188)
- Panels animate on expand/collapse and resize with synchronized choreography across desktop and mobile. (#532)
- Eliminated UI freezes during simulation recompute via non-blocking async pipeline with chunked overlay rendering and work scheduling. (#574)
- Deep-link cold-load incorrectly flagged slug-resolved shared simulations as unavailable on first load. (#629)
- Antenna height and cursor height display in hover path profile segments. (#491)
- Added an in-app
/ui-galleryvisual inventory with tabbed families (Actions, Panels, Forms, Notifications, States, Meta/Map UI), status labeling, and gallery-local theme controls aligned with real app styling. (#539) - Added a unified app-level notification queue with debug hooks for local/staging (
window.linksimNotifications) to support iterative UI verification without code edits. (#539)
- Converged standard text-bearing app actions toward the shared
ActionButtonfamily across Simulation Library and inspector surfaces, reducing mixed legacy button language. (#521, #523, #525, #529) - Aligned panel shell language across left/right/bottom surfaces and improved shell/header rhythm consistency while preserving intentional structural differences. (#529)
- Updated UI taxonomy and glossary coverage to better map real production families and migration status for future cleanup passes. (#527, #529, #539)
- Unified banner-like transient notices into the mini-bar notification system and removed remaining duplicate notice styles in app shell/admin contexts. (#539)
- Fixed staging/prod shell visibility regression where
.app-shellcould remain atopacity: 0after animation path mismatch. (#539) - Fixed notification mini-bar clipping regressions (shadow clipping and mobile spacing under controls) and refined fade/reflow behavior for manual vs timed dismissals. (#539)
- Cloud library sync now performs background delta pulls and merges remote updates by id, so cross-device changes appear without a reload and manual sync no longer keeps stale local copies. (#113, #374)
- UI panel visibility (Navigator, Inspector, Profile) now persists in localStorage and is restored across sessions. (#132)
- Radio and model controls were restructured: propagation model selection was removed (ITM is now the only model), and Frequency Plan / ITM Environment / network options moved into New Simulation and Edit Simulation dialogs to reduce sidebar clutter. (#183, #394, #395)
- Coverage resolution control now applies consistently across heatmap, relay, and pass/fail overlays, including drag-time low-resolution behavior with automatic restore after drag. (#393)
- Anonymous deep-link loads no longer trigger unnecessary authenticated API calls or CORS noise; readonly bootstrap and access-check fallback behavior is hardened for Firefox and auth bootstrap edge cases. (#385)
- Newly created Sites and Simulation entries now set owner edit role correctly, preventing creator-owned resources from appearing read-only. (#383)
- Site library delete flow now handles simulation references deterministically, and shared-link workspace naming/selection-driven results behavior is more consistent during path workflows. (#124, #141, #185)
- Search rate-limit behavior and terrain loading reliability were hardened, including removal of unreliable in-memory geocode throttling and clearer terrain loading state transitions. (#105, #150)
- Private simulations can now be shared with specific users without elevating them to public. Collaborators are granted viewer or editor access per-user; the simulation and its sites stay private. The share link is auth-gated — only explicitly added users can open it. (#142)
- Share modal redesigned with two equal option cards: "Make Broadly Accessible" (existing public upgrade path) and "Share with Specific Users" (new private collaboration path), each with an icon. (#142)
- Per-collaborator role selector (viewer / editor) in the resource access dialog. (#142)
- Anonymous visitors now land on a demo workspace with four real Oslo-area sites (Tryvannstårnet, Haukåsen, Kikut, Kolsåstoppen) instead of an empty map, giving a clear first impression of the tool. (#346)
- Meshmap MQTT node data now loads with a progress bar and shows a retry button on failure, consistent with the terrain and simulation loading patterns. (#292, #294)
- Sidebar "More" panel reduced — actions consolidated into more appropriate locations, reducing clutter and improving focus. (#182)
- Cloud auto-sync no longer fails after sharing a private simulation with specific users. The
simulation_private_site_referenceconflict is suppressed during sync for private simulations; strict validation is kept only when explicitly upgrading a simulation to shared/public. (#142) - New sites created in areas without terrain data no longer silently default to elevation 0 — elevation is resolved from live terrain data at creation time. (#181)
- Path profile fullscreen button no longer triggers map fullscreen; the two controls now operate independently. (#309)
- "Fit" button now correctly fits the viewport to the simulation area in all cases, including a Mercator cos(lat) correction for accuracy. (#223)
- Map search in the site editor now pans the map to the selected result immediately. (#95)
- Mobile map attribution placement is now stable across all panel and tab states. (#240)
- Meshmap proxy no longer caches error responses (429/5xx) — only successful responses are cached, preventing stale error states. (#294)
- Map UI pill is now correctly centered in expanded mode. (#300)
- Removed the redundant "Inspector" heading from the inspector panel header. (#142)
- Panel toggle button is now left-aligned on desktop and hidden on mobile; Share button stays right-aligned in both modes. (#142)
- Clipboard permission error when saving collaborators resolved — clipboard write is now registered within the user-gesture context before async operations begin. (#142)
- Holiday theme state is now shared across all UI consumers (AppShell, MapView, Sidebar). Clicking "Revert Theme" in the map inspector immediately reverts the color without requiring a page refresh.
- Yellow Easter theme option now appears in the color theme dropdown during the active Easter window, and disappears afterward.
- Mobile: tabbed interface splits map/profile view and sidebar for better small-screen layout.
- Desktop: right-side inspector panel for simulation results alongside the sidebar.
- Easter holiday theme framework with automatic seasonal activation and window management.
- Holiday theme system is reusable for future seasonal overrides.
- Unified UI iconography with the Lucide icon set across all controls, map buttons, and sidebar.
- Map UI controls consolidated into the sidebar; removed floating overlays on mobile.
- iOS: map renders full-bleed behind safe areas with proper viewport anchoring.
- Sidebar header simplified to icon-only row; environment badge moved to title area.
- Basemap fallback now uses Carto Normal style instead of incorrect default layer.
- Fullscreen toggle for map and path profile now operate independently.
- Mobile attribution placement is stable across panel open/close states.
- iOS map canvas sizing is consistent across orientation changes and viewport updates.
- Coverage store extracted from main Zustand store to reduce re-render overhead.
- Deep links now update the browser URL live as selection state changes, so shared links always match the current context.
- Terrain and calculation requests are routed through async job endpoints to improve reliability under longer-running workloads.
- Onboarding is consolidated into a simpler welcome flow with clearer entry points to Simulation Library and Site Library.
- Deep-link handling is more deterministic for multi-site selections and shorter shared link paths.
- Deep-link parsing now handles emoji variation selectors and non-Latin names (including Korean) more consistently.
- Blank Simulation workflows no longer get stuck during startup/reload edge cases.
- Terrain calculation path no longer depends on the reverted Pages proxy experiment; production path is stabilized.
- Removed temporary deep-link debug instrumentation after validation.
- Updated release and staging workflow guardrails documentation.
- Restored stable blank Simulation loading/session behavior so empty workspace flows continue correctly.
- Promoted staging release guardrails to main for safer branch, deploy, and promotion flow.
- Aligned production Copernicus proxy rate limits with staging to avoid environment-specific terrain behavior.
- Added version-based migration framework and standardized client storage migration policy.
- Added profile-click temporary Site draft behavior to speed up map-driven planning.
- Improved startup responsiveness through deferred non-critical loading and terrain prioritization.
- Refined onboarding and workspace entry behavior by removing forced starter workspace autoload.
- Simplified terrain UX with clearer loading states, continuation messaging, and preview-to-refined updates.
- Improved library filter controls with grouped, persisted filters and compact layout.
- Hardened startup fallback behavior and hover/profile interaction edge cases.
- Stabilized Copernicus throttling behavior and reduced terrain loading stalls.
- Unified LOS model behavior across views and reduced link-switch jank.