Summary
Integrate profile default images and accent colors from the MeticulousHome ProfileDefaultImages repository to enrich the profile browsing and creation experience.
Background
The OEM provides 25 curated profile thumbnail images (PNG, 106-254KB each) and an accent_colors.json that maps image MD5 hashes to hex accent colors. These are used on the machine dial UI to give each profile a distinct visual identity.
Behaviour
Profile Cards (Catalogue & History)
Current: Profile cards show the profile name on a plain background.
After: Profile cards display the profile's assigned thumbnail image as a background with the accent color as a subtle gradient overlay. Cards without an assigned image use the current plain style.
Visual example:
┌──────────────────────┐
│ [thumbnail image] │ ← Profile image as card background
│ │ (dimmed 40% in dark mode)
│ ══════════════════ │ ← Gradient fade to accent color
│ Slow-Mo Blossom │ ← Profile name over accent color bar
│ ⏱ 4:30 ☕ 36g │ ← Metadata
└──────────────────────┘
Profile Creation (AI-generated)
When Gemini creates a new profile:
- Backend picks the most appropriate default image based on profile characteristics:
- Espresso-based → espresso thumbnail
- Pour-over style → pour-over thumbnail
- Filter/long brew → filter thumbnail
- Fallback → generic coffee thumbnail
- The accent color from
accent_colors.json is applied automatically
- User can change image/color in profile editor
Profile Editor
New "Appearance" section:
- Image picker: Grid of available thumbnails (25 defaults + any user-uploaded)
- Accent color: Color picker pre-populated from the image's mapped accent color
- Preview: Live preview of how the card will look
- Custom upload: Option to upload a custom image (cropped to standard dimensions)
Settings View
Profile list entries show a small circular thumbnail (24px) next to the profile name, using the accent color as a ring border.
How Accent Colors Work
The OEM maps images to colors via MD5 hash:
{
"a1b2c3d4...": "#8B4513",
"e5f6g7h8...": "#2E8B57"
}
When a profile has an image URI reference matching a known image, we look up its MD5 → accent color. This color is used for:
- Card gradient overlay
- Profile name background tint
- Settings list avatar ring
- Brew screen accent highlight
Data Source
- Images: Bundled at build time from ProfileDefaultImages repo (or fetched on first load in direct mode)
accent_colors.json: Bundled alongside images
- Storage:
public/images/profiles/ in web app, served statically
Implementation
Backend
- Clone ProfileDefaultImages at Docker build time (like we do for espresso-profile-schema)
- Serve images via static file route:
GET /api/profile-images/{filename}
- Expose
GET /api/profile-images/manifest returning image list + accent colors
- Add
image and accentColor fields to profile metadata in AI generation
Frontend
- Bundle default images in
public/images/profiles/
- New component:
ProfileThumbnail — renders image with accent color overlay
- Update
ProfileCard to use ProfileThumbnail background
- New component:
ImagePicker — grid selector for profile editor
- Color utility:
getAccentColor(imageHash) lookup
- Update profile creation flow to assign default image
- Lazy-load images (IntersectionObserver) for performance
- i18n keys for image picker labels (6 locales)
Profile Schema Extension
Add optional fields to profile metadata:
interface ProfileDisplay {
image?: string // URI reference to thumbnail
accentColor?: string // #RRGGBB hex color
shortDescription?: string // ≤100 chars (already in schema)
}
Acceptance Criteria
References
Summary
Integrate profile default images and accent colors from the MeticulousHome ProfileDefaultImages repository to enrich the profile browsing and creation experience.
Background
The OEM provides 25 curated profile thumbnail images (PNG, 106-254KB each) and an
accent_colors.jsonthat maps image MD5 hashes to hex accent colors. These are used on the machine dial UI to give each profile a distinct visual identity.Behaviour
Profile Cards (Catalogue & History)
Current: Profile cards show the profile name on a plain background.
After: Profile cards display the profile's assigned thumbnail image as a background with the accent color as a subtle gradient overlay. Cards without an assigned image use the current plain style.
Visual example:
Profile Creation (AI-generated)
When Gemini creates a new profile:
accent_colors.jsonis applied automaticallyProfile Editor
New "Appearance" section:
Settings View
Profile list entries show a small circular thumbnail (24px) next to the profile name, using the accent color as a ring border.
How Accent Colors Work
The OEM maps images to colors via MD5 hash:
{ "a1b2c3d4...": "#8B4513", "e5f6g7h8...": "#2E8B57" }When a profile has an
imageURI reference matching a known image, we look up its MD5 → accent color. This color is used for:Data Source
accent_colors.json: Bundled alongside imagespublic/images/profiles/in web app, served staticallyImplementation
Backend
GET /api/profile-images/{filename}GET /api/profile-images/manifestreturning image list + accent colorsimageandaccentColorfields to profile metadata in AI generationFrontend
public/images/profiles/ProfileThumbnail— renders image with accent color overlayProfileCardto useProfileThumbnailbackgroundImagePicker— grid selector for profile editorgetAccentColor(imageHash)lookupProfile Schema Extension
Add optional fields to profile metadata:
Acceptance Criteria
References
display.image,display.accentColor