Best on a larger screen

occurd. uses a polygon drawing tool and interactive map that need a tablet or desktop to work properly.

occurd.
by

Rutherford ecology v7.09

| go to Big Data Mode | | Buy me a coffee
← Click here to start drawing
Species checklist
Highlighting: clear
Species #
Taxon group
Changelog — occurd.
v7.09 Jul 2026
  • New geolocate button (crosshair icon) under the zoom controls — click it to pan the map to your current location and drop an accuracy marker. Works any time, unlike the one-off location jump that only happened at page load
v7.08 Jul 2026
  • On mobile, the map controls (zoom, layers, draw) now sit as a single horizontal toolbar along the top of the map instead of stacking down the left edge, so they no longer end up underneath the species-list sheet that slides up from the bottom
  • Reworked GBIF request handling: on a "Too many API requests" 429, the app now pauses every queued GBIF request together for a real cooldown (honouring GBIF's Retry-After) instead of each call independently retrying and extending the block. A search or Big Data fetch that gets rate-limited now says so plainly and tells you to wait about a minute, rather than a generic failure message
v7.07 Jul 2026
  • Removed the start-up "GBIF is rate-limiting occurd" notice — the throttling that prompted it has cleared, so standard searches run normally again
v7.06 Jul 2026
  • The species-checklist search box now filters the map too. Previously, typing a species name isolated it in the checklist but left every other species still plotted on the map; the search now drives both, so an isolated species in the list is isolated on the map. Clearing the box restores your existing checkbox selections
v7.05 Jul 2026
  • Fixed real GBIF results being silently discarded to "0 records" for polygons near the antimeridian (Samoa, Tonga, Fiji) drawn on a Pacific-panned map view — Leaflet stores their longitude unwrapped past 180° (e.g. 188° instead of -172°) in that case, and the post-fetch spatial clip compared this directly against GBIF's standard-range coordinates, so every record failed the point-in-polygon test even though the search itself succeeded. The same bug also broke the iNaturalist obscured-records bounding-box search and the QEII/KMZ-intersect features for these locations
v7.04 Jul 2026
  • Fixed the "Add buffer" button row on a drawn polygon overflowing its panel on narrower screens instead of wrapping — the 0.2° buffer option (and sometimes 10 km) could hang off the edge of the sidebar, clipped and unclickable
v7.03 Jul 2026
  • Photo pre-warm was still ~12x over iNaturalist's recommended rate (batches of 3, 250ms apart) even after the v7.02 fix — large checklists still tripped 429s (shown as CORS errors in the browser console, since iNat's 429 responses sometimes arrive with no CORS header). Every iNaturalist call (species photos, popup photo detail, obscured-record fetches) now funnels through a single shared throttle queue — one request at a time, ~1.1s apart, matching iNaturalist's recommended practices — and the bulk photo warm-up processes species in chunks of 40 (most-recorded first) with an extra 8s cool-down between chunks, so a 200+ species checklist backs off periodically instead of hammering iNat continuously for minutes on end
v7.02 Jul 2026
  • Big Data Mode uploads with large species checklists — fix the actual "too many API requests" trigger: the background photo warm-up was doing a full lookup (iNaturalist search + iNaturalist detail + up to 2 GBIF occurrence searches) for every species in the uploaded dataset, all at once. A checklist of a few hundred species could fire 500+ external requests in seconds. The warm-up pass now does a single cheap iNaturalist search per species; the fuller lookup only runs lazily when a species' popup is actually opened. The GBIF occurrence-search fallback also now goes through the app's existing retry-with-backoff helper instead of a bare request
v7.01 Jul 2026
  • Common names — fix: same failure mode as the recent photo-cache fix, but in the vernacular-name lookup — a single rate-limited/failed GBIF response was cached as a permanent "no common name" for that species, so a valid taxonKey with perfectly good data upstream (e.g. Ctenochaetus binotatus) could show blank in every future popup for the rest of the session. Failures are no longer cached, so reopening a popup retries
v7.00 Jul 2026
  • Common names and photos — fix: occurrence records with a blank taxonKey (common in Big Data Mode downloads where GBIF's name match only resolved to speciesKey, e.g. ambiguous or synonym scientific names) showed neither a common name nor a photo, since every lookup keyed strictly off taxonKey. All common-name and photo lookups now fall back to speciesKey when taxonKey is missing
v6.99 Jul 2026
  • Species photos — fix: iNaturalist's taxa search endpoint only ever returns a species' single "default" photo, never its curated taxon_photos list, so any species whose default photo happened to be All Rights Reserved (e.g. Great Barracuda) showed no photo at all despite having plenty of CC-licensed options. Now fetches the taxon's detail record, which does include the full curated list, to actually get a usable photo
v6.98 Jul 2026
  • Species photos — fix: once iNaturalist or GBIF rate-limited a photo lookup (common on Big Data Mode uploads with large species lists), that species was permanently marked "no photo" for the rest of the session, hiding photos even for well-photographed species. A throttled/failed lookup is no longer cached as a miss, so the next popup open or prefetch pass retries instead of staying stuck
v6.97 Jul 2026
  • Traditional Knowledge detection now scales to more than one GBIF dataset — TK_DATASET_KEYS is a maintained list (currently just Moorea Biocode, with GBIF's Ecuador/NZ Indigenous data governance pilot datasets expected to join it) instead of a single hardcoded key; each dataset's real registered bounding box is fetched once and cached, so the extra GBIF query is skipped entirely for searches nowhere near any known TK dataset — no hardcoded geography to keep updating by hand
v6.96 Jul 2026
  • Big Data Mode zip upload — fix: record photos were missing for most occurrences because GBIF's Darwin Core Archive download splits photos into a separate multimedia.txt file (joined on gbifID), which the upload parser never read; it now extracts and attaches this data so the camera-button record photo works the same as a live search
v6.95 Jul 2026
  • Cut the number of GBIF requests per search to stay under GBIF's rate limit. Traditional Knowledge detection (an extra GBIF query per search, relevant only to the Moorea Biocode dataset) is now an opt-in checkbox under Coordinate precision, off by default. Common-name lookups — previously one GBIF call per species, so 100+ per search — now fetch up front only for the most-recorded species; the rest use the occurrence-record name and upgrade to the official GBIF common name when you open that species.
v6.94 Jul 2026
  • Added a start-up notice while GBIF is rate-limiting occurd's live fetch requests — standard searches may currently stop partway through. The notice points you to Big Data Mode, which retrieves your dataset through GBIF's bulk download service and isn't affected by the limit. Dismiss it and it stays hidden for the rest of your session; it never shows in Big Data Mode.
v6.93 Jul 2026
  • Fixed the species checklist group headers overlapping on mobile when taxa groups were minimised — a minimised header was dimmed by fading the whole (sticky) header, which made its background see-through, so headers piling up at the top of the list bled through one another. The dim now applies to the header's contents only, keeping the background solid.
v6.90 Jul 2026
  • Specimen badges in record popups are now consistent text pills — eDNA, Fossil and Specimen — instead of a mix of text, icon and emoji
v6.89 Jul 2026
  • Record popups — photo button, preserved-specimen badge and Traditional Knowledge badges now use line icons instead of emoji
v6.88 Jul 2026
  • More icon rollout — place-search field, KMZ badge, Tech tools label, and the saved-areas list (polygon, species and remove markers) now use line icons instead of emoji
v6.87 Jul 2026
  • Record popups now show the occurd. pin mark instead of a red map pin
  • QEII project menu uses lock / unlock line icons instead of emoji
v6.86 Jul 2026
  • About dialog — replaced the leaf icon with the occurd. wordmark logo in green on white (an inverse of the header lockup)
v6.85 Jul 2026
  • Timeline options — "Colour by year" and "Normalise by effort" now share one consistent style: a light pill that turns bold green when active. Fixed a bug where toggling one off left it with a stray black border
v6.84 Jul 2026
  • Checklist Quiz and Photos buttons now use the line-icon set instead of emoji
v6.83 Jul 2026
  • More of the icon rollout — replaced emoji across the dialogs, drop-zone and secondary buttons (map, warning, copy/share, leaf, nerd notes, changelog, close, TK/BC, coffee) with the line-icon set
v6.82 Jul 2026
  • Restored the "Rutherford ecology" wordmark to its original typeface (the rest of the interface keeps the new one)
  • Added the WhatDat, LookLike and WhatDatBird links back to the sidebar footer, now with matching line icons
v6.81 Jul 2026
  • New shared icon library — emoji in the header and footer (Projects, About, Buy me a coffee, Nerd notes, Changelog) replaced with a consistent line-icon set; more of the interface to follow
v6.80 Jul 2026
  • Visual refresh — the whole interface now uses a single clean typeface (Inter Tight) for a more consistent, professional look
  • Tidied up corners and borders — all pop-ups, dialogs and controls now share consistent rounded corners and crisp 1px borders
  • Removed the decorative map icon from the small-screen notice
v6.79 Jul 2026
  • Fixed records plotting outside the polygon on imported/complex shapes — long polygons are simplified before querying GBIF (down to ≤120 pts, up to 0.1° tolerance), so GBIF returned points inside the coarser query shape but outside the true boundary. Fetched records are now always clipped back to the exact on-screen polygon, not only in the KMZ draw-to-select flow
v6.74 Jun 2026
  • QEII draw-to-select — removed simplification option; covenants are always added with their original geometry to avoid double-counting from overlapping simplified shapes
v6.72 Jun 2026
  • QEII simplification bar — opaque dark style, now readable against the map
  • QEII simplification — simplified polygons are buffered ~15m outward after simplification so no edge records are missed when fetching from GBIF
v6.71 Jun 2026
  • QEII draw-to-select — when the selected covenants have complex geometries (avg >30 vertices), a bar appears offering Light (80 vertices), Medium (30 vertices), or Keep original simplification before adding them; simplified shapes export normally in GeoJSON/KML
v6.70 Jun 2026
  • Fixed: opening a shared link no longer jumps to the user's GPS location — the geolocation setView is now skipped when a shared state hash is present
v6.69 Jun 2026
  • Fixed: opening a shared link no longer jumps to the user's GPS location when "Get started" is clicked — geolocation is skipped when a shared state is being restored
v6.68 Jun 2026
  • Brought back the "All" chip in the NZTCS and IUCN filter rows — removing it in v6.64 left no obvious way back to unfiltered once a status chip was active besides re-clicking the same chip
v6.67 Jun 2026
  • Styled the ambiguous-subspecies picker and badge — both were completely unstyled (raw browser default buttons/text), now using the same amber treatment as the species-search ambiguity picker
v6.66 Jun 2026
  • Added a "△?" filter chip to the NZTCS row for species showing the ambiguous-subspecies badge (where conflicting subspecies statuses haven't been resolved with a pick) — filters both the checklist and the map to just those species
v6.65 Jun 2026
  • Fixed "Occurrences CSV" download silently doing nothing once NZTCS was active: building the nztcs_status/category/year columns assumed every NZTCS lookup result has an .entry, but species with an ambiguous (conflicting) NZTCS match return {conflict:true} with no entry, throwing mid-export and aborting the download before the file was ever generated
  • Also fixed the same export silently dropping the polygon_name column whenever NZTCS was active — it was rebuilding rows from the raw filtered records a second time instead of building on the polygon-name-tagged rows from the step above
v6.64 Jun 2026
  • Removed the redundant "All" chip from the NZTCS and IUCN status filter rows — click an active chip again to clear the filter instead
v6.63 Jun 2026
  • Fixed: any polygon whose stored WKT exceeds 3,000 characters (roughly 120+ vertices) and whose source ring winds clockwise — common in catchment/district boundary exports — silently returned zero records instead of fetching anything. GBIF's geometry validator rejects clockwise exterior rings with an HTTP 400, but that error wasn't being surfaced; it just looked like an empty result. getQueryWKT(), which rebuilds a shorter WKT for long polygons, now enforces the same counter-clockwise winding that the initial WKT builder already did — it just wasn't reapplied after re-simplifying for length
v6.62 Jun 2026
  • Fixed "Simplify & add" returning zero GBIF records for complex district-boundary-style polygons — turf.simplify can introduce a self-intersecting (bowtie) ring when aggressively reducing a wiggly coastline, and GBIF silently matches nothing against an invalid WKT polygon instead of erroring. The simplified shape is now run through the same kink-unwrapping already used for KMZ imports before being added to the map
v6.61 Jun 2026
  • Updated the complex-polygon warning text to point at the new "Simplify & add" button instead of suggesting a QGIS round-trip, now that simplification happens in-app
v6.60 Jun 2026
  • Added a "Simplify & add" option to the complex-polygon warning shown for KML uploads with too many vertices — uses turf.simplify (Douglas-Peucker) to bring the shape under the 500-vertex threshold in-app, instead of requiring a round trip through QGIS
v6.59 Jun 2026
  • Fixed "click here to start drawing" hint not following the polygon button when the layer switcher (Map/Greyscale/Satellite/Topo) is opened, leaving the hint pointing at the wrong spot
v6.58 Jun 2026
  • Added an OpenTopoMap layer ("Topo") alongside Map, Greyscale and Satellite in the basemap switcher
v6.57 Jun 2026
  • Fixed a serious freeze: clicking the "select all" checkbox dispatched a separate change event per species row, and each row's handler does a full map re-render plus a CSV rebuild over every record — for a large checklist (500+ species) this meant hundreds of full re-renders and a flood of photo-lookup requests to GBIF/iNaturalist, freezing the page. Select/deselect-all now updates everything once instead of once per species
v6.56 Jun 2026
  • Fixed: the "select all" checkbox at the top of the species checklist showed unticked when results first loaded, even though every species starts selected — it's now synced on first render to match the actual selection state
v6.55 Jun 2026
  • Fixed: NZ species search threw an error on every map pan/zoom and never actually loaded NZOR data — a leftover variable name from the recent name-resolver refactor
  • Fixed: searching "kiwi" matched an unrelated wasp/spider genus that happens to share the bare scientific name "Kiwi", with no indication anything was wrong. Now correctly prompts "which one?" between Apteryx (the bird) and Kiwi (the wasp genus)
v6.54 Jun 2026
  • Fixed polygon drawing: double-clicking to finish a shape sometimes didn't stop drawing, left stray vertex markers on the map, or produced an unwanted extra triangle. The map's own double-click-to-zoom was stealing the second click of the finish gesture — it's now disabled while drawing is active
  • The species filter chip now shows the scientific name alongside the common name (e.g. "Weka (Gallirallus australis)")
v6.52 Jun 2026
  • NZOR matching itself (index building, ambiguity detection) moved out of species-search.js into a new shared but-is-it-threatened/nzor-source.js, eliminating the duplicate copy that used to live in but-is-it-threatened's own page. Both apps now read from the same module
  • Fixed false "which one?" prompts for names like "tui"/"kakapo"/"pukeko" — a single NZOR vernacular record often links to several citations of the *same* taxon (a species and its own subspecies, or a spelling variant), which the new disambiguation data was treating as separate species. These now collapse correctly; genuinely different species sharing a name (toatoa, penwiper, kiwis) still prompt as before
v6.51 Jun 2026
  • Species search is now backed by a new pluggable name-resolver.js, so the NZOR/NVS/Samoa lookup logic isn't locked into this one app; a fork can register its own species list as another source without touching the search UI code
  • Common names that genuinely apply to more than one species (e.g. "toatoa" → 4 different plants, "Kiwis" → family or order) now show a "which one?" picker instead of silently guessing or failing — same pattern but-is-it-threatened already uses for ambiguous names
  • The ~860 scientific-name homonym collisions that the v1.58 NZOR rebuild was dropping entirely (two different taxonomic concepts sharing a bare name, no single accepted winner) now also surface as a picker rather than disappearing from search
v6.50 Jun 2026
  • Fixed: single species search returned 0 records for any common-name match (e.g. searching "weka" and selecting it from the dropdown) while the Latin name worked fine. The June 23 NZOR index rebuild (v1.58, fixing homonym collisions) dropped the link from each common name to its scientific name, so the app silently queried GBIF for the literal common name instead of the Latin binomial. Rebuilt the index again, this time preserving that link — 13,289 common names now resolve correctly
v6.49 Jun 2026
  • Fixed: ticking a taxon group's checkbox in the checklist (e.g. Aves) after it had been collapsed via the group header did nothing — the checkbox only tracked per-species visibility, while map filtering also gates on a separate "active group" flag that only the header click controlled. The checkbox now keeps both in sync, so ticking it reliably un-collapses the group and brings its records back onto the map
v6.48 Jun 2026
  • Iterated on heatmap colour scaling and density rendering across many versions (gradient bands, colour ceilings, zoom-dependence, density estimation methods) trying to fix oversaturation and improve hotspot clarity; ultimately reverted to the original algorithm — per-coordinate log2 occurrence counts, polygon-extent-based pixel radius, and the blue→cyan→lime→yellow→red gradient — which performed best
v6.47 Jun 2026
  • Fixed broken photo for iNaturalist records not yet in GBIF (both the polygon-search and obscured-record paths) — record photo was stored as a plain URL string instead of the object the popup renderer expects, so the image src came out "undefined"
v6.42 Jun 2026
  • Re-uploading a CSV downloaded from Occurd — the drop zone now accepts Occurd's own comma-separated export (it was previously rejected because the upload parser only understood tab-separated raw GBIF downloads and choked on the "# Downloaded from Occurd" comment header); vernacularName and country are now preserved on re-upload
v6.34 Jun 2026
  • Fixed: closing a polygon (✕) could leave a stale heatmap/cluster layer on the map even after the species checklist correctly emptied out. Removing a polygon only cleared the map layers when that specific removal was what zeroed the record count — if records were already empty (e.g. a leftover polygon with no records of its own) the cleanup never ran. The map layers now always get cleared whenever no records remain, regardless of why
v6.29 Jun 2026
  • Fish filter — fetching just fetched the entire phylum Chordata (every mammal, bird, reptile and amphibian too) and threw most of it away client-side, since the legacy backbone had no clean "Fish" node. COL XR's modern taxonomy splits Tetrapoda out as a sibling rather than nesting it under fish-adjacent classes, so the fetch now queries Actinopterygii, Sarcopterygii, Chondrichthyes and Cyclostomi directly — only fish come back, no more wasted bandwidth fetching thousands of non-fish records
v6.26 Jun 2026
  • Fixed: clicking a species name to solo/toggle it left the taxon group tick box (e.g. "Aves") showing its old state instead of updating to reflect the species ticked underneath it
v6.25 Jun 2026
  • Fixed: the "select/deselect all visible species" checkbox at the top of the checklist ticked the boxes but never actually updated the map/heatmap/timeline/quiz/photos — it set each row's checkbox without touching the underlying selection state or re-rendering
v6.24 Jun 2026
  • Species checklist click — fixed: clicking a species name now behaves like a solo button when everything is ticked (ticks just that one, unticks the rest), and like a normal toggle afterwards, so you can build up a multi-species selection by clicking names instead of hunting for tick boxes
v6.23 Jun 2026
  • Clicking a species name in the checklist now toggles its tick box (map/quiz/timeline/photos inclusion) instead of just highlighting it on the map
v6.22 Jun 2026
  • Tree of life search — rank badges (Family/Order/Genus/etc) for NZOR-sourced results take a couple of seconds to resolve over the network; added a pulsing placeholder so it's clear it's loading rather than missing
v6.21 Jun 2026
  • Fixed 404 error when sending species to LookLike from beta — link was missing the "../" needed to reach the looklike folder from inside /beta/
v6.20 Jun 2026
  • Coordinate precision — "Exclude low-precision" checkbox replaced with a dropdown: All records / Exclude low-precision (>1.5 km) / Only low-precision (>1.5 km), so you can isolate the low-precision records instead of only ever removing them
v6.19 Jun 2026
  • Tree of life — fix: searching/jumping to a species could sit loading for a long time. COL XR's class-level taxa (e.g. Aves) mix ~40 real orders with ~180 incertae-sedis fossil genera/families placed directly underneath, pushing some columns past the 200-result page size and forcing a slow second sequential fetch that the rest of the columns had to wait on; page size raised to 500 so this fits in one request
v6.18 Jun 2026
  • Tree of life and species search now run on COL XR (Catalogue of Life Extended Release), the same taxonomy already used by taxon-group filters — both species-picking UIs are consistent again. Bacteria now browses as a Domain with its real modern kingdoms (Bacillati etc.) underneath, rather than one flat kingdom
  • Fixed a real bug exposed by the migration: species/match (used to resolve a typed/picked species name to a GBIF taxon) has no COL XR equivalent and was silently ignoring the checklist scope — replaced with v2/species/match for free-typed names and species/search for curated local-name lookups (NZOR/NVS/Samoa)
  • NZ/Samoa occurrence-count badges in Tree of life still come from the legacy backbone's occurrence facets (no behaviour change there) — taxa with no legacy equivalent just show no count, instead of a wrong one
v6.17 Jun 2026
  • Tree of life — internal prep for COL XR migration: rank recognition switched from an allowlist of known ranks to a blocklist of junk ranks, so taxonomy sources that use intermediate clade ranks (e.g. Infraphylum, Megaclass) navigate correctly instead of silently dead-ending; no visible change yet on the current data source
v6.16 Jun 2026
  • GBIF zip/CSV upload — fix: the antimeridian fix below didn't actually take effect because the map's re-centring animates by default and marker placement read the map's center before the pan finished; re-centring now jumps instantly so markers land in the right place
v6.15 Jun 2026
  • Drag-and-drop GBIF zip/CSV upload — drop zone now shows a live progress indicator (reading zip, extracting CSV, parsing records, filtering to polygons, looking up common names) instead of giving no feedback while large files process
v6.14 Jun 2026
  • NZTCS species lumping — when GBIF records the same NZTCS-listed taxon under two different accepted names (e.g. kōtuku as both Ardea alba and Ardea modesta), both now merge into one checklist row under NZTCS's name instead of appearing as two separate species
v6.13 Jun 2026
  • Popup photos — wide landscape shots no longer get their left/right edges cropped off; the fixed-height cover-fit now falls back to a letterboxed contain fit once cropping would lose more than ~20% of the photo (previously only applied to tall portrait photos)
v6.12 Jun 2026
  • Fixed Big Data Mode downloads for polygons crossing the antimeridian (e.g. Kamchatka–Alaska) — the shape-simplification retry path built a manual WKT ring that mixed positive/negative longitudes into a self-intersecting shape, returning only a sliver of the drawn area instead of the full region
v6.11 Jun 2026
  • Tree of life search — Family/Order/Class hits from the local name index (e.g. "Psittacidae") now get their rank badge filled in shortly after appearing, instead of staying unlabeled forever; resolving also speeds up the click since the GBIF key gets cached ahead of time
v6.10 Jun 2026
  • Minimising a taxon group in the species checklist now unticks it (and re-ticking it expands it back) — the checkbox state was previously left stale when a group was collapsed by its header
v6.09 Jun 2026
  • "Other Animalia" now queries GBIF for the exact complement of taxa (every Animalia phylum/class not already covered by its own checkbox) instead of fetching the whole animal kingdom and filtering ~90% of it away afterward — fewer wasted requests, faster fetch
v6.08 Jun 2026
  • Removed the "Technical search" filters (institution code, recordedBy, identifiedBy, typeStatus) — GBIF's own search covers this better. Nerd tools section is hidden until results exist again
v6.05 Jun 2026
  • Record photos — fix: if GBIF's image-resize proxy can't fetch a source image (some institutions, e.g. MNHN, block it with bot protection), the photo now retries the original un-proxied URL instead of failing silently
v6.04 Jun 2026
  • LookLike "Photos" handoff — fix: now uses a relative link instead of a hardcoded domain, so selected species transfer correctly regardless of which Occurd URL (github.io or custom domain) you're browsing on
  • Record/GBIF photos (popup camera button and LookLike grid) now load through GBIF's image-resize proxy instead of full-resolution originals — much faster loading, especially for camera trap and museum specimen images
  • Timeline — fix: dragging the slider no longer auto-enables "Colour by year" (this was never meant to happen automatically)
  • Timeline — added a Close button so you can exit timeline view without hunting for the Points/Heat buttons elsewhere in the sidebar
  • Species checklist — fix: "select all" (and per-group select-all) no longer select species that are minimised/filtered out or greyed out by the timeline year filter
v6.03 Jun 2026
  • NZTCS filter chips — now dynamic: one chip per status actually present in the results (NC, NE, NV, De, NU, Re, GD, SD, Un, Rc, NI, Ex); chips not present in the data are hidden; All Threatened covers all listed statuses
  • NZTCS button — now appears whenever records are loaded, not just for NZ polygon searches
  • Checklist redesign — removed confusing group-level checkbox; collapsing a group now directly hides those species from the map, quiz, and photos; individual species checkboxes control all three (map dots, quiz, LookLike); everything checked by default; state persists across NZTCS/IUCN rebuilds
  • Nav link — "go to Big Data Mode" now uses the same bold/italic logo font treatment
v5.89 Jun 2026
  • Big Data zip upload — dropping a GBIF download zip now immediately shows a progress indicator; records are filtered to any drawn polygons using point-in-polygon; records outside polygons are excluded and the count is shown in the status bar
  • NZTCS button — now activates correctly after loading a GBIF zip file
  • Header Big Data Mode label — restyled to match the occurd logo typeface (Big Data Mode) instead of plain bold text
v5.87 Jun 2026
  • Big Data mode — add ?bigdata to the URL to activate GBIF async download path on the same page; no 10,000 record cap; requires a free GBIF account (credentials stored in browser only, never sent anywhere except GBIF)
  • Credentials UI — username/password fields appear in Big Data mode with optional "Remember me" (sessionStorage default, localStorage opt-in)
  • Header "Big Data" link and 10k-error nudge now point to ./?bigdata on the same page, pre-filling polygon and filters
  • Redirect — /beta/bigdata/ redirects to /beta/?bigdata for bookmarkable URL
  • Big Data header label — "big data" tag appears next to the occurd logo in the top-left when in Big Data mode
  • Check credentials — "Check credentials" button in Big Data mode tests GBIF login via /v1/user/login and shows ✓ Valid / ✗ Invalid inline
  • GBIF CSV upload — drop zone now accepts GBIF occurrence CSV files; parses tab-separated rows with _mapDwcRecord and loads into the full Occurd interface (map, checklist, filters, timeline) with auto-fit to points
  • Share modal CSV download — "Download CSV" button appears in the share modal when results are loaded
v5.60 Jun 2026
  • Species list header — LookLike button is now a compact camera icon (📷); all columns (species, checkbox, count) align cleanly across header and rows
v5.59 Jun 2026
  • GBIF rate limiting — auto-retry with 500 ms back-off on rate-limit responses; 300 ms gap between polygon fetches to avoid hitting the limit when using many small polygons; plain-language error message when limit is exceeded
v5.58 Jun 2026
  • Fix NZTCS missing for species with informal/quoted subspecies names (e.g. NZ Falcon "southern", Powelliphanta varieties) — build script now detects conflicts across all subspecies including those named with quotes or author abbreviations
v5.57 Jun 2026
  • NZTCS badge shown next to species name in photo popup when NZTCS is unlocked
v5.56 Jun 2026
  • Fix NZTCS button not appearing after fetch with QEII project active — searchAreaOverlapsNZ now handles array-format latlngs used by auto-added covenant polygons
  • Exclude low-precision records checkbox (pre-fetch) — when ticked, the GBIF query adds coordinateUncertaintyInMeters=*,1499 so low-precision records never count against the 10k cap; iNat obscured records and supplemental iNat records with positional accuracy ≥1.5 km are also skipped
v5.40 Jun 2026
  • but is it threatened v1.45 — PDF drag-and-drop; text extracted via PDF.js then binomials parsed automatically
  • but is it threatened v1.44 — paste any block of text; scientific names extracted automatically
  • LookLike v1.20 — Occurd handoff cards always show GBIF link; names-only cards do not
  • LookLike v1.19 — NZTCS synonym resolution (e.g. Dysoxylum → Didymocheton); epithet stem fallback for non-NZ names
  • LookLike v1.17–18 — synonym photo lookup via iNat epithet + Latin gender stem matching
  • LookLike v1.14–16 — remove corner badges, GBIF fallback link, photo explainer; add A–Z sort
v5.33 Jun 2026
  • LookLike v1.15 — synonym resolution: if a name has no active iNat taxon, falls back to inactive taxa and follows current_taxon pointer to get accepted name and photo (e.g. Fuscospora → Nothofagus)
v5.32 Jun 2026
  • LookLike v1.14 — remove iNat/GBIF corner badges; remove "GBIF occurrences" fallback link; hide photo explainer in names-only mode; add A–Z / original sort buttons
v5.31 Jun 2026
  • but is it threatened — fix synonym ambiguity: vernacular names that map to both a synonym and its accepted name no longer shown as "multiple species"
v5.30 Jun 2026
  • LookLike — fix: record photos now correctly passed through (was reading r.media instead of r.recordPhoto on mapped records)
v5.23 Jun 2026
  • Checklist — cleaner 3-column layout: species name · 📷 select checkbox · # record count; column headers added; group headers aligned to same grid
v5.22 Jun 2026
  • LookLike integration — passes exact GBIF occurrence records (with photos, IDs, institution info) via localStorage rather than just species names; LookLike now shows the specific records Occurd fetched, not a fresh global search
v5.21 Jun 2026
  • LookLike link — encode pipe separator as %7C to fix CDN caching issue with species URLs
v5.20 Jun 2026
  • Map stability — tile layers now buffer more aggressively and skip updates during zoom animation, preventing the grey/checkerboard crash when zooming quickly while drawing
  • Draw tool — distance label handler now ignores events fired during zoom animation to prevent state corruption
v5.19 Jun 2026
  • LookLike integration — tick species in the checklist and open them in LookLike to browse taxon and record photos; select-all per taxon group and for the whole visible list
v5.18 Jun 2026
  • Samoa species search — Latin name searches now keep the Latin name as the primary label; vernacular (Samoan/English) searches show the vernacular name with Latin as subtitle; multiple species sharing a name appear as separate results
v5.17 Jun 2026
  • Single species search — label renamed from "NZ species search" to "Single species search" in sidebar
  • Samoa species search — species search field now appears when map is centred over Samoa, with Samoan and English name autocomplete
v5.16 Jun 2026
  • Mobile — species list handle moved to left edge of map, away from Leaflet attribution link
  • Mobile — accordion step headers more compact; sidebar sections use tighter padding
v5.15 Jun 2026
  • Share/copy URL now preserves iNat obscured-only checkbox state for each polygon
v5.14 Jun 2026
  • Quality box legend updated to distinguish red ring (low-precision GBIF) from orange ring (obscured iNat)
  • Orange ring on obscured iNat markers made thinner
v5.13 Jun 2026
  • Obscured iNat record jitter now constrained to within the actual polygon shape, not just the bounding box — points no longer scatter into corners outside a circular buffer
v5.12 Jun 2026
  • Obscured iNat records now jitter within the drawn polygon bounding box rather than ±0.1° from the grid-cell centre
  • Popup note on obscured records explaining actual location may be up to ~11 km from displayed point
v5.11 Jun 2026
  • Fix iNat obscured records being silently dropped — _inatClassFields was defined after the obscured fetch ran, so all records got no kingdom/class and were filtered out by the taxon group check; moved the definition earlier so both fetch paths can use it
v5.10 Jun 2026
  • Jitter iNat obscured record positions by ±0.1° (half the grid-cell size) so stacked points spread across the plausible area rather than piling on a single pixel
v5.09 Jun 2026
  • iNat obscured query now respects selected taxon groups — maps Occurd taxon checkboxes to iNaturalist iconic_taxa so only the selected groups are returned
  • iNat obscured query now applies the date range filter
v5.08 Jun 2026
  • Fix iNat obscured-only fetch not triggering — reads checkbox state directly from the DOM at fetch time instead of relying on a stored property
  • Skip polygon clip for iNat obscured records — the reported location is the 0.2° grid-cell centre which can fall outside the buffer polygon even when the actual observation is inside the core area; bounding-box search is used instead
v5.06 Jun 2026
  • iNaturalist supplemental fetch — in species basket mode, after the GBIF fetch completes a second query runs against the iNaturalist API to find research-grade records within your polygon that haven't yet been synced to GBIF; new records are merged in and shown with an orange ring so they're visually distinct from GBIF-sourced records
  • Buffer "obscured only" option — a checkbox next to the buffer distance buttons; when ticked the resulting buffer polygon fetches only records with coordinate uncertainty ≥ 10 km from GBIF (catching iNat-obscured records near the polygon edge without pulling in thousands of precise records)
  • 0.2° buffer option — new buffer button sized to match the iNaturalist obscured-record grid square; hover tooltip explains its use; works with the "iNat obscured records" checkbox
  • iNat obscured records mode — when ticked on a buffer polygon, skips GBIF entirely and queries the iNaturalist API directly with geoprivacy=obscured; only obscured iNat observations within the buffer are returned, keeping record counts manageable; markers shown with orange ring
v4.71 Jun 2026
  • Spread chart — taller (120px), non-zero baseline so small year-on-year changes are visible rather than a flat line at the bottom
v4.70 Jun 2026
  • Spread (km) — new Nerd tools option showing cumulative mean distance from centroid per year as a line chart below the timeline; tracks how far records have spread geographically over time
v4.69 Jun 2026
  • Nerd tools — new sidebar section grouping the Timeline view button with its analysis controls (Colour by year, Normalise by effort)
  • Normalise by effort — fetches total GBIF record counts per year (all taxa, same polygon) via a single facet query and divides focal species counts; timeline bars show % of all records, correcting for observer effort inflation
v4.68 Jun 2026
  • Timeline — fixed rainbow gradient running through colours twice when switching between year and month view modes
  • Timeline — "Colour by year" no longer auto-disables when slider is dragged back to the earliest year; rainbow stays on until manually toggled off
  • Timeline — Rainbow mode button colours points by year using a red→violet gradient, making temporal spread visible at a glance; gradient rescales dynamically with the slider; toggle off to restore taxon colours
  • Cluster toggle — uncheck "Cluster points" to show all points individually without merging nearby records into numbered bubbles
v4.23b Jun 2026
  • Checklist toggle — mobile handle moved outside the panel so it stays visible at the bottom of the map when the checklist is closed; no longer disappears when panel slides off-screen
  • Checklist toggle — desktop and mobile handles now explicitly stay visible after closing so the panel can always be reopened
v4.22b Jun 2026
  • Fetch timeout increased from 30s to 60s — prevents false "connection dropped" retries on slow GBIF responses
  • Retry message changed from alarming red "Connection dropped" to neutral blue "GBIF taking a while"
v4.21b Jun 2026
  • Traditional Knowledge / Biocultural labels — 🏷️ TK button appears in the checklist header when any records in the current search carry a Local Contexts project ID; click to filter checklist and map to TK/BC-labelled species only; click again to clear
  • 🏷️ badge shown on species in the checklist where at least one record has a TK/BC label
  • CSV export — tk_label column added when TK/BC records are present, containing the Local Contexts Hub project URL
v4.20b Jun 2026
  • IUCN modal — note added that a species may be threatened in its native range while invasive elsewhere
  • NZTCS and IUCN filter rows labelled for clarity
v4.19b Jun 2026
  • Mobile — collapsed sidebar sections (Define Area, Parameters, etc.) now use less vertical space when minimised
  • Mobile drawing — "shape edges cannot cross" error suppressed; self-intersecting preview lines during drawing no longer block input
v4.18b Jun 2026
  • Heatmap now updates correctly when taxon groups are toggled on/off in the species checklist
v4.17b Jun 2026
  • NZTCS button updated to 🇳🇿 to match the IUCN globe style
  • NZTCS — fix: badges no longer appear on non-NZ searches when NZTCS data was loaded from a previous NZ session
  • NZTCS — activation now based on whether the drawn polygon overlaps New Zealand geographically, not on which country codes appear in the occurrence results
v4.16b Jun 2026
  • Onboarding tour — now waits for the data disclaimer modal and mobile screen warning to be dismissed before starting
  • Checklist toggle — moved to the left edge of the map on desktop, away from the Leaflet attribution link; desktop close button added inside panel header
v4.15b Jun 2026
  • IUCN Red List — now behind a IUCN lock button with a disclaimer modal; badges only appear after acknowledgement
  • IUCN button appears after every search (global dataset, not NZ-only)
  • Both NZTCS and IUCN buttons toggle off when clicked while active — badges and filter rows disappear; click again to re-enable
v4.13b Jun 2026
  • Mobile drawing — Finish button disabled until 3 vertices placed; tapping the first polygon point no longer triggers an error
  • IUCN — switched to species-level /threatStatuses endpoint for accurate current assessments; occurrence-level field was stale for some species (e.g. avocado showed LC instead of VU)
  • NZTCS / IUCN filter rows — labelled "NZTCS" and "IUCN Red List" for clarity
  • Mobile — species checklist hidden by default after search; tab shows species count; ✕ Close button in header
v4.12b Jun 2026
  • Mobile — species checklist stays hidden after a search; tab handle shows species count (e.g. "⌃ 42 species"); tap to open
  • Mobile — "✕ Close" button added to checklist header; easy to dismiss without hunting for the tab
  • IUCN — fix: read iucnRedListCategory from occurrence records (not species API which doesn't expose this field)
v4.11b Jun 2026
  • IUCN Red List badges — fetched from GBIF per species, appearing progressively after results load; EX / EW / CR / EN / VU / NT / LC / DD badges shown alongside NZTCS badges in the checklist
  • IUCN filter row — second filter row under NZTCS filters; appears automatically once IUCN data has loaded; filters both checklist and map points
  • IUCN category added as a column to CSV export when data is available
v4.10b Jun 2026
  • Occurrence fetch — 50 cycling phrases appear centred in the header while GBIF records are loading, fading every 2 seconds
v4.09b Jun 2026
  • NZTCS threat status badges updated to official NZ DOC colour scheme
v4.08b May 2026
  • Responsive layout — tablet breakpoint (701–1024px): narrower sidebar (260px), tighter padding, smaller popup photo, proportional popup widths
  • Species photo — require exact iNaturalist scientific name match to prevent taxon-swap mismatches (e.g. Eurasian Goldfinch showing American Goldfinch photo)
  • Tree of Life — species common names: NZOR first, falls back to GBIF vernacular name
  • Tree of Life — loading phrase appears for minimum 2 seconds on every taxon click, even when cached
  • Tree of Life — empty columns left of Kingdom now show blank header instead of positional label
  • Tree of Life — loading phrases cycle every 2 seconds with fade transition while waiting
  • Tree of Life — taxonomy children now cached to localStorage (7-day TTL); repeat visits are fast
  • Tree of Life — loading phrase only shown during search jump, not on open or column click
  • Tree of Life — loading phrases stay visible for a minimum of 2 seconds
  • Tree of Life — loading phrase centred in header; refreshes on every new load
  • Tree of Life — expanded loading phrase pool to 45 phrases
  • Vernacular name filters — allow Māori macron vowels (ā ē ī ō ū) through the non-ASCII filter; é in "Ciervo Ibérico" is a different Unicode character so it is still blocked
v3.91b May 2026
  • Species checklist — require ASCII in null-language vernacular name fallbacks; fixes foreign names (e.g. "Ciervo Ibérico") slipping through when GBIF stores them without a language tag
v3.90b May 2026
  • Species checklist — skip non-ASCII vernacular names from GBIF occurrence records (e.g. Spanish "Ciervo Ibérico" no longer shown for red deer)
v3.89b May 2026
  • Tree of Life — sort children by rank hierarchy first (Phylum before Family before Genus) so incertae sedis placements in GBIF no longer cause wrong column headers on Plantae, Fungi etc.
v3.88b May 2026
  • Tree of Life — NZ occurrence filter cached to localStorage with 30-day TTL; repeat visits skip the GBIF facet queries entirely for any taxa already browsed
v3.87b May 2026
  • Tree of Life — fix "No sub-taxa found" after leaving and re-entering; replaced empty-array sentinel with in-flight promise tracking so a mid-fetch exit no longer poisons the cache
v3.86b May 2026
  • Tree of Life — taxa names appear after first page of GBIF results; remaining pages load silently in background so large families (e.g. Animalia phyla) no longer block the column
v3.85b May 2026
  • Tree of Life — kingdoms now render instantly on open; NZ counts and filtering load in background so Animalia is clickable immediately
v3.84b May 2026
  • Tree of Life — reverted global polygon mode; Tree of Life remains NZ-only where NZOR data makes it genuinely useful
v3.83b May 2026
  • Tree of Life — now works globally; when a polygon is drawn outside NZ a "Tree of life" button appears and occurrence counts use the polygon geometry instead of country=NZ; NZ behaviour unchanged
v3.82b May 2026
  • Tree of Life — paginate GBIF children fetches; large families (e.g. Muridae) now load all genera instead of stopping at 200
v3.81b May 2026
  • NZ species search / Tree of Life gate — added zoomend listener and a 2.5s fallback check; fixes features not appearing when map starts off-centre due to VPN geolocation
v3.80b May 2026
  • Favicon — fixed O as a punched hole in the pin so curves match; deployed to production
v3.78b May 2026
  • Tree of Life — fix crash when a GBIF fetch fails mid-session; undefined children no longer cause a TypeError in nzFilterAndCount or jumpToTaxon, breaking subsequent navigation
v3.77b May 2026
  • Tree of Life search — removed incorrect rank guessing for NZOR results; single-word names (families, orders, classes etc.) no longer wrongly labelled as "Genus"
v3.76b May 2026
  • Tree of Life — reverted to standard ranks only (Kingdom → Phylum → Class → Order → Family → Genus → Species); intermediate sub-ranks removed for now
  • Renamed kakapo.js → projects.js (file was still named after the deleted Kākāpō project)
v3.75b May 2026
  • Tree of Life — failed GBIF fetches no longer cached as empty; clicking the taxon again retries the request
v3.74b May 2026
  • Tree of Life — wider default column layout (1160px base); all columns now auto-widen dynamically to fit long names, not just the species column
v3.73b May 2026
  • Tree of Life — expanded rank support: Division, Subdivision, Superfamily, Infrafamily, Superorder, Infraorder, Parvorder, Superclass, Infraclass, Subtribe and Infraphylum now recognised and navigable
v3.72b May 2026
  • First-time onboarding tour — 5-step spotlight walkthrough for new users; shows once then remembers via localStorage
v3.71b May 2026
  • Taxon group headers — chevron (▼/▶) added to show expand/collapse state; rotates on toggle
v3.70b May 2026
  • Taxon group toggle — header stays visible when group is off; only species rows collapse; click again to expand
v3.69b May 2026
  • Taxon group headers in species list are now clickable toggles — click to show/hide that group's records on the map; header dims when off
  • Filter chips section removed — filtering is now done directly from the species list
v3.68b May 2026
  • Species list — coloured dot added to each taxon group header; map legend removed (redundant)
v3.67b May 2026
  • Large fetches — added 120 ms inter-page delay to avoid GBIF rate limiting on big samples; increased per-page timeout from 20 s to 30 s for deep pagination
v3.66b May 2026
  • Removed Kākāpō project — GBIF only holds NZ records for this species; Projects dropdown now contains QEII only
v3.65b May 2026
  • Kākāpō — hardcoded GBIF backbone taxon key, removed species/match step; institution markers made more visible (darker grey, higher opacity)
v3.64b May 2026
  • Projects dropdown — project names (QEII, Kākāpō) stay fixed; only the icon changes to show lock/loading/active/error state
v3.63b May 2026
  • Removed QEII lock button from sidebar footer — QEII is now activated exclusively via the Projects dropdown
v3.62b May 2026
  • Projects dropdown — removed access keys from visible labels; projects now show as "QEII" and "Kākāpō" only
v3.61b May 2026
  • Projects dropdown — fixed invisible item text (var(--text1) was undefined; corrected to var(--text))
v3.60b May 2026
  • Taxon group legend moved from bottom-right to bottom-left of map
v3.59b May 2026
  • Renamed "Clients" dropdown to "Projects" — button, IDs, and all references updated
v3.58b May 2026
  • Projects dropdown — new 🔑 Projects button in the header unlocks project-specific layers: QEII Perpetuity (key: perpetuity) and Kākāpō · Whenuahou (key: whenuahou)
  • Kākāpō project — fetches all global Strigops habroptilus records from GBIF; records with field coordinates are plotted in green; records without coordinates are placed at the publishing organisation's registered location (grey marker) using the GBIF organisation API; dropdown shows total count and how many are institution-placed
  • QEII key updated from 'qeii' to 'perpetuity' (both the sidebar footer button and the new Projects dropdown)
v3.57b May 2026
  • Tree of life: fix breadcrumb duplicating full ancestry after a search jump — jumpAncestry now shown alone (Kingdom › … › Parent › Target) without also appending all selNodes
  • Tree of life: search dropdown now shows NZOR/NVS results immediately (no network wait), then updates with GBIF results as they arrive — first suggestions appear in milliseconds instead of 2–3 seconds
  • Tree of life: increase auto-widen overhead allowance for species name padding/badges
v3.56b May 2026
  • Tree of life: Species column gets double width by default (flex:2); modal also auto-widens to fit the longest species name after each render using canvas text measurement; resets to default width when the panel is closed
v3.55b May 2026
  • Tree of life: two-phase progressive loading — taxonomy columns appear immediately (fast taxonomy API), then NZ occurrence counts and filtering update each column in the background as they arrive; removes the 15–20 second wait on first search
  • Second searches are instant: taxonomy is cached after the first load, and NZ counts are cached per taxon for the session
v3.54b May 2026
  • Tree of life: expanded to 7 Miller columns (Kingdom → Phylum → Class → Order → Family → Genus → Species) — the full Linnean hierarchy is now always visible in a single view with no panning required
  • Tree of life: search results now show inferred rank badges (Species, Genus, Subspecies) for NZOR and NVS results that don't carry rank metadata
  • Modal widened to 980px to accommodate 7 columns
v3.53b May 2026
  • Tree of life: fix "No sub-taxa found" for families like Muridae whose direct GBIF taxonomy children are Subfamily/Tribe intermediate ranks — these don't appear in GBIF occurrence facets, so the NZ filter was incorrectly wiping out the entire child list; now falls back to unfiltered children when filtering produces zero results
  • Tree of life: increase child fetch limit from 100 to 200 to handle families with many intermediate-rank children
v3.52b May 2026
  • Tree of life: expanded from 3 to 5 Miller columns — fixes taxa with intermediate ranks (Subfamily, Tribe, Suborder etc.) that were previously stuck with no Family column visible; Rattus rattus and similar deep-hierarchy species now navigate correctly
v3.51b May 2026
  • Tree of life: fix drill-up past the first level — was using index comparison to detect re-clicking the selected item, which drifts after a drillUp; now uses node key comparison so every level works reliably
  • Tree of life: clicking the already-selected item in col 0 drills up through the full taxonomy all the way to kingdom
v3.45b May 2026
  • Record type filters — replace the single "Exclude eDNA" checkbox with four inclusion filters: Observations (on by default), Preserved specimens (on by default), Fossils (off by default), and eDNA (off by default); uncheck all but Fossils to fetch only fossil records
v3.41b May 2026
  • Tree of life search jump now positions correctly — searching a species lands with the family in col 0 (highlighted), genus in col 1 (highlighted), and species in col 2 (highlighted); previously the genus was in col 0 with no family context
v3.40b May 2026
  • Tree of life column items no longer show a rank badge per row — the column header already shows the rank, so showing it on every item was redundant and made columns cramped
  • Tree of life is hidden and unavailable on small screens (under 700px)
v3.39b May 2026
  • NVS code search — type a National Vegetation Survey code (e.g. PIPCRA, ACASP) in the NZ species search or the Tree of life to find the matching species; codes and their preferred synonyms are resolved from the NVS dataset and matched to GBIF; results show a blue NVS badge
v3.38b May 2026
  • Tree of life now shows NZ occurrence counts alongside each taxon — e.g. Rhodophyceae (132) or Animalia (1.2k) — so you can see at a glance which branches have the most NZ records; counts come from the same GBIF facet query already used for NZ filtering
v3.36b May 2026
  • Sidebar tidied: "No polygons loaded" text removed; "Exclude eDNA records" moved up to sit directly below Taxon Groups; "Browse taxonomy tree" is now a small inline link beside the NZ species search label; "Notes for nerds" renamed to "Nerd notes"
v3.35b May 2026
  • Sidebar declutter: "Clear all polygons" is now a small text link rather than a button; "NZ species search" label simplified; taxonomy browser link is now hidden unless the map is centred over New Zealand
v3.34b May 2026
  • Taxonomy browser search ranking: exact matches now sort to the top — "Whau" will appear above "Whauwhaupaku", "Whauama" etc.
v3.33b May 2026
  • Taxonomy browser search jump now positions the result correctly across all three columns — col 0 shows the grandparent's children (e.g. genera in the family), col 1 shows the direct parent's children (e.g. species in the genus) with the target selected, col 2 shows the target's own children (subspecies etc.); previously the target landed alone in col 0
v3.32b May 2026
  • Taxonomy browser search now queries three sources in parallel: NZOR (common/Māori names), GBIF backbone full-text search (catches vernacular names not held in NZOR, e.g. plain "mahoe"), and GBIF backbone suggest (scientific names)
v3.31b May 2026
  • Taxonomy browser column headers now reflect the actual rank of the taxa shown (e.g. Species, Genus, Family) rather than fixed position labels like Kingdom / Phylum
  • NZOR common name search now returns up to 20 results (was 10) to reduce the chance of missing plain common names like "mahoe" when compound forms appear first
v3.30b May 2026
  • Fix taxonomy browser search jump — GBIF parents API returns ancestors kingdom-first, so direct parent is now correctly taken from the end of the array; previously the kingdom was used as the parent, filling col 0 with phyla instead of the taxon's actual siblings
v3.29b May 2026
  • Taxonomy browser search — results now ranked by relevance: vernacular and common names appear before scientific name matches, and names that start with the search term rank above names that only contain it
v3.28b May 2026
  • Taxonomy browser search bar — type a scientific name, common name or Māori name to jump directly to any taxon; GBIF backbone and NZOR are searched in parallel; selecting a result loads that taxon's siblings into the browser and shows its children, with the full ancestry path shown in the breadcrumb
v3.27b May 2026
  • Taxonomy browser now filters to NZ-present taxa only — each column load runs a parallel GBIF occurrence facet query (country=NZ) alongside the taxonomy children fetch, so only groups with actual NZ records appear; kingdoms, phyla, classes, orders and families with no NZ occurrences are hidden
v3.26b May 2026
  • Taxonomy browser rebuilt as Miller columns — three scrollable side-by-side panels replace the sunburst; click to drill down through Kingdom › Phylum › Class › Order › Family, with a Back button and breadcrumb trail; selected taxon at any rank added to species basket
v3.25b May 2026
  • Fix "click here to start drawing" hint — now positions dynamically against the actual draw button rather than a fixed offset, so it stays correct regardless of how many controls are stacked in the top-left corner
v3.24b May 2026
  • Taxonomy browser — new sunburst diagram for exploring and selecting any taxonomic rank (Kingdom down to Genus); opens via "Browse taxonomy tree" link below the taxon groups filter; 3 visible rings with drill-in navigation and breadcrumb trail; selected taxon added directly to species basket
v3.23b May 2026
  • Fix genus taxon key lookup — now validates GBIF returns a genus-rank match (not a higher group), with backbone suggest API as fallback; prevents inflated record counts when genus name matched a family or order
v3.22b May 2026
  • Genus search — when a single-word query matches the start of two or more NZ scientific names, an "all species in this genus" option appears at the top of the dropdown (e.g. type "blechnum" or "senecio"); selecting it adds an "all Blechnum" entry to the species basket and fetches every species in that genus across your polygon
v3.21b May 2026
  • Polygon list split into two groups — when both geometry polygons and species entries are present, they appear under separate "Polygons" and "Species" headings so it is clear that species entries search across all polygons rather than being tied to a specific one
v3.20b May 2026
  • Layer control (Map / Greyscale / Satellite) moved to top-left — it was being covered by the species checklist due to a CSS stacking context boundary; top-left is never affected by the checklist sliding in from the right
v3.19b May 2026
  • Species basket — selecting a species from the NZ search dropdown adds it as a virtual polygon entry (blue, 🔍) rather than setting a one-time filter; add as many species as you like before fetching; each species entry fetches only that taxon within your drawn polygon(s); close the entry to drop its records just like a geometry polygon; the search field clears after each selection ready for the next species
v3.18b May 2026
  • Species checklist no longer covers the map controls — Leaflet's layer switcher and zoom buttons slide left when the checklist panel opens, then slide back when it closes
v3.17b May 2026
  • NZ vernacular & Māori names in species checklist — when the map is centred in New Zealand, common and Māori names from NZTCS and NZOR replace generic GBIF vernacular names in the species list (e.g. kererū · New Zealand pigeon, tūī, kea); NZOR data loads silently in the background as soon as the map enters NZ bounds
v3.16b May 2026
  • Species search guard — if you've typed in the species field but haven't selected from the dropdown, clicking Fetch now shows a warning and shakes the input rather than silently fetching all taxa
v3.09 May 2026
  • Species search — type a name in the new field (between taxon groups and exclude eDNA) to search GBIF for matching species; select from the autocomplete dropdown; when a species is selected it overrides the taxon group filter and fetches only that taxon across your polygon; clear with ×
v3.08 May 2026
  • More aggressive fetch retry — up to 5 attempts with exponential backoff (1 s → 2 s → 4 s → 8 s → 12 s); added 20-second request timeout per attempt so a hung connection is cut and retried rather than stalling indefinitely
v3.07 May 2026
  • Better fetch retry — "Failed to fetch" errors caused by the connection dropping mid-response now retry up to 3 times (with status showing "retrying attempt N/3") before giving up; previously the app failed immediately
v3.05 May 2026
  • Deleting a polygon no longer wipes records from other polygons — only that polygon's records are removed and the map, checklist and metrics update in place
v3.04 May 2026
  • Perpetuity layer is now key-locked — clicking 🔒 perpetuity prompts for a key; entering the correct key unlocks the layer for the session and the lock opens (🔓)
v3.03 May 2026
  • Drawing around KMZ polygons now keeps the drawn polygon in the list alongside the selected KMZ polygons — consistent with QEII behaviour; delete either polygon if you only want the other
v3.01 May 2026
  • Perpetuity (QEII) button moved to sidebar footer — subtle text button between © Rutherford Ecology and Changelog; labelled "🔒 perpetuity" with a small "qeii" key; turns green when active
  • Draw-to-select QEII covenants — while perpetuity layer is on, drawing a polygon around or overlapping covenant polygons automatically adds those covenants to your polygon list, just like importing a KML
v3.00 May 2026
  • QEII National Trust covenant layer — overlays all QEII covenant polygons in the current map view; click a polygon to see covenant number, type, area (ha), registration date and territorial authority; layer refreshes automatically on pan and zoom
v2.97 May 2026
  • Removed establishment means filter (Native/Introduced/Naturalised) — GBIF data coverage for this field is too patchy to be useful as a fetch filter; establishmentMeans is still included in CSV and GeoJSON exports where populated
v2.92 May 2026
  • Added establishmentMeans field to all occurrence exports (CSV, GeoJSON) — shows Native, Introduced, Naturalised etc. where populated by the source dataset
v2.91 May 2026
  • Notes for nerds link in NZTCS modal now opens the nerds panel on top rather than replacing it — NZTCS modal stays open underneath so you can still accept and continue
  • Added iNaturalist geoprivacy section to Notes for nerds panel explaining the 0.2° × 0.2° obscuring box and its size at NZ latitudes
v2.89 May 2026
  • Buffer polygons labelled as "Polygon name + Nkm buffer" (e.g. "Wetland + 1km buffer") — stacking buffers chains the labels
v2.88 May 2026
  • iNaturalist geoprivacy disclaimer — added to NZTCS beta modal and all download formats (CSV, GeoJSON, KML, checklist CSV) explaining that threatened/obscured species are snapped to a 0.2° × 0.2° grid square (~349–493 km² depending on latitude), so rare species near polygon boundaries may be missed or incorrectly included
  • Per-polygon buffer — click 1/2/5/10 km on any polygon to add a new buffered polygon with its own independent species list
v2.83 May 2026
  • Fixed Reptilia filter — GBIF retired the Reptilia taxon key (358) in their 2022 Catalogue of Life update; now queries Squamata, Testudines, Crocodylia and Sphenodontia (tuatara) directly so geckos, skinks and tuatara come through correctly
v2.78 May 2026
  • Checklist opens automatically after each fetch — removed the manual toggle button; minimise with › and restore via the Checklist tab on the right edge of the map
v2.77 May 2026
  • Low-precision markers now have a light red ring to match the red warning theme
v2.76 May 2026
  • Low-precision markers (≥1.5 km uncertainty) now have a black ring instead of white — easier to distinguish from normal points at a glance
v2.75 May 2026
  • Fixed photo lightbox — close button event was wired before the element was in the DOM, crashing the expand function silently
  • NZTCS beta disclaimer now shows every time the button is clicked, not just the first time per session
v2.74 May 2026
  • Cancel now stops common-name lookup mid-way — previously the button had no effect once the name-lookup phase began
v2.73 May 2026
  • Photo expand button (⛶) — click to view any species or record photo full-screen in a lightbox overlay; press Escape or click outside to close
v2.72 May 2026
  • NZTCS relocks on each new search — button shows 🔒 until clicked; popup appears on first click per session, then unlocks directly on subsequent clicks
v2.71 May 2026
  • Low precision warning in record popup now shown in red
v2.70 May 2026
  • NZTCS beta popup now triggers when you click the NZTCS button, not automatically when results load
  • Clicking a threat category chip (NC, NE, NV etc.) now filters the map as well as the checklist
v2.69 May 2026
  • Switch social share image to JPEG (95% quality) — prevents Facebook recompressing the PNG and causing artefacts
v2.68 May 2026
  • NZTCS beta disclaimer now resets each session — popup shows once per browser session rather than once ever
v2.67 May 2026
  • Greyscale basemap option added to the layer control (top-right of map)
v2.66 May 2026
  • Polygon names are now editable — click the name in the polygon list to rename it
  • Exports (CSV, GeoJSON, KML) now include a polygon_name column showing which polygon each record came from
v2.65 May 2026
  • Fix contact email in NZTCS beta popup to rutherfordecology@gmail.com
v2.64 May 2026
  • NZTCS now auto-activates for NZ searches only — no password required
  • Beta disclaimer popup on first use — must be accepted before NZTCS badges appear
  • NZTCS button hidden for non-NZ searches
  • Once agreed, beta disclaimer not shown again (stored in browser)
v2.63 May 2026
  • Restore broken page logo images (occurd-logo.png, logo.png) accidentally overwritten by replace_all during og:image edits
v2.62 May 2026
  • Use custom medialogo.jpg as social media share image
v2.61 May 2026
  • New social-preview.png (1200×630) — compact version of full logo for Facebook/social link previews
v2.60 May 2026
  • Switch social media preview image to logo.png (green logo with icons and "by Rutherford ecology")
v2.58 May 2026
  • Fix og:url and og:image meta tag URLs to use correct capitalisation (Occurd) for Facebook/social media link previews
v2.57 May 2026
  • 🐚 badge on fossil specimen records, 📄 badge on preserved specimen (museum/herbarium) records — shown alongside the eDNA badge in both single and multi-species popups
v2.56 May 2026
  • Add "Exclude eDNA records" checkbox in fetch parameters — when ticked, MATERIAL_SAMPLE records are excluded at the GBIF query level so they never count against your record limit
v2.55 May 2026
  • eDNA filter in the taxon group panel — choose All, eDNA only, or Hide eDNA; row only appears when eDNA records are present in the results
v2.54 May 2026
  • Fix eDNA badge missing from multi-species popup record rows — the badge was only shown in single-record popups, not in the expanded species list
v2.53 May 2026
  • Removed Australian EPBC threatened species feature — taxonomic name divergence between GBIF and ALA made reliable matching impractical
v2.52 May 2026
  • Australian EPBC threatened species status — unlock with access code to see live Commonwealth conservation status badges (CE, E, V, CD, EW, Ex) fetched from the Atlas of Living Australia; filter checklist by threat category; status exported in CSV/checklist
  • NZTCS button hidden for Australian searches; EPBC button hidden for New Zealand searches — each system only activates in the region it applies to
v2.51 May 2026
  • eDNA badge shown in popup for environmental DNA records (GBIF basisOfRecord: MATERIAL_SAMPLE)
v2.50 May 2026
  • KMZ badge is now clickable — tap it after clearing polygons to re-open the selection panel without re-uploading
v2.49 May 2026
  • Clicking a species name in the map popup opens the iNaturalist taxa map for that species
v2.48 May 2026
  • Fix Plantae records with old backbone class names (e.g. Hamamelidae, Rosopsida) falling through to "Other" — any kingdom Plantae record now routes to Angiosperms as a fallback
v2.47 May 2026
  • NZTCS unlock no longer persists across page loads — each new instance starts locked
v2.46 May 2026
  • Fix NZTCS false positives: added missing GBIF taxon keys for kawakawa (Piper excelsum subsp. excelsum, Not Threatened) and Geniostoma ligustrifolium var. majus (NU) so records match the correct status instead of a threatened sibling subspecies
v2.45 May 2026
  • Reset NZTCS unlock password
v2.44 May 2026
  • Heatmap intensity increased — higher point weights, lower saturation threshold, and more visible base opacity
v2.43 May 2026
  • When GBIF rejects a polygon as invalid shape, automatically retries with its convex hull rather than stopping the whole fetch — remaining polygons continue to load
v2.42 May 2026
  • Clear all polygons no longer dismisses the loaded KMZ — the badge persists so you can draw a new area and re-select. Use × on the badge to unload the KMZ.
v2.41 May 2026
  • KMZ polygons with keyholes (inner boundary rings) now send proper WKT with holes to GBIF — records within excluded areas like building footprints are correctly omitted from results
v2.40 May 2026
  • Fixed "Invalid shape in WKT" for KMZ polygons with holes (keyholes) — inner boundary rings are now ignored when parsing, so only the outer boundary is sent to GBIF
v2.39 May 2026
  • Fixed "Invalid shape in WKT" for self-intersecting KMZ polygons — now detects and splits them into valid sub-polygons before sending to GBIF
v2.38 May 2026
  • KMZ file stays loaded in memory after a search — a badge shows the polygon count and filename so you can draw a new study area and re-select without re-uploading. × on the badge clears it.
v2.37 May 2026
  • Iterated three times on the same "Invalid shape in WKT" bug for KMZ polygons (caused by KML's duplicate closing vertex) — landed on stripping trailing closure duplicates and deduplicating any consecutive identical vertices, with epsilon comparison for floating-point precision
v2.34 May 2026
  • Drawing a polygon while KMZ browse is open now automatically adds all overlapping KMZ polygons and begins clipping immediately — no need to click "Add selected"
v2.33 May 2026
  • Drawing a polygon while KMZ browse mode is open now immediately auto-selects all KMZ polygons that overlap the drawn area, with tick marks appearing in the list
v2.32 May 2026
  • Fixed clip-to-drawn-polygon — now queries GBIF using the KMZ polygon shapes, then filters returned records client-side using point-in-polygon against the drawn study area. More reliable than the previous intersection geometry approach.
v2.31 May 2026
  • Drawn study area is now kept on the map as a faint dashed reference outline after clipping — visible for context but not included in the GBIF query. Cleared with "Clear all polygons".
v2.30 May 2026
  • Fixed clip-to-drawn-polygon — drawn study area is now removed when intersection polygons are added, so GBIF is only queried within the clipped shapes (previously the full drawn area was also included, giving unclipped results)
  • Original drawn polygon is restored if no intersections are found
v2.29 May 2026
  • Traditional Knowledge labels — occurrence popups now show a 🏷️ link to the Local Contexts community project when a record carries a local_contexts_project_id in its dynamic properties
v2.28 May 2026
  • Multi-polygon KML/KMZ support — large files with thousands of polygons now open in a browse panel instead of loading all at once
  • Spatial auto-selection — polygons from the file that overlap your drawn study area are pre-selected automatically
  • Clip to drawn polygon option — fetch GBIF data only within the intersection of a selected KMZ polygon and your drawn area
  • Re-select from drawn polygon button to refresh the spatial selection after adjusting your study area
v2.27 May 2026
  • Fixed antimeridian polygon queries — polygons crossing the 180° line are now split into two sub-polygons and sent as MULTIPOLYGON, avoiding GBIF's winding-order check failures for cross-antimeridian geometry
v2.25 May 2026
  • Fixed polygon rejection for areas east of New Zealand — antimeridian-crossing polygons now always use positive-extended longitudes (e.g. 181°) which GBIF requires
v2.24 May 2026
  • Source links (iNaturalist, eBird, Xeno-canto, museum collections) now appear in the species checklist record rows, not just in map popups
  • eBird checklist-based record IDs (older records) now generate working links to the eBird checklist page
  • Direct source links replace GBIF link where available — GBIF shown as fallback only
  • Error messages from GBIF now shown verbatim to help diagnose query issues
  • Fixed polygon winding order bug that caused some valid polygons to be rejected by the GBIF API
v1.98 May 2026
  • Fish detection overhaul — added ~25 modern fish orders split from Perciformes in current taxonomy (gobiiformes, carangiformes, labriformes, scombriformes and more), plus class-based fallback for records with missing order data
  • Species matching improvements — GBIF taxon keys now used for primary lookup, avoiding mismatches from genus reclassifications and synonyms
  • Classification data columns added to CSV exports (occurrences and species list)
  • Map/satellite layer control repositioned to avoid overlap with checklist panel
  • Checklist button now resets correctly when a new polygon is drawn
  • Conservation status feature locks on tab close rather than persisting across browser sessions
v1.90 May 2026
  • Record cap raised to 100,000 (was 10,000) — large areas and broad filters now load full datasets
  • Coordinate precision warning threshold refined — low-precision records flagged at >1.5 km uncertainty
  • Species richness indicator added to results metrics
  • Common name detection improved — API-preferred names take priority, with fallback voting across occurrence records; foreign-language names now correctly excluded for English-speaking regions
  • Record-level photos — where available, view the photo attached to an individual occurrence record and toggle back to the species photo
v1.75 May 2026
  • KML and KMZ file import — drop a file onto the map to load polygons directly
  • Multiple polygon support — draw or import several areas and fetch all at once
  • KML export added alongside CSV and GeoJSON
  • Species checklist — click any species to highlight its records on the map; photos load from iNaturalist
  • Taxon group filter chips added to results view
v1.62 May 2026
  • Pacific island fix — Samoa, Tonga, Fiji and other near-antimeridian locations now return and display results correctly
  • Photo gallery — browse multiple iNaturalist photos per species using ‹ › buttons below the image
  • Draw distance labels — segment lengths appear on each side as you draw a polygon, with a live label tracking the current segment
  • Partial results on network error — if a fetch fails mid-way, records already loaded are shown with a warning rather than discarded
  • Automatic fetch retry — transient network errors are retried up to 3 times before failing
  • Common name fix — German compound animal names (e.g. "Bisamratte") were being misclassified as English and are now correctly excluded
v1.15 May 2026
  • Mobile layout overhaul — sticky header, map-first scroll order, draw buttons (undo/cancel) now work reliably on touch
  • Fetch button converts to Cancel button during active fetch
  • Hard 10,000 record limit — fetch aborts early if result set is too large
  • Fixed Mammalia fetch filter (was silently returning zero records due to wrong taxon key)
  • Portrait photos no longer cropped — tall images scale to fit
v1.0 May 2026
Initial release.