Releases: stef-k/Wayfarer
Releases · stef-k/Wayfarer
v1.4.1
v1.4.0
Added
- Added a single compiled Wayfarer runtime version source backed by
Version.props, exposed through the app CLI,/api/version,X-Wayfarer-Version, and the shared footer display (#322, #325) - Added repo-local release helper automation for deterministic version bump preparation, changelog skeleton insertion, offline release checks, explicit local tag checks, and explicit GitHub release validation (#324, #326)
- Added app CLI help output for
help,version --help, and reset-password usage without starting the web host or database-backed command path (#327, #328)
Changed
v1.3.2
Changed
- Map tiles from the local cache now render immediately when stale while bounded background refresh revalidates them with the provider, preserving OSM-safe conditional requests and avoiding request-path waits on cached map views (#316, #318).
- Proxied trip and region images now serve stale optimized local cache files immediately while refresh and cache-miss work is coalesced per image and protected by a process-wide origin/ImageSharp budget (#317, #320).
- Local proxied-image cache hits now bypass anonymous image-proxy rate limiting, while origin downloads and optimization work remain protected for both anonymous and authenticated users (#317, #320).
Fixed
- Fixed repeated slow tile reloads for cached map areas by moving expired tile revalidation off the response path, adding bounded retry/backoff, atomic tile replacement, and Trip Editor retry/concurrency parity (#316, #318).
- Fixed slow repeated proxied image loads for cached trip images by keeping expired local files usable, refreshing them in bounded background work, and preserving old bytes/metadata on refresh failures (#317, #320).
- Fixed raw cover fallback render paths for public trip thumbnails, quick views, and legacy trip/region cover views so they use the local image proxy instead of direct external image URLs (#317, #320).
Deferred
- Trip export snapshot cover downloads still use the raw cover URL and are tracked separately for a later release (#319).
v1.3.1
Changed
- Improved the Trip Editor visit progress/history modal with region progress bars, clearer filter controls, status icons, visit-count pills, and compact first/last/history rows (#309, #311).
- Added a phone-only Trip Editor map-first bottom drawer with
Trip,Regions, andSegmentstabs, deterministic drawer states, mobile search placement, dirty-editor guards, and protected desktop/tablet breakpoints (#312, #313, #314). - The
reset-passwordadmin CLI now runs as a scoped command host and exits after completion instead of continuing into normal web app startup (#306, #307).
Fixed
- Fixed Trip Editor public/progress URLs so editor-generated links use the canonical public trip route instead of
/Public/TripViewer/View/{id}(#308, #310). - Fixed the
reset-passwordCLI service setup to avoid the ASP0000BuildServiceProviderwarning while preserving normal Identity password reset behavior (#306, #307). - Fixed Trip Editor mobile drawer polish issues found during published-bundle validation, including transparent sticky edit headers/footers, non-draggable handle affordance, inconsistent drawer controls/heights, and desktop-to-phone Trip edit/view resize behavior (#314, #313).
v1.3.0
Added
- Replaced the legacy Trip Edit experience with the Vue/Vite Trip Editor on the canonical
/User/Trip/Edit/{id}route (#236, #238, #240, #242, #244, #246, #252, #258, #259, #263, #264, #265, #268, #271, #278, #280, #281, #282, #283) - Added Trip Editor support for metadata, regions, places, areas, segments, tags, share-progress settings, visit progress/history, rich notes, geosearch add-place, coordinate picking, map navigation, map utilities, and shared docked/expanded editor surfaces (#238, #240, #242, #246, #252, #258, #259, #263, #264, #265, #268, #271, #278, #280)
- Added searchable icon and marker-color selectors, selected-place map/sidebar/status synchronization, popup/marker parity, and responsive light/dark Trip Editor polish (#288, #289, #290, #291, #292, #294)
- Added real endpoint Trip Editor contract coverage for CRUD persistence, search-add persistence, rich-notes persistence, stale/error/dirty/delete feedback, and Development/published asset smoke checks (#297, #298, #299, #300, #301, #302, #303, #304)
Changed
GET /User/Trip/Edit/{id}now serves the Vue Trip Editor directly; the old/User/Trip/Workspace/{id}route and legacy editor fallback were removed during cutover cleanup (#282, #283)- Trip Editor rich notes are normalized at the Trip Editor request boundary before persistence, including canonical image URL handling, allowed Quill formatting/alignment, unsafe attribute stripping, and trailing helper paragraph cleanup (#302)
- Deployment now requires the Trip Editor Vite assets to be built before
dotnet publish; server-build deployments need Node.js/npm build tooling and must generatewwwroot/vite/trip-editor/manifest.json(#287, #303) - Development mode uses the Vite dev server assets only, while published/non-Development mode loads manifest-based Trip Editor bundle assets (#303)
- Trip Editor Playwright coverage now distinguishes real endpoint contract proof from mocked UI/request-shape/visual tests (#297, #298)
Fixed
- Fixed published-output Trip Editor asset loading by moving the Vite manifest to the publish-safe
wwwroot/vite/trip-editor/manifest.jsonpath (#287) - Fixed ASP.NET static asset serving/compression interactions for generated
/distand/vite/trip-editorbundle outputs (#285) - Fixed source-tree Production-run documentation by documenting published-output acceptance as the supported production-like local test path (#286)
- Fixed Trip Editor release-candidate parity regressions found during manual validation, including Unassigned Places behavior, geosearch add-place defaults and persistence, marker/icon rendering, map search result containment, coordinate pick behavior, copy-link feedback, and selected editor/sidebar state coherence (#288, #289, #290, #291, #292, #294, #296)
- Fixed final Trip Editor E2E nondeterminism around copy-link feedback timing, inline segment editor layout overlap, sidebar search fixtures, visual-polish expand targeting, real CRUD cleanup, and rich-notes image assertions (#304)
v1.2.28
Added
TileMetadataHotCacheSizeMBapplication setting with Admin Settings UI support and client-side derived entry-count hint for the zoom >= 9 tile metadata hot cache (#217)
Changed
- Warm zoom >= 9 tile hits now use an in-process metadata hot cache to avoid the per-hit Postgres metadata read on the common fresh-cache path (#217)
- Hot metadata cache invalidation now participates in purge, eviction, and tile-delete paths while preserving DB/file durability ordering and existing revalidation behavior (#217)
Fixed
- Fresh hot-hit
LastAccessedthrottling is now atomic per tile and retries immediately after failed DB persists instead of suppressing writes for the full cooldown window (#217)
v1.2.27
Fixed
- HIGH: LRU/full cache purge timed out on large caches (~500MB), showing error page despite successful deletion. Purge now runs in background with immediate HTTP 202 response (#207)
- Cache lock contention during purge blocked concurrent tile writes. Reduced file-delete chunk size from 100 to 10 with
Task.Yield()between chunks to prevent writer starvation (#207)
Added
- SSE-based real-time progress reporting for cache purge operations — admin UI shows animated progress bar with file count and percentage (#207)
- Atomic purge-in-progress guard (
Interlocked.CompareExchange) prevents concurrent purge operations; second request returns 409 Conflict (#207) TileCachePurgeSseendpoint for SSE subscription andTileCachePurgeStatusendpoint for on-load reconnect (#207)- On page load, admin settings UI checks purge status and reconnects SSE if a purge is mid-flight (#207)
- Tile-provider-change purge now respects the concurrency guard — skips gracefully if manual purge is running (#207)
Changed
v1.2.26
Changed
- Outbound budget burst capacity raised from 10 to 12 — allows 2 more tiles through on initial burst before settling into sustained 2/sec rate, reducing 503s on cold-cache loads (#214)
- Outbound budget acquire timeout raised from 3.0s to 3.5s — extra 0.5s yields 1 more token from replenishment per wave, reducing false timeouts (#214)
- Client concurrency pool multiplier raised from 60% to 75% of burst capacity (pool size 6 → 9) — more tiles queue server-side instead of waiting client-side (#214)
- Budget retry-after interval updated from 5s to 6s to align with new burst refill time (12 tokens / 2 per sec = 6s) (#214)
- Client slow-retry interval auto-derives to 18s (was 15s) from updated retry-after × 3 (#214)
v1.2.25
Fixed
- HIGH: Slow retry phase replayed full 5-attempt fast-retry cycle on each poll (~34s lag, 6 per-IP budget hits per cycle). Now uses single-shot
_slowRetryOnce— one fetch per ~15s poll, one budget hit each (#206)
Added
_slowRetryOncemethod — lightweight single-fetch slow-phase handler (#206)
Full Changelog: v1.2.24...v1.2.25
v1.2.24
Changed
- Default per-IP outbound budget increased from 30 → 80 cache misses/min — 30 was too low for cold-cache zoom-17 loads (~35 tiles) (#206)
- Slow retry interval reduced from 30s → 15s (derived from
retryAfterSeconds * 3) (#206) - Client-side pool size and slow retry delay now derived from server config (
burstCapacity,retryAfterSeconds) injected viawayfarerTileConfig— no more hardcoded magic numbers (#206) _Layout.cshtmlnow injectsburstCapacityandretryAfterSecondsintowayfarerTileConfigTileCacheService.OutboundBurstCapacityexposed for config injectionTilesController.BudgetRetryAfterSecondschanged fromprivate stringtointernal int
Full Changelog: v1.2.23...v1.2.24