User Guide

Everything you need to know about using CollarID to track and manage your wildlife devices.

SD Card Viewer

The SD Card Viewer opens a CollarID SD card directly in your browser — no upload, no install. It parses METADATA.CSV for the timeseries sensor logs and stitches the audio and accelerometer .wav files into playable, downloadable, time-aligned recordings. Unlike the rest of the dashboard, this page is publicly accessible and works offline once it has loaded.

Your data stays on your computer. SD card contents — audio, accelerometer, GPS, status — are read directly off the card by your browser and never sent to a server. The only outbound call is a lat/lon timezone lookup to timeapi.io from the first GPS coordinate, used to label times in the animal's local timezone. Everything else runs locally in the tab.
Experimental tool. The viewer is under active development and may have rough edges in formats or edge cases we haven't seen yet. Please report any issues via support with a device ID and the approximate recording timestamp.

Opening an SD card

Two paths in, depending on your browser:

Summary cards

Once a card is loaded, eight to ten cards across the top summarize what was recorded: GPS fixes, light, magnetometer, environmental, battery, particulate, activity (step count), status events, plus total hours of audio and accelerometer when the folder access path is used.

Find recordings with sound (first-pass scan)

Most collar audio is just silence — the animal asleep, no vocalizations, no distinct events. When you open an SD card folder, a prominent blue banner appears above the recordings list with a single button: 🔍 Scan all N recordings. Click it and the viewer runs a fast, local scan over every audio recording on the card and tags each one as silent or as having sustained sound. Recordings with no sound get a 🔇 silent badge; ones with biological calls, vocalizations, or other distinct events get 🎵 active or ⚡ event, plus a thin timeline strip underneath showing where in the recording the sound is so you can scrub straight to it.

The scan runs in parallel on as many CPU cores as your laptop has (capped at 8), so a card with hundreds of recordings finishes in a couple of minutes. Your tab stays responsive while it runs — click the button to cancel mid-scan, and previously-scanned recordings are saved as you go. The button collapses to a green status strip when complete (e.g., "✓ 47 recordings scanned — 12 have sustained sound") with a small ↻ Re-scan option if you ever want to re-run.

Results are remembered per SD-card folder, so reopening the same card later restores all badges instantly — no need to scan again.

This is a first-pass filter, not a classifier — it tells you which recordings have something worth listening to, not what. The semantic-classification layer is the next step (see Categorize sounds).

How the scan flags a frame — DSP details

A 1024-sample window slides over the PCM and computes three features per frame: short-time RMS energy, spectral flux (frame-to-frame change in spectrum shape), and spectral entropy (whether the energy is concentrated at a few frequencies or spread broadly). A frame is flagged when its RMS rises ~10 dB above the recording's quiet baseline and its spectral entropy is low — i.e. structured, tonal, or transient content. Wind, friction, and other broadband noise have high entropy and get suppressed even when loud. A recording is marked as having sound when at least one continuous run of active frames lasts a full second; longer or denser activity bumps it to event.

Categorize sounds (Stage 2 — YAMNet classifier)

Once Stage 1 has flagged the recordings with sound, a second blue banner offers 🔬 Categorize sounds. Click it and the viewer runs Google's YAMNet audio classifier (521 sound categories — birds, mammals, insects, rain, wind, vehicles, speech, music, etc.) over every active recording locally on your machine. The model weights (~17 MB) download from a CDN the first time and cache in your browser; audio itself never leaves the page. TensorFlow.js automatically picks WebGPU when available (Chrome / Edge / Brave on modern hardware) and falls back to WebGL or CPU.

Resource-intensive step. The classifier runs neural-network inference on every recording — the heaviest task on this site. It works on most laptops but a machine with a capable GPU is strongly recommended for large cards. On CPU-only laptops expect several seconds per recording. Narrow the Categorization scope dropdown (newest day / last 7 days / last 30 days / all) to limit the first pass to a recent slice.

Each classified recording grows a row of category badges below its timestamp:

Up to 5 non-silence labels appear per recording, ranked by a combined score (mean over non-silent frames, or single-frame peak — whichever is higher). When a class peaks much higher than its mean, the badge shows the peak number with an up-arrow (e.g. 🐾 Howl ↑ 80%) so brief events like a several-second howl in a mostly-quiet recording still surface. The badge tooltip lists the sustained mean, the peak score, and the local times where each interval fired.

Click any badge to seek the audio player to that class's strongest interval. Translucent category-colored rectangles appear on the activity strip showing every time-range where the class fired (peak-stitched with a 2-frame gap bridge so a momentary dip doesn't split one event). Click again to clear.

Heart-sound false positives are filtered — why

YAMNet's "Heart sounds, heartbeat" and "Heart murmur" classes were trained on stethoscope audio and reliably fire on mechanical impulse noise from the collar housing (taps, ring-rub, mount creak). An animal's actual heartbeat can't reach the mic through the housing, so any such hit is guaranteed to be a false positive. Those classes are excluded from the candidate list, category scoring, and CSV exports.

Post-process & store in folder

Once a folder is open via Open SD card folder (the File System Access path — Chrome, Edge, Brave), a prominent 🗂️ Post-process & store in folder button appears above the recordings list. Click it and the viewer requests write permission on the folder you opened (one-time prompt), then writes a complete ecology-ready derivation of the card into a post_process/ subdirectory. Re-runnable; each file is written atomically (.tmp sibling + rename) so a crash mid-write never corrupts the previous output.

It says "store in folder" because it works on either path. Writes go to whichever folder you opened — the live SD card via your card reader, or a directory on your computer you've copied the card into. Same flow either way.

Files written into post_process/

Portable analysis cache

The post-process pipeline also mirrors your scan results to a post_process/cache/ subdirectory. When the same folder is opened on a different computer or browser, the viewer restores the analysis silently — so a colleague who plugs in the card after you doesn't have to re-run Stage 2, and any spectrogram you've already rendered shows up instantly.

Cache file layout & versioning — for developers

Inside cache/:

  • manifest.json — schema version, generation timestamp, source card name, deployment timezone, detector versions, and per-section counts.
  • stage1.json + stage1_timelines/<file>.bin — Stage 1 activity summaries plus uint8-quantized per-frame timelines (~180 KB per hour; divide each byte by 255 to recover the [0, 1] Float32 value).
  • stage2.json — YAMNet results keyed by audio path.
  • spectrograms/<file>.png — PNG copies of any rendered spectrograms. Lossless, so an import on a different machine matches pixel-for-pixel.

Each entry carries detectorVersion / renderVersion fields. Stale cache entries from older detectors are ignored automatically and a fresh scan is requested. Local IndexedDB results always win over folder-cache rows. Re-running post-process rewrites everything in cache/ atomically.

Export analysis (CSV)

Above the recordings list, the ↓ Export analysis ▾ dropdown produces three CSVs — each row links back to its source WAV path and carries both UTC and deployment-local timestamps, ready to drop into pandas, R, or QGIS without timezone math:

Recordings panel

Audio and accelerometer files are grouped into sessions: any files that share the same RTC second in their filename (the firmware's intra-second collision suffix _1, _2) are treated as one logical recording and stitched back together on playback / download.

Audio playback & downloads

Each audio session has five buttons:

▶ Play

In-browser playback through Web Audio with a +27 dB boost and soft limiter. Firmware mic recordings are quiet on purpose (large electrical headroom for biological events); the boost is roughly 22× louder so faint sounds are audible without loud peaks clipping into a wall.

🏃 Activity

Toggles an inline panel showing what the accelerometer was recording during this exact audio session — VeDBA & ODBA in one chart, pitch & roll in another, aligned to the mic timeline. Useful when listening to a recording: you can see whether the animal was at rest, walking, or in a particular posture during a sound of interest. Greyed out when no accel recording overlaps the audio session.

↓ WAV

The raw stitched firmware audio, unmodified. Use this for any analysis pipeline that applies its own gain or expects unmodified PCM.

↓ Boosted WAV

Same audio, but with the +27 dB gain and limiter baked in so the level matches the in-browser player when you open the file in Audacity, Raven, ffmpeg, or any other tool. Filename gets a _+27dB.wav suffix.

📦 Synced bundle

See the next section. Greyed out when no accelerometer recording overlaps the audio session.

Synced bundle (audio + accelerometer + GPS)

The collar's microphone runs on a schedule; the accelerometer is recording continuously. The Synced bundle button on an audio row pulls in every accelerometer file that overlaps that audio session (often more than one, since a single audio recording can straddle the boundary between two accel files) and assembles a single ZIP with everything time-aligned to the microphone:

Alignment caveats & accelerometer units — upsampling, phase, gaps, G-range

Sample-and-hold. Each accel sample is repeated until the next one arrives — original measurements are preserved exactly at native sample times. Treat any content above (accel rate / 2) Hz on channels 2-4 as a stair-step artifact, not motion.

Phase shift. The mic is the time reference. A small phase shift between mic and accelerometer may exist because they're captured by separate subsystems — coarse alignment is reliable, sample-precise alignment is not guaranteed.

Gaps. When the firmware closes one accel file and opens the next, channels 2-4 are zero-filled for those samples; the audio channel is never altered. The exact zero-filled sample count is in session.json and the README.

Units. When CONFIG.CSV is present, the BMA400's configured G-range (±2 / ±4 / ±8 G) ships in the bundle so you can convert int16 → G with G = int16 × (range / 32767). Without CONFIG.CSV the bundle says so and leaves the conversion to you.

Accelerometer preview

On the Accelerometer tab, each session has a 📊 Preview button. It computes two charts on demand from the stitched PCM, using the standard ecology metrics for dynamic body acceleration:

GPS exports

The ↓ Download GPS menu on the GPS Track section offers five formats:

CSV

All columns — epoch, datetime, lat, lon, altitude, accuracy, fix type, fix time. Compatible with Excel, pandas, R, anything.

GPX

XML track format. Opens in Google Earth, Garmin BaseCamp, QGIS, Strava, every hiking app. Best for general GPS sharing.

KMZ

Zipped KML. Open directly in Google Earth to visualize the track on satellite imagery — no other software needed.

GeoJSON

Modern GIS standard. Loads in one line in QGIS, ArcGIS, GeoPandas, sf (R).

Movebank CSV

Pre-formatted with Movebank's column names (timestamp, location-long, location-lat, etc.) for direct upload to movebank.org studies. Rename the individual-local-identifier column to your animal ID before uploading.

Periodic clicks in the microphone audio

Recordings may contain faint, regularly-spaced ticks (single-sample spikes in Audacity). These are not biological events — they come from the SD card's write activity tugging on the mic preamp's power rail, so they appear only when the device is actively writing.

How to remove them

If downstream analysis is sensitive to impulse noise, a simple amplitude threshold or short-window median filter (1–3 sample width) in Audacity, Raven, or a small Python/R script removes them cleanly without affecting acoustic content.

Analytics

The Analytics page is a deployment-level lens on the same SD card. Where the SD Card Viewer shows recordings one row at a time, Analytics plots every recording on a map (interpolated to the GPS track at each recording's midpoint). It reads the same Stage 1 / Stage 2 results out of your browser's IndexedDB, so any scan you've already run in the SD Card Viewer carries over here automatically — and vice versa.

Same privacy story. Audio, GPS, and all sensor data are read directly off the card by your browser. The only outbound call is a timezone lookup for the first GPS coordinate so timestamps render in the animal's local time.

Map & markers

Each audio recording is plotted as a circle at its midpoint location. Markers are colored by what the recording contains rather than by raw activity:

Marker size encodes recording duration; a red halo highlights statistical anomalies (recordings whose Stage 1 activity is unusually high for that hour of day, modified z-score > 3.5 with median + MAD).

Filters (floating legend)

The legend pinned to the top-right of the map is interactive:

Above the map, a class filter input narrows the map AND the diurnal chart to recordings/events whose top-5 contains a matching YAMNet label. Useful for questions like "where on the deployment did 'howl' fire?"

Scope & scans

A scope dropdown (Newest day / Last 7 days / Last 30 days / All) drives both Stage 1 and Stage 2 scans so long deployments don't have to scan every recording on every visit. Two banners appear in sequence:

Side panel

Clicking a marker slides in a panel from the right showing the recording's local time, Stage 1 activity numbers + anomaly flag, the recording's top-5 detected sounds with peak indicators + per-class hit bars + peak-time chips, GPS coordinates, and in-page audio playback (with the same +27 dB boost as the SD Card Viewer). A link jumps to the same recording in the SD Card Viewer for the full feature set (synced bundle, accelerometer overlays, etc.).

Diurnal pattern

Below the map, a "Diurnal pattern" panel plots when during the local day each category fired. One row per category, 24 hourly bars, height scaled across the whole chart so the rows are directly comparable. Counts come from peak-stitched Stage 2 intervals, so a single howl event counts once — not once per audio frame. Honours the scope, category filter, and class filter, so you can drill from "all activity" down to "howls in the last 7 days" and see the time-of-day distribution.

Spectrogram (side panel)

Below the inline audio player in the side panel, a 📊 Show spectrogram button computes a frequency-vs-time spectrogram for the selected recording. The X axis is time, the Y axis is log-scaled frequency from 100 Hz to 8 kHz (the firmware mic's full bandwidth), and color encodes magnitude on a viridis ramp — dark = quiet, yellow = loud. Click anywhere on the spectrogram to seek the player to that time. An amber playhead line tracks playback in real time. Same +27 dB boost as playback so what you see matches what you hear. Computed on demand because STFT over an hour-long recording is real work — expect a few seconds of progress before the canvas paints.

Top detection events

Below the diurnal chart, a table lists the strongest Stage 2 detection events across the whole deployment — sorted by peak confidence, capped at 30 rows. Each row shows the local time, category, class, peak percent, and event duration. Click any row to fly the map to that recording and open its side panel. Honours the scope, category filter, and class filter — narrow to "Last 7 days" + "biological" and you get the strongest 30 biological detections from the recent week.

Anomalies (sortable list)

Recordings whose Stage 1 activity is unusually high for that hour of day (modified z-score ≥ 3.5 using median + MAD) now show up as a sortable table. Each row carries the local time, severity, z-score, baseline-multiple, and the hour bin. The sort dropdown lets you re-rank by strongest first, largest multiple of baseline, newest first, or oldest first. Clicking a row opens the side panel for that marker and recenters the map on it.

Activity heatmap (map layer)

For deployments with hundreds of recordings stacking on the same location, individual markers can become hard to read. The GPS layers section of the floating legend has an Activity heatmap toggle that overlays a density layer weighted by Stage 1 activity — transparent → blue → amber → red as activity concentration rises. Off by default; turn it on when you want a deployment-wide density view.

Export (CSV with GPS)

The same three CSVs available in the SD Card Viewer are reachable from the ↓ Export ▾ dropdown — with one addition: every row carries interpolated lat / lon at the recording's midpoint (or, for interval rows, at each event's peak time). The intervals CSV drops straight into QGIS as point geometry, with one feature per detected sound event.

Live Map

The map is the main interface for monitoring your devices in real time. Devices appear as colored dots that update via a live WebSocket connection.

Device Markers

Click a marker to open its popup with GPS coordinates, signal info, weather, and quick links to history, notes, alerts, and more.

Sidebar

The left panel lists all your devices with battery levels, coordinates, signal strength, and quick-access buttons:

Click the pencil icon next to a device name to rename it. Click the emoji to set a custom avatar.

Map Controls

Map Style

Cycle between Dark, Satellite, and Terrain (OpenTopoMap) views using the style button in the top-right corner of the map.

Heatmap

Toggle a density heatmap overlay showing where your devices have been concentrated.

Distance Measurement

Click the ruler tool, then click points on the map to measure distances between locations. Double-click to finish.

Marker Clustering

When zoomed out, nearby devices are automatically grouped into clusters showing the count. Click a cluster to zoom in.

Refresh Interval

Use the dropdown next to the connection status indicator to control how often the sidebar and marker colors refresh: 5s, 15s (default), 30s, 60s, or Off. Device data still arrives in real time via WebSocket regardless of this setting.

Tags & Filtering

Organize devices by adding tags (e.g., "herd-A", "north-field"). Tags are stored locally in your browser.

History & Tracks

Click history on any device to open the telemetry table. Use the time range presets (24h, 3d, 7d, 30d, All) or set a custom date range.

Toggle subsystem columns (GPS, Environment, LoRa, Activity, etc.) using the row of buttons above the table.

Geofences

Define geographic boundaries and get notified when devices cross them.

Alerts

Set up alerts for individual devices to monitor battery levels and connectivity:

Alerts are delivered via WebSocket (in-app), email, and webhook — depending on your Account Settings.

Field Notes

Attach text notes to any device for field observations, maintenance logs, or other records.

Share Links

Generate a public, read-only link for any device. Anyone with the link can view the device's current location and track without signing in.

Webhook Notifications

Receive real-time JSON POST notifications to an external URL (Slack, Discord, custom server, etc.).

Example payload:

{
  "type": "geofence_alert",
  "event": "ENTERED",
  "device_uid": "0x0024000D",
  "display_name": "Bella",
  "fence_name": "North Pasture",
  "message": "Bella entered geofence 'North Pasture'",
  "text": "Bella entered geofence 'North Pasture'"
}

Data Export

Per-Device Export

Both are available from the history panel toolbar when viewing a device's history.

Bulk Export

Export data for all your devices at once from the Cloud Data page:

Notes Download

In the Notes modal for any device, click the download button to save all notes as a .txt file.

Keyboard Shortcuts

Use these shortcuts on the Live Map page for faster navigation:

Shortcuts are disabled when typing in input fields or text areas.

Organizations

Organizations let multiple users share devices and geofences. When your account belongs to an org:

Organization membership and device assignments are managed by your admin in the Admin Panel under the Orgs tab.

Mobile

On mobile devices, the sidebar appears as a bottom sheet that you can swipe up and down:

Model credits & licenses

The audio analysis pipeline on this site uses two third-party machine-learning models. Both run entirely in your browser; audio never leaves your machine. Please respect the licenses below if you redistribute or build on this work.

Stage 2 — YAMNet (sound categorization)

YAMNet is a 521-class audio event classifier trained on AudioSet by Manoj Plakal and Dan Ellis at Google Research. Released under the Apache License 2.0.

Account Settings

Click the key icon at the bottom of the sidebar to manage your account: