--- stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] inputDocuments: ['prd.md', 'architecture.md'] workflowType: 'ux-design' project_name: 'pictureFrame' user_name: 'Matt.edholm' date: '2026-04-27' --- # UX Design Specification - pictureFrame **Author:** Matt.edholm **Date:** 2026-04-27 --- ## Executive Summary ### Project Vision pictureFrame is a handcrafted e-ink digital picture frame ecosystem built as a meaningful gift. The physical frame is hand-built; the companion web app is where the frame's content comes to life — uploading photos, approving shares from family, curating what someone you love wakes up to every morning. The app is not a monitoring dashboard. It is an image curation tool with a warm, personal, playful character — simple and obvious in its interactions, fun in its personality. Future directions (image stickers, overlays) are consistent with this tone: the app should feel like a place where you make something for someone, not a place where you manage a device. ### Target Users **Margaret (recipient)** — non-technical gift recipient. Approves photos shared by family members. Her primary interaction is clicking an email approve link and choosing which frame to add a photo to — no login required for that flow. When she does open the app, it should be immediately obvious what to do. **Matt (builder/admin)** — gift giver and super admin. Uploads the initial photo collection, approves images per device, configures device settings, monitors the fleet. Power user comfort without admin visual weight — the controls should feel purposeful, not bureaucratic. **Sarah (contributor)** — family member. Uploads photos and shares them to a recipient. Should never need to understand approvals, device settings, or the rotation engine. Her job is: pick a photo, send it to someone. ### Key Design Challenges 1. **Non-technical provisioning** — Two-phase QR flow must be self-explanatory and self-healing. Every failure state resets automatically. No step can require interpretation. 2. **Email-first approval** — The share email is a primary UX surface, not just a notification. It must work on any email client, any device, with no login. The device-selection page after approval is a critical no-auth screen. 3. **Three users, one app** — Matt wants control and visibility. Sarah wants to pick a photo and go. The app must not expose contributor-level users to admin complexity, while giving Matt the full picture. ### Design Opportunities 1. **Curation as the core emotional experience** — Choosing which photos appear on someone's frame is an act of care. The image upload and approval flows should feel considered and personal, not transactional. Image detail views should feel like a canvas — ready for future sticker/overlay features without a redesign. 2. **The gift moment** — When a device is first linked via setup QR, there is an opportunity to frame the experience as "you just gave someone this" rather than "device provisioning complete." 3. **Warm, playful personality** — Simple and obvious as the baseline; fun as the texture. The visual and copy language should reflect that this is for family, not for IT departments. ## Core User Experience ### Defining Experience The heart of pictureFrame is the upload-to-frame flow: pick a photo, make it yours, see it in the frame, put it there. Everything else — sharing, approvals, device settings — orbits this moment. The editing experience is the product's personality. Crop/fit and pre-baked sticker overlays are first-class, not afterthoughts. Images with stickers retain their edit state and can be re-edited at any time — sticker placement, sizing, and removal is always available on images you own. ### Platform Strategy Mobile-first web app. iOS Safari and Android Chrome are the primary targets; all flows are designed touch-first. Laptop is a supported secondary use case. No native app. Touch interactions drive all design decisions: tap targets sized for thumbs, drag-to-position for sticker placement, tap-to-remove (×) on placed stickers. ### Upload & Edit Flow The primary upload flow is a linear funnel on mobile: 1. **Pick** — select from camera roll or files 2. **Crop/Fit** — frame-shaped crop UI (device aspect ratio always visible; landscape or portrait per device) 3. **Stickers** — add pre-baked sticker overlays; drag to position, resize, tap × to delete; multiple stickers supported 4. **Add to Frame** — choose which device(s) this goes to (own devices only; sharing to others uses the share flow) 5. **Done** — return to home page Images with stickers can be re-edited from the library at any time. The original and edit state (crop parameters, sticker positions/sizes) are stored separately from the rendered output. ### Sharing & Approval Sharing is initiated from the UI (library or image detail). The email approve flow is the primary approval mechanism for recipients — one tap, no login required, device-selection page after approval. Users can also approve or decline images directly within the app UI (equivalent action to the email flow, both are first-class paths). ### Critical Success Moments - **First photo on the frame** — the upload-edit-add funnel completes and the image enters rotation. This should feel like sending something. - **Sticker placement** — drag-and-drop on mobile should feel immediate and fun; the frame preview keeps the recipient's experience in frame. - **Email approval** — one tap, confirmation, done. No friction for non-technical recipients. - **Re-editing** — returning to a photo with stickers and adjusting it should feel natural, not like a special mode. ### Experience Principles 1. **The frame is always in view** — the device's aspect ratio is visible throughout crop and sticker editing. You are always making something for someone. 2. **Edit state is never lost** — sticker compositions and crop settings are preserved and re-editable indefinitely. 3. **Fun is prominent** — stickers and editing are surfaced in the primary flow, not buried in an overflow menu. 4. **One flow, complete** — upload leads directly to frame assignment; no orphaned library items unless the user explicitly chooses not to add to a device. 5. **Approve your way** — email tap or UI action: both paths are first-class and produce identical results. ## Desired Emotional Response ### Primary Emotional Goals - **Warmth** — sharing and curating photos should feel like an act of care, not a task. The product is for family; the UI should reflect that. - **Playfulness** — the sticker/editing experience is where personality lives. It should make you smile. A funny edit spreads because someone saw it on a frame and said "send me that one." - **Connection** — the frame is the social surface. You see a photo cycling on someone's wall, you want it, you ask for it. The app is how you send it; it should be fast. - **Confidence** — every step obvious and safe, no dead ends. ### Emotional Journey Mapping | Moment | Target feeling | |---|---| | First open | "This feels friendly" | | Upload + crop | "Easy — and I'm making something" | | Sticker placement | "Haha, yes" | | Add to own frame | Immediate satisfaction — no approval, no wait | | See photo on someone's frame in person | "Send me that one" | | Owner finds it, shares it | Quick, obvious, done | | Email approve (recipient) | "Oh that was easy" | | Frame cycles to new photo | The payoff — warmth without the app | ### Micro-Emotions - **Delight** — sticker interactions, fun copy, small animations on completion - **Accomplishment** — the upload-edit-add funnel ends with something on the frame, not in a queue - **Trust** — no approval needed for your own devices; the system does what you expect - **Connection** — the frame in the room drives the social loop; the app just closes it ### Design Implications - **Warmth** → rounded UI, named devices ("Dad's Frame", not "Device #3"), friendly copy throughout - **Playfulness** → stickers prominent in edit flow; small celebratory feedback on actions - **Connection** → finding and sharing a photo should take seconds; the share flow is the product's social handshake - **Confidence** → one obvious action per screen; your own devices need no approval gate; clear feedback on every tap ### Emotions to Avoid - Tech anxiety — especially for non-technical recipients - Overwhelm — settings and admin complexity never leak into contributor or recipient flows - Transactional — nothing should feel like filing paperwork - Waiting — adding to your own frame is instant; no approval limbo for the uploader ## UX Pattern Analysis & Inspiration ### Inspiring Products Analysis **Snapchat — sticker/overlay editing** The gold standard for tap-to-place sticker UX on mobile. Users already know it: tap a sticker from a tray to place it on the canvas, drag to reposition, pinch to resize, tap to select, × to delete. Zero learning curve. The sticker tray scrolls horizontally and stays out of the way of the canvas. This is the exact pattern to replicate for pictureFrame's sticker editor. **iMessage / Apple Photos — sharing and warmth** Named recipients, not abstract IDs. Sharing feels like handing something to a specific person. Confirmation is quiet — a small animation, not a modal. The visual language is warm and human without being childish. **Instagram — mobile upload funnel** Crop-first design: you see the frame before you decide anything else. The aspect ratio is always visible. The upload flow is linear and committed — you move forward, not sideways. One obvious action per step. **Canva (simplified) — pre-baked element tray** A scrollable horizontal tray of categorized elements (stickers, in our case) that opens from the bottom of the screen. Doesn't take over the canvas. Categories let you browse without overwhelming. Works well for non-technical users who just want to pick something fun. ### Transferable UX Patterns **Sticker interaction (from Snapchat):** Tap from tray → placed on canvas → drag to move → pinch to resize → tap to re-select → × to delete. Applied directly to pictureFrame's sticker editor. Users arrive already knowing this pattern. **Crop-first framing (from Instagram):** Show the device aspect ratio before anything else in the edit flow. The frame shape is the first thing you see — you are always designing for a specific physical object, not cropping an abstract photo. **Named, human recipients (from iMessage):** Devices are always shown by their given name ("Margaret's Frame") in every context — upload, share, approve. Never a MAC address, device ID, or generic label. **Bottom sheet element tray (from Canva/Snapchat):** Sticker categories and sticker items in a bottom sheet that slides up without covering the full canvas. Scrolls horizontally within categories. Dismisses by tapping the canvas. **Quiet confirmation (from Apple Photos):** Completing an action (add to frame, approve, share) should feel settled and calm — a small visual acknowledgment, then return to context. No success modal that demands a tap to dismiss. ### Anti-Patterns to Avoid - **Approval-first design** — adding a photo to your own frame should never require an approval step. Approval friction belongs only in the cross-user sharing flow. - **Settings leaking into primary flows** — device configuration, rotation frequency, uniqueness windows are admin concerns. They should never appear in the upload, sticker, or share flows. - **Buried stickers** — if stickers require more than one tap to reach from the edit screen, they won't be used. They must be a first-class element of the editing UI. - **Empty canvas anxiety** — the crop/edit screen should never look blank or intimidating. The device frame shape, a clear "Add sticker" affordance, and the photo itself should fill the space confidently. - **Generic confirmation copy** — "Success" or "Done" is wasted space. Every completion moment should say something specific and warm. ### Design Inspiration Strategy **Adopt directly:** - Snapchat sticker interaction model — tap, drag, pinch, × - Instagram crop-first funnel — frame shape before anything else - Bottom sheet sticker tray — non-intrusive, dismissable **Adapt for pictureFrame:** - Canva element tray → simplified to stickers only, mobile-optimized, warmer visual style - iMessage sharing warmth → applied to the share flow and email design, not just in-app interactions **Avoid entirely:** - Any UX that treats the frame as a device to be configured rather than a gift to be curated - Multi-step confirmation flows for actions the user has clear intent on ## Design System Foundation ### Design System Choice **Authenticated app:** Vue 3 SPA (TypeScript strict, Vite, Vue Router, Pinia) with SCSS modules scoped per SFC component and Konva.js + Vue-Konva for the sticker canvas editor. **Public flows** (email approve/decline, provisioning setup page): Symfony + Twig, minimal SCSS, no Vue dependency. ### Rationale for Selection - **Vue 3 over React** — Composition API is clean, bundle size is smaller, TypeScript integration is excellent, appropriate for this application's complexity level. - **SCSS modules over Tailwind** — semantic, authored CSS produces more maintainable component styles; complex canvas states (sticker selected, dragging, pinch-active) express more clearly as authored classes than utility strings. No utility class noise in templates. - **No DaisyUI** — components are written properly from scratch in Vue SFCs with scoped SCSS; a pre-built component library is unnecessary. - **Konva.js** over Fabric.js — lighter, superior mobile touch event handling, maintained Vue-Konva wrapper for reactive sticker state. - **TypeScript strict mode** — API response interfaces mirror Symfony entities; compiler surfaces contract drift before it reaches deployed devices. Non-negotiable given the no-breaking-changes firmware constraint. ### Implementation Approach - Vue app scaffolded with Vite + TypeScript template - `src/types/` directory holds interfaces mirroring every Symfony API response shape: `Device`, `Image`, `StickerLayer`, `RenderedAsset`, `Token` - Symfony serves the Vue app's `index.html` shell for all authenticated routes; Vue Router handles client-side navigation - Public Symfony routes (`/setup/{mac}`, `/token/{uuid}/approve`) remain outside the Vue app entirely ### Customization Strategy - Design tokens defined as SCSS variables: color palette, spacing scale, border radius, typography — warm/playful values set once, used everywhere - Component SCSS lives in each SFC `