WildSky by Charlie
WildSky by Charlie

Enter the 6-digit code from your authenticator app.

WildSky by Charlie

Requesting access - the admin will get an email and needs to approve it before you can log in.

WildSky by Charlie
What's happening
Nothing going on right now.
Manage
Logs & reports
Tools
Download backup Mobile dashboard
Activity
Display
Data & security
Loading storage usage…
Account

Scoring trends

⬇ Export CSV

No decisions recorded in this range yet - cull some photos first.

By gear ⬇ Export CSV

CameraLensPhotosKeep rateAvg sharpness

No decided photos with camera/lens EXIF yet.

By shooter ⬇ Export CSV

ShooterPhotosKeep rateAvg sharpness

No decided photos with a shooter assigned yet.

Recalculating…
Per-camera calibration iDifferent camera bodies produce different raw sharpness magnitudes for an equally in-focus shot. A multiplier here scales the ceiling above just for that camera's photos, so scores stay comparable across bodies. 1.0 = no adjustment.
iRe-measures every scored photo's sharpness using the current focus-region logic, from the cached preview - no rescan or raw decode needed. Run this once after a scoring-algorithm update; the strictness/ceiling controls in Scoring calibration don't need it.
Rescoring…
iA parsing bug could show a coordinate's opposite hemisphere for some cameras (e.g. a real West longitude displaying as East) - this re-derives every stored GPS coordinate from each file's own EXIF using the fix. Safe to run more than once; only touches photos that already have a GPS reading.
Checking…
iFills in the capture date/time shown in the photo preview for photos scanned before that field was added. Safe to run more than once - only touches photos that don't have a date yet.
Checking…
iSome cameras' embedded preview thumbnails don't carry the lens tag, even though the RAW file's own EXIF has it - this re-reads lens info straight from the file for any photo currently missing it. Safe to run more than once.
Checking…
iFills in the composition score (rule-of-thirds placement of the main subject, shown in the lightbox) for photos scored before that column existed. Pure arithmetic on data already stored - no raw decode, can't fail on a missing file. Safe to run more than once.
Checking…
iFlags a photo's primary person subject as a possible blink (a face was found but no open eye - most often means eyes closed, but can also mean a profile view or motion blur) and/or a smile, shown in the lightbox. Fast, classical detection (not a confident AI model) - treat both as "worth a second look", not a certain reading. Off by default; only affects photos scored from now on, nothing already scored.

Welcome to RawCull

A quick walkthrough before your first scan:

  1. Drop your RAW (or HEIC) files here: …
  2. Click Scan for new photos above - RawCull finds new files and scores them automatically.
  3. Rate each photo Good or Reject from the lightbox (or press G/R in Speed Cull mode).
  4. Everything else - tags, star ratings, denoise, client galleries - builds on top of that. Press ? anytime for the full shortcuts list.

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.

Move to album

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.

iRe-classifies every already-scored bird photo's primary subject using whichever model is picked above - overwrites any species already stored, including from a different model, so this is how you actually see what switching models changed. No raw decode needed, reuses the cached preview + detection box. Runs in the background - safe to switch tabs or close this one while it works.
Applying…

Species identified so far

No species identified yet - pick a model above, then scan new photos or use "Rescore bird species" on ones already scored.

Life list

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.

SpeciesPhotosManually taggedFirst seenLast seen
Review queue

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.

Export life list PDF Export this year PDF
Import a real regional checklist from eBird (optional)

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.

eBird files include genus-level placeholders like "gull sp." that can't be collected. They're already hidden from the checklist; this clears them out of the saved import data too.

Search a country, state, or place above to see species you've photographed nearby.

Import from card

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.

Past imports

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.

Live eBird sightings

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.

Attach an Edited Photo

Pick the shot you want to represent this species on your checklist.

Species

View on eBird (photos, range map, ID info)

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.

Suggested matches from face recognition

These faces matched a confirmed bib elsewhere in this race closely, but not quite closely enough to apply automatically.

Nothing unmatched right now.

Bib #

photos — ⬇ Export all as .zip

Athlete roster & email

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.


Bulk email


Roster for this race

Race photo pricing

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.


Review-queue sensitivity

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.


Revenue summary

Loading…

Recent purchases


Print orders (fulfillment queue)

No shipping address is collected — reach out to the buyer's email to arrange delivery or pickup, then check it off here.

Reports & tools

Watermark preview

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).

Watermark preview

View & purchase funnel

Views counted per gallery open on the public search page; "Purchased" means at least one paid order for that bib.


Revenue by shooter

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.


Archive event (frees disk space)

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.


Delete race scan (test data / bad imports)

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.


Recovery

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.


Migrate old flat-sorted photos

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.


Face-match unmatched photos

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.

Public search page QR code

Scan to open the public, no-login race photo search page — handy for a finish-line sign or results board.

OCR crop
✓ CONFIRM
✕ NOT A BIB

Swipe right to confirm, left to dismiss — or use the buttons below. Tap the photo for full context.

Review queue clear.

Open full-res in new tab
Before Before denoise
After After denoise
⇔
Speed cull — G Good · R Reject · Space Skip · Backspace Back · Esc Exit
← → navigate · Esc close
detected subject region scored used for overall score

No GPS data for this photo.

Or click the map above to drop a pin there. Not written into the RAW file's own EXIF - stored in RawCull only.

Upload photos iUploaded into your own folder — nobody else can see them.

Raw photos (.ARW) iScored automatically right after upload — no need to click "Scan" after.

Edited photos (JPEG / TIFF / PNG / etc.) iShows up read-only in the Edited Photos tab.

Change password

Keyboard shortcuts

Anywhere

Ctrl+ZUndo last cull decision
Ctrl+Shift+ZRedo
EscClose whichever modal/menu is open
?Show this shortcuts list

Lightbox

← →Previous / next photo
EscClose the lightbox

Speed Cull mode

GMark Good
RReject
SpaceSkip to next
BackspaceGo back one photo

Shortcuts that type into a text field (like undo) are disabled while you're actively typing in one.

Two-factor authentication

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:

2FA QR code

Can't scan? Enter this key manually:

Open in authenticator app

Step 2 of 2 — Confirm

Two-factor authentication is enabled.

Trusted devices

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.

Read-only API keys

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.

Outbound webhooks

Get a JSON POST when something happens - a scan finishes, a client places an order, a client leaves a comment.

No webhooks configured.

SMS notifications

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.

Manage users iEach account only sees photos in its own subfolder of the watch dir (and the matching subfolders under rawcull-data and Edited Photos). Give someone their folder path and they just drop .ARW files in there.

UsernameFolderRole

Pending signups

EmailRequested

Clients iEach client project gets its own delivery folder and a one-time invite link. Send the link yourself (or let RawCull email it), they create their own account, and see only that gallery - no culling tools, just preview and download.

ClientStatusSettings
Start from a template
Who it's for
How the gallery looks
What the client can do
Release & expiry

Upload photos to a client

Client favorites

Print sizes iSizes and prices clients see when placing a print order. Removing a size only hides it going forward - past orders keep their original price.

SizeDimensionsPrice

Print orders

⬇ Export CSV
ClientDateTotalPayment

No print orders yet.

Open in new tab

Fulfillment queue

Open in new tab

Storage

Cleanup assistant iScans for files that are safe to delete: RAW files already marked Reject, orphaned RAW files with no matching photo record, and the disposable full-resolution viewer cache. Doesn't touch anything marked Good, undecided photos, or your Denoised output - those are never auto-selected.

CategoryFilesSize

Users

AccountFolderUsed

Clients

ClientFolderUsed

Notes

No notes from this client yet.

Shoot location

No shoot location set and no GPS data found in delivered photos.

Preview links iPasscode-gated links for sharing UNWATERMARKED previews with a specific venue, magazine, or vendor - no login required, no downloads. Create one per third party so each can be revoked independently.

No preview links yet.

Feedback

No feedback submitted yet.

Faces iScans this client's delivered photos for faces and groups similar ones together. Label a group (e.g. "Bride") to turn it into a "Photos of ___" filter the client sees in their gallery - unlabeled groups stay admin-only.

No faces found yet - try scanning.

Review uncertain matches iThese faces matched an existing group, but the match was close enough to the confidence boundary that it's worth a quick check - most matches never show up here. Confirm the group is right, move the face to a different group, or split it off into its own new group.

Nothing to review right now.

Known people iEveryone you've labeled a face cluster with, across every client project. New scans on ANY client's gallery auto-suggest one of these names when a strong match is found, so repeat clients don't need to be relabeled each time. Removing someone here just stops future suggestions - it doesn't touch labels already applied.

NameLast confirmed

No known people yet - label a face cluster to add one.

System health

Library file integrity

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.

Demo / staging mode

Seeds a fake "[DEMO]" client project (a client account, a print order, a couple of comments) so there's something to look at on a fresh deployment - no real photo files, since those can't be faked without actual RAW samples.

Recently deleted

Deleted files stay here for 30 days before being permanently removed.

Nothing in the trash.

Recent activity

No client activity yet.

Audit log

Who did what - account deletions, client project deletions, bulk actions, and other consequential admin actions.

Nothing logged yet.

Calendar

Shoot date Deadline

No shoots or deadlines scheduled this month.

Email templates

Customize the wording of automated emails. Use the placeholders shown for each one - anything else in curly braces will break that email.

Portfolios iBuild showcase galleries from your own Edited Photos. Add photos from the "Edited photos" tab with the button on each card, then manage, reorder, and publish them here.

NamePhotosPublic

No photos yet - add some from the "Edited photos" tab.

Compare burst — pick the keeper

Sorted sharpest first. Rate directly here, or click a photo to open it full-size.

Edit photo

Adjustments apply to the full-resolution raw decode - export saves a new file into Edited Photos, your original is never touched.

Editing preview
Before Original, unedited
After With current adjustments
⇔
Rendering…
Light
Color
Effects
Curve
Tone curve

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.

Color Mixer
Hue
Saturation
Luminance
Color Grading
Split toning

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.

Detail
Optics
Geometry
Crop
No crop applied

Drag the corners or edges on the preview to frame the crop, or use the sliders below - nothing is applied until you confirm.

Framing:
Local adjustments
Local adjustments Click the preview to place a spot
Also export as (saved alongside the main file)
This edit is locked

Unlock it to change any sliders, crop, or local adjustments.