red-girlfriend is a private, single-recipient visual love object. One person — the creator — assembles a small, handmade-feeling web experience out of three things: photographs of the two of them, a love letter, and hidden messages that the recipient uncovers herself. The finished experience is then shared by a link with exactly one intended reader: his girlfriend.
The product intent is not utility. It is devotion made visible. The experience must read as something assembled by hand on a kitchen table — cut paper, ink, thread, tape, imperfection kept on purpose — and never as software. The audience is a single girlfriend opening a link on her phone, and the emotional register is sweet, tender, playful and a little secretive.
The audience for the creator-facing side is equally narrow: one boyfriend, working alone, who wants to put photographs, a letter and a few hidden lines into a shape he can hand over.
red-girlfriend is a small web application with two faces:
The creator's work is durable: it persists across sessions, so he can return, add a photograph, rewrite a line of the letter, or add another hidden message, and the shared experience reflects the current state of his assembly.
The recipient's side is deliberately open — she opens a link and experiences the content. She does not create an account, and she is not asked to sign in.
Current delivery. Everything in this document is current and in scope: the anonymous landing surface, creator self-service enrollment and returning verification, the protected creator workspace where photographs, the letter and hidden messages are assembled, and the shared recipient-facing visual experience.
Access ownership. The creator's workspace is application-owned and protected: the durable assembly belongs to one person and must remain bound to him across sessions, so the application establishes and verifies his identity. The landing surface, the enrollment and verification surfaces, and the shared visual experience are reachable without identity establishment — the girlfriend in particular must be able to open the shared link and experience everything without creating anything.
What this is not. red-girlfriend is not a social network, not a gallery for many recipients, not a messaging product, and not a general-purpose card maker. There is one creator and one intended recipient. No capability in this document should be read as extending the product to multiple recipients, public discovery, feeds, comments, reactions, or sharing beyond the single link the creator hands over.
Future. No future-horizon requirements were accepted. Anything not stated in this document is out of scope for the current generation.
The page inventory below is the final, ordered page contract for this generation: Landing, Login, Sign Up, Creator Studio, Visual Experience.
FR-1. Creator self-service enrollment — provenance: required_inference As a creator (boyfriend), I should be able to create my own identity on the Sign Up page so that I can begin assembling a personal visual experience that belongs to me.
FR-2. Creator returning verification — provenance: required_inference As a creator (boyfriend), I should be able to verify myself on the Login page so that I can return to the assembly I already made.
FR-3. Add photographs to the experience — provenance: explicit As a creator (boyfriend), I should be able to add photographs of the two of us into my assembly so that the experience contains our real pictures.
FR-4. Arrange and label the photographs — provenance: explicit As a creator (boyfriend), I should be able to arrange the photographs and give them their labels so that the stack reads the way I want her to see it.
FR-5. Write the love letter — provenance: explicit As a creator (boyfriend), I should be able to write a love letter into my assembly so that she receives a real letter, not a caption.
FR-6. Write hidden messages — provenance: explicit As a creator (boyfriend), I should be able to write hidden messages into my assembly so that she has something of mine to uncover.
FR-7. Edit and remove hidden messages — provenance: explicit As a creator (boyfriend), I should be able to edit or remove a hidden message so that only the lines I mean to leave her remain.
FR-8. Share the assembled experience with the recipient — provenance: required_inference As a creator (boyfriend), I should be able to obtain a shareable path to my assembled experience so that I can give it to my girlfriend.
FR-9. Open the shared experience — provenance: explicit As a girlfriend (recipient), I should be able to open the shared link and land in the experience so that I can see what he made for me.
FR-10. See the photographs — provenance: explicit As a girlfriend (recipient), I should be able to see our photographs presented as physical prints so that the experience feels like something he made by hand.
FR-11. Open and read the letter — provenance: explicit As a girlfriend (recipient), I should be able to open the letter and read it so that I receive the words he wrote for me.
FR-12. Reveal a hidden message — provenance: explicit As a girlfriend (recipient), I should be able to uncover a hidden message myself so that discovering it is something I do, not something I am shown.
FR-13. Continue through the experience at her own pace — provenance: explicit As a girlfriend (recipient), I should be able to move through the photographs, the letter and the hidden messages in one continuous reading so that the experience reads as a single handmade object.
Product context. He is the one who asked for this. He is making a visual love object for exactly one person, working alone, on his own time, and he will come back to it more than once — to add a photograph he just found, to rewrite a line of the letter, to add one more hidden message he thought of at midnight.
Primary goal. A finished, shareable experience that delivers the personal message he intends, and that looks like he made it rather than like a template produced it.
Distinct accepted responsibilities. He enrolls himself and verifies himself on return (FR-1, FR-2). He adds photographs of the two of them (FR-3), arranges them and gives them their labels (FR-4). He writes the love letter (FR-5). He writes hidden messages (FR-6) and edits or removes them (FR-7). He obtains the shareable path and hands it over (FR-8).
Relevant inputs and decisions. Which photographs belong in the stack and in what order; what each photograph's label says; what the letter's salutation, body and dateline say; which lines become hidden messages and which are cut; when the assembly is finished enough to share.
Interactions with other accepted participants. He is the sole initiator of everything the recipient will see. His only handoff is the shareable link, and the quality of that handoff is entirely determined by what he assembled before he sent it.
Observable success. He can return to Creator Studio at any time and find his photographs, letter and hidden messages exactly as he left them; the share control gives him a link that opens the current assembly; the recipient opens it and finds what he meant her to find.
What makes this role different. His work is authoring and custody. He is the only participant with durable private state, the only one who edits, and the only one whose success is measured by what someone else experiences later.
Product context. She receives a link — probably on her phone, probably without warning — and opens it. She has no account, no instructions beyond what the page itself says, and no reason to expect software. What she finds is a page that looks like paper and ink, with her name on it.
Primary goal. To discover and enjoy the personal content made for her, including uncovering the hidden messages herself.
Distinct accepted responsibilities. She opens the shared experience (FR-9), sees the photographs (FR-10), opens the letter by pressing its wax seal and reads it (FR-11), scratches off the ink to reveal each hidden message (FR-12), and moves through the whole thing at her own pace (FR-13).
Relevant inputs and decisions. How long she lingers on each photograph; whether she opens the letter before or after the photographs; how thoroughly she scratches each ink layer; whether she reveals every hidden message or saves some.
Interactions with other accepted participants. She is the sole recipient of the creator's assembly. She never interacts with him inside the product — the product is the message, not the channel. Everything she sees was placed there by him, and her only response is her own experience of it.
Observable success. She sees their photographs as physical prints, reads the letter he wrote, and uncovers each hidden message, with each revealed line settling in red. Nothing asks her to sign in, and nothing is broken or clipped on her phone.
What makes this role different. Her work is discovery, not authoring. She has no durable private state, no editing surface, and no account — and the entire design of the experience exists to make her uncovering feel like a physical gesture rather than a UI interaction.
Muse and headline. Stefan Sagmeister — handmade devotion. Type and image built from real physical material: cut paper, ink, thread, tape, with imperfection kept on purpose and wit as a material. This is a private, one-recipient love object, not a product and not a utility. It must look assembled on a kitchen table.
Palette (light mode).
| Role | Hex | Use |
|---|---|---|
| Background (paper ground) | #F2E7DA | The unbleached paper that carries the whole page — never pure white |
| Surface | #FFFDF8 | Reserved for the letter sheet and the photo mats, so the letter reads as a real object laid on top |
| Text (ink) | #1B1714 | All body copy and display type — near-black, warm, like rubber-stamp ink |
| Primary (red) | #C8102E | The single hot accent and the project's identity: wordmark, seal, handwritten underlines, revealed hidden-message text, and the one element that moves |
| Accent (mustard) | #E8B21F | Secondary "sticker" colour, small doses only — washi-tape strips, a circled date, the tab of a folded flap |
| Muted | #8A7A6B | Captions, dates and metadata |
Proportion. ~70% paper ground, ~20% ink, ~7% red, ~3% mustard. Red on paper is 5.4:1 and ink on paper is 15:1, so every readable string passes at body size.
Typography.
clamp(52px, 12vw, 148px); section headline clamp(34px, 7vw, 84px); letter salutation clamp(30px, 6vw, 60px); body 17–19px; captions 12–13px. Mobile floor is 52px for the hero — it never drops below half the desktop size.Shape language. Hard edges, no rounded corners on structural elements — paper has corners. Radii appear only where a real object would have them: a stamp's perforated edge, a sticker's die-cut curve, a paperclip's arc. Photographs are never in neat frames: each sits on a #FFFDF8 mat rotated between -4° and +4°, with a 2px ink hairline and a hard offset shadow (6px 6px 0 #1B1714) so it reads as a physical print dropped on the page. Washi-tape strips in #E8B21F and #C8102E, semi-transparent, are the only "soft" element and always overlap a mat corner.
Layout. A single-column reading measure of 62ch, centred on the paper ground, with asymmetric interruptions: every third section is pushed off-centre by 6–14% and rotated 1–2°, so the page never settles into a template rhythm. The hero is a full-bleed ink composition, not a boxed banner. Photos are placed as a scattered stack rather than a grid — two or three per viewport, overlapping by 20–40px, each at its own rotation. The letter is the one perfectly straight, perfectly centred object on the page: a #FFFDF8 sheet with 32px padding, a 1px ink rule down its left edge, and a red wax-seal circle at the bottom. At 375px the scatter collapses to a single vertical stack with rotations clamped to ±1.5° and no overlaps; at 768px two photos may overlap; at 1280px the full asymmetric scatter returns. Every headline, caption, photo label and control stays wholly inside its container at all three widths, wrapping rather than clipping.
Imagery. Real photographs of the two of them, treated as physical prints: warm, slightly grainy, with a paper-texture overlay at 6% and a soft vignette. No stock people, no illustrated characters, no 3D renders. Supporting imagery is genuinely handmade — ink fingerprints as bullet points, torn-paper section dividers, a hand-drawn arrow in #C8102E pointing from a caption to a photo, a pressed-flower scan, halftone dots at 40% where a photo bleeds off the edge. Where a photo bleeds off the page edge it carries only decoration; no readable text or control is ever cropped or overlapped.
Forbidden. The generic indigo/blue-on-white SaaS template is forbidden for this project. Also avoided: rounded-corner cards in a uniform grid with hover-lift shadows; smooth 300–500ms eased fades and bouncy spring micro-interactions; pure white #FFFFFF grounds, cool greys, and any blue or indigo anywhere in the palette; Inter, Roboto, Poppins, system-ui, or any neutral geometric sans for headings or body; gradient-blob heroes, glassmorphism, frosted panels and glow effects; stock photography, illustrated characters and 3D renders standing in for their real photos; a centred headline + subtext + filled blue button at the top of the page.
The ink poster that becomes a stack of prints.
The public entry is not a hero banner. It is a full-viewport ink flood: #1B1714 fills the screen, and her name is set in Fraunces at clamp(52px, 12vw, 148px), stacked across five to seven lines that span the full width edge to edge, in #F2E7DA, rotated -2°, with the last line breaking mid-word. A single 2px #C8102E rule runs the full viewport width directly beneath the name. One photograph — theirs, in a #FFFDF8 mat rotated 3° with a hard 6px offset shadow — is pinned to the lower right, bleeding 40px past the right edge at 1280px and tucking fully inside at 375px. A mustard washi-tape strip crosses the mat's top-left corner. Below the name, flush left in the ink field, a single line of Karla 700 uppercase at 0.14em tracking reads FOR YOU — OPEN IT SLOWLY, and beneath it a red underlined text link — not a filled button — reads Start with the photographs. Nothing is centred; nothing floats; no gradient anywhere.
The concept is implementable entirely from accepted content and states: the name is the recipient's name, the photograph is one the creator added, the link is the entry into the experience, and the creator entry is a quiet affordance on the same surface. The poster's ink field is the same ink that covers the hidden messages — the first screen and the last gesture are made of the same material, which is what makes the whole thing read as one handmade object rather than a landing page followed by a feature.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: layered_2d
Landing Hero Motion Brief.
Signature motion — the scratch-off. The hidden-message scratch-off is the centrepiece of the recipient's experience: dragging (or tapping on touch) erases a #1B1714 ink layer over the message in irregular, hand-drawn patches that grow with each pass, and the revealed line settles in #C8102E. Under prefers-reduced-motion the scratch-off gets a Reveal button beside it that swaps the ink layer out in one frame.
The letter's seal. Pressing the red wax-seal circle folds the letter sheet open in three stop-motion steps. Under reduced motion it opens in a single instant state change.
NFR-1. Durable creator assembly — provenance: required_inference The creator's photographs, letter and hidden messages must persist across sessions so that he can return and find his assembly intact, and so that the shared experience reflects his current assembly. Rationale: the accepted creator journey includes returning verification and revision; without durable state, returning verification has nothing to return to.
NFR-2. Protected creator workspace — provenance: required_inference Creator Studio must be reachable only by the verified creator. No protected state may be exposed before verification, and a failed verification must not grant partial access. Rationale: the assembly is private to one person and must remain bound to him.
NFR-3. Open recipient access — provenance: explicit The Visual Experience must be reachable by the recipient without identity establishment. She must never be asked to sign in, create an account, or provide any information. Rationale: the accepted recipient journey is opening a link and experiencing the content; any identity requirement would break it.
NFR-4. Readable text and controls stay whole at every viewport — provenance: explicit
Headlines, wordmarks, labels, numbers, captions, photo labels and controls must stay entirely inside the viewport and their container at 375px, 768px and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit. No other element may cover any part of them. Imagery, decoration and motion may be cropped, bled off an edge, rotated, overlapped or cut exactly as the creative direction asks, as long as they cover no readable text or control. Rationale: the recipient opens this on a phone; a clipped line of the letter or an unreachable control would break the gift.
NFR-5. Reduced-motion parity — provenance: explicit
Under prefers-reduced-motion, every reveal becomes an instant state change and each scratch-off gets a Reveal button beside it that swaps the ink layer out in one frame. Nothing is lost. Rationale: the recipient must be able to uncover every hidden message and read the whole letter regardless of motion preference.
NFR-6. Photographic integrity — provenance: explicit Photographs are the creator's own images of the two of them. No stock photography, illustrated characters or 3D renders may stand in for them. Rationale: the experience is a personal love object; substitute imagery would defeat its purpose.
NFR-7. Graceful degradation of missing content — provenance: required_inference Any section the creator has not filled must be simply absent rather than rendering a broken frame, and a photograph that fails to load must render as its paper mat with hairline and shadow so the composition stays whole. Rationale: the creator may share before every section is complete, and the recipient must never see a broken page.
docker-compose.yml as the inventory of runnable services — frontend, backend, database, and object storage. [Default — not specified by user]#F2E7DA, #FFFDF8, #1B1714, #C8102E, #E8B21F, #8A7A6B — source-specified by the creative direction.No Kubernetes is required: the deployment is a small single-instance application with one creator and one recipient.
Assumptions.
Constraints.
#FFFFFF grounds, no cool greys, and no blue or indigo anywhere in the palette. [Source-stated]#1B1714 covering over a hidden message, erased in irregular hand-drawn patches by dragging or tapping.#FFFDF8 paper mount under each photograph, rotated between -4° and +4°, with a 2px ink hairline and a hard 6px 6px 0 #1B1714 offset shadow.#F2E7DA background that carries the whole experience.#E8B21F or #C8102E strip that overlaps a mat corner; the only "soft" element in the shape language.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No user flows yet.
The User Flow Agent will generate per-persona navigation diagrams after SRD updates.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No user flows yet.
The User Flow Agent will generate per-persona navigation diagrams after SRD updates.
No comments yet. Be the first!