Weft is a desktop app for working with sound recordings from the field. Train a classifier on your own recordings, run it (or BirdNET or HaikuNet) over new recordings, look at the detections on maps and charts, and make figures, papers and posters from what you find. Everything runs on your own machine. Weft is in free beta — all features are free while we work out the rough edges.
Your work is organised into studies. A study is whatever you are working on — a site, a species, a season — and it has five parts:
- Libraries — recordings you have sorted into categories. This is what models are trained on.
- Models — classifiers you train on a library.
- Runs — new recordings processed with a model (yours, a community model, or the built-in BirdNET and HaikuNet), or just acoustic metrics with no model.
- Analyses — detections and sensor data on maps and charts, with weather, tides, sun and moon, and an AI advisor.
- Documents — figures saved from charts and maps, put together into papers and posters. New — tell us what breaks.
| Platform | Download |
|---|---|
| macOS — Apple Silicon (M1/M2/M3/M4/M5) | Latest .dmg |
| Windows | Latest .exe |
| Linux — AppImage (auto-update supported) | Latest .AppImage |
| Linux — Debian / Ubuntu | Latest .deb |
Every link goes to the latest release page — pick the matching file under Assets at the bottom.
Notes:
- macOS builds require an Apple Silicon Mac (M1/M2/M3/M4/M5). Intel Macs are not supported.
- Linux builds target x86_64 with glibc ≥ 2.35 (Ubuntu 22.04+, Debian 12+, Fedora 36+).
- macOS 11+ (Apple Silicon only), Windows 10+, or x86_64 Linux (glibc ≥ 2.35)
- Anaconda (free)
- 16 GB RAM minimum, 32 GB recommended (training)
- 4 GB disk space (including Python environment)
-
Install Anaconda — download the graphical installer from anaconda.com/download and follow the setup wizard. If you already have Anaconda or Miniconda installed, skip this step.
-
Install Weft — download the installer for your platform from the latest release.
- macOS (Apple Silicon): Open the
.dmgand drag Weft to your Applications folder. - Windows: Run the
.exeinstaller. - Linux — AppImage (recommended):
chmod +x Weft_*.AppImage, then run it. - Linux — Debian/Ubuntu:
sudo apt install ./Weft_*.deb.
- macOS (Apple Silicon): Open the
-
First launch — Weft will detect your Anaconda installation and set up a Python environment automatically. This takes 5-10 minutes and only happens once. You'll see a progress screen — don't close the app during setup. Sign up for Weft using your email.
-
Subsequent launches — the app starts in a few seconds.
- Home shows all your studies. Open one and you see its five parts; the top bar moves between them.
- When you start a new study, Weft asks what you are working on and uses that name for your first library, model and run.
- Make a second library (or model, or run) in the same study and Weft asks what is different about it, then shows that in the list.
- Duplicate copies a project's settings, not its data, and remembers which project it came from.
- Sort audio into categories with a spectrogram viewer and playback, from folders on disk or straight from a Haikubox
- Train classifiers (EfficientNet-B0, EfficientNet-Lite, EdgeNet) and watch the training curves as they go
- Export models to ONNX or TFLite (INT8) to run on small devices; share them with other Weft users
- Run your model, or a community model, over folders of recordings
- BirdNET and HaikuNet are built in: identify birds in your recordings with no training, or click Second opinion on any detection in Review
- Acoustic metrics with no model: RMS, peak, SEL, spectral entropy, ACI, kurtosis, 1/3-octave bands
- Calibrate to absolute sound levels (dB re 1 µPa or dB re 20 µPa)
- Species names follow GBIF
- Pull in this study's runs directly, or import CSV, Parquet, NDJSON, JSON and DuckDB files
- Map with dots, a heatmap or hexbins
- Timeline, category, histogram and day-by-hour charts
- A table that scrolls through millions of rows
- Add weather, air quality, elevation, tides and ocean data for your locations
- Ask questions in plain English with the AI advisor (subscription)
- Total, average, max or min of any numeric column
- Compare years side by side
- Six colourblind-safe palettes; set colours per category
- Dark or light charts for print
- Click + Figure on any chart, map or spectrogram to save it. Edit, restyle and export figures.
- Papers: put figures in order and write the legends
- Posters: lay out figures and text on a page
This is how recordings become a trained classifier — for bird calls, whale sounds, bat echolocation, or anything else — and how that classifier is run over new recordings.
Everything in Weft belongs to a study. Home lists your studies. Open one and you see its five parts; the top bar moves between them. Each part starts as a list. Open a project and the page becomes that project, with a link back to the list and a menu to switch between the projects of that kind.
When you start a new study, Weft asks what you are working on and uses that name for the first library, model and run you make. Make a second one of any kind and Weft asks what is different about it; that note shows in the list so you can tell them apart. Duplicate copies a project's settings without its data and remembers where it came from, so related projects stay together.
- I have unlabeled audio — Start here to sort your recordings into categories
- I have labeled audio — Jump straight to training a classifier
- I have a trained model — Run batch classification on new recordings
Open Libraries and start a library: your audio files sorted into categories (species, call types, noise, etc.).
There are two ways to start a library:
Option A: Start from raw audio
- In Libraries, click + New — the first library takes the study's name
- Point it at your folder of audio files
- Add categories from the standardized list (e.g.,
Megaptera novaeangliae,SYS_anthropogenic,SYS_unknown) - Sort files one by one using the sorting interface
Option B: Import pre-sorted audio
- In Libraries, click + New — the first library takes the study's name
- Point it at a folder where audio files are already organized into subfolders named by category
- Weft imports the folder structure — subfolder names are automatically mapped to standardized GBIF and system category names
Category names are standardized using GBIF (Global Biodiversity Information Facility) identifiers. This ensures that models and detections can be shared consistently across projects and researchers.
- Species categories use scientific names (e.g.,
Megaptera novaeangliaefor humpback whale) - System categories use a
SYS_prefix (e.g.,SYS_anthropogenicfor boat noise and other human-made sounds)
Arbitrary category names are not supported. If you need a category that isn't available, please submit a feature request.
Each file loads with a spectrogram display and audio playback:
- Play the audio (Space bar)
- Assign to a category by clicking the category button or pressing 1–9 for quick assignment
- Skip with the right arrow key (→) if you're unsure
- Go back with the left arrow key (←) to revisit the previous file
- Undo with Cmd+Z if you make a mistake
If your recordings are long (minutes to hours), enable chunking to split them into shorter segments:
- Set a chunk duration (e.g., 3 seconds) that's long enough to see your signal of interest
- Weft will step through the file chunk by chunk
- Each chunk you label gets saved as its own WAV file in the category folder
Adjust the spectrogram view to see your signals clearly:
- Frequency range (freq_min / freq_max): Zoom into the frequency band where your species vocalizes
- FFT points: Higher values = better frequency detail
- Colormap: Choose a color scheme that makes your signals stand out (inferno, viridis, grayscale)
- Brightness (vmin / vmax): Adjust contrast to highlight faint calls
These display settings are independent of the training spectrogram settings.
If you have a Haikubox bird monitor, you can label detections directly from your device without downloading files manually.
Setup:
- Go to Settings and add your Haikubox account using the API key from listen.haikubox.com
- In a library, click Haikubox Source and select your account, device, species, and date range
- Audio is streamed on demand — files are downloaded to a local cache as you sort
How it works:
- Weft queries your Haikubox device's detection history for the selected species and date range
- Audio clips are prefetched in batches of 10 for smooth labeling with no wait between files
- Spectrogram display, playback, chunking, and keyboard shortcuts all work identically to local files
- Labeled clips are saved to your library's category folders as local WAV/FLAC files
- Progress is tracked per species and device — resume where you left off in a later session
Supported workflows:
- Label Haikubox detections to build training datasets for custom classifiers
- Review and verify automated detections by species
- Mix Haikubox remote sources with local audio folders in the same library
Switch to Library mode to review what you've sorted:
- Filter by category to check consistency
- Play back files to verify they're in the right category
- Move misclassified files to the correct category
- Delete bad recordings
Open Models and create a model project to build a neural network from your labeled audio.
- In Models, click + New
- Add a data source — link to the library (or libraries) with your labeled audio; another study's libraries are offered too
- Select which categories to include in training
These control how audio is converted to images for the neural network. The defaults work well for most bioacoustic applications:
| Setting | Default | What It Does |
|---|---|---|
| n_fft | 1024 | FFT window size. Higher = better frequency detail, coarser time detail |
| hop_length | 280 | Gap between FFT frames. Lower = better time resolution |
| freq_min | 100 Hz | Low frequency cutoff. Set above your noise floor |
| freq_max | 10,000 Hz | High frequency cutoff. Set just above your highest signal |
| freq_bins | 128 | Vertical resolution of the spectrogram image |
| time_frames | 256 | Horizontal resolution of the spectrogram image |
Tip: Preview a spectrogram before training to make sure your signal is visible and fills a reasonable portion of the image.
Two neural network architectures are available:
| Architecture | Parameters | Description |
|---|---|---|
| EfficientNet-B0 | 4.0M | Pretrained on ImageNet and fine-tuned on your spectrograms. Best accuracy for most use cases. Default learning rate: 0.00002 |
| EdgeNet | 2.8M | Xception-style architecture trained from scratch. Smaller model, better suited for edge deployment (ESP32-S3 via TFLite). Default learning rate: 0.001 |
When you switch architectures, the learning rate and early stopping patience are automatically adjusted.
| Setting | Default | What It Does |
|---|---|---|
| Epochs | 50 | Number of passes through the training data. More epochs = more learning time, but diminishing returns after the model converges |
| Batch Size | 32 | Samples processed at once. Reduce to 16 if you run low on memory |
| Learning Rate | Auto | Automatically set per architecture (0.00002 for EfficientNet, 0.001 for EdgeNet). Can be overridden manually |
| Patience | 5 / 15 | Epochs without validation improvement before early stopping. 5 for EfficientNet, 15 for EdgeNet |
| Min Specs per Class | 10 | Categories with fewer samples are excluded from training |
| Max Files per Class | 0 (unlimited) | Cap samples per category. Useful if one category vastly outnumbers others |
| Augment | On | Randomly varies spectrograms during training to improve generalization |
| Balance Method | Weighted Loss | How to handle unequal category sizes (see below) |
| Method | Description |
|---|---|
| Weighted Loss | Adjusts the loss function to penalize errors on rare categories more heavily, proportional to the inverse of class frequency. All samples are used, but the model pays more attention to underrepresented classes. Best for most cases |
| Balanced Sampling | Oversamples rare categories during training so the model sees each class roughly equally often. Useful when rare classes have distinctive features that get drowned out by larger classes |
| None | No class balancing. Categories with more samples will have more influence. Only use when categories are already roughly equal in size |
Click Train and watch the live progress:
- Training accuracy: How well the model fits the training data
- Validation accuracy: How well it generalizes to unseen data (this is what matters)
- Loss curves: Should trend downward; if validation loss starts rising while training loss drops, the model is overfitting
Training auto-saves a checkpoint at each epoch. You can stop early and keep the best model.
After training, the confusion matrix shows you exactly where the model succeeds and struggles:
- Diagonal cells = correct predictions (you want these to be high)
- Off-diagonal cells = mistakes (the model confused one category for another)
- Click on any cell to see the actual files — listen to them and decide if the model is wrong or if the file was mislabeled
Open Runs and create a run project to run batch analysis on audio recordings. There are two processing modes:
- Classification — Run a trained model to identify species/sound categories in recordings
- Acoustic Analysis — Compute acoustic metrics (no model required) for soundscape characterization
- In Runs, click + New
- Select the input folder containing audio files
- Choose a processing mode at the top of the page
Runs a trained neural network on your audio files to identify and classify sounds.
Setup: Select a model — from this study's model projects first, then other studies, community models, and the built-in BirdNET and HaikuNet.
| Setting | Default | What It Does |
|---|---|---|
| Chunk duration | 3.0 s | Length of each audio segment analyzed. Should match your training clip length |
| Step size | 50% | Overlap between chunks. 50% means each moment of audio is analyzed twice |
| Min confidence | 50% | Only export detections above this confidence threshold |
| Save chunks | Off | Optionally save WAV clips of detected sounds |
| Consecutive detections | 1 | Require N chunks in a row with the same label before reporting a detection |
You can optionally enable Acoustic Metrics to compute acoustic measurements alongside classification. When enabled, each detection row includes all acoustic metric columns in addition to the predicted category and confidence.
When processing with overlapping chunks, you can require multiple consecutive chunks to predict the same label before reporting a detection. This reduces false positives by confirming that a signal persists across overlapping windows.
How it works: After classification, chunks are grouped by file and sorted by position. The system finds runs of consecutive chunks with the same predicted label. A run of length L with threshold N produces floor(L/N) detections — one every N chunks. Runs shorter than N are discarded entirely.
Example — 50% overlap, consecutive = 2:
Chunks: [whale] [whale] [whale] [whale] [noise]
Result: 2 detections (whale run of 4 → floor(4/2) = 2, at chunks 1 and 3)
The lone [noise] is discarded.
Example — 50% overlap, consecutive = 2:
Chunks: [whale] [whale] [noise] [whale] [noise]
Result: 1 detection (whale run of 2 → floor(2/2) = 1)
The lone [whale] at chunk 4 is discarded — only 1 in a row.
Example — consecutive = 1 (default):
Chunks: [whale] [noise] [whale] [whale] [noise]
Result: 5 detections (every chunk reported as-is, no filtering)
Computes acoustic metrics on audio files without any classification model. Use this for soundscape characterization, noise level monitoring, or baseline environmental acoustic surveys.
No model required — select an input folder and start analysis.
| Setting | Default | What It Does |
|---|---|---|
| Window mode | Per chunk | How audio is windowed: per chunk, per file, or custom duration |
| Window duration | 3.0 s | Analysis window length (for chunk and custom modes) |
| Step size | 100% | Window overlap. 100% = no overlap, 50% = each moment analyzed twice |
| Sample rate | 48000 Hz | Target sample rate for loading audio |
All metrics are always computed for every analysis window:
| Metric | Description |
|---|---|
| RMS level | Root-mean-square amplitude level |
| Peak level | Maximum sample amplitude |
| SEL | Sound Exposure Level — total acoustic energy in the window |
| Spectral Entropy | Normalized 0–1. Low = tonal signal, high = broadband noise |
| ACI | Acoustic Complexity Index (Pieretti et al. 2011) — temporal variability of spectral amplitudes |
| Kurtosis | Excess kurtosis of waveform amplitude. High = impulsive signal |
| 1/3-Octave Band Levels | ISO 266 center frequencies from 25 Hz up to Nyquist, dynamically generated based on sample rate. Supports sample rates up to 400 kHz+ |
Add custom frequency bands to measure energy in specific ranges (e.g., a species chorus frequency band). Each band produces a column like band_chorus_db.
Without calibration, all levels are in dBFS (decibels relative to full scale). With calibration, levels are converted to absolute Sound Pressure Level (SPL):
| Setting | Description |
|---|---|
| Sensitivity | End-to-end sensitivity in dBFS/Pa (e.g., -170 for a typical hydrophone) |
| Recorder Gain | System gain in dB. Auto-extracted from filename for Loggerhead recorders |
| Medium | Underwater (dB re 1 uPa) or Air (dB re 20 uPa) |
Loggerhead recorders: Gain is automatically extracted from the filename pattern (e.g., 20230615T143022_1234565678_24.0dB_3.7V_ver1.0.wav → 24.0 dB gain).
Calibration formula: SPL = dBFS - sensitivity - gain
Both modes produce results that an analysis in the study picks up directly.
Classification output — one row per detection:
- Timestamp and file path
- Detected species/category and confidence score (0–100%)
- Duration and offset within the source file
- Acoustic metrics (if enabled)
Acoustic Analysis output — one row per analysis window:
- Timestamp, filename, and file path
- Window index, start time, and duration
- All acoustic metric columns (RMS, peak, SEL, entropy, ACI, kurtosis, 1/3-octave bands)
Acoustic metric columns are automatically recognized as numeric variables in an analysis, making them immediately available for histograms, correlation analysis, box plots, timeline charts, and map visualization.
- Be consistent: If you're unsure about a file, skip it rather than guessing. A few mislabeled files are OK — you'll catch them during training.
- Include background noise: Always include normal background sounds in your training set. The model needs to learn what is NOT a signal.
- Use the confusion matrix: After training, review the files the model got wrong. You'll often discover target signals hiding in your background category that can be moved to the correct label. Fix and retrain.
- Aim for at least 1,000 samples per category. More is better. Background/noise categories can have significantly more — 5,000+ is fine and helps the model learn what is NOT a signal.
- Use multiple locations if possible. Training on data from a single site often produces a model that only works well at that site. Including recordings from different locations, microphones, and ambient conditions greatly improves generalization.
- Imbalanced categories are OK — the weighted loss function handles this. But try to avoid extreme ratios (1000:10).
- The clip should be long enough to show your complete signal. A 3-second clip works for most bird calls. Whale songs may need 10–30 seconds. Bat echolocation may only need 1 second.
- The clip should be short enough that the signal fills a meaningful portion of the spectrogram. A 0.1-second bird chirp in a 30-second spectrogram will be invisible to the model.
- Match your processing chunk duration to your training clip duration.
- Narrow the frequency range to focus on your signal. If your bird calls are between 2,000–8,000 Hz, set freq_min=1500 and freq_max=9000. This removes irrelevant noise and gives the model a clearer picture.
- Leave a small margin above and below your signal's frequency range.
The most effective workflow is iterative:
- Label a small set (100–200 files per category)
- Train a model — it won't be perfect, but it'll be useful
- Process unlabeled recordings with this model
- Review the results — the model will find examples you missed, and its mistakes reveal what it needs more training on
- Add the good detections to your training set and fix the bad ones
- Retrain with the expanded dataset
Each cycle produces a better model. Two or three iterations usually get you to a production-quality classifier.
- Always include a noise or background category (e.g.,
SYS_anthropogenic,SYS_unknown). The model needs to learn what is NOT a signal. - Include common confusers: similar species, weather noise, etc. Give each its own category so the model can distinguish them.
- Validation accuracy plateaus below 80%: You likely need more data, cleaner labels, or better frequency range settings. Check the confusion matrix — the problem categories will be obvious.
- Validation loss increases while training loss drops: The model is overfitting. Try reducing epochs, increasing augmentation, or adding more training data.
- Training is very slow: Reduce batch size if running low on memory. Training time is proportional to the number of samples and epochs.
An analysis is where you look at detections, or any other data with times and places. Pull in the study's runs, or import a table with coordinates and timestamps, then look at it on maps and charts, add weather and other environmental data, and ask the AI advisor about it.
- Open Analyses in the top bar
- Click New analysis, say what it is about and choose a location
- The analysis creates a local DuckDB database to store your data
Go to the Data tab. Runs lists this study's processing runs — pick the ones to combine, no export needed. Or click Import for a file:
- CSV — Comma-separated values
- Parquet — Columnar binary format (fast, compact)
- JSON / NDJSON — Newline-delimited JSON records
- DuckDB — Import tables from another DuckDB database
If you have a Haikubox bird monitor, you can sync your detection data directly into an analysis.
- Go to Settings and add your Haikubox account (API key from account page on listen.haikubox.com)
- On the Data tab, click Haikubox Sync
- Select an account, choose devices, and set a date range
- Click Sync — detections stream into a DuckDB table with real-time progress
Features:
- Syncs all detection fields: species, datetime, location, confidence score, detection count
- Incremental sync — only fetches new data since the last sync
- Device metadata is synced separately and auto-joined so station names appear in your data
- Column mapping is auto-configured — maps, charts, and environment tabs work immediately after sync
After import, map your columns in the sidebar so Weft knows how to interpret your data:
| Column | Purpose |
|---|---|
| Datetime | Timestamp column — enables timeline charts, time-based aggregation |
| Category | Grouping column — species, call type, etc. |
| Latitude / Longitude | Enables map view and environmental enrichment |
| Numeric columns | Any numeric field available for aggregation (confidence, count, etc.) |
The map shows your data geographically. Requires latitude and longitude columns to be mapped.
| Mode | Description |
|---|---|
| Dots | Individual points at each location, sized by count or aggregated variable |
| Heatmap | Continuous density surface |
| Hexbin | Hexagonal grid aggregation |
Six base map styles: Dark Matter, Light, Streets, Satellite, Ocean, and Terrain.
Click individual points to select locations, or use box selection (Shift+drag) to select a region. Selected locations filter the charts and table views.
Six colorblind-safe palettes: Okabe-Ito, Wong, Tol Bright, Tol Muted, Set 2, Paired. You can also customize colors per category by clicking the color chip next to each category name.
| Chart | Description |
|---|---|
| Summary Metrics | Quick statistics — total detections, rate, date range |
| Timeline | Activity over time, binned by your chosen time interval |
| Category Breakdown | Distribution across categories |
| Numeric Distributions | Histograms for numeric columns |
| Day x Hour Heatmap | Activity patterns by day of week and hour of day |
- Toggle chart visibility in the sidebar
- Click a chart title to expand it full-screen (Esc to exit)
- Drag the bottom edge to resize height
- Switch between bar, line, and dot chart types
- Toggle dark/light theme for print-friendly charts
Enable in the sidebar to overlay years. Each year becomes a separate trace, aligned by day of year. Useful for comparing seasonal patterns across years. When YoY is active, time bins smaller than one day are disabled.
Weft uses a two-stage aggregation pipeline to efficiently summarize large datasets for the map, timeline, and other visualizations.
The backend groups your raw data by (latitude, longitude, time_bin, category) and applies the selected aggregation function. For example, if you have 10,000 raw detections at a location over a week, a "Week" time bin with "SUM(detectionCount)" produces one row per location per week with the summed value.
-- Simplified example
SELECT lat, lon, time_bucket('7 day', datetime) AS time_bin,
category, SUM(detectionCount) AS detectionCount_sum
FROM detections
GROUP BY lat, lon, time_bin, categoryEach location gets back a record with:
count— number of raw rows in the groupnumerics— a map of{column}_{agg}keys (e.g.detectionCount_sum,confidence_avg)
The timeline and category charts sum the pre-aggregated values across all locations for each time bin. This collapses the spatial dimension so you see a single time series.
Example: 3 locations, weekly bins, SUM(detectionCount)
| Location | Week 1 | Week 2 |
|---|---|---|
| A | 45 | 52 |
| B | 30 | 28 |
| C | 25 | 31 |
| Timeline | 100 | 111 |
By default, the map and charts use Count (number of rows). You can switch to any numeric column in the sidebar under Variable:
| Function | Description | Example |
|---|---|---|
| Count | Number of rows per group (default) | 150 detections this week |
| Sum | Total of the numeric column | Total detectionCount = 847 |
| Average | Mean of the numeric column per location | Avg confidence = 0.82 |
| Maximum | Highest value in the group | Peak confidence = 0.99 |
| Minimum | Lowest value in the group | Min confidence = 0.51 |
The time bin controls the resolution of the timeline and heatmap:
| Bin | Best For |
|---|---|
| Hour / 6 Hours | Short-duration datasets with fine detail |
| Day | Default — good balance of detail and readability |
| Week / Month | Smooths out noise, reveals long-term trends |
| Custom | Specify any number of hours (1–720) |
After aggregation, you can filter by the aggregated value. For example, set a minimum of 5 to hide locations with fewer than 5 detections per time bin. This filters both map points and chart data.
The heatmap uses a separate SQL query that groups by day-of-week and hour-of-day directly from the raw table. When a numeric aggregation variable is selected, the heatmap applies that function (e.g., SUM(detectionCount)) instead of COUNT(*).
Note on Average aggregation: When using Average, the timeline sums per-location averages across locations. This is a sum-of-averages, not a true global average. For a single location it is exact, but across multiple locations with different row counts, it weights each location equally regardless of sample size.
Filters in the left sidebar constrain which data is displayed across all views (map, charts, table).
| Filter | Description |
|---|---|
| Category | Check/uncheck categories. Use the search box to find specific categories |
| Date Range | Set From and To dates to focus on a specific time period |
| Numeric Range | Set min/max bounds on any numeric column (e.g., confidence >= 0.8) |
Numeric range filters are applied to raw data before aggregation. The threshold filter is applied after aggregation.
For tables with more than 100 million rows, filters are not applied automatically. Instead, adjust your filters and click Update to re-query. This prevents accidental long-running queries.
The Environment tab shows relationships between your detection data and environmental variables. Requires latitude, longitude, and datetime columns.
Always available when coordinates and timestamps are mapped:
- Activity Relative to Sunrise — Detection timing relative to sunrise/sunset
- Activity by Moon Phase — Detection counts across lunar phases
- Nocturnal by Moon Phase — Same as above, filtered to nighttime only
Available after computing weather enrichment on the Data tab. Select variables from the picker to add timeline and correlation charts for temperature, precipitation, wind speed, air quality, and more.
Available after computing elevation enrichment. Shows elevation distribution and detection-vs-elevation correlation charts.
On the Data tab, the Enrich section lets you add environmental context to your data. Each enrichment source creates a new table that is joined to your detection data for analysis.
| Source | Type | What It Adds |
|---|---|---|
| Weather | Daily, per location | Temperature, precipitation, humidity, wind, cloud cover, pressure, solar radiation |
| Air Quality | Daily, per location | AQI (US/EU), PM2.5, PM10, O3, NO2, SO2, CO (bundled with weather) |
| Tides | Sub-daily (6-min), per location | Observed & predicted water level, tidal slope, daily tidal range (NOAA CO-OPS; free, coastal locations within 100 km of a tide station) |
| Ocean | Daily, per location | Sea surface temperature & anomaly, chlorophyll-a, wave height/direction/period, swell height/direction/period (NOAA ERDDAP + Visual Crossing; paid tier) |
| Elevation | Static, per location | Elevation in meters (90m SRTM data, computed locally) |
- Click Compute on an enrichment card
- Weft extracts the unique locations and date range from your data
- Data is fetched (from API or local library) and stored as a new table
- Progress is shown in real-time with a cancel button
- Once computed, environment charts and advisor access become available
Enrichment tables are named with a prefix (e.g., _weather_detections, _elevation_detections) and are visible in the Data tab.
On the Data tab, use Combine to merge multiple tables:
- Union — Stack tables with matching columns (e.g., combine detection CSVs from multiple deployments)
- Join — Link tables on shared key columns (e.g., add metadata to detections)
Combined data is created as a view. The original tables remain unchanged.
All projects are saved in your home folder under WeftProjects by default:
- macOS:
~/WeftProjects/ - Windows:
C:\Users\<username>\WeftProjects\
Organized by type:
WeftProjects/sorting/— LibrariesWeftProjects/training/— Model projectsWeftProjects/processing/— Run projectsWeftProjects/weft/— Analyses
Deleting a project is a soft delete — it removes the project from the app but leaves all files on disk. To free up disk space, you need to manually delete the project folder from ~/WeftProjects.
Exception: Deleting an imported data table within an analysis is a hard delete — the imported data is permanently removed. If you need to keep imported data, back it up before deleting the table. Deleting the analysis itself leaves imported data tables intact on disk.
There is no way to undelete a project in the app. However, since the files remain on disk, you can import them into a new project if a project was accidentally deleted.
Study
Libraries → Models → Runs (classification) → Analyses → Documents
(labeled (trained (detections + optional (maps, (figures,
audio) model) acoustic metrics) charts) papers, posters)
Audio files → Runs (acoustic analysis — no model required)
- A model can be trained on more than one library, from this study or another
- A trained model can be used in any number of runs. A run belongs to the study its recordings belong to
- Acoustic analysis runs need no model, just recordings
- An analysis can pull in the study's runs directly. Figures saved from an analysis or a model go to Documents
Privacy Policy · Terms of Service
© 2026 Loggerhead Instruments