Recued
Menu
← Back to recipes

Send one person their photos

by recued-core v2 80 views 2 installs

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.

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.

Send one person their photos
This recipe 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 “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
Show all 16 recipes

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

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

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 →

What the message says

You write it. Message is the whole body, and three things are filled in:

  • {name} — the name you chose for that person
  • {event} — whatever you called this event
  • {photos} — the lines about each picture, one per paragraph

The default reads:

Dear Maggie,

>

Here are your photos from the Christmas party.

>

Maggie and Tom are mid-laugh by the tree.

⚠ A message with no {photos} is refused. Without it the pictures would arrive with nothing said about them, and nothing downstream would notice.

{event} works in the subject too.

What gets sent

One message carrying this person's approved photos — up to fifty of them. Beyond that they receive the rest on the next send, in a second message.

A fresh copy of each picture is made at the moment of sending with its embedded details removed, and that copy is what is attached. Your originals are untouched and are not what travels — a photograph taken at someone's home carries that home's location, and it should not go out with it.

Those copies stay in your Files. They are stored by their contents, so sending the same photo again reuses the same copy rather than making another one; the count grows with the photos you have sent, not with how often you send. Delete them from Files when you want to — deliberately, on the surface where deleting is what you came to do.

⚠ They used to be deleted here, and that was worse. Deleting is the one kind of action Recued asks you to confirm even when you are driving it yourself, so tidying up meant a second approval after every send — raised once the message had already gone, about files you no longer had any decision to make about.

Before it will send

The person needs an email address and a mailbox to send from, and at least one of their photos must be approved. Any of those missing and it stops rather than sending a partial message.

Two numbers to read

Photos attached against what you expected. An attachment over the size limit is dropped before the message is built, so a message can go out successfully carrying fewer pictures than you meant.

One message stays a message

Somebody who appears in thirty photos would otherwise get all thirty in one email. At a realistic few megabytes each that is a hundred-megabyte message, and every mail provider refuses one: Gmail stops at 25 MB, Outlook at 20. Each photo is individually fine, so nothing would have warned you — the refusal arrives from the provider, after Recued has told you the send worked.

So photos are attached until Largest message to build is used up, and the rest wait for the next send. Only the photos that will actually go are copied and re-encoded; the ones held back are not touched until the send that carries them. Recued works out how many will fit by preparing the first one and measuring it, so when the photos are of a piece — which they are, coming off one camera at one event — splitting a batch across several messages costs no more than sending it in one. They stay exactly as they were: still waiting, still attached to that person, picked up the next time you send to them. **Held back for the next send** on the card is how many, and it is not a failure — send again and they go.

⚠ Picture quality re-encodes, and that can make a photo BIGGER. Every attachment is written out fresh at the quality you set (92 by default) with the camera details stripped. A photo that was already saved at a lower quality comes out larger than the file on disk — no sharper, just bigger, because detail thrown away once cannot come back. It matters at the edge: a photo a little under the 3 MB attachment limit can cross it after re-encoding, and an over-limit photo is dropped while the message sends anyway. If you are attaching large photos and the count looks short, lower the quality before suspecting anything else.

⚠ Sent but not recorded should be zero. It means the message went but some records still read as waiting, so a later run would try again. Each message carries a reconciliation key that prevents a duplicate delivery, but fix the records before the next send rather than after.

Not offered to an AI, and why that is not enough on its own

Sending is kept out of the chat and MCP tool catalog. The pack already treats approving a photo as a human act (the review card is closed too); putting someone's picture in their inbox is the larger version of that decision. An AI can still say who is ready to hear from (send-photos); a person presses send.

Be clear about what that buys. Leaving the catalog means an AI is not handed this as a tool — it does not mean the recipe cannot be reached, since a caller that already knows its name can use the generic runner.

Sending always asks first — including when you do it yourself. Recued holds the run at the send and shows you what is about to go out; the message does not leave until you approve it. That is not the ordinary write approval (an ordinary write of yours is never gated); it is a rule specifically about mail crossing out of your trust boundary, and it applies to you and to an AI alike, for different reasons. Measured in mail-send-gate-position.test.ts, which asserts which step holds rather than merely that one did.

⚠ An earlier version of this note said the opposite — that the mail left and the pause landed on the following step. That reading came from a test harness that drives the engine directly and therefore has no approval gate wired at all; an absent gate and an admitting gate look identical from inside a run. Sending is gated. It is kept out of the catalog anyway, because the pack already treats approving a photo as a human act and putting someone's picture in their inbox is the larger version of that decision.

How it works 69 steps

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

Process (69 steps)
◆ profile recued-core.photo-attribution.face_profile.get
Get face profile on photo attribution
■ found compare
Check if profile record id has data
⚠ guard guard
Stop if found equals
■ sendable all
Check if all conditions are true
⚠ sendable_guard guard
Stop if sendable equals
■ has_photos_token compare
Check if setting body template contains {photos}
⚠ photos_token_guard guard
Stop if has photos token equals
■ profile_ref template
Generate text from a template
◆ pending recued-core.photo-attribution.attributed_result.search
Search attributed result on photo attribution
■ rows default
Apply default
■ row_count count
Count items in rows
■ has_rows compare
Check if row count is greater than 0
⚠ rows_guard guard
Stop if has rows equals
■ strip replace
Replace text in item photo ref
■ link_ids map
Extract from each item
◆ photos recued-core.photo-attribution.photo.get
Get photo on photo attribution
■ pf map
Extract from each item
■ readable filter
Filter by condition
■ approved filter
Filter by condition
■ approved_n count
Count items in approved
■ any_approved compare
Check if approved n is greater than 0
⚠ approved_guard guard
Stop if any approved equals
■ probe_src slice
Take a subset of
◆ probe_copy recued-core.photo-derive.image.delivery_copy
Delivery copy image on photo derive
■ probe_flat map
Extract from each item
■ probe_ok filter
Filter by condition
■ probe_size_raw reduce
Reduce with max
■ probe_size clamp
Clamp probe size raw between 1 and 100000000
■ est_raw math
Calculate setting max message bytes divided by probe size
■ est_floor math
Calculate est raw floor
■ est_n clamp
Clamp est floor between 1 and 50
■ rest_src slice
Take a subset of
◆ rest_copy recued-core.photo-derive.image.delivery_copy
Delivery copy image on photo derive
■ rest_flat map
Extract from each item
■ rest_ok filter
Filter by condition
■ both default
Apply default
■ kept_flat flatten
Flatten nested lists in
■ attachable filter
Filter by condition
■ largest reduce
Reduce with max
■ per_photo clamp
Clamp largest between 1 and 100000000
■ fit_raw math
Calculate setting max message bytes divided by per photo
■ fit_floor math
Calculate fit raw floor
■ fit_n clamp
Clamp fit floor between 1 and 50
■ attach_fit slice
Take a subset of
■ attachments pluck
Extract temp_ref from each item
■ attachment_n count
Count items in attachments
■ held_raw math
Calculate approved n minus attachment n
■ held_n clamp
Clamp held raw between 0 and 50
■ any_attach compare
Check if attachment n is greater than 0
⚠ attach_guard guard
Stop if any attach equals
■ lines pluck
Extract sentence from each item
■ lines_joined join
Join items with " "
■ b1 replace
Replace text in setting body template
■ b2 replace
Replace text in b1
■ body replace
Replace text in b2
■ subject_line replace
Replace text in setting subject
■ fence_ids pluck
Extract link_id from each item
■ attach_sorted sort
Sort by
■ attach_key join
Join items with ","
■ attach_digest sha256
Apply sha256
■ reconciliation template
Generate text from a template
■ now date_add
Add 0 seconds to
◆ send core.mail.send
Send mail
■ already_sent default
Apply default
■ delivery_note ternary
Apply ternary
◆ marked recued-core.photo-attribution.attributed_result.update
Update attributed result on photo attribution
■ mark_failed filter
Filter by condition
■ mark_failed_n count
Count items in mark failed
■ card to_summary
Format results as a summary card
▼
Output
summary card
Settings 6 configurable

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

quality setting = 92
subject setting = Your photos from {event}
profile id setting = [object Object]
event label setting = the event
body template setting = Dear {name}, Here are your photos from {event}. {photos}
max message bytes setting = 13000000

Uses (6 operations)

Pack operation Get face profile on photo attribution recued-core.photo-attribution.face_profile.get
Pack operation Search attributed result on photo attribution recued-core.photo-attribution.attributed_result.search
Pack operation Get photo on photo attribution recued-core.photo-attribution.photo.get
Pack operation Delivery copy image on photo derive recued-core.photo-derive.image.delivery_copy
Mail Send mail core.mail.send
Pack operation Update attributed result on photo attribution recued-core.photo-attribution.attributed_result.update

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.get · No approvalRead: attributed_result.search · No approvalRead: photo.get · No approvalWrite: attributed_result.update · No approval
Write Mail core.mail.send external change

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

Data it touches

SurfacesMail

About

Tags

pack:photo-attributionphotofacedeliveryrecordsv1

Details

69 steps 6 configurable settings recipe_id: send-to-person