Public changelog
What changed in IrriDex, newest release first.
IrriDex 2.0.0 — Major user interface overhaul
- Major user interface overhaul across the IrriDex homepage, navigation, catalog, account pages, and map interface.
- Unified typography, buttons, dropdowns, dialogs, and light/dark styling, with appearance selection available in Account Settings.
- Improved map toolbar and logging-mode layouts for mobile devices and browser zoom, while retaining the full-width map.
- No database migration or changes to existing map records.
IrriDex 1.0.0.32 — multi-administrator role management
- Moderator Dashboard role management can now promote any admitted account to Administrator, allowing a co-owner to use the same Administrator-only IrriDex controls as the original owner.
- Administrator grants and removals require the acting administrator's current password in addition to the normal CSRF token and written audit reason.
- Role changes invalidate the target account's existing sessions; the promoted user signs in again before Administrator privileges become active.
- Administrators cannot change their own role from the dashboard, and IrriDex refuses any change that would leave the site with zero Administrator accounts.
- Existing Administrator protections against moderator discipline/account deletion remain intact, and all successful role changes continue to be recorded in the moderation audit log.
- No database migration and no production data are bundled. DreamHost/FileZilla/SFTP privileges remain separate from IrriDex account roles.
IrriDex 1.0.0.31 — calibration reliability + fresh Esri imagery
- Repairs the v1.0.0.29/30 migration omission that left
global_calibrations,global_calibration_items, andglobal_calibration_backupsabsent on already-upgraded databases. v1.0.0.31 advances the schema revision and the admin calibration API self-heals these additive tables if necessary. - The calibration picker now uses the same Esri World Imagery native zoom behavior as the main map: native z19, overzoomed through z23. The old picker incorrectly requested native z20 tiles and could therefore show a different/stale image set.
- Calibration Esri requests are cache-busted per page load/refresh, and the workspace includes REFRESH ESRI IMAGERY plus a visible tile-load status.
- The green corrected point is draggable for fine alignment before preview.
- Calibration database failures now return useful administrator-facing SQLite details rather than only the generic rollback message.
- Deployment itself does not move any map data. Preview, automatic pre-apply safety backup, transaction rollback, history, Undo, and backup restore remain in place.
1.0.0.30 — dashboard calibration + safety-backup recovery
- Moved Global Pin-to-Imagery Calibration out of the normal map controls and into Moderator Dashboard → Imagery calibration & safety backups. The actual global apply/restore actions remain Administrator-only.
- Replaced the old two-free-click workflow with a simpler maintenance flow: enter one known Find/System/Loot ID, IrriDex loads its stored coordinate, then click that same physical object on the refreshed Esri imagery.
- Every calibration automatically creates a full SQLite snapshot with
VACUUM INTO, runsPRAGMA quick_check, and records its SHA-256 checksum before any coordinates move. - Added a backup picker and rescue restore. Restore previews the matching live map records, requires the exact phrase
RESTORE MAP POSITIONS, and restores coordinates/line-polygon geometry from the chosen snapshot while leaving newer records, accounts, messages, feedback, and other non-map state alone. - Every rescue restore first creates another verified snapshot of the current database, so selecting the wrong backup still leaves a recovery point immediately before the restore.
- Adds the additive
global_calibration_backupstable and protecteddata/calibration_backups/snapshot directory. - Fixed the failed-run path in the first calibration implementation: the maintenance page now resolves the old/reference coordinate directly from a typed record ID instead of depending on an existing Leaflet marker click bubbling through to the map. The calibration API now exposes that reference lookup and matches the dashboard backup/restore response contract.
- Backup creation prefers SQLite
VACUUM INTObut falls back to a guarded FULL checkpoint + database copy on shared hosts that do not supportVACUUM INTO; long maintenance writes receive a longer lock/request window instead of failing almost immediately.
1.0.0.29 — global pin-to-imagery calibration
- Adds an administrator-only Global Pin-to-Imagery Calibration tool for aerial-imagery shifts. Pick a known marking’s old coordinate, then its corrected position on the refreshed imagery; IrriDex derives one latitude/longitude translation for the dataset.
- Adds a cutoff calendar date. Finds, Systems, Loot records, lines, and polygons created after that day do not move; the cutoff includes the complete selected day in the administrator account timezone.
- Preview enumerates the exact pre-cutoff target set and issues a fingerprint. Apply recomputes that fingerprint while holding the write guard and refuses stale previews if any target changed.
- The actual shift is atomic across coordinate-bearing Finds, Systems, Loot records, and every vertex of pre-cutoff lines/polygons. Image overlays are deliberately not shifted because they are imagery patches, not map markings.
- Each applied calibration is recorded with per-record before/after snapshots. Recent calibration history can undo a calibration only while all affected records still match their calibrated positions, so later edits cannot be silently overwritten.
- Adds additive
global_calibrationsandglobal_calibration_itemstables. Existing coordinates are unchanged until an administrator explicitly presses Apply global calibration.
1.0.0.28 — update-notice loop repair
- Corrected the release ledger ordering error that placed 1.0.0.26 after 1.0.0.27, which caused the version checkpoint to treat 1.0.0.26 as perpetually unseen after every 1.0.0.27 acknowledgement.
/api/update-info.phpnow compares normal dotted release versions semantically rather than trusting raw ledger position, so an accidentally misplaced older entry cannot recreate the loop.- Explicit update dismissal is persisted to exact-version browser storage immediately, before the background account activity POST finishes. A slow/failed checkpoint request therefore cannot resurrect the same notice on refresh.
- The server still repairs the signed-in account checkpoint in the background for cross-device continuity.
- No database migration.
1.0.0.27 — mobile selection, imagery-patch editing, feedback replies
- Corrected the Saved checkmark geometry so the mark faces the normal ✓ direction without depending on Unicode or icon-font glyph rendering.
- Movement Select on touch/mobile now uses tap first corner → tap opposing corner → draggable four-corner adjustment → Use selection, so map panning no longer competes with rectangle drawing.
- Imagery Patch creation gets the same two-tap mobile rectangle workflow, large touch handles, four-corner resize, and a center move handle.
- Existing imagery patches can now be edited from the map location card: move/resize bounds, change title/notes/opacity/visibility, and optionally replace the image. Mobile users can long-press the map to open the location card.
- Moderator Feedback Inbox can send visible replies to signed-in submitters. Replies are stored as a thread, notify the submitter, and open on a private Feedback Thread page available to that user and moderators.
- Adds the additive
feedback_repliestable; existing feedback reports and map records are preserved.
1.0.0.26 — Saved marker glyph hardening
- Removed the Saved marker's dependency on Font Awesome / Unicode glyph rendering; the green badge now draws its white check geometrically in CSS.
- Traditional Mode Saved markers now use a vector-check sentinel based on the semantic
savedsymbol key, so stale/corrupted legacy glyph text cannot render as a placeholder square. - The Traditional logging Saved choice uses the same font-independent vector check.
- No database migration.
1.0.0.25 — variant artwork, global ID lookup, favicon/icon cleanup
- Replaced the IrriDex favicon/PWA icon family with the supplied IDx artwork.
- Catalog variants can now have exact per-variant 512×512 marker images; choosing a variant automatically selects its configured artwork.
- Map search now supports exact global record ID queries such as
pin:123,system:45,loot:9,polygon:88,line:12, andid:123, including automatic map focus. - Replaced fragile remaining action glyphs in Save Find / close controls with self-hosted Font Awesome icons.
1.0.0.24 — self-hosted Font Awesome UI icons
- Added self-hosted Font Awesome Free 6.7.2 under
map/assets/vendor/fontawesome/; IrriDex does not depend on a Font Awesome CDN or Kit. - Replaced decorative Unicode UI glyphs across the main map with Font Awesome icons: menu, measure, movement select, geolocation, notifications, announcement expand/collapse, close buttons, map rotation, Layout / Mass Mark, photo/image choices, polygon/line logging, current-location actions, and Saved checks.
- Updated dynamically generated icons in the map bundle, timezone picker, tutorial, Systems/Loot success states, credits player, catalog reorder controls, breadcrumbs, and expandable-section affordances.
- Replaced standalone page back-arrow glyphs with Font Awesome arrow icons.
- Traditional Mode marker glyphs remain text-configurable legacy marker data by design; mathematical/prose symbols such as
×,→, dimensions, and degree marks are not UI icons and remain text. - Font Awesome loads from the already-shared
theme.css, so utility pages and the map get the same local icon set without adding a new external failure point. - No database migration.
1.0.0.23 — asset fallback hardening + Bubbler / Indicator categories
- Fixed the map-bricking 404:
.htaccesshad intentionally rejected every fingerprintedmap/assets/js/app-*.jsexcept 1.0.0.19, so 1.0.0.22 existed on disk but Apache refused to serve it. - Replaced the brittle fingerprint allowlist with a missing-file compatibility rewrite to stable
assets/js/app.js; versioned CSS receives the same protection. - The map now loads stable
app.js?v=<release>first and retries the redundantapp-1.0.0.23.jscopy if the primary asset fails. If both copies fail, the shell surfaces an explicit map-code failure instead of silently presenting a dead map. - Deployment diagnostics now verify both primary and fallback map bundles.
- Added first-class Bubbler equipment type and split Salco Bubbler, Rain Bird 1300/1400, Hunter PCB/PCB10R, Orbit Mushroom II, Irritrol Bubbler, and Richdel 533 Bubbler out of Shrub while preserving existing catalog IDs where possible.
- Added first-class Irrigation indicator equipment type and moved Hunter ECO-INDICATOR out of Drip/micro.
- Existing catalog-bound Finds move with their models; conservative free-text Bubbler/ECO-INDICATOR Finds and pending migration/import hints are upgraded too.
- Shrub remains for shrub/riser heads such as Shrub Adapter, PGP Shrub, 570 Shrub, and brass shrub heads. Bubblers retain NP/check-valve applicability inherited from the old Shrub category.
- Additive/idempotent catalog-data migration; no Find IDs, coordinates, photos, or ownership are replaced.
1.0.0.22 — live incremental Find synchronization
- Added live map synchronization for sprinkler Finds without refreshing or reloading the complete map payload.
- Every Find insert, edit, move, visibility change, Mass Edit mutation, import, and deletion is captured by a compact SQLite changefeed trigger, so all existing write paths participate automatically.
- Open maps poll the lightweight changefeed approximately every 2.2 seconds while visible and online, then batch-fetch only the changed Find IDs through the existing authorized marker API.
- A newly created pin appears in-place, an edited/moved pin updates its existing marker, and a deleted or newly-hidden pin disappears without rebuilding unrelated markers or clusters.
- Marker moves reinsert only the affected marker into MarkerCluster so its spatial bucket is recalculated without touching the rest of the map. Traditional Mode likewise updates only the affected Canvas marker/layer.
- Live synchronization respects the active equipment, brand, feature, condition, lifecycle, date, “since last active”, and search filters. A changed pin that no longer matches the active filters is removed from that view.
- The changefeed is privacy-aware: events are delivered only when the current viewer could see the old or new record state. This allows Public → Private changes to remove a formerly visible pin without exposing unrelated private activity.
- Change polling is viewport-aware and pauses during conflicting movement/layout tools, while hidden tabs and offline clients back off automatically.
- Added a signed changefeed cursor plus bounded 50,000-event retention. A page stale beyond that unusually large replay window performs one normal viewport refresh rather than risking inconsistent markers.
- Added batched
focus_idssupport to the Finds marker endpoint so simultaneous changes can be reconciled in one compact request rather than one request per pin. - Added a new fingerprinted
app-1.0.0.22.jsmap bundle so browsers cannot retain the pre-live-sync JavaScript under the older asset URL. - Additive database migration only: one small changefeed table, index, and triggers. Existing Find records are not rewritten.
1.0.0.21 — Mass Edit workspace completion and QOL overhaul
- BCE: Mass Edit now loads and displays every coordinate-bearing Find immediately on entry, providing full-map context before any selection is drawn.
- BCE: all pins remain visible while a polygon is being drawn; finishing the polygon immediately removes every outside pin from the Mass Edit map and isolates the inside working set before the live scan completes.
- Pin hit-testing is temporarily disabled while drawing so visible pins can never steal polygon-vertex clicks. Clearing the polygon restores the complete map context.
- Polygon completion now automatically scans live records; dragging a finished polygon vertex immediately updates the isolated context and automatically rescans after the drag ends.
- Added FIT ALL PINS / FIT SELECTION controls, Enter-to-finish and Escape-to-cancel keyboard behavior, clickable Find markers that open Edit Pin in a new tab, and live inside/eligible/selected-pin counters.
- Added server-authoritative target-state filters for current potable state, lifecycle, and visibility. These filters are included in preview fingerprints and commit criteria.
- Added explicit Uncatalogued Finds selection as one stable bucket without turning legacy/MyMaps free-form labels into fake catalog identities.
- Added model-group QOL controls for live search, Select Filtered, Invert Filtered, Select None, per-group potable/NP counts, and preserved selections across rescans.
- Expanded Mass Edit operations from one RCW action to feature add/remove operations for Non-Potable/RCW, Check Valve/SAM/Check-O-Matic, Side Inlet, Stainless Steel Riser, and Flow Inhibitor/Shut-Off, with model compatibility enforced server-side.
- Added lifecycle batch operations for Installed, Inactive, Removed, Discarded, and Unknown; moving a Saved/collector Find to a non-collector lifecycle clears stale Saved-by attribution.
- Added Public / Trusted Users Only / Private visibility batch operations. Trusted-only changes skip records whose owner account is not eligible for Trusted visibility, matching SQLite defense-in-depth rules.
- Added Exact/Known, Approximate, and Unknown original-location batch operations.
- Preview is now operation-agnostic and reports changes, unchanged rows, unsupported/ineligible rows, and rows excluded by state filters. Commit confirmation names the exact selected operation.
- All new operations retain exact live re-evaluation, signed stale-preview protection, one write guard, one database transaction, and moderation audit logging.
- No database migration.
1.0.0.20 — All-collector Loot view
- Expanded Loot Board Saved-Find integration from a signed-in-user-only list to an all-collectors view of every Saved Find the current viewer is allowed to see.
- Saved Finds are grouped by the attributed collector, with direct links to each collector's IrriDex profile and per-collector counts.
- Added an optional collector filter while preserving the ordinary Loot status filter.
- Existing 1.0.0.19 Saved-by editing remains unchanged: moderators, owners, and eligible Trusted Users can go through legacy Saved marks in Edit Pin and assign the accepted IrriDex account that actually collected each sprinkler.
- Visibility enforcement stays server-side: Public records are broadly visible, Trusted Users Only records remain restricted, and Private records remain visible only to their permitted viewers.
- No database migration and no Find/Loot record rewrite.
1.0.0.19 — Saved-find attribution, Loot integration, and green Saved checks
- Added explicit
saved_by_user_id/saved_atattribution for Finds in the existingcollector(Saved) lifecycle state. - Advanced and Traditional logging can select the accepted IrriDex user who saved the sprinkler; new saves default to the current user and are validated server-side.
- Existing Saved Finds can assign or change the saver from Edit Pin; leaving the Saved lifecycle clears the attribution. Legacy Saved Finds remain valid with an unknown saver.
- Detailed Modern and Traditional pin popups show who saved the sprinkler, including profile identity and saved timestamp when known.
- The signed-in user's Loot Board now includes all visible Saved Finds attributed to that user without creating duplicate Loot records.
- Modern Mode adds a green checkmark overlay to Saved pins, and Traditional Canvas markers receive the same green saved-state indicator.
- Traditional desktop popups now fetch current full details on open, preserving lightweight map payloads while exposing Saved-by and archaeology metadata correctly.
- Additive schema migration only; existing Finds and ordinary Loot records are not rewritten.
1.0.0.18 — Hunter HPC station-capacity repair
- Fixed the Hunter Hydrawise HPC / Pro-C Retrofit catalog picker omitting legitimate 13-station controllers.
- Corrected the built-in modular-capacity choices to 4, 7, 10, 13, 16 and 23 stations, plus a clearly labelled 32-station EZ Decoder / hybrid option.
- Existing databases receive a one-time catalog-metadata migration. If the HPC model still has IrriDex's old built-in variant list, it is replaced with the corrected list; moderator-customized variant lists are preserved and receive only the missing
13 stationoption. - Existing Find records are not rewritten, and old free-text variants remain editable through the full record editor.
1.0.0.17 — Mass Edit filter repair and preset retirement
- Fixed the Mass Edit catalog filter appearing inert:
.model-row { display:flex }could override the browser's native[hidden]rendering, so rows marked hidden by JavaScript remained visible. - Filtering now applies live while typing and also supports an explicit FILTER button, Enter, blur, Escape-to-clear, and a CLEAR FILTER button.
- Added a visible
Showing X of Y catalog modelsresult count so it is obvious when a filter is active and whether it matched anything. - Removed the one-off Irvine I-20 / Rain Bird 5000 preset, its permanently pinned button, query-string autoload path, and embedded coordinates/model criteria now that the requested live batch has been completed.
- General Moderator Mass Edit, satellite map, complete in-polygon pin display, catalog-only model resolution, preview fingerprinting, and atomic commit remain unchanged. No database migration.
1.0.0.16 — emergency Mass Edit usability/catalog repair
- Rebuilt Mass Edit model discovery around the CURRENT IrriDex catalog. Legacy/MyMaps free-form labels are no longer exposed as selectable models.
- Added read-only legacy-to-catalog resolution using catalog aliases, so records such as Rain Bird
5004/5006/5012resolve to the canonical Rain Bird 5000 / 5000+ catalog family and Hunter I-20 product-code variants resolve to I-20 without rewriting live records. - Mass Edit now displays every Find inside the selection polygon, including unselected and uncatalogued records, instead of showing only the records in the current preview/target subset. Selected catalog models are highlighted separately.
- Changed the Mass Edit basemap from OpenStreetMap streets to the same Esri satellite/reference stack used by the main IrriDex map for visual sprinkler alignment.
- Preserved atomic preview/commit fingerprinting and the exact four-point live-data preset. No database migration and no stale database-derived record IDs.
1.0.0.15 — moderator Mass Edit and live-safe Irvine NP preset
- Added a Moderator/Administrator-only Mass Edit workspace with polygon selection, draggable polygon vertices, live model discovery, model checkboxes/search, before/after preview, and explicit atomic commit.
- Mass Edit targets are computed from the live database at Preview/Commit time. Commit carries a signed fingerprint of the exact previewed rows and aborts with 409 if any matching row changes, appears, disappears, or changes potable state first.
- Added the requested four-coordinate Irvine preset targeting Hunter I-20 and Rain Bird 5000-family rotors for Potable → Non-Potable / RCW. The preset stores only the supplied geometry/model criteria; it contains no stale database-derived record IDs.
- The Non-Potable operation adds the stable
npfeature without removing existing body-feature metadata and skips records already identified as reclaimed/non-potable. - Successful batches are recorded in the moderation audit log with polygon/model criteria, affected count, an ID-set hash, and a bounded ID preview. No schema migration.
1.0.0.14 — emergency blacklist edit hotfix
- Editing an existing Find/System/Loot record without changing its coordinates no longer re-runs placement blacklist enforcement against the already-existing location.
- Editing an existing line/polygon without changing its geometry likewise does not fail just because the existing geometry intersects a blacklist created later.
- Moderators/administrators bypass address-blacklist placement restrictions by policy.
- The creator/owner of a blacklist region may also place or move records through that restriction without filing an override request.
- Actual moves by ordinary users into restricted areas remain blocked server-side. No schema migration.
1.0.0.13 - geometry editor reference pins
- Line and polygon editing now shows nearby sprinkler Finds as non-interactive reference markers beneath the editable geometry, making it practical to align vertices directly with existing heads.
- Reference pins reload as the embedded editor is panned, use the same visibility authorization as the normal map API, and are kept below geometry/vertex layers so they never steal editing clicks.
- Reference markers are retained/reconciled during the editing session instead of being cleared on every move, with distant markers trimmed to keep memory bounded.
- Preserved the existing return-to-previous-map-view behavior after saving or cancelling map-originated edits.
- No database migration.
1.0.0.12 — hardware archaeology and production metadata
- Added optional structured fields for manufacture/production date, generation, revision, part/catalog number, date/mold code, country of manufacture, materials/construction, identifying marks, historical/obscure notes, and detail confidence.
- Advanced Log exposes the fields in a collapsed Hardware archaeology section so ordinary logging remains fast.
- Existing finds can edit the same metadata from the full Find editor; Traditional Mode edits preserve it without forcing users through the full selector.
- General Find search now indexes the archaeology fields, so searches such as
Gen 3, a molded date code, part number, country, or material can locate matching records. - Full detail popups show archaeology metadata only when present. Marker-only map payloads do not include it, preserving 1.0.0.11 map-read performance.
- Added an additive schema migration only; no existing Find data is rewritten.
1.0.0.11 — stabilization, lifecycle markings, and map-read performance
- Repaired inactive/dead marking visuals in Modern Mode: inactive markings are consistently dimmed and reduced, while removed/severely-damaged markings receive the same red-X treatment used by Traditional Mode.
- Eliminated split-version map assets: the 1.0.0.11 shell now loads matching fingerprinted CSS and JavaScript, and the bundle's internal version matches the site version.
- All map browsing now uses marker-only API payloads; complete notes/photos/profile details are fetched only when a marking popup is opened.
- Marker-only Find reads no longer execute photo/profile correlated subqueries and use indexed custom-pin joins while retaining every field needed for artwork, inactive/dead status, Traditional Mode, and Movement Select permissions.
- Desktop marker-only reads can return the full supported Find set without falling back to heavyweight popup records; compact devices remain intentionally bounded. Truncated responses are no longer treated as complete viewport coverage, so omitted older pins cannot remain falsely cached as “loaded.”
- Reconciliation is truncation-aware: a capped response cannot evict nearby cached Finds merely because they were absent from that partial response. Systems/Loot marker reads avoid unnecessary user joins, stale generated asset copies are blocked, and retired root app/catalog copies are removed from the clean package. No schema changes.
- Large JSON/JS/CSS responses are gzip-compressed when Apache mod_deflate is available, complete marker reads skip an unnecessary sort, and transient map-read 5xx/network failures receive one bounded retry while stale viewport requests remain abortable.
1.0.0.10 — mobile popup lifecycle and map loading
- Mobile map reads now carry pin artwork/status and geometry only. Notes, photos and profile details are fetched after tapping a marking opens its popup.
- Closing a mobile popup aborts its request and clears its content, including detached HTML. Reopening fetches fresh details; no detail cache is kept.
- Applies to Finds, Systems, Loot and line/polygon popups in Modern and Traditional modes. Focus links locate a marking on mobile without preloading its popup.
- Repeated legacy catalog identity lookups share a bounded cache of catalog matches, without retaining marking records.
- Mobile imagery waits for pinch zoom to settle before requesting intermediate tiles. Public imagery providers and original cluster/pin interactions are retained.
- Desktop full-record reads and immediate popups remain unchanged. No schema changes.
1.0.0.9 — restore 1.0.0.1 pin interactions
- Restored the individual-pin click handlers directly from the original 1.0.0.1 delta: individual pins open details without forced zoom level 20.
- Restored real Leaflet marker clusters at every map zoom. Cluster clicks use the original zoom-to-bounds behavior, radius settings and level-17 split; the geographic count overview is no longer requested.
- Restored original viewport record limits, startup fitting and default map animations. Existing user animation preferences still apply.
- Kept cancellable rendering, full-response deadlines, marker reuse, readable/dismissible layer controls, and signed-out Traditional pin access. No schema changes.
1.0.0.8 — map usability repair
- Restored pin-tap zoom and details for Finds, Systems and Loot on desktop and mobile. Individual pins zoom to street detail without zooming out when already closer.
- Fixed Traditional Mode pin interactions for signed-out visitors: the browsing click handler no longer depends on authenticated logging initialization.
- Moved map layers to the top right, added an explicit Close button, bounded scrolling and 44px choices, and corrected dark-theme label/background contrast.
- Completed marking counts disappear after 4.5 seconds. Loading progress and Retry remain available without a permanent count banner across the map.
- Preserved drawing/picking tools, bounded marker loading and existing moderation features. No schema changes.
1.0.0.7 — moderation notices and Appeals Inbox
- Added a responsive moderation notice with the supplied warning logo and exact warning, temporary ban, permanent ban and account deletion headings.
- Added permanent account bans alongside the existing warning and temporary ban controls. Notices include the reason, issue time, expiry/status and next steps.
- Account owners can submit one appeal per moderation action and read its status and staff response. The Appeals Inbox provides pending/reviewed queues, authorization checks, CSRF protection and audited decisions.
- Approved warning/ban appeals reverse only the linked action. Deleted-account appeals preserve restricted authentication and case history; approval records a decision without restoring deleted profile data.
- Additive schema migration imports existing warnings and active temporary bans. No local instance data is changed by preparing this delta. Existing 1.0.0.6 map bundles remain in use.
1.0.0.6 — mobile map startup and touch usability
- Zoomed-out maps now request authorized, filter-aware geographic counts instead of thousands of complete Find/System/Loot records. Tap a count to zoom into individual markings. Detailed shapes and imagery patches load only at street level.
- Phone detail reads are bounded to 600 Finds, 100 Systems, 100 Loot records, and 100 shapes per request. The map explicitly asks users to zoom closer when results are limited. Desktop map requests use larger bounded limits; exports and stored records are unchanged.
- Added visible fetching/drawing/count status and Retry. The full-screen startup panel is dismissed once controls are ready; optional imagery never blocks it. Read deadlines cover response bodies, superseded viewport reads are cancelled, and rendering yields without depending on animation frames.
- Modern and Traditional marker batches remain incremental and sequence-guarded. Phones release offscreen cached markers and default to reduced map animation, while honoring explicit animation preferences.
- Added a compact Tools menu, 44px touch controls, 16px filter inputs, scrollable logging choices with reachable Cancel, safe-area spacing, and a narrower phone header. Fixed Leaflet attribution intercepting Log Find taps.
- Preserved direct Find/geometry links with authorized targeted reads, and remember the last viewport within the current tab.
- Fixed the stale internal map-bundle version label. Added a CSP-compatible startup fallback for missing map scripts. Service workers remain retired. No database migration or runtime-data changes.
1.0.0.5 — persistent recovery protection and deployment cleanup
- Password-recovery checks reserve an attempt in SQLite before verifying answers, under the existing write guard and an immediate transaction. New sessions and overlapping requests cannot reset or oversubscribe the limit.
- Rolling 15-minute limits allow five checks per account/connection, fifteen per account across connections, and sixty per connection across accounts. Only HMAC fingerprints and timestamps are stored. Checks, including successful or interrupted checks, expire naturally; sign-in counters remain independent.
- Missing fingerprint information, unavailable storage, and lock contention refuse recovery verification safely. Existing password requirements, all-three-answer verification, CSRF, and session invalidation remain in place.
- Added an additive schema upgrade from the 1.0.0.2–1.0.0.4 database revision without rerunning historical catalog backfills.
- Retained 1.0.0.4 marker reconciliation, coverage caching, stale-response rejection, and the restored offline queue/intro scripts.
- Extended stale-request rejection across animation-frame marker batches so an older renderer cannot add stale pins or overwrite newer viewport coverage after yielding.
- Updated deployment documentation and MapLibre credits; refreshed release fingerprints and deploy checks. Packages are delta-only and exclude runtime data.
1.0.0.4 — incremental viewport marker reconciliation
- Repaired the severe viewport-refresh regression where every map movement cleared all client-side Find markers and then recreated them from the API response.
- Finds now reconcile by stable record ID: unchanged markers are retained, moved/visually changed markers are updated in place, new markers are added, and only stale/out-of-cache markers are removed.
- Systems and Loot map pins now use the same incremental reconciliation strategy instead of being destroyed and rebuilt after every viewport request.
- Traditional Mode now incrementally retains its Canvas marker objects during map movement; full marker rebuilds are reserved for explicit Modern/Traditional renderer switches.
- Added padded viewport coverage hysteresis: pans and zoom-ins that remain inside already fetched map coverage make no new map-data request.
- Added a bounded warm marker cache around the current viewport so small back-and-forth pans reuse existing marker objects without unbounded client memory growth.
- Added request sequencing so a slow older viewport response cannot overwrite a newer map position.
1.0.0.3 — privacy-friendlier security questions
- Added a new low-personal-information recovery-question set, including favorite animal, season, weather, food/snack, hobby/activity, fictional character, game, music, memorable-word, made-up-place, and private-phrase choices.
- New security-question setup defaults to the less-personal choices instead of biographical questions about schools, childhood addresses, family, friends, jobs, or vehicles.
- Kept all original question keys for backward compatibility so existing recovery setups continue to display and verify correctly.
- Added guidance explaining that recovery answers do not need to reveal real-life biographical facts and should instead be memorable but difficult for other people to guess.
1.0.0.2 — update-window repair and audit cleanup completion
- Repaired the New Update window regression introduced by the 1.0.0.1 CSP hardening by moving its dynamically injected UI styles into the trusted shared stylesheet; the notification sound and modal now use the same CSP-compatible path.
- Reworked sign-in and registration abuse controls for shared/NAT networks: username-specific failures throttle independently, a much higher connection-wide ceiling remains for brute-force abuse, and registration primarily limits the browser before applying a higher shared-IP ceiling.
- Added an explicit Messages privacy notice explaining that messages are server-stored, are not end-to-end encrypted, and can be inspected by administrators for abuse/service administration with snoop access audit-logged.
- Removed obsolete historical app/site-ui generated bundles and retired unreferenced root app copies; DELTA deployments also block stale copies that may remain on disk.
- Replaced native browser confirm/alert flows in active interfaces with the shared IrriDex dialog system and raised several 8–10px metadata/utility labels to a more readable floor.
- Hardened browser permissions by denying camera access through Permissions-Policy and denying framing with X-Frame-Options/CSP while retaining file-input camera capture where supported.
- Replaced the profane registration agreement with a direct responsible-use and anti-vandalism agreement.
1.0.0.1 — security, viewport loading, and shared UI infrastructure
- Restricted
map/deploy-check.phpto administrators and blocked direct HTTP access to internal.md/.txtdeployment and security notes. - Added CSRF validation to authenticated
api/update-info.phpwrites and moved PHP document responses to a nonce-based CSP for script/style elements while retaining staged compatibility for legacy inline attributes. - Added integrity verification to pinned Leaflet, MarkerCluster, ExifR, and MapLibre CDN dependencies.
- Added viewport-bounded loading for Finds, Systems, Loot, and geometries, with a debounced refresh after map movement instead of routinely returning the entire visible data set.
- Standardized remaining account/moderation/message/block/audit timestamps through the user-aware timezone formatter.
- Expanded storage accounting to the full runtime data tree and aligned Trusted Loot Area edit/delete permissions under the same modification policy.
- Added shared page-shell helpers for favicon, utility/theme CSS, and Site UI loading, removing repeated path/version boilerplate from major PHP pages.
0.4.29.35 — Feedback Inbox TLC
- Rebuilt the moderator Feedback Inbox around the standard IrriDex header and global theme system, fixing the jammed/un-styled navigation and giving the page proper light/dark behavior.
- Added clickable All / New / In review / Resolved / Closed counters, full-text inbox search, tighter status/type filtering, result counts, and filter-preserving review saves.
- Redesigned reports into compact moderation cards with clearer subject/reporter/status hierarchy, client/version/viewport facts, copyable report IDs, direct View Map Location actions, and structured collapsible technical context.
- Fixed the doubled timezone label on feedback timestamps. Shared time localization now receives the stored ISO timestamp without an extra literal
UTC, eliminating output such asPDT UTC. - Added responsive/mobile layouts, a visible open-report summary, save-in-progress/confirmation feedback, and a focused-report notice when a just-updated item moves outside the active filter.
0.4.29.34 — Reliable New Update window
- Replaced manually versioned
site-ui-*filenames with one canonicalsite-ui.js, cache-busted from the liveIRRIDEX_VERSION, so the update checker cannot quietly lag behind the deployed release. - The New Update window now marks a release seen only after an explicit close, Continue, or changelog action. Simply rendering the window no longer advances the acknowledgement checkpoint.
- Stale tabs are told when a newer IrriDex version is deployed and receive a Reload IrriDex action instead of silently continuing with outdated release metadata.
- Added a per-version fail-safe notice if update metadata is temporarily unreachable, while keeping acknowledgement local until the user actually acts on it.
- Moved all PHP pages onto the same canonical update-window script and automatic version query string.
0.4.29.33 — Toro 570 third-generation black-seal correction
- Fixed v0.4.29.32 incorrectly collapsing legacy Toro
570 (3rd gen/generation)records into the ordinary570Zcatalog row. - Third-generation wording now resolves only to a distinct moderator-created 570Z Black Seal catalog entry (for example
570z-black-seal). If no black-seal entry exists, IrriDex leaves the legacy wording alone rather than guessing. - Added recovery for records already collapsed by v0.4.29.32: Migration Event / MyMaps source metadata is used to identify the original third-generation records and relink them to the black-seal model without touching unrelated 570Z, 570C, 570P, PR, or PRX records.
- Legacy popup heights such as
4inare still preserved when the dedicated black-seal catalog model exposes the corresponding height variant. - Search can continue matching
3rd genbecause protected migration source text is intentionally retained as historical/source metadata even after the visible catalog identity is corrected.
0.4.29.32 — ruler click priority + live distance + Toro 570 normalization
- Measure mode now owns map interaction while active: sprinkler pins, clusters, and other interactive map overlays no longer steal ruler clicks or open their detail popups, so a measurement point can be placed directly on the center of a head.
- Added a Google-My-Maps-style live ruler preview. After the first point, moving the pointer draws the pending segment and shows the continuously updated cumulative distance both beside the pointer and in the ruler status banner.
- Legacy Toro
570 (3rd gen/generation)identities are automatically corrected to the stable Toro570zcatalog model (the black-seal 570Z listing), including existing records and future saves/edits. - Embedded legacy popup heights such as
570 3rd gen 4inare preserved as the corresponding 570Z catalog variant during correction.
0.4.29.31 — product-aware stainless riser + flow-control features
- Added Stainless Steel Riser as a first-class body feature with model-aware eligibility instead of exposing it on every rotor/spray. Supported seeded identities include the 4-inch K-Rain Pro-S plus Rain Bird 5000/Falcon 6504/8005, Hunter I-20/I-25/I-40, and K-Rain RPS 75/RPS 75i rotors.
- Added a single stable Flow Inhibitor / Shut-Off data value whose visible name follows the selected product: Stop Flow (K-Rain Pro-S 4-inch), FloGuard (Hunter Pro-Spray PRS30/PRS40), FloStop (Hunter I-20), X-Flow (Toro 570Z/570Z PRX), Flow-Shield (Rain Bird RD1800), and Flow Shut-Off (5000+) (Rain Bird 5000 Series).
- Standard logging, Layout / Mass Mark, and the edit page now hide incompatible special features based on manufacturer/model/variant. Server-side single and batch writes apply the same whitelist so stale clients cannot persist impossible combinations.
- Bumped the schema seed marker so existing installations receive the two new built-in catalog options without disturbing moderator-customized catalog records.
- Advanced the map app and shared Site UI fingerprints and added this release to Changes Since Last Active.
0.4.29.30 — Feedback announcement + T-Mobile connection notice
- Announced the new center-right FEEDBACK tab through IrriDex's deployment-critical Changes Since Last Active window so users know where to send suggestions, bugs, outage/problem reports, data corrections, and general feedback.
- Announced the T-Mobile/slow-route repair: the obsolete
/map/service worker and its hard network deadlines were retired after they were shown aborting otherwise-live connections. - The update notice points affected users to
/connection-repair.phpif one browser remains controlled by the stale worker; the repair unregisters IrriDex workers/caches without clearing account cookies. - Refreshed the shared UI fallback release metadata so this announcement still appears even when
/api/update-info.phpitself cannot be reached. - Added a conspicuous repository-root reminder file documenting the exact version/release-notice checklist required every time IrriDex is modified.
0.4.29.29 — T-Mobile/slow-route false-outage repair
- Retired the
/map/service worker after network captures showed v0.4.29.27 aborting the live/map/navigation at its six-second deadline and substituting the offline response even though the origin was still reachable. - Removed all service-worker navigation/API/static fetch deadlines; the browser now owns navigation and ordinary network recovery instead of IrriDex turning a slow route into a hard failure.
- Existing IrriDex service-worker registrations and old static caches are actively removed when the new app loads.
- Added
/connection-repair.phpoutside the old/map/worker scope so a user trapped behind the obsolete worker can forcibly unregister it without clearing login cookies or site data. - Forced
sw.jsresponses to no-store/no-cache so emergency worker retirements cannot be held behind a stale HTTP cache.
0.4.29.28 — transient-outage hardening + Feedback inbox
- Reduced a plausible source of intermittent whole-site SQLite lock failures: normal requests no longer issue schema DDL or re-assert WAL journal mode when the database is already configured. Busy/locked database opens now receive a short bounded retry.
- Temporary database/migration contention is reported as HTTP 503 with
Retry-Afterand a one-time automatic reload instead of looking like a permanent generic 500. PHP failures receive short request IDs and are written to a capped, non-web-accessible runtime incident ledger for later diagnosis. - Map/API GET requests now retry once on transient network failures and HTTP 500/502/503/504 responses. Failed refreshes keep already-rendered map data instead of clearing a working map first. The map service worker also retries transient 5XX navigation failures once.
- Added a center-right FEEDBACK tab for signed-in users and guests. It opens an in-map dialog for suggestions, general feedback, bug reports, problem/outage reports, data corrections, and other feedback.
- Feedback can optionally include the IrriDex build, page, browser/viewport, current map view/bearing, request correlation ID, and the last few client/network failures. Cookies and form contents are never included.
- Added retry-safe feedback submission, anonymous/authenticated rate limits, moderator/admin notifications, and a moderator Feedback Inbox with report status, internal notes, technical context, and the recent server incident ledger.
0.4.29.27 — wrapped-world layout transform repair
- Fixed layout previews and transform handles jumping by exactly one world width at low zoom or near the ±180° longitude seam.
- Preview/edit geometry now preserves Leaflet's unwrapped longitude while it is on screen; longitude wrapping is deferred until the batch is actually saved.
- Rectangle heads, transform frames, resize handles, and rotation handles therefore remain in the same visible world copy throughout move/resize/rotate operations.
- Kept independent edge/corner resizing and the existing no-uniform-scale behavior from v0.4.29.26.
- Persistence still normalizes saved longitudes to the canonical -180..180 range, so this visual repair does not change stored coordinate format.
0.4.29.26 — layout editor usability + unconstrained edge resizing
- Reworked the generated-layout editor so proposed sprinkler heads use distinct round blue markers while resize controls are separate high-contrast square handles.
- Added eight resize handles: each side handle moves only that edge, and each corner handle independently changes the two touched edges. Aspect ratio is never locked and the opposite edge(s) remain anchored.
- Resize math now works in the selection's own rotated coordinate system, so edge/corner dragging stays intuitive after rotating the preview.
- Simplified the floating layout toolbar: removed uniform +/- scaling and rotation-step clutter, kept direct drag editing, Reset placement, Settings, Create, and Cancel.
- Improved transform dragging by tracking pointer movement in screen space and continuing the drag even when the pointer leaves the Leaflet map container; mouse/touch release also reliably restores map panning.
- Retained edge-to-edge rectangle placement and endpoint-inclusive line placement from v0.4.29.25.
0.4.29.24 — sprinkler layout tools + map rotation
- Added Layout / Mass Mark to LOG FIND with three preview-first creation modes: Endpoint Fill, Follow Curve, and Rectangle Grid.
- Endpoint Fill accepts two known endpoints plus an exact number of heads between them and evenly spaces only the new intermediate markings.
- Follow Curve accepts a traced multi-point route and distributes the requested total number of heads evenly by cumulative path distance.
- Rectangle Grid uses a drag-selection workflow with configurable rows/columns and optional edge placement; its visual rectangle remains aligned with the screen even at a rotated map bearing.
- Layout anchors can snap to nearby existing pins, tool settings are remembered locally, and each generated batch uses an atomic idempotent API so timeout retries cannot duplicate the layout.
- Added persistent map rotation controls for clockwise/counterclockwise 15° steps and north reset. Keyboard shortcuts:
[/]; hold Shift for 5° fine rotation;\resets north. - Rotation-aware point conversion keeps map clicking and Movement Select arrow-key nudging aligned with what is visually on screen.
- Preserved the deployment-critical Changes Since Last Active release-notice invariant and advanced app/CSS/shared-UI/service-worker fingerprints together.
0.4.29.23 — logging menu artwork integration
- Integrated the four supplied 256×256 logging icons into LOG FIND: Google Maps + for Traditional Log, lightning + for Rapid Log, green S + for System Log, and framed satellite + for Image Overlay / Imagery Patch.
- Reused the existing
.log-mode-iconsizing/responsive behavior so the supplied artwork lines up with Quick Log, Advanced Log, and Polygon / Line Log on desktop and mobile. - Rapid Log's mixed-deployment/self-healing UI now reconstructs with the supplied RapidAdd artwork instead of the old emoji glyph.
- Added all four small logging icons to the map service worker's core cache so the logging chooser remains visually complete offline.
- Preserved the OAM catalog repair, imagery-patch workflow, Movement Select keyboard capture, optional map animations, and the deployment-critical Changes Since Last Active release-notice invariant.
0.4.29.22 — OAM catalog repair + imagery patch overlays
- Repaired OpenAerialMap HD discovery by removing the hard-coded legacy
openaerialmapcollection restriction. IrriDex now searches the HOT STAC catalog across collections, keeps only records with an actualassets.visualimagery asset, and renders each chosen item through its own returned collection ID. - Added Image Overlay / Imagery Patch to LOG FIND. Drag a map rectangle, upload a replacement image, preview its opacity, choose Public / Trusted / Private visibility, and save it as a correction layer.
- Imagery patches render above the selected basemap but below IrriDex pins, polygons, and lines, so stale aerial imagery can be covered without obscuring mapped irrigation records.
- Patch uploads are normalized server-side, metadata is stripped, file/pixel/area limits are enforced, and owner/moderator removal is available from the map right-click workflow.
- Preserved Movement Select keyboard capture, optional map animations, and the deployment-critical Changes Since Last Active release-notice invariant.
0.4.29.21 — OpenAerialMap clean STAC rebuild
- Removed the previous OpenAerialMap basemap implementation instead of adding another patch on top of it.
- Rebuilt OAM around the current HOT STAC catalogue plus the documented per-item TiTiler-PgSTAC raster endpoint.
- IrriDex no longer uses
global.imagery.hotosm.org; the numbered z0–13 density/coverage tiles are therefore impossible to display as the OAM basemap. - OAM HD is available at zoom 15+ and selects real imagery covering the viewport, preferring the smallest GSD at the map centre and then the newest capture.
- No OAM coverage or raster failure now exits OAM explicitly and returns to the separately named Esri basemap rather than silently substituting pixels.
- Preserved Movement Select keyboard capture, optional map animations, and the deployment-critical changes-since-last-active update window.
0.4.29.19 — OAM rollback + Movement Select keyboard repair
- Reverted OpenAerialMap to the exact plain Leaflet TileLayer configuration used in v0.4.29.14, the last field-tested build reported as showing the desired high-detail OAM imagery.
- Removed every post-v0.4.29.14 OAM rendering experiment: no checkerboard, no hidden Esri underlay, no request diagnostics, no request scheduler, no opacity/min-zoom intervention, and no custom tile-error replacement.
- Movement Select now captures Arrow/Shift+Arrow/Enter/Escape at the window capture phase before Leaflet can pan the map. Arrow = 1 px; Shift+Arrow = 10 px.
- Preserved the map-animation toggle and the deployment-critical Changes Since Last Active release notice.
0.4.29.18 — OpenAerialMap provenance + request diagnostics
- Removed the silent Esri-under-OAM fallback introduced in v0.4.29.17. Selecting OpenAerialMap now means visible aerial tiles are actually OAM pixels or visibly absent.
- Replaced the IrriDex navy canvas beneath missing/loading OAM tiles with a neutral checkerboard so gaps do not resemble a broken dark map.
- Added an on-map OAM status indicator showing tile requests started, OAM tiles actually loaded, and unavailable/error tiles.
- Kept HOT's documented
https://global.imagery.hotosm.org/{z}/{x}/{y}.pngXYZ endpoint and ordinary Leaflet TileLayer request path. - Preserved Movement Select, map-animation preference, and the deployment-critical changes-since-last-active notice.
0.4.29.17 — OpenAerialMap request-path rollback + visual fallback
- Reverted the experimental v0.4.29.16 OpenAerialMap
minZoom/tile scheduling/error-tile behavior after field debugging showed browsers could display only the IrriDex navy canvas with no OAM image requests. - Restored OAM to the ordinary Leaflet TileLayer request path that worked in v0.4.29.14/15.
- OpenAerialMap now renders over an independent Esri imagery fallback, so slow, missing, or failed OAM tiles never reveal the navy map background.
- OAM's z0-13 coverage-density product is visually suppressed; real OAM aerial pixels become visible at z14+.
- Preserved Movement Select, optional animations, right-click address/coordinate copy, and the deployment-critical Changes Since Last Active window.
0.4.29.16 — Movement Select + optional animation + OpenAerialMap behavior repair
- Restored classic smooth map/cluster animation by default and added a remembered Map animations toggle in the map drawer. Turning it off reloads the renderer at the same view and retains the low-motion stability mode from v0.4.29.15.
- Added Movement Select for imagery-alignment corrections: drag a rectangle around editable pins, lines, and polygons; drag the selected group or nudge it with arrow keys (Shift + arrow = 10 px); press Done or Enter to save, or Esc to cancel.
- Bulk movement is authorized server-side and committed atomically. Owners can move their own editable content, Trusted-user shared edit rules are preserved, and Moderators/Administrators can move every loaded pin/line/polygon.
- OpenAerialMap now skips the non-imagery z0–13 coverage grid, jumps to z14 when selected too far out, refreshes predictably while panning, and replaces failed tiles cleanly instead of leaving broken-image artifacts.
- Preserved the changes since last active release notice and its exact-version/fallback deployment invariants.
v0.4.29.14 — imagery CSP repair + map right-click copy tools
0.4.29.15 — Map stability / OpenAerialMap load control
- Stabilized pins and other IrriDex map content during wheel/pinch zooms by disabling Leaflet/MarkerCluster zoom animations while retaining off-screen pruning for performance.
- OpenAerialMap now waits for navigation to settle before refreshing tiles and keeps a larger nearby tile buffer to reduce repeat requests to the slower imagery host.
- Disabled raster tile fade compositing to reduce browser/GPU pressure when thousands of markers are visible.
- Preserved the free-imagery selector, right-click Copy Address/Coordinates, and the changes-since-last-active update window.
- Repaired the Content-Security-Policy omission that caused the new USGS Aerial, OpenAerialMap, and Santa Clara County 2025 imagery layers to be blocked by the browser even though their layer URLs were valid.
- Added the required USGS, HOT/OpenAerialMap, HOT imagery API redirect, and Santa Clara County hosts to the map image/connect policy.
- Added a source-code MAP-IMAGERY CSP INVARIANT so future basemap additions must update the CSP whitelist in the same release.
- Right-clicking anywhere on the actual map surface now opens an IrriDex location popup with COPY ADDRESS and COPY COORDINATES. Right-clicking directly over marker artwork is supported too.
- Address copying uses the existing keyless OpenStreetMap Nominatim infrastructure through a same-origin IrriDex endpoint, retaining server-side caching and one-request-per-second rate-limit protection.
- Preserved the changes since last active update window, exact-version activity guard, API/fallback notice path, and atomic map CSS/JS/shared-UI/service-worker fingerprinting.
v0.4.29.13 — Free aerial imagery test layers
- Added USGS Aerial — Free / USA using the keyless USGS The National Map
USGSImageryOnlytile service. - Added OpenAerialMap — Free / Open using HOT's global OpenAerialMap mosaic; below zoom 14 it intentionally shows the coverage grid, while zoom 14+ serves contributed aerial/UAV imagery where available.
- Added Local Hi-Res — Santa Clara Co. 2025 using the County of Santa Clara public Winter 2025 ImageServer (3–6 inch source imagery) with no IrriDex API key or billing account.
- Retained both existing Esri satellite modes, terrain, street map, and OSM fallback so imagery can be compared directly.
- IrriDex now remembers the selected basemap locally between reloads.
- Added a source-code NO-BILLING BASEMAP INVARIANT: future providers requiring a billable API key, credit card, paid subscription, or payment-dependent account must not be added to the selector.
- Preserved the changes since last active update window, exact-version activity guard, API/fallback paths, and atomic CSS/JS/service-worker fingerprinting.
v0.4.29.12 — System Log on map
- Added System Log to the same LOG FIND chooser as Rapid, Quick, Advanced, Traditional, and Polygon/Line logging.
- Choose System Log, click/tap the map location, then enter the irrigation system inventory; latitude/longitude are supplied automatically from the selected map point.
- System Log supports name, site/location label, backflow, controller, valves, rain sensor, majority popup brand, notes, and Public/Trusted/Private visibility.
- Successful saves refresh map data immediately without leaving the map.
- Preserved the What changed since you were last active release-notice invariant and advanced map JS/CSS/shared UI/service-worker fingerprints together.
v0.4.29.11 — edit/move permission repair
- Repaired a cross-surface permission mismatch where some records could expose Delete while suppressing Edit/Move.
- Finds and map geometries now use the same mutation authorization for map UI flags, edit pages, pin movement, and deletion.
- Systems/Loot retain owner-or-moderator modification rules.
- Preserved the What changed since you were last active deployment invariant and fresh asset/service-worker fingerprints.
IrriDex v0.4.29.10
- Repaired the v0.4.29.9 delta package's version drift: the site shell could report v0.4.29.8 because
config.phpremained hard-coded whileVERSIONhad advanced.IRRIDEX_VERSIONnow derives from theVERSIONfile. - Refingerprinted the map CSS, map JavaScript, shared site UI, and service-worker cache as one release so stale mixed-build assets cannot intermittently affect layout or pin-edit behavior.
- The map service worker now keys registration to its bundle release and revalidates the installed worker, independent of a stale server bootstrap version.
- Edit pages now send
no-store/no-cache headers to prevent a stale editor from surviving a deployment and making pin changes appear inconsistent. - Raised the Changes Since Last Active backdrop above the fixed IrriDex topbar/drawer. The release-notice API guard and bundled fallback remain explicitly protected in source.
v0.4.29.9 — Trusted terminology + moderator trust controls
- The user-facing trust tier is now Trusted User everywhere. Restricted visibility now reads Trusted Users Only. The legacy database column/visibility slug named
approvedis intentionally retained so existing records and installations do not require a destructive migration. - Moderator Dashboard explicitly permits Moderators to make accepted Standard Users Trusted or remove Trusted status.
- Confirmed Moderator warning and temporary-ban workflows remain available for both Standard and Trusted accounts. Moderators still cannot discipline Administrator/Moderator accounts; Administrators retain the broader role hierarchy.
- Username validation now permits
0. A space or any other forbidden character reports exactly:Illegal character. Username must only consist of the following characters - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_.- - Deployment invariant: the What changed since you were last active window, version checkpoint, network fallback, and old-client activity guard are deliberately preserved and marked in source comments so later feature work does not accidentally remove them.
v0.4.29.8 — Username validation message repair
- A whitespace or other forbidden character in a username now reports exactly:
Illegal character. Username must only consist of the following characters - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_.- Username is too long.is now reserved for usernames that actually exceed 32 characters.- Username creation/change no longer trims leading or trailing whitespace before validation, so whitespace cannot silently disappear and become a different username.
- Browser-side username validation and server-side account validation now agree on the permitted character set.
0.4.29.5 — save edits and return to the working map view
v0.4.29.7 — Update-window deployment race repair
- Fixed a deployment timing race where
last_active_atcould move past a release's recorded push time while the previous build was still live, causing the new-update window to be skipped. - The server now treats the loaded version fingerprint as authoritative and includes the current release whenever the saved activity version is older, missing, or different.
- Added a bundled one-release fallback notice so a transient
update-info.phpfailure cannot silently suppress the update window. - Added exact-release browser acknowledgement for the fallback path so network outages do not make the same fallback notice appear on every page load.
- Pin and geometry edit links now carry the map center and zoom into the editor.
- Successful pin, line, and polygon edits return immediately to that exact map view through a fresh 303 navigation.
- Direct edit-page visits fall back to focusing the edited record on the map after save.
- Back Without Saving also preserves the originating map viewport when the editor was opened from the map.
0.4.29.4 — custom colors for polygons and lines
- Line Log and Polygon Log now include a native color picker plus editable
#RRGGBBvalue. The draft shape changes color immediately while drawing/saving. - Existing map geometry can change color from Edit line / Edit polygon; the Leaflet editing preview updates live before Save.
- Geometry colors are stored per record and rendered consistently for both stroke and polygon fill.
- Existing geometry defaults to the historical Leaflet blue (
#3388FF). Migrated MyMaps lines/polygons are backfilled from their source color when a valid six-digit source color is available.
0.4.29.3 — mobile logging reliability + save recovery
- Replaces the indefinite mobile
Saving…state with a progress-aware upload path. Photo uploads report their percentage, the server-processing phase is labeled separately, and a stalled connection is stopped rather than being allowed to sit for many minutes. - Adds per-user request tokens to Find saves. Retrying after a network timeout is idempotent: if the first request committed after the browser lost contact, the retry returns the existing Find instead of inserting a duplicate.
- A confirmed save closes the logging wizard immediately; reloading the several-thousand-pin map now happens in the background rather than keeping the Save button disabled while map data refreshes.
- Keeps the entered form intact after timeout/error and changes the action to Retry save, with an inline status message explaining what happened.
- Improves phone logging ergonomics with a keyboard/visual-viewport-aware wizard, controls positioned below the fixed top bar, 16 px form inputs to prevent iOS focus zoom, larger touch targets, a compact Advanced Log photo/EXIF strip, stacked search controls, and thumb-sized sticky navigation/save buttons.
0.4.29.2 — editor contrast + draw-through pins
- Repairs dark-theme contrast on standalone edit-page feature/condition checkbox cards, section headings, visibility legends, and geometry helper surfaces.
- While Polygon or Line Log is armed, clicking an existing Find/System/Loot pin now places a vertex at that pin's exact coordinates instead of opening its detail popup.
- The behavior applies to both progressively loaded and normally rendered markers; ordinary pin popup behavior is unchanged outside geometry drawing mode.
IrriDex v0.4.29.0
- Performed a broad text/background contrast audit across shared CSS, theme rules, legacy fingerprinted map CSS, and inline PHP styles. Corrected explicit pairs below the normal-text 4.5:1 target and added semantic light/dark theme guards.
- Reworked startup loading so the IrriDex top bar, hamburger menu, logo, drawer/account/notification controls remain usable while the loader is visible. Loading progress now includes a numeric percentage.
- Normal-mode map data now populates visibly: finds are painted in animation-frame chunks while lines/polygons can render independently, instead of holding thousands of markers until one final bulk paint. Systems/Loot rendering is sequenced after the find-cluster pass to avoid a cluster-clear race.
- Moderator catalog preview uploads no longer need to be pre-sized to 512×512. PNG, JPEG, WebP, GIF, and BMP sources at arbitrary dimensions/aspect ratios are safely decoded and forcibly stretched/squished to an exact 512×512 PNG; no crop is performed.
- Hardened moderation: trust and role changes require reasons, role changes invalidate stale sessions immediately, early ban lifts require reasons, account deletion requires a reason plus exact typed username, automatic IP-ban overrides are Administrator-only, and site-wide presentation controls are Administrator-only. The dashboard now reports
last_active_atrather thanlast_login_at. - Added
/api/message-status.phpand shared one-minute message polling for signed-in clients. The browser establishes an inbox baseline, then shows aPING — NEW MESSAGEalert only when a newer received message ID appears; otherwise polling stays silent. Map message badges update from the same result. - Fixed two cache/deployment issues found during the audit: the map now loads fingerprinted
app-0.4.29.0.css, and the map service worker no longer ignores query strings when matching cached assets.
IrriDex v0.4.28.2
Changes since last active + release push timeline
- Replaced the per-version “Update Installed” acknowledgement behavior with a cumulative What changed since you were last active dialog. If multiple releases landed while a user was away, the dialog groups all matching releases in chronological order.
- Added
users.last_active_atas the release-notice cutoff. Existing accounts receive a one-time migration bridge from the legacy login timestamp; after that migration, release notices uselast_active_atexclusively. - Activity is advanced only after the current-version update check has successfully completed. An older page left open across a deployment is not allowed to advance activity on the newer server version, so refreshing after a push reliably surfaces the new release.
- Added an immutable release ledger with UTC
pushed_atmetadata. Historical entries are marked approximate; v0.4.28.2 and future releases are expected to carry definite push timestamps. - Logged-out/public-map visitors use a browser-local server-issued activity cutoff, while signed-in users use their account
last_active_atvalue.
IrriDex v0.4.25.7
0.4.25.7 — setup redirect/fatal recovery hotfix
- Fixed the v0.4.25.6 MyMaps catalog relinker crashing on numeric-only aliases such as
5000: PHP converted numeric-string associative-array keys to integers, which were later handed topreg_replace(). Alias storage now preserves every normalized model identity as an actual string. - Database/schema exceptions are no longer interpreted as “IrriDex is not configured.” An installed site that fails during bootstrap now returns HTTP 500 instead of redirecting every visitor into
/setup/. /setup/now fails closed: it is shown only after database initialization succeeds and the users table genuinely contains zero accounts. Existing/broken installations can no longer expose the administrator-creation form.- PHP fatal pages now state: “IrriDex encountered a fatal error. The webmaster needs to fix it. During this time IrriDex is inaccessible.” and include a sanitized Error reason without exposing the application filesystem path.
- The PDO handle is cached only after schema migration succeeds, preventing a caught migration failure from leaving a half-initialized connection reusable in the same request.
- Retains all v0.4.25.6 profile previews, theme contrast, latency/worker hardening, and current-catalog MyMaps relinking behavior.
IrriDex v0.4.25.6
0.4.25.6 — profile attribution, contrast, no-spam latency hardening, migration relinking
- Pin and geometry detail boxes now show the discoverer's profile-icon preview beside a canonical profile link; the old missing-
user_idfallback that sent names to user 0 is removed. - Pin-detail foreground/background colors are explicitly paired for both light and dark themes, including notes, metadata, links, and discoverer identity rows.
- Removed 30-second notification polling, forced service-worker update checks, and network-first static revalidation. Notification refreshes are single-flight and event-throttled; update checks run during idle time at most once per 10 minutes per tab.
- Service-worker install now precaches only the small application core. Large audio/artwork assets are cached only when actually used, and cached map assets generate no origin revalidation request.
- The obsolete root-scope service worker now self-unregisters instead of deleting the active
/map/worker cache; the map worker only replaces IrriDex-owned caches and is registered only when the current version is not already installed. - Pin popup HTML is built lazily only when a pin is opened instead of prebuilding thousands of detailed cards during map startup.
- Normal-map Leaflet markers are inserted into MarkerCluster in one chunked bulk operation instead of thousands of one-by-one cluster recalculations, preventing long main-thread stalls on the migrated dataset.
- Non-critical worker/update/badge work is deferred until after the first map load so it cannot compete with the catalog/find requests.
- MyMaps-migrated finds with no catalog ID are conservatively relinked to current catalog models using manufacturer, normalized model identity, and normally equipment type; a unique exact body-model match may also correct a bad legacy equipment-type guess. Ambiguous matches remain untouched. Adding or editing a catalog model immediately retries only that model against still-unbound migrated pins, so later catalog additions are recognized without remigrating data.
- Clarified Quick Catalog Addition audit wording. The former phrase “placed it in the requested model order” referred only to the moderator-selected catalog placement and could be mistaken for a user-submitted model request.
- Quick-add audit entries now identify the action as
moderator_quick_add, target the newly created catalog model ID, and record the exact placement (after a specific existing model or at the end of the manufacturer/type group). - Added an explicit note to Catalog Manager that Quick Catalog Addition is a direct Moderator+ edit and is not a user model-request queue. No user model-request subsystem is added by this patch.
IrriDex v0.4.25.4
- Repositioned the code-rendered START, CREDITS, and signed-out TUTORIAL controls so the complete button group is always contained within the IrriSplash artwork rather than hanging beyond its lower/right edge.
- Made the moderator-customizable yellow splash text pulse exactly 3× faster (1.45 s → 0.4833 s per animation cycle) and moved it farther inward from the top/right edges of the artwork.
- Sillies remain on their existing bottom-of-screen track and keep the five-second launch cadence from v0.4.25.2.
IrriDex v0.4.25.3
- Corrected the new IrriSplash layout: the artwork is once again a centered intro card rather than a full-viewport background, matching the spatial behavior of the older startup intro.
- The live IrriDex page remains blurred around the centered artwork. START, CREDITS, signed-out TUTORIAL, moderator splash text, and Sillies stay positioned with the intro card.
- The five-second no-repeat Sillies scheduler and all other v0.4.25.2 intro behavior are unchanged.
IrriDex v0.4.25.2
- Replaced the legacy bar-based startup artwork with the supplied full-screen IrriSplash image. The splash image now fills the intro while preserving the click/tap-to-begin flow, music, credits, tutorial, moderator splash text, and QUIT replay behavior.
- Rebuilt START, CREDITS, and signed-out TUTORIAL controls entirely in HTML/CSS. They retain hover, focus, disabled, and pressed feedback without image assets or generated artwork.
- Changed intro Sillies to a fixed cadence: one new unique phrase is launched every 5 seconds. Existing phrases keep traveling until they leave the screen and are then removed; there is no active-item cap.
- Sillies still shuffle without replacement for each intro sitting and remain Moderator+ editable.
IrriDex v0.4.25.1
- Increased startup Sillies density: up to two unique phrases now cross the same lower-screen track at once.
- Added a QUIT control to the map drawer. QUIT intentionally reopens the startup intro even if the daily intro has already played or the signed-in account normally skips startup intros.
- Added Moderator+ editing for the site-wide silly list on the Moderator Dashboard, including save and reset-to-default controls. Blank lines/exact duplicates are removed, with a 1,000-phrase / 300-character-per-phrase safety limit.
- Sillies remain shuffled without replacement during each intro sitting, including after Credits pauses/resumes the marquee.
IrriDex v0.4.25.0
- Added Sillies to the startup intro: randomized phrases travel from the lower-right edge to the lower-left edge while the main intro scene is active.
- A phrase is never repeated within the same intro sitting. The submitted list contains one exact duplicate (
hii sprinkler!!), so the runtime deduplicates exact matches before shuffling. - Sillies pause and clear while Credits are open, resume from the remaining randomized queue afterward, and stop immediately when START or TUTORIAL leaves the intro.
- The intro sillies are decorative (
aria-hidden) and are suppressed forprefers-reduced-motion.
IrriDex v0.4.24.0
- Previously replaced the IrriDex-owned Franklin Gothic font stack with a hosted sans-serif typeface; this earlier typography choice has since been retired.
- Added Google Fonts preconnect/stylesheet tags to every rendered IrriDex HTML/PHP page, including the offline and branded error surfaces.
- Updated the Content Security Policy to permit
fonts.googleapis.comstyles andfonts.gstatic.comfont files. - Previously introduced a credit for the hosted typeface. That obsolete automatic attribution was removed when the interface returned to system-provided fonts.
- No database schema or irrigation-record behavior changed in this release.
IrriDex v0.4.23.4
- Expanded the global UI sound controller so every ordinary
href/hyperlink, native button, submit/reset/image input, summary control, and role-based button/link receivesSelect.wav. - Primary pointer activation starts the sound before navigation, preventing same-tab hyperlinks and form submits from unloading the page before the click can be heard. Keyboard activation falls back to click-time playback.
- Preserved intentional sound exceptions: Back/Close/Cancel actions use
Back.wav, Sign Out usesUserLogoff.wav, and startup-intro controls retain their dedicated intro sound behavior. - Confirmed every normal rendered IrriDex PHP page loads the shared
site-ui.jscontroller; only the dependency-free fatal-error renderer intentionally does not.
IrriDex v0.4.23.3
- Repaired branded PHP 5XX handling after the live
/debug/intentional500test proved DreamHost FastCGI bypasses ApacheErrorDocumentfor uncaught PHP failures. - Added a bootstrap-level uncaught exception and fatal runtime handler that returns HTTP 500, suppresses implementation details, logs the server-side error, and renders
/errors/5xx.html. - Kept the existing Apache
ErrorDocumentdirectives as a second fallback for server-generated 5XX responses. /debug/intentional500remains available as the production verification route.
IrriDex v0.4.23.1
- Added the public diagnostic route
/debug/intentional500. It deliberately queries the nonexistent SQLite tablegeometrieswith PDO exception mode enabled, producing a genuine uncaught server-side HTTP 500 for testing the configured IrriDex 5XX ErrorDocument behavior. - The diagnostic is explicitly
no-storeandnoindex; no normal application data or schema is changed by the test. - No other functional behavior was changed in this release.
IrriDex v0.4.23.0
- Fixed the profile-page HTTP 500 caused by the public activity counter querying
geometriesinstead of the actualmap_geometriestable. - Added once-per-version update notices with
Update_Installed.wav; update popups wait until the startup intro is no longer being displayed and link to the new public/changelog.php. - Added global UI sounds:
Select.wavfor buttons and map point placement,Back.wavfor close/back/cancel actions, andUserLogoff.wavwhen signing out. - Added per-account user blocking. Either side of a blocked pair is prevented from sending new direct messages until the blocker removes the block; existing mailbox history remains readable.
- Added a searchable Blocked Users manager and block/unblock controls from message threads.
- Added a static branded 5XX ErrorDocument using the supplied fatal-error artwork so PHP/server failures no longer fall through to the browser-generic 500 page when Apache can serve the error document.
IrriDex v0.4.21.1
- Replaced the splash Credits utility window with a cinematic full-screen credit roll over the blurred IrriDex page.
- Credits auto-scroll slowly, pause immediately on pointer contact, support direct mouse/touch dragging in either direction, and resume after a drag. A simple tap/click ends the credits.
- Reaching the end of the roll automatically concludes the credits and fades/stops the credits soundtrack before returning to the intro. Escape remains a keyboard exit.
- The permanent
/credits.phpreference page remains unchanged.
IrriDex v0.4.21.0
- Added catalog marker overrides for check-valve-equipped heads and for combined non-potable + check-valve heads. Marker priority is combined NP+CV → NP → CV → normal.
- Added a per-account Custom Pin Gallery. Users can upload normalized custom pin artwork, apply gallery images to finds they own, switch back to catalog/default artwork, and delete gallery images. Ownership is enforced server-side.
- Repaired multi-line announcement banners so they have a bounded, scrollable height instead of covering the map. Leaflet top controls now automatically shift below the rendered banner, keeping zoom controls reachable even under newline abuse.
- Added the supporting schema/API fields for the new catalog overrides and owner custom-pin assignments.
IrriDex v0.4.20.1
- Fixed global light/dark-theme contrast on custom utility-page surfaces, including Notifications, Messages, migration/import cards, catalog manager panels, and Credits.
- Added supplied image buttons for Credits & Acknowledgements, Messages, and Notifications in the map drawer, with unread badges layered over the artwork.
- Removed the persistent moderator Migrate Now drawer shortcut. Administrator KMZ/KML staging now temporarily re-enables Migrate Now for that active batch, and it disappears when the batch has no pending/conflicting records.
- Preserved all v0.4.20.0 account/profile/theme/messaging functionality and existing migration/map behavior.
IrriDex v0.4.20.0
Accounts, appearance, profiles, messaging administration, and audit detail
- Replaced the direct-message recipient dropdown with live username search/autocomplete so the compose flow scales to hundreds or thousands of accounts.
- Added an account-wide Light/Dark mode preference and applied it to every rendered IrriDex page, including the map UI.
- Made the IrriDex wordmark in the top-left navigation of every page a
/maphome link. - Added account preferences to mute startup-intro audio and/or skip the startup intro entirely. Explicit tutorial launches continue to bypass the intro and still retain tutorial audio.
- Added Administrator-only message inspection. Opening a private message is itself recorded in the moderation audit log; message bodies are not copied into audit payloads.
- Added profile icons. Uploads are center-cropped/resized to exactly 256×256, metadata-stripped, converted to JPEG, and iteratively compressed to less than 15 KB. Administrators can freeze/unfreeze an account's ability to change its profile icon with a user-visible reason.
- Expanded moderation audit records with an event UUID, query string, referrer, Cloudflare Ray ID when available, plus the existing actor/IP/path/user-agent/before-after context. The audit viewer can search these fields.
- Added username-change requests in Account Settings with Administrator approve/deny review, optional review notes, notifications, history, uniqueness re-checking at approval, and audit logging.
- Added profile avatars to account/messaging/map moderation surfaces while preserving user-ID ownership beneath username changes.
IrriDex v0.4.19.0
Notifications, direct messages, warnings, and temporary account bans
- Added a signed-in notification center with unread state, severity, action links, mark-read controls, and a live unread badge in the map header.
- Added private IrriDex direct messaging with Inbox/Sent views, compose/reply, read state, per-user soft deletion, and a 60-messages/hour abuse ceiling. Sending a message creates a "New message from @user" notification for the recipient.
- Moderator actions now notify affected users when Trusted User status is granted/removed and when an Administrator promotes/demotes a Moderator.
- Added moderator-issued account warnings as durable notifications.
- Added temporary account bans from 1 hour through 30 days. A ban immediately invalidates existing sessions, blocks correct-credential sign-in until expiry, shows the ban reason/expiry to the affected account, and can be lifted early. Moderator permissions follow the existing role hierarchy.
- Added account Inbox shortcuts plus notification/message links in the map drawer. The map polls lightweight unread counts while visible.
- Added notification/message/ban schema tables without changing existing find/system/loot data.
0.4.18.1
- Hotfix: restore the webroot as a dependency-free redirect to
/map/; fixes HTTP 500 athttps://irridex.sccpsteve.com/caused by the rootindex.phprequiring../auth.php.
0.4.18.0
- Restored the Credits & acknowledgements feature from the last known working credits build onto the current v0.4.17.6 codebase.
- Added the supplied CREDITS pressed/unpressed control to the startup splash. Logged-out splashes show START + CREDITS + TUTORIAL; signed-in splashes show START + CREDITS.
- Restored the in-splash credits window, public
/credits.phppage, permanent map-drawer and Account Settings links, and the credits soundtrack. - Preserved the v0.4.17.5 20,000-find retrieval experiment and v0.4.17.6 Hunter PRS30/PRS40 migration classifier/backfill.
0.4.17.6
- Fixed legacy MyMaps Hunter Pro-Spray classification when PRS40/PRS-40 or PRS30/PRS-30 is present in the source description but the migrated model was generic Pro-Spray.
- New migration-event records now resolve the PRS class immediately before INSERT and bind recognized PRS30/PRS40 finds to the native Hunter catalog model.
- Existing migrated finds receive a one-time conservative backfill. Replacement chains use the last relevant PRS mention (for example PRS30 → PRS40 resolves to PRS40), while nearby, future, or already-replaced PRS references are ignored.
- The standalone MyMaps importer uses the same pressure-class inference for new imports and conflict overwrites.
0.4.17.5
- Experimental map-scale test: raised the find retrieval ceiling from 5,000 to 20,000 records in both current and legacy find endpoints.
- No database/schema change.
0.4.17.4
- Tutorial: Visibility and ownership now opens the real visibility controls in the safe hardware-wizard preview instead of describing them over an empty map.
0.4.17.3
- Tutorial: Detailed hardware wizard step opens the actual selector as a safe non-saving preview.
- Tutorial cleanup now closes the preview automatically and prevents accidental submissions.
IrriDex changelog
v0.4.17.2 — map-home link / tutorial audio boost
- Made the IrriDex wordmark/version hero beside the hamburger menu clickable/tappable; it now returns directly to
/map. - Amplified
TutorialTrack.mp3to 300% of its previous amplitude. The source had enough headroom that the 3× gain remains below digital clipping.
v0.4.17.1 — draggable tutorial / splash fit hotfix
- Replaced the blurred modal-style tutorial with a sharp, Luna-inspired draggable utility window.
- The tutorial no longer blocks the underlying site; the walkthrough can be moved out of the way while the live interface remains usable.
- Added an XP/Luna-style title bar close button plus Escape/arrow-key fail-safes so the tutorial cannot trap the user.
- Strengthened tutorial cleanup after the guest splash transition to prevent invisible intro/tutorial layers from leaving the map softlocked.
- Shrunk and repositioned the guest START and TUTORIAL artwork so both controls stay on the right side of the intro bar and leave the IrriDex wordmark unobstructed.
IrriDex v0.4.17.0
Tutorial splash button + guided wizard
- Added the supplied blue TUTORIAL artwork to the startup splash. It exists only for logged-out visitors and only inside the splash sequence; signed-in splash screens never render it.
- Added supplied pressed/unpressed TUTORIAL states and the existing intro click sound. Choosing TUTORIAL fades the IrriCore intro out and launches the guided walkthrough.
- Added
TutorialTrack.mp3as the looping tutorial soundtrack, with fade-out when the tutorial ends and a retry on tutorial navigation if browser autoplay policy initially blocks it. - Added a read-only tutorial wizard with End Tutorial, Prev, and Next/Finish controls. It highlights the real map UI and covers map navigation, searching/filtering, Traditional Mode, Systems, Loot Board, accounts, all logging modes, detailed metadata/provenance, visibility, offline behavior, and role-specific moderation/admin concepts.
- Added a normal text-based Start tutorial button in Account Settings. It launches
/map/?tutorial=1directly and intentionally does not reuse the splash-screen artwork. - Added all tutorial assets and scripts to the service-worker cache/deployment check and bumped the application/cache version.
IrriDex v0.4.16.0
Startup intro + logging audio
- Added the IrriDex startup sequence: a black Click/Tap to Begin gate, blurred live map backdrop, looping
IrriCore.mp3, centered IrriDex bar artwork, clickable START artwork with pressed-state art and click sound, and a smooth audio/blur fade into the map. - The intro runs once per local calendar day. A successful logout/login cycle rotates a server session token so the intro runs again after the new sign-in, while logging out to the public map does not unnecessarily replay it.
- Added moderator-editable yellow diagonal splash text with a size-pulsing animation; the setting is audited like other moderator configuration changes.
- Added
LogSuccess.mp3for successful find posts across Rapid, Traditional, Quick, and Advanced Log, successful Loot Board area saves, new systems, and new loot entries. System/loot create forms use a same-page AJAX confirmation so the sound can play reliably inside the user's interaction context before the list refreshes. - Added all intro/audio assets to the PWA static cache.
IrriDex v0.4.15.6 — Legacy RCW Backfill
- Backfills the
np(Non-Potable / RCW) feature onto migrated finds whose legacy model identifier already encodes reclaimed-water status. - Recognizes Hunter terminal
-Rreclaimed-water codes such asPROS-06-PRS40-CV-R,Pro Spray PRS-40-CV-R,Pro Spray PRS-30 12" CV-R, andI-20-06-SS-R. - Recognizes explicit
NP,RCW,Non-Potable,Reclaimed Water, andRecycled Watermodel/variant text across brands (including Rain Bird 5006+NP/Falcon ...-NP). - Migrated RCW Hunter Pro-Sprays now use the light-magenta non-potable marker artwork instead of black/brown/gray PRS artwork.
- Modern popups visibly show a NON-POTABLE / RCW tag, and Edit Pin receives the persisted
npfeature. - Free-text/filter search now also understands legacy Hunter
-Rrecords before/while the backfill completes. - New/edited exact reclaimed model codes automatically retain the
npfeature server-side.
IrriDex v0.4.15.5
Search / filter refinement
- Free-text search is now tokenized and searches across equipment, brands, models, variants, features, nozzle/rotor fields, condition/lifecycle/provenance metadata, field notes, Traditional metadata, visibility, and discoverer. Multiple words are ANDed, so searches such as
Hunter RCWwork naturally. - Catalog labels are resolved to their stable stored values.
RCW,NP,non-potable,reclaimed water, and similar terms find thenpfeature even though the database stores the short stable key. - Added feature-aware shorthand for Check Valve terminology, including Rain Bird
SAMand ToroCheck-o-Matic, while retaining legacysamrecords. - Current Catalog Config manufacturer/model names and Traditional class/symbol/layer labels are searchable even when older records retain older display text.
- Added an explicit Feature filter to the map drawer, plus Enter-to-search and Clear Filters controls.
- Lines and polygons now participate in free-text search by name, notes, type, role, Traditional layer, and discoverer. They no longer remain visible as unrelated results during a pin search.
- Structured hardware filters intentionally hide lines/polygons because geometry has no manufacturer, feature, condition, or lifecycle hardware attributes.
- Search result stats now include matching line/polygon count.
IrriDex v0.4.15.4
Traditional Mode — MyMaps marker fidelity + click repair
- Fixed Traditional markers becoming effectively unclickable after the v0.4.15.1 Canvas performance conversion. Leaflet Path hit-testing is no longer relied on for the custom offset pushpin artwork; a single map-level hit tester opens the correct pin popup while the markers remain on the fast shared Canvas renderer.
- Reworked the Traditional pushpin silhouette to match Google MyMaps more closely: broad round head, short centered point, strong white outline, and a white center dot for ordinary Active pins.
- Corrected status/icon geometry. Active remains a pushpin; Inactive and the icon/status markers (Dead/Removed, Saved, System, Large Amount, Approximate Location, Multiple, etc.) now render as circular MyMaps-style medallions instead of teardrop pins.
- Circular icon markers are approximately 28 px across with white borders and white symbols. Glyph-less Inactive markers are plain colored circles rather than pins.
- Catalog Config now calls the editable marker shapes Pushpin and Circle. The stored keys remain
pin/dotfor compatibility. - The v0.4.15.3 migration updates the built-in Traditional symbol rows to the corrected Pushpin/Circle defaults without changing any finds, coordinates, layers, classifications, colors, notes, or audit data. Moderators can still modify the symbol shape afterward.
- Retains the v0.4.15.2 moderation/IP audit trail and all v0.4.15.1 performance work.
IrriDex v0.4.15.2
Moderation audit trail / IP attribution
- Added an Administrator-only moderation audit log with acting account, account role, UTC timestamp, canonical client IP, HMAC IP fingerprint, action type, target, summary, request path, and before/after detail payloads where available.
- Banner changes now record the previous and replacement banner text, making future banner vandalism attributable to a specific signed-in account and source IP.
- Account application decisions, Trusted User changes, Moderator role changes, account deletion, and login-ban clearing are audited.
- Catalog Config changes are audited, including model deletion/reordering, selector changes, Traditional Mode classifications/layers/icons, and pin-preview changes. Upload audit entries store only upload metadata, never image bytes.
- Shared/legacy content moderation is audited when somebody acts on a record they do not own: pin move/delete, moderator edits, system deletion, loot status/deletion, Loot Board area deletion, and geometry deletion.
- MyMaps migration review actions are audited: event open/close, migrate, same-address batch migrate, handoff, and skip.
- Added
/audit-log.phpwith search, action filtering, pagination, before/after inspection, and a recent-actions panel in the Moderator Dashboard. - Raw IP addresses are intentionally restricted to Administrators. Existing failed-login and registration abuse controls remain privacy-preserving and continue to store only IP fingerprints.
- Audit rows snapshot username and role so attribution remains readable if the actor account is later removed.
- New audit logging starts at deployment; actions that happened before v0.4.15.2 cannot be reconstructed from this table retroactively.
- Includes all v0.4.15.1 Traditional Mode Canvas performance and correct pushpin/circle rendering fixes.
IrriDex v0.4.15.1
Traditional Mode rendering hotfix.
- Replaced the CSS rotated-square/teardrop marker construction with a true classic pushpin silhouette.
- Inactive Traditional markers render as true circles.
- Traditional markers are now painted through one shared Leaflet Canvas renderer instead of one DOM
DivIcontree per find. - Traditional popup HTML is generated lazily when a pin is opened instead of being prebuilt for every find.
- Traditional layer toggles add/remove the existing canvas layer groups rather than destroying and reconstructing every marker.
- Traditional Move Pin temporarily promotes only the selected canvas pin to a draggable SVG marker, then returns to canvas after Save/Cancel.
- Existing Traditional classifications, colors, symbols, layers, and database records are unchanged.
0.4.15.4 — Non-potable / RCW popup artwork overrides
- Added per-model non-potable/reclaimed-water (RCW) marker artwork that takes precedence over the normal model preview whenever the
npbody feature is selected. - Hunter Pro-Spray, Pro-Spray PRS30, and Pro-Spray PRS40 now all use the supplied light-magenta non-potable bonnet artwork when marked NP/RCW. The normal black/brown/gray PRS distinction is used only for potable/standard bonnets.
- Catalog Config can upload or clear a separate 512×512 RCW preview for each applicable model, using the same 2 MB, MIME, dimension, and HTTP-upload validation as normal previews.
- Legacy records that encode NP/RCW/non-potable/reclaimed-water in the model or variant text are recognized for marker selection.
- No existing find identity, pressure-regulation status, or popup height is rewritten.
v0.4.21.2 — replayable + editable credits
- Fixed the cinematic splash credits state machine so a completed or dismissed roll can be replayed repeatedly from the CREDITS button without stale close timers, audio fades, scroll position, or disabled-button state leaking from the previous run.
- Credits content is now data-driven. Administrators can modify the public-page introduction, splash opening/closing copy, music label, fine print, section titles, acknowledgement rows, and optional HTTP/HTTPS links directly from
/credits.php. - The public credits page and cinematic splash roll share the same saved credits document, so changes appear consistently in both locations.
- Added an Administrator-only reset-to-defaults action and audit events for credit modifications/resets. User-entered credit text remains escaped as plain text and links are scheme-validated.
v0.4.22.0 — profiles + scalable username selection
- Added public IrriDex profiles with display name, headline, About Me, optional public location/interests, social/website links, profile icon, a media gallery, join date, role/trust badge, and public IrriDex activity counts.
- Added
/profiles.phpprofile discovery/search and/profile-edit.phpaccount-owned profile editing. Profile gallery uploads are metadata-stripped JPEGs capped at 1280 px on the long edge and under 450 KB, with a 12-image account limit. - Logger/user references on map popups, moderation surfaces, and message views now link to profiles where an owning account exists.
- Replaced the remaining account-owner dropdowns used by Migration Review and moderation discipline with live username search selectors. Messages already used live username search and remain search-based.
- Added a shared authenticated
/api/user-search.phpendpoint with scope-specific authorization for messaging-compatible account discovery, migration ownership, and moderator discipline. - A full select-element scan found no remaining username/account/owner/recipient dropdown picker in the PHP/JavaScript application surfaces. Non-account selectors such as visibility, hardware, migration target, ban duration, and catalog controls remain normal dropdowns.
- Credits behavior/content was intentionally left unchanged in this release.
0.4.25.8 — drawer profile/signup artwork buttons
- Implements the supplied QUIT, ALL PROFILES, MY PROFILE, and SIGN UP button images in the map drawer.
- Replaces the previous plain-text drawer links for My profile, Browse profiles, and Apply for an IrriDex account with the supplied artwork tiles.
- Replaces the plain red QUIT button with the supplied QUIT artwork tile while preserving the existing intro-return behavior.
- Adds the new drawer button PNG assets under
map/assets/ui/and bumps the static cache/app bundle version so clients fetch the updated drawer UI reliably.
0.4.25.9 — United States lore pin artwork
- Adds the supplied United States flag icon as a special marker artwork override for the MyMaps lore pin labeled The United States of America.
- The override keys off the pin's Traditional/MyMaps title, so the migrated lore pin receives the flag artwork automatically without any manual database edit.
- Bumps the active map bundle and static cache version so clients fetch the new lore-pin artwork promptly.
0.4.26.0 — catalog editor finder + Hunter PGP split
- Reworks Catalog & Pin Configuration with a global model finder that searches across all manufacturers and equipment types rather than requiring the correct browse filter first.
- Adds a compact all-model index containing every model name/key. This keeps ordinary browser Find (Ctrl/Cmd+F) useful without rendering every full edit form at once.
- Global search covers display names, stable keys, manufacturer names, equipment types, internal notes, and conservative legacy aliases such as
PGP-ADJ;/focuses the finder from anywhere on the page. - Search results are ranked and show manufacturer/equipment badges; direct model-index jumps open the selected model editor automatically.
- Decouples reorder lists from global search results so a partial search can never be accidentally saved as a manufacturer's complete ordering.
- Splits the Hunter rotor seed from the old combined PGP / PGP Ultra entry into distinct PGP and PGP Ultra models.
- Splits the corresponding shrub entries into PGP Shrub and PGP Ultra Shrub.
- Existing untouched built-in combined PGP rows are renamed in place, preserving their database IDs and moderator metadata; the new Ultra rows are seeded separately and the existing MyMaps relinker can bind previously-unbound legacy PGP identities to the correct model.
0.4.26.1 — collapsible announcement + branded loading phases + UI sound preference
- Announcement banners can now be collapsed and expanded. The collapsed state is remembered only for that exact announcement, so a newly changed banner opens automatically instead of staying hidden.
- Adds the supplied
infoBg.pngand animatedLoading_bar.gifto a branded startup loading panel. Startup reports Loading Assets, Loading Catalog, Loading Markings, and Preparing Interface; the loading bar is anchored at the bottom center of the supplied info background. - Adds a UI acknowledgement sounds toggle to the map drawer. The browser-local preference controls Select, Back, log-success, logout, and update acknowledgement sounds without muting intro/tutorial/credits music.
- Bumps the active map bundle and static cache to v0.4.26.1; the small loading assets are part of the core cache while large media remains runtime-only.
0.4.26.2 — hard-collapse banner, Account sound setting, frontmost loader
- Collapsed announcement banners now reduce to a thin handle only. The bottom-center arrow points down while collapsed and up while expanded.
- Signed-in users now manage UI acknowledgement sounds from Account Settings; signed-out visitors retain the drawer toggle.
- Raises the branded startup loading panel above the intro/splash and places it before the intro in document order so loading remains the frontmost startup layer.
- Fingerprints the active map stylesheet as
app-0.4.26.2.css, preventing an older service worker'signoreSearchcache lookup from serving staleapp.cssafter an ordinary reload.
0.4.26.3 — reliable Update Installed notice
- Fixes the IrriDex Update Installed window appearing intermittently when its first
/api/update-info.phprequest timed out during startup. - Removes the old behavior that wrote a 10-minute session throttle before the update-info request had actually succeeded.
- The release version and fallback update notes are bundled directly into the fingerprinted global UI script, so the notice still appears even if the update-info request fails.
- Replaces stable
site-ui.js?v=...references withsite-ui-0.4.26.3.js; an older service worker can no longer answer a new shell with stale global UI logic merely because query strings are ignored by cache matching. - Update notices now wait for both the intro and the frontmost startup loading panel to finish, preventing layer-order races.
- The active map JavaScript and map stylesheet are fingerprinted to 0.4.26.3 as well.
0.4.27.0 — loading progress, 1400 artwork repair, RWS class, marker state overlays, Systems/Loot map records
- Converts the branded startup loading bar into visible staged progress. A full-size green copy of
Loading_bar.gifis cropped from the right edge as startup advances; its geometry is never resized as progress changes. - Repairs old MyMaps Rain Bird 1400 bubbler artwork by adding
1400as a conservative catalog relink alias. Legacy 1400 records typed as sprayheads may be corrected to the unique current shrub/bubbler model. The renderer also resolves unbound 1400 legacy text against the current catalog preview as a fallback. - Adds first-class
rwsequipment type for Root Watering Systems. Existing Rain Bird RWS catalog rows are moved in place before seeding so model IDs, uploaded previews, moderator notes, and ordering survive the class split. - Adds a normal lifecycle
inactivestatus and updates the Traditional Inactive symbol to use it. Inactive listings render at 70% size and 25% brightness. - Removed listings and listings tagged Severe Structural Damage receive a red X overlay at 50% opacity in both modern and Traditional rendering.
- Adds privacy-aware
/api/map-records.phpand renders coordinate-bearing Irrigation Systems and individual Loot Board records directly on the main map. The Systems and Loot Board pages remain unchanged and available for full record management. - Systems and Loot participate in free-text map search and Traditional Systems/Loot layer visibility; structured hardware filters intentionally hide these non-hardware record types.
0.4.27.1 — PGP Ultra uploaded artwork binding repair
- Repairs legacy/migrated Hunter PGP Ultra finds that still point at the pre-v0.4.26 combined
PGP / PGP Ultracatalog ID, moving only clearly identified Ultra records to the current PGP Ultra / PGP Ultra Shrub rows. - Adds a renderer-side current-catalog identity rescue for exact legacy models and the historically combined PGP families, so moderator-uploaded marker previews apply immediately even if a stale legacy binding survives.
- Non-Potable / RCW, Check Valve, combined NP+CV, and normal preview priority all use the resolved current PGP Ultra model ID.
- No catalog preview files or production data are bundled or overwritten.
0.4.27.2 — edit-return focus + live RCW artwork preview
- Successful pin edits now issue a fresh 303 return to the map with the edited find ID. The map zooms directly to that listing and opens its popup instead of returning to the generic map center.
- The fresh return intentionally bypasses stale browser back/forward-cache marker state, so artwork and lifecycle/feature changes are reloaded immediately after Save.
- Standard pin editing now includes a live Map pin preview. Toggling Non-Potable / RCW and Check Valve immediately recomputes the normal / NP / CV / NP+CV catalog artwork before the form is saved.
- Custom per-user pin artwork is shown as the effective preview and explicitly identified as overriding catalog feature artwork.
- Fingerprints the active map and global UI JavaScript as 0.4.27.2 so old service-worker assets cannot substitute the previous edit/focus behavior.
0.4.27.3 — persistent Update Installed acknowledgement
- Fixes the same Update Installed dialog reopening repeatedly after it had already been closed and the user navigated to another IrriDex page.
- Acknowledgement is now stored redundantly in
localStorage,sessionStorage, and a same-origin long-lived cookie; any matching record suppresses that version's notice. - Open IrriDex tabs synchronize acknowledgement through
BroadcastChanneland the storage event, so dismissing the dialog in one tab closes/suppresses duplicates elsewhere. - Pages restored from browser back/forward cache re-check acknowledgement and remove a stale restored dialog.
- Adds a global script-instance guard so accidental duplicate inclusion cannot start two update checks on the same page.
0.4.27.4 — quick product renaming + Orbit generation split
- Catalog Config model cards now expose an always-visible Product name field and one-click RENAME action. Renaming changes only the display label; stable model keys, model IDs, existing catalog artwork, and already-bound pins remain intact.
- The rename action runs the MyMaps relinker once before and once after a rename so still-unbound migrated pins using either the old or corrected product wording can be attached conservatively.
- Splits the old Orbit
Voyager / Voyager II / IIIcatalog row into Voyager I and Voyager II. The existingvoyagerrow/ID is preserved as Voyager I so moderator metadata/artwork survive. - Removes Voyager III as a selectable catalog product because it does not exist. Historical imported finds that claim Voyager III are preserved but deliberately left unbound for manual correction rather than being deleted or silently converted.
- Adds separate Orbit Saturn I, Saturn II, and Saturn III catalog identities. Existing Saturn III retains its row/ID; untouched built-in ordering is normalized around the new generation rows.
- Adds conservative Roman/Arabic generation aliases (for example Voyager II/Voyager 2, Saturn III/Saturn 3) while intentionally providing no Voyager III alias.
0.4.27.5 — update notice acknowledgement repair
- Replaces the shared mutable update-acknowledgement value with release-specific local-storage, session-storage, and cookie keys. An older/stale acknowledgement can no longer suppress a newly installed IrriDex version.
- Keeps cross-tab and cross-page dismissal synchronization, but only for the exact release that was actually acknowledged.
- The update notice now waits for the frontmost loading panel to finish but does not wait for the startup intro to be dismissed; it can display above the intro after loading completes.
- Fingerprints the global UI and active map JavaScript as v0.4.27.5 and bumps the service-worker cache so ordinary reloads receive the repaired updater.
0.4.28.0 — stronger MyMaps model recognition + account timezones
- Generalizes the current-catalog MyMaps relinker to extract strong digit-bearing product-code aliases from catalog model names. This fixes cases such as Rain Bird 6504 failing to bind to Falcon 6504 when the legacy title omitted the Falcon family name.
- Product-code matching remains manufacturer-scoped and ambiguity-safe. A unique exact body-model code may repair a historical equipment-type mistake; containment/fuzzy text cannot silently change equipment class.
- Adds compact manufacturer identity matching so legacy spacing/hyphen differences such as
RainBirdvsRain Birddo not block otherwise-safe catalog recognition. - Adds an account-level IANA timezone preference in Account Settings with a Use browser timezone shortcut. Stored timestamps remain UTC; display conversion only changes presentation.
- The shared UI layer localizes UTC/ISO timestamps across IrriDex pages and dynamically inserted content, while the map uses the configured account timezone for pin timestamps and capture summaries.
0.4.28.1 — timezone picker UI cleanup
- Replaces the browser-native timezone datalist/combo box with a first-party IrriDex timezone picker; operating-system dropdown styling can no longer produce the oversized gray/black menu seen in Chromium.
- Adds instant search across friendly city labels and canonical IANA identifiers, grouped timezone results, keyboard navigation, and a compact selected-timezone card.
- Common North American timezones receive human-friendly labels such as Pacific Time (Los Angeles) while the canonical value
America/Los_Angelesremains visible and is what the account stores. - Keeps Use browser timezone and the live local-time preview. No timezone storage/schema changes are required.
0.4.29.1 — startup progress bar + complete map-pin count
- Restores visible green loading progress using a dedicated animated
Loading_bar_green.gif. It has the same 220×19 source geometry as the gray bar; progress changes only the green layer's right-edge crop and never its width, height, or scale. - Fixes Loading Markings counting only sprinkler Finds while the rendered map also included coordinate-bearing Systems and Loot. The denominator now matches the complete point-marker population for the current view.
- Systems/Loot continue loading over parallel network requests, but their returned marker count is incorporated before progressive Find rendering begins, so the loader can progress to the same total the map ultimately receives.
0.4.29.6 — pins since last active + creation-date filters
- Adds Logged from and Logged through date controls to Map Filters. These use each Find's IrriDex
created_attimestamp rather than capture/photo time or edit time. - Date-only boundaries are interpreted in the viewer's configured timezone and converted to UTC for database filtering, including the full selected “through” day.
- Adds Only pins added since last active. The cutoff is snapshotted when the map shell loads, before the updater records the current visit, so the feature cannot erase its own comparison point.
- Public/guest browsers reuse IrriDex's existing browser-local last-active timestamp; first-time visitors see the control disabled until a prior activity timestamp exists.
- Pin popups identify records created after the previous activity cutoff with NEW SINCE LAST ACTIVE.
- While a date or since-last-active filter is active, unrelated line/polygon, System, and Loot records are hidden instead of leaking into a pin-date result set.
0.4.29.20 — OpenAerialMap low-zoom cleanup
- Suppresses OpenAerialMap's numbered low-zoom coverage-density grid from the user workflow without modifying OAM's proven plain Leaflet XYZ tile-request path.
- Selecting OAM below zoom 14 moves the map to zoom 14; while OAM remains selected, zoom attempts below 14 return to the actual contributed-imagery range.
- Does not use TileLayer
minZoom, custom request scheduling, hidden fallback imagery, opacity substitution, or replacement tiles. - Preserves Movement Select keyboard capture, optional map animations, and the deployment-critical Changes Since Last Active update notice.
0.4.29.25 — layout edge placement + transform controls + rotation drag repair
- Endpoint Fill now creates a marking at the selected start point and end point in addition to the requested evenly spaced heads between them. The batch remains capped at 500 total generated markings.
- Rectangle Mass Mark is always edge-to-edge. Outer rows/columns sit on the drawn boundary and grids with at least two rows and columns place heads directly on all four corners; the old cell-center padding option is removed.
- Generated line, curve, and rectangle previews can be moved before saving by dragging the dashed selection frame, uniformly scaled from corner handles, and rotated with the top rotation handle. Toolbar controls provide 10% scale / 5° rotation steps, Shift provides fine adjustment, Reset restores the original preview, and arrow keys nudge by screen pixels.
- Repairs rotated-map panning by converting Leaflet's committed drag delta from visual screen axes back into the map's logical axes, so dragging remains directionally correct at non-zero bearings.
- Layout points are normalized before POST, longitudes are canonicalized, and the batch endpoint accepts finite numeric coordinates without the previous false-negative float validation path.