No decisions recorded in this range yet - cull some photos first.
| Camera | Lens | Photos | Keep rate | Avg sharpness |
|---|
No decided photos with camera/lens EXIF yet.
| Shooter | Photos | Keep rate | Avg sharpness |
|---|
No decided photos with a shooter assigned yet.
A quick walkthrough before your first scan:
…
No photos yet. Drop .ARW files in your watch folder, then hit Scan for new photos.
No photos match your current filters.
Best shot from each detected burst/similar group, ranked by sharpness.
No scored photos yet. Score some photos in the Cull tab first.
Browsing rawcull-data / Edited Photos — drop your exported edits there.
No edited photos found yet. Export some into the "Edited Photos" folder on your rawcull-data dataset.
Identifies the species for the primary subject of any photo where a bird is the top-scoring subject, as long as that photo's sharpness score clears the threshold below - a soft/blurry crop is exactly the case a classifier is most likely to guess wrong on, so it isn't worth spending the compute there. Runs entirely on this server - nothing ever leaves it, regardless of which option below is picked.
No species identified yet - pick a model above, then scan new photos or use "Rescore bird species" on ones already scored.
Every distinct species identified across your photos - from the AI classifier or tagged by hand (see the "Edit species" button in the lightbox) - with how many photos of each and the earliest/latest capture date seen.
| Species | Photos | Manually tagged | First seen | Last seen |
|---|
Bird IDs the classifier wasn't very confident about - a quick "yes that's right" or a correction clears each one out for good, so this list only ever shows guesses nobody's weighed in on yet.
Nothing waiting on review right now.
No bird photos yet. Once some are scored (and a model is picked above), they'll show up here.
Pick a region and this lists the birds eBird has recorded there, marking the ones you've
already photographed. Attach one of your Edited Photos to a species to tick it off.
Use "Pick an eBird region…" rather than typing a place name. eBird's own
region list is where the species come from, and a typed name has to be geocoded, which
can't resolve US counties at all — "Marion County" finds a dam, some parks and no county.
The import below adds one thing the eBird API cannot: when in the year each
species turns up. eBird publishes that only as a file on their website, so it can't be
fetched automatically. The checklist works without it — you just lose the month badges.
Bird ID does not. BioCLIP 2 scores each photo against the species
plausible where and when it was taken, and that list comes only from an import, so
without one it declines to name anything at all.
Adds month-by-month timing to a region you've picked — the species list itself already comes from eBird's API, but detection frequency by week is published only as a downloadable file: go to a region's page on ebird.org, click "Bar Charts", then "Download Histogram Data" at the bottom right. Upload that file here, labeled with the same place name you'll search above, and expected species merge into that region's view.
Search a country, state, or place above to see species you've photographed nearby.
Copies photos off a card and checks every file arrived intact, by comparing the copy against the original before the card leaves the reader. Nothing is ever written to or deleted from the card.
Kept after the card is formatted, which is when they start mattering: this is how you check later that a card really did copy cleanly.
Shows what people have actually reported near you in the last few days, and which of those you haven't collected yet. Needs a free eBird API key from ebird.org/api/keygen. The key is stored on the server and never sent back to the browser.
Pick the shot you want to represent this species on your checklist.
Pick a client above to browse their edited photos.
Browsing /photos/incoming-ironman — a completely separate
folder from the normal Cull tab. Photos stay here untouched unless you use "Move & rename by
bib number" below, which relocates them into a per-race subfolder under
/photos/incoming-ironman-sorted.
No bib numbers indexed yet. Drop race photos into the Ironman watch folder and hit "Scan for new race photos".
Low-confidence bib reads — confirm the correct number, or dismiss if it isn't actually a bib.
Nothing waiting on review right now.
Photos that finished processing with no readable bib number at all — nothing detected, or every candidate was dismissed. Click one to view it full-size and type in a bib number by hand if it's actually there.
These faces matched a confirmed bib elsewhere in this race closely, but not quite closely enough to apply automatically.
Nothing unmatched right now.
Upload the results CSV from your timing provider. You'll pick which columns are the bib number, name, and email next - every provider formats these a little differently.
Prices shown on the public search page (/race.html) where anyone can look up
their bib number or name, no login required. Turning this off hides all "Buy" buttons there —
the free watermarked preview/search keeps working either way.
⚠️ Stripe isn't configured on this server yet (RAWCULL_STRIPE_SECRET_KEY / RAWCULL_STRIPE_WEBHOOK_SECRET) — purchases can be priced and enabled here, but the public page won't actually be able to check out until Stripe is set up in docker-compose.yml.
Bib reads below this confidence go to the review queue instead of being auto-confirmed. Lower it to auto-confirm more (less review work, more risk of a wrong number slipping through); raise it to send more to review (more work, more accuracy). Saving re-checks everything already sitting in the queue or already auto-confirmed against the new value right away.
No shipping address is collected — reach out to the buyer's email to arrange delivery or pickup, then check it off here.
See what the current watermark strength actually looks like on a real photo before a customer complains it's too strong or too weak. This only previews — it doesn't change what's live (that's the RAWCULL_CLIENT_WATERMARK_OPACITY environment variable).
Views counted per gallery open on the public search page; "Purchased" means at least one paid order for that bib.
Set a photo's shooter from its full-size view (open any bib photo, then use the "Shooter" field). "All photos" orders are attributed to whichever shooter shot the most of that bib's photos — an estimate, not an exact split.
Deletes original source files (RAW especially) for the selected race to free up space on disk. Thumbnails, watermarked previews, and JPG purchases/downloads keep working — only "original file" purchases stop being possible once archived. This cannot be undone.
Fully removes the selected race from this tab — every tile, every database record, AND the not-yet-organized source files sitting in the watch folder for it. This is the one that actually stops a bad OCR read (a stray "#1"/"#2"/"#3" tile, say) from coming back on the next scan — Stop & Clear only wipes the app's index, so a rescan just re-finds the same files and re-detects the same numbers; this deletes the files themselves. This cannot be undone. Doesn't touch the roster (use "Clear roster" in the Roster tool for that) or existing orders.
If bibs that were already moved via "Move & rename" ever go missing from the bib list or public search page (their files are still safe in the sorted folder), this rebuilds their database rows straight from the filename — no re-scanning or OCR needed. Safe to run any time; does nothing if there's nothing to recover.
Races organized before per-race subfolders existed are still sitting flat at the root of the sorted folder. This moves them into a subfolder each, matched to their race automatically wherever possible (falls back to the "Race / folder" picker above for anything it can't match). Preview first to see the plan before moving anything.
For photos in the selected race with no readable bib at all, looks for a face match against photos that already have a confirmed bib elsewhere in the same race. Very confident matches (a tight face similarity) get applied automatically; everything else close enough to be worth a look shows up as a suggestion in the Unmatched tab for you to confirm or dismiss. Never matches faces across different races. Faces from bystanders/other runners in a confirmed photo can occasionally produce a wrong suggestion — that's exactly what the review step in the Unmatched tab is for.
Scan to open the public, no-login race photo search page — handy for a finish-line sign or results board.
Swipe right to confirm, left to dismiss — or use the buttons below. Tap the photo for full context.
Review queue clear.
Shortcuts that type into a text field (like undo) are disabled while you're actively typing in one.
Adds a 6-digit code from an authenticator app (Google Authenticator, Authy, 1Password, etc.) on top of your password.
Step 1 of 2 — Scan
Scan this with your authenticator app, or enter the key manually:
Can't scan? Enter this key manually:
Open in authenticator appStep 2 of 2 — Confirm
Two-factor authentication is enabled.
These devices skip the 2FA code for 30 days after "Remember this device" was checked at login.
No trusted devices - every login will ask for a code.
For external tools (a spreadsheet sync script, say) that need to pull stats without your login password. Currently covers scoring trends and gear stats - read-only, nothing can be changed through a key.
No API keys yet.
Get a JSON POST when something happens - a scan finishes, a client places an order, a client leaves a comment.
No webhooks configured.
Get a text via Twilio when something happens - same event types as the webhooks above, delivered to a phone instead. Not configured yet - set RAWCULL_TWILIO_ACCOUNT_SID/RAWCULL_TWILIO_AUTH_TOKEN/RAWCULL_TWILIO_FROM_NUMBER to enable sending.
No SMS subscriptions configured.
| Username | Folder | Role |
|---|
| Requested |
|---|
| Client | Status | Settings |
|---|
| Size | Dimensions | Price |
|---|
| Category | Files | Size |
|---|
| Account | Folder | Used |
|---|
| Client | Folder | Used |
|---|
No notes from this client yet.
No shoot location set and no GPS data found in delivered photos.
No preview links yet.
No feedback submitted yet.
No faces found yet - try scanning.
Nothing to review right now.
| Name | Last confirmed |
|---|
No known people yet - label a face cluster to add one.
The database is the only record that a photo exists, and backups cover the database only. This hashes the actual files and re-reads them later, so silent damage — bit rot, a half-finished copy, a file altered outside the app — is found while you still have a good backup, not years later when you open it.
Deleted files stay here for 30 days before being permanently removed.
Nothing in the trash.
No client activity yet.
Who did what - account deletions, client project deletions, bulk actions, and other consequential admin actions.
Nothing logged yet.
No shoots or deadlines scheduled this month.
Customize the wording of automated emails. Use the placeholders shown for each one - anything else in curly braces will break that email.
| Name | Photos | Public |
|---|
No photos yet - add some from the "Edited photos" tab.
Sorted sharpest first. Rate directly here, or click a photo to open it full-size.
Adjustments apply to the full-resolution raw decode - export saves a new file into Edited Photos, your original is never touched.
Click the line to add a point, drag a point to shape the curve, double-click a point to remove it. RGB applies to all three channels together (like a normal tone curve); R/G/B each shape just their own channel, layered on top.
Colorizes shadows, midtones, and highlights independently - a full 3-way color wheel, not just the shadow/highlight 2-way split most split-toning tools offer. Classic teal/orange is the default shadow/highlight starting colors, but pick anything.
Drag the corners or edges on the preview to frame the crop, or use the sliders below - nothing is applied until you confirm.