NLT143 Research / Attest How it works . v0.1
Six checks. One verdict.

A verified-photo calendar for friends who want to find me in person.

Submit a photo of you with David. We verify it. You get the calendar. We delete the photo within 24 hours and keep only the math we need to remember you passed.

Attest → See the math →
The pipeline

The six layers, in order.

Each layer runs server-side. Some are cheap and run first to short-circuit obvious failures. Others are paid API calls that run in parallel where they can. The whole thing finishes in seconds.

01Format We accept HEIC, JPEG, PNG. We hash the file with SHA-256 and a perceptual hash. If somebody already passed using these exact bytes from a different email, we reject. If a near-duplicate has been used recently, we flag for human review.
02Metadata We read the EXIF. We check the camera make and model against a list of real devices. We check the timestamp is within the last 24 months. If the Software field names a generative model — Midjourney, DALL-E, Sora, Firefly — we hard fail immediately.
03AI check We send the bytes to Hive Moderation's generated-image detector. If it scores the photo over 0.5, hard fail. Otherwise the score becomes part of the weighted confidence.
04Faces AWS Rekognition counts faces. We require at least two faces with bounding box area above 1.5% of the image — rules out solo selfies and tiny background heads. Less than two faces is a hard fail with a specific message.
05Match We search the photo against a private collection of David's reference faces. Similarity at or above 92 passes. Below 80 hard fails. Between 80 and 92 flags for manual review.
06Token On pass we issue a JWT with a 90-day expiry, stored as an HttpOnly cookie. We delete the photo from blob storage within 24 hours. We keep only the SHA-256 hash, the perceptual hash, an EXIF extract, the layer scores, and a 200×200 thumbnail for audit.
Try the verdict math

Drag the sliders. Watch the verdict shift.

This is the same synthesis function the live pipeline uses. Each layer has a weight. The final verdict is a weighted-average confidence, with hard-fail gates that override everything. Face detection and face match are required for a pass — if either is skipped, the verdict caps at flagged.

Live verdict
Score
flag
pass

Weighted across active layers. Hard fails short-circuit.

FAILED
Show synthesis function
weights = { format 0.5, exif 1.0, ai_detection 1.5, face_detection 1.0, face_match 2.0 }
score = Σ (weight × confidence) over active layers
normalized = score / Σ (weight) over active layers
 
if any hard_fail → failed
if normalized ≥ 0.65 and face_detection + face_match active → passed
if normalized ≥ 0.45 → flagged
else → failed
Adversarial model

What we defend against.

Trust in 2026 is not a checkbox. It is a cryptographically and physically attested claim that two people have actually met. Here is what we expect the adversary to try.

ThreatDefense
AI-generated selfie (GPT image gen, Sora, Midjourney)EXIF software blocklist (hard fail). Hive generated-image detector (hard fail above 0.5). C2PA verification (Phase 2).
Deepfake face swap onto stock photoHive detector. Geo cross-reference against operator location log (Phase 2).
Photoshop composite of real David faceEXIF software field flagged. Hive detector catches blending artifacts.
Replay of someone else's valid photoSHA-256 dedup across all prior passed attempts. pHash near-match soft flag.
EXIF-stripped real photoReduces score; requires stronger Hive and face-match signals to still pass.
Old photo from a real meetingTimestamp soft limit at 24 months. Manual review path via /admin/attempts.
Photo of a photo on a screenHive usually catches moiré patterns and lighting inconsistencies.
Privacy

What we keep. What we delete.

Photo bytes live in blob storage for at most 24 hours. A scheduled cron deletes anything older. The pipeline only needs the bytes long enough to compute layer scores.

What we persist forever as audit: the SHA-256 hash, the perceptual hash, an EXIF extract (camera, time, place), the layer scores, the verdict, and a 200×200 face thumbnail for human review.

What we never store: the raw photo past 24 hours, the magic-link token (only the SHA-256 hash of it), or the JWT.

Each attested user can /me at any time to see their state and export or delete every row tied to their email.

Visibility tiers

Three rings of access.

FieldPublicAttestedInner Circle
Event title and dateyesyesyes
Descriptionfirst 200 charsfullfull
End timeyesyes
Venue nameyesyes
Venue addresswithin 24h of startyes
GPS coordinatesyes
David's expected arrivalyes
Attendee listcount onlynames
Origin

From a conversation.

May 18, 2026. David Phung and Robin Kim, on the substrate problem.

David

starting to put together where friends like you all here can see my calendar for curated events so you can find me irl. thinking the security and encryption necessary. i like the moment that if my friend and i share location, you can see the city name. more touch points to meet irl. to convert from url to irl what's the substrate, forcing functions and programming is an anchor for that.

Robin

ooo that would be sweet. like a private luma playlist. you could make something password gated too.

David

i like the private playlist framing. i would make it like a secret language, phrase (word, audio, sentence) etc. one password is submitting your photo with me. if you don't have it no proof no contact. this is the verification angle.

Robin

that's sickkkk. make sure gpt image gen 2 can't bypass this.

David

will need to verify metadata and location with my database. attestation is key.

Stack

Built on what.

FrameworkNext.js 16, React 19, TypeScript strict, Tailwind 4
DatabasePostgres on Neon, Drizzle ORM
AuthMagic link via Resend, jose JWT in HttpOnly cookie
Photo storageVercel Blob, 24h retention
AI detectionHive Moderation
Face engineAWS Rekognition (private collection of operator references)
Rate limitingUpstash Redis sliding window
HostingVercel

Ready when you are.

If you have met David in person, attest. If you have not, the calendar funnels you toward a public event where attestation can be bootstrapped in person via a single-use QR.

Attest → Calendar → Source →