Recued
Menu
← Back to recipes

Scan an event folder

by recued-core v2 54 views 2 installs

Use “Scan an event folder” in Recued. Compare every photo in one event folder against the people you know, and record who appears in each picture. Photos stay where they are and are never copied. Matching happens on your own machine.

Complete workflow

Photo Attribution 16 pinned recipes

Use Photo Attribution in Recued to match one event's photos to the people you know, write a warm line for each picture, review them, and send everyone their own. Faces are matched on your machine; your photos are never copied; sending asks first. First install two programs on the server: face_recognition (pipx) and libvips (brew install vips). Then allow their actions on each tool pack's Access tab. Open “Scan an event folder” for the rest of the setup.

You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.

Scan an event folder
This recipe

Use “Scan an event folder” in Recued. Compare every photo in one event folder against the people you know, and record who appears in each picture. Photos stay where they are and are never copied. Matching happens on your own machine.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2

Use “Write the photo lines” in Recued. Look at each scanned photo and write one warm line naming the people recognised in it. A small copy with its embedded details removed is what the model sees, and the original is never sent. Run it again until the queue is empty.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2

Use “The roster” in Recued. See everyone Recued can recognise, whether each person can actually be written to, and who has been retired — and open any of them from here, which is the only way in to a person.

photosrosterpeople
by recued-core pinned v1

Use “Review photos before sending” in Recued. List the photos waiting for a look, with the line that will arrive alongside each one and the names it was written for. Open a photo to approve it, rewrite the line, or leave it out.

pack:photo-attributionphotofacedelivery
by recued-core pinned v1

Use “Review one photo” in Recued. See the picture itself beside the names Recued matched in it, correct the line it wrote, and say whether it is ready to send — the one place a wrong name or a wrong sentence can be caught before it reaches somebody.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2

Use “Look at one person” in Recued. See who a roster entry actually is — their reference photo shown from your own folder, beside the name and address Recued will use for them — so a wrong or duplicated face is something you can see rather than guess at.

pack:photo-attributionrosterpeoplephoto
by recued-core pinned v1
Show all 16 recipes

Use “Set someone's details” in Recued. Fill in an email address and the name that messages should use for one person on your roster. A field left blank keeps what is already there rather than clearing it. The key derived from their reference photo cannot be changed.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2

Use “Retire a person” in Recued. Take somebody off the roster without deleting anything they are attached to — a duplicate left behind by a renamed reference photo, or someone who should not be sent to any more. Their photos stay on record; they simply stop being matched and stop being sent to.

pack:photo-attributionrosterpeoplecleanup
by recued-core pinned v2

Use “Import the roster (CSV)” in Recued. Add everyone to the roster from a spreadsheet in one go — their key, the name messages should use, and their email address — instead of typing each person in after the first scan.

pack:photo-attributionrostercsvimport
by recued-core pinned v3

Use “Export the roster (CSV)” in Recued. Copy out everyone on the roster as a spreadsheet, or - on an empty roster - get the column headings the importer expects, so you can fill them in and import the list instead of typing it.

pack:photo-attributionrostercsvexport
by recued-core pinned v1

Use “See who is ready to receive” in Recued. List everyone with approved photos waiting, and separately everyone recognised who has no email address yet. Send each person from here. Nobody is dropped quietly, because a missing address is the usual reason a photo never arrives.

pack:photo-attributionphotofacedelivery
by recued-core pinned v1

Use “Re-describe a person” in Recued. After changing someone's name, rebuild the stored names on their photos and queue those photos to be written again. Photos already approved are left alone and counted, because somebody signed those off.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2
Skip a photo
Background automation

Use “Skip a photo” in Recued. Leave one photo out of the sending queue and release everyone who was waiting on it. Their other photos are untouched, so this cancels one picture for everyone in it rather than cancelling a person.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2
Send one person their photos
Background automation

Use “Send one person their photos” in Recued. Send one person a single message carrying every photo of them that has been approved. A fresh copy of each picture is made with its embedded details removed, and that copy is what travels.

pack:photo-attributionphotofacedelivery
by recued-core pinned v2

Use “See what has been delivered” in Recued. Show who has received which photo and when, one row per person per picture, with the message it arrived under. It reads information without changing anything.

pack:photo-attributionphotofacedelivery
by recued-core pinned v1
View pack details, dependencies, and permissions →

Before the first run

Four things, in this order. The first two are one-offs for the machine; the third is the one people miss.

1. Install the two local tools. Matching and resizing both happen here, with programs Recued does not ship. They must be on the PATH of the machine running your server, not your laptop — it is the server that runs them.

On macOS or Linux:

pipx install face_recognition
brew install vips            # or: apt install libvips-tools

On Windows — verified on Windows 11, including on ARM machines:

winget install libvips.libvips
winget install Python.Python.3.12
pip install dlib-bin
pip install --no-deps face_recognition face_recognition_models
pip install Click numpy Pillow "setuptools<81"

⛔ After installing libvips, put its real folder on your PATH — something like ...\WinGet\Packages\libvips.libvips_...\vips-dev-8.18\bin. The short vips that winget puts on your PATH for you cannot run: it sits by itself, away from the sixty-odd files it needs, and stops with a missing-file error before it does anything. Recued will report vips as installed, because there is something called vips on the PATH, and then every scan will fail with a number instead of a reason. Point the PATH at the real folder and it works.

⚠ dlib-bin is not a typo. The usual pip install face_recognition tries to BUILD its face library from source, which on Windows needs a C++ compiler and several gigabytes of build tools. dlib-bin is the same library already built — a few megabytes, no compiler.

⚠ On an ARM machine, install the x64 Python rather than the ARM one. Windows runs it under emulation and it works; the face library has no ARM build.

⚠ The setuptools<81 pin is not Windows-only — it matters anywhere you have a FRESH Python. Version 81 removed a helper that face_recognition_models still asks for, so on a new machine the scan stops with *"Please install face_recognition_models"* even though you just did. An older Python usually has the helper already, which is why this only bites on a clean install.

2. Install the pack. Installing Photo Attribution also installs the two packs it depends on, Face Recognition and Photo Derive. You do not install those yourself.

⛔ 3. Allow the four tool actions. Installing a pack does NOT let it run a program on your machine — that is a separate, deliberate yes, and until you give it every scan stops at the first step.

Each pack carries its own toggles, on Packs → that pack → Access. The four you need are not on Photo Attribution; they are on the two packs it installed for you:

packallowprogram
Face Recognitionface.readiness, face.scanface_recognition
Photo Deriveimage.preview, image.delivery_copyvips

4. Build the roster. One reference photo per person, one face per file, named <key> - <Name>.jpg — 001 - Maggie.jpg gives the key 001 and the name Maggie. The key is the identity and never changes; the name is what people see. Import a roster takes a CSV instead, in one approval, and its key column must match those file names without the extension.

⚠ A comma in either folder's name is refused, and that refusal is protecting you: the matching tool prints unquoted CSV, so Xmas, 2025 would split into the wrong columns and quietly attach every photo to one made-up person. Rename the folder.

Not needed to scan

Sending needs a mailbox connected and an address for each person, set on their card. Writing the lines needs a language model — the free pool, or your own key. You can scan, describe and review long before either is set up; nothing leaves the machine until you send.

What this does

Point it at one event's folder and a roster folder of reference photos, one face per file. Every picture is compared against the roster on this machine, and Recued records who appears in each one. Your photos are never copied, moved or altered.

Run it once per event folder, then Write the photo lines.

What it can read

JPEG and PNG only. HEIC — what an iPhone saves unless you have changed the setting — is skipped silently, so a folder straight off a phone can scan to nothing with no error.

The folder is not searched recursively. Photos in subfolders are ignored. Scan each subfolder as its own event.

⚠ A scan runs until it finishes, up to an hour, and stopping the run is how you cancel it.

Measured on a ten-core machine, a phone-sized photo holding seven faces costs about a tenth of a second, so an ordinary event finishes in seconds. Most of a small scan is startup: twelve photos take about as long as one. A modest two-core server is roughly five times slower, which still leaves thousands of photos inside the hour.

Match strictness

Lower is stricter. The tool's own default is 0.6; this pack ships 0.45, because on a seven-face group photo 0.6 matched four of those faces to one person.

Faces matching nobody is the dial. Climbing means people you know are being missed, so raise it. Falling to zero while the wrong names appear means lower it. Neither number is stored — only photos with at least one recognised person get a record.

Two people, or one face twice?

A photo lists everyone recognised in it, but nothing records which face each name came from. Two names may be two people, or one face that resembled two people on your roster.

So read the names against the picture on the review screen. That is the only place a wrong attribution can be caught, and it is why the review step exists.

Running it again is safe

Photos already recorded for this event are skipped. Adding forty pictures to a folder scanned last week costs forty comparisons, not four hundred.

⚠ Changing the strictness does not re-judge photos already scanned. Every row records the setting that produced it, so a number you change today never quietly rewrites a decision made yesterday. To re-judge, delete those rows and scan again.

The counts that matter

Lines that were not data should be zero. Two things land here: warnings the scanner prints on the same channel as its results — a roster photo holding two faces, or none — and lines that name nobody. Both are dropped rather than mistaken for a photo. A number above zero usually means a roster file needs a look.

Could not be linked, could not be recorded and **people that could not be added** should all be zero. Each counts work that was refused, and a refused write does not stop the run.

Before the first run

Two local tools have to be installed, or the scan stops with "cli tool ... was not found":

  • pipx install face_recognition — the matcher. Installs in seconds from a prebuilt

wheel on common platforms.

  • libvips — brew install vips, or apt install libvips-tools. Used to make the

small copy shown to the model when you write the lines.

Neither sends anything anywhere. Both run on this machine.

A comma in the folder name is refused

Xmas, 2025 will not scan, and that refusal is deliberate. The matcher prints its results as comma-separated text without quoting, so a comma in the path splits into an extra column: the photo's path is cut short, part of it is read as a person's name, and the real match is lost. Worse, every photo in the folder would collapse onto one record, because the path is what identifies a photo.

Rename the folder — Xmas 2025 — and scan again.

Building the roster folder

There is nothing to upload. The roster is a plain folder you keep, and Recued reads it in place — no picture is ever copied into Recued, and there is no photo on a person's record.

The file name is the identity. There are two ways to write it:

  • Maggie Chen.jpg — the whole name is both the identity and what messages say.

Simple, and fine if you never intend to rename anyone.

  • 001 - Maggie Chen.jpg — the part before the first - is the identity, and the

rest is what messages say. The separator is a space, a hyphen and a space, so ordinary hyphenated names like Mary-Jane are safe.

The second form is worth the trouble for one reason: **you can rename the name half whenever you like.** 001 - Maggie Chen.jpg → 001 - Maggie Thompson.jpg is still person 001, with their address and their history intact.

One file per person. The same face saved twice — maggie.jpg and Maggie Chen.jpg — is two different people to Recued, and both will match the same photo, so that person appears twice and could be sent the same picture twice. Two files sharing one key (001 - Maggie.jpg and 001 - Mags.jpg) is one person.

One face per file. A reference photo holding two faces uses only the first and prints a warning; one holding none is ignored entirely. Both show up in **Lines that were not data**.

A file starting with the separator — - orphan.jpg — has no identity at all and is skipped rather than added as a nameless person.

People are added automatically the first time they are recognised, named after their file and with no email address. Import the roster (CSV) adds everyone at once from a spreadsheet, and Set a person's contact fixes one person — either is where an address comes from.

⚠ Renaming the IDENTITY does not rename the person

It makes a second person.

Renaming the name half of 001 - Maggie.jpg is safe — the identity is still 001. Changing the identity is not: maggie.jpg renamed to margaret.jpg, or 001 - … renamed to 002 - …, is something Recued has never seen, so a new person is added with no email address and no history. The original stays exactly where it was, still holding every photo ever attributed to it, and it will never be matched again because the file it was named after is gone.

Retire a person takes the leftover off the roster — it stops being matched, stops counting, and its photos are released, while everything it already holds is kept. Set a person's contact changes an address and a display name only. Deleting a record outright is still the Data screen; retiring is almost always what you want instead, because it keeps the history.

So pick each file name once and leave it alone. If you want a different name in messages — Maggie instead of maggie, or Mum instead of Margaret Thompson — change it in Set a person's contact. That name is what the lines and the greeting use, and it is free to differ from the file.

How it works 99 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Process (99 steps)
■ source trim
Trim whitespace from setting source folder
■ has_source compare
Check if source has data
⚠ source_guard guard
Stop if has source equals
■ known trim
Trim whitespace from setting known folder
■ has_known compare
Check if known has data
⚠ known_guard guard
Stop if has known equals
■ now date_add
Add 0 seconds to
■ tolerance_n to_number
Convert setting tolerance to a number
◆ scan recued-core.face-recognition.face.scan
Scan face on face recognition
■ with_header template
Generate text from a template
■ rows csv_parse
Apply csv_parse
■ data_rows filter
Filter by condition
■ named_rows filter
Filter by condition
■ raw_n count
Count items in rows
■ data_n count
Count items in named rows
■ noise_n math
Calculate raw n minus data n
■ scanner_spoke compare
Check if raw n is greater than 0
⚠ scanner_guard guard
Stop if scanner spoke equals
■ with_faces filter
Filter by condition
■ matched filter
Filter by condition
■ mk_split split
Split item name into parts
■ mk_named replace
Replace text in item item name
■ mk_env merge
Combine objects together
■ matched_keyed map
Extract from each item
■ keyed_ok filter
Filter by condition
■ unknown filter
Filter by condition
■ no_faces filter
Filter by condition
■ seen_names pluck
Extract key from each item
■ new_names unique
Remove duplicates from
◆ roster recued-core.photo-attribution.face_profile.search
Search face profile on photo attribution
■ roster_keys pluck
Extract roster_key from each item
■ to_enrol filter
Filter by condition
■ enrol_rows find
Find first match in
◆ enrolled recued-core.photo-attribution.face_profile.create
Create face profile on photo attribution
◆ roster_all recued-core.photo-attribution.face_profile.search
Search face profile on photo attribution
◆ roster_total recued-core.photo-attribution.face_profile.count
Count face profile on photo attribution
■ roster_got count
Count items in roster all records
■ roster_whole compare
Check if roster total count equals roster got
⚠ roster_guard guard
Stop if roster whole equals
■ roster_named map
Extract from each item
■ roster_sorted sort
Sort by friendly_name
■ matched_paths pluck
Extract path from each item
■ photo_paths unique
Remove duplicates from
◆ probe recued-core.photo-attribution.photo.search
Search photo on photo attribution
■ probe_flat map
Extract from each item
■ fresh filter
Filter by condition
■ fresh_paths pluck
Extract path from each item
■ already filter
Filter by condition
■ already_index map
Extract from each item
◆ link_probe recued-core.photo-attribution.attributed_result.search
Search attributed result on photo attribution
■ link_lists map
Extract from each item
■ link_rows flatten
Flatten nested lists in
■ existing_keys map
Extract from each item
■ f0 filter
Filter by condition
■ f1 map
Extract from each item
■ f2 pluck
Extract key from each item
■ f3 map
Extract from each item
■ f4 filter
Filter by condition
■ f5 map
Extract from each item
■ f6 pluck
Extract friendly_name from each item
■ f7 map
Extract from each item
■ f8 join
Join items with ", "
■ named_paths map
Extract from each item
■ fn_posix replace
Replace text in item path
■ fn_half map
Extract from each item
■ fn_win replace
Replace text in item name
■ to_create map
Extract from each item
◆ created recued-core.photo-attribution.photo.create
Create photo on photo attribution
■ photo_index map
Extract from each item
■ photo_ok filter
Filter by condition
■ photo_index_all default
Apply default
■ all_index flatten
Flatten nested lists in
■ by_person filter
Filter by condition
■ by_photo filter
Filter by condition
■ pairs map
Extract from each item
■ has_person filter
Filter by condition
■ resolved filter
Filter by condition
■ resolved_keyed map
Extract from each item
■ missing filter
Filter by condition
◆ links recued-core.photo-attribution.attributed_result.create
Create attributed result on photo attribution
■ create_failed filter
Filter by condition
■ create_failed_n count
Count items in create failed
■ link_failed filter
Filter by condition
■ link_failed_n count
Count items in link failed
■ new_n count
Count items in fresh paths
■ enrolled_n count
Count items in to enrol
■ unknown_n count
Count items in unknown
■ no_faces_n count
Count items in no faces
■ pairs_n count
Count items in pairs
■ resolved_n count
Count items in resolved
■ missing_n count
Count items in missing
■ already_ids pluck
Extract photo_id from each item
■ repaired filter
Filter by condition
■ repaired_n count
Count items in repaired
■ unresolved_n math
Calculate pairs n minus resolved n
■ enrol_failed filter
Filter by condition
■ enrol_failed_n count
Count items in enrol failed
■ card to_summary
Format results as a summary card
■ table to_table
Format results as a data table
▼
Output
summary card
table table
Settings 3 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

tolerance setting = 0.45
known folder setting = [object Object]
source folder setting = [object Object]

Uses (8 operations)

Pack operation Scan face on face recognition recued-core.face-recognition.face.scan
Pack operation Search face profile on photo attribution recued-core.photo-attribution.face_profile.search
Pack operation Create face profile on photo attribution recued-core.photo-attribution.face_profile.create
Pack operation Count face profile on photo attribution recued-core.photo-attribution.face_profile.count
Pack operation Search photo on photo attribution recued-core.photo-attribution.photo.search
Pack operation Search attributed result on photo attribution recued-core.photo-attribution.attributed_result.search
Pack operation Create photo on photo attribution recued-core.photo-attribution.photo.create
Pack operation Create attributed result on photo attribution recued-core.photo-attribution.attributed_result.create

Trust & control

What installing this recipe would let it do. Recued grants these permissions at install — review them there before approving.

What it's allowed to do

Write Pack Photo Attribution external change
Read: face_profile.search · No approvalWrite: face_profile.create · No approvalRead: face_profile.count · No approvalRead: photo.search · No approvalRead: attributed_result.search · No approvalWrite: photo.create · No approvalWrite: attributed_result.create · No approval

1 more isn't listed here. You'll see it at install.

About

Tags

pack:photo-attributionphotofacedeliveryrecordsv1

Details

99 steps 3 configurable settings recipe_id: scan-folder