# photo sending with identity and consent checks — Loopi

The photo pipeline made trustworthy: a character only sends a picture after a real offer, the picture is always of her, and a promised photo still arrives if you answer days later.

Type: project

Published: 2026-08-25

[Original page](<https://artlu.ai/project/photo-sending-with-identity-and-consent-checks-loopi>)

[Browse this group](<https://artlu.ai/ai/groups/loopi.md>)

Parent project: Loopi

Recorded status: launched

Updated: 2026-09-16T19:16:17.668Z

Technologies: TypeScript, Expo, Fastify, Postgres, Cloudflare R2, kie.ai, OpenRouter

## Details

**What is it?**
The work that made a character sending a photo something the app can guarantee rather than hope for.

**What it does**
- A photo counts as authorized only after a genuine offer, not because someone asked
- A picture can only ever show the character herself — asking her to put someone else in it no longer works
- She stops typing out a description of a photo instead of sending the photo
- A one-time story photo still arrives with its moment intact if the person says yes days later
- Photos open full screen, with pinch to zoom and drag
- When one photo in a conversation can't be shown, only that one shows as missing instead of hiding every photo in the chat
- Blocked photos are listed in the admin with the reason recorded against each one

**How it works**
One decider answers "is a photo authorized this turn," so the prompt and the safety check can never reach different conclusions. A story moment is reserved, verified, then spent — it only counts as used once the photo actually reached the person, which is what stopped one-time moments being silently burned by a message that failed to send. Characters are told a character's age before her picture is drawn, so the app stops generating images its own safety check rejects.

**Built with**
TypeScript, Expo, Fastify, Postgres, Cloudflare R2 with signed URLs, kie.ai for image generation.

## Links

[Site or demo](<https://aidate-app.pages.dev/>)


Status and dates describe the published record, not a recent test of an external service. Missing details are not inferred. Public links do not imply an open-source licence or permission to reuse material.

[Directory](<https://artlu.ai/llms.txt>)
