Overview
Immich looks like a friendlier, self-hosted take on a mainstream photo app. The brand is a calm indigo on light and a soft periwinkle on dark, set in Google Sans, and the personality comes from the five-color logo (red, pink, yellow, blue, green) that is also available as ten color presets in the mobile app. Photos are the content, so surfaces are plain white or near-black. [Measured]
Three decisions define the look:
- Brand color flips for dark mode. Indigo
#4250afbecomes#accbfaon dark backgrounds (#0a0a0a), keeping contrast without a separate palette. The web and mobile apps use these same two values. [Measured] - Ten user color presets. The mobile app offers indigo, deep purple, pink, red, orange, yellow, lime, green, cyan and slate gray, each a Material 3 scheme generated from a seed, so users can retheme the app. [Measured]
- Round, soft controls. Mobile cards and inputs use
15radius, buttons and tiles10, and titles are semibold Google Sans. [Measured]
Source for this file: the public source and immich.app, read on 2026-10-06. No on-device capture was done. See Known Gaps.
Core
Colors
| Role | Light | Dark |
|---|---|---|
| Brand primary | #4250af (mobile #4150af) | #accbfa |
| Background | #ffffff | #0a0a0a |
| Foreground | #000000 (app text #221f20) | #e5e7eb |
| Dark gray surface | #212121 | |
| Input and soft fill | #f3f4f6 (ring #e5e7eb) | |
| Secondary text | #6b7280 | |
| Logo red, pink, yellow | #fa2921, #ed79b5, #ffb400 | |
| Logo blue, green | #1e83f7, #18c249 |
Mobile presets (light seeds): indigo #4150af, deep purple #6f43c0, pink #ed79b5, red #c51c16, orange #ff5b01, yellow #ffb400, lime #cddc39, green #18c249, cyan #00bcd4 and slate gray #696969. Dark seeds are tuned per preset (for example deep purple #d3bbff, orange #cc6d08, red #d3302f). Each uses a Material 3 scheme generator, with fidelity and neutral variants for orange and slate. Dynamic system color is supported. All [Measured].
Typography
Google Sans is the interface font on both mobile and web (a variable file with weights 410 to 900), with Google Sans Code for monospace. The mobile app picks a locale-specific font where needed. [Measured]
Mobile scale: titles at 26, 18 and 16 (semibold), display styles at 18, 14 and 12 (semibold), body hints at 14 regular, and labels at 14 medium. App bars use 18 semibold. [Measured] The web uses a scale from .75rem to 3.75rem. [Measured]
Shape and spacing
- Mobile radii:
10(buttons and cards) and15(inputs, dialogs and tiles). App bar elevation is0. [Measured] - Web: a
4.5remsidebar width token. Breakpoints at 639, 767, 850 (sidebar), 1023, 1279 and 1535px. [Measured]
Iconography and motion
Icons follow the Material style. The logo mark is a five-petal pinwheel in the logo colors. [Inferred] Motion values were not extracted. [Inferred]
Themes
Light and dark on both apps, ten color presets and dynamic color on mobile. The web has its own light and dark theme variables. [Measured]
Platform: iOS
How the iOS app looks and behaves. Items come from public source files.
Back and up navigation
Expected on iOS: chevron plus previous title, swipe from the left edge.
The iOS back swipe works, but the app bar has a Material look without a previous-title label. [Inferred]
Primary navigation
Expected on iOS: bottom tab bar, about five items.
A bottom navigation with photos, search, albums and library. The structure is inferred from product knowledge. [Inferred]
Main action
Expected on iOS: nav bar or bottom bar button.
Upload and backup controls in the app bar and library. [Inferred]
Sheets, dialogs and messages
Expected on iOS: action sheets, alerts, modals.
Material dialogs and bottom sheets. [Inferred]
Controls
Expected on iOS: Cupertino switches, pickers, segmented controls.
Material controls with 15 radius inputs. [Measured]
Text sizing
Expected on iOS: Dynamic Type.
Text follows the system scale. [Inferred]
Touch and pointer targets
Expected on iOS: 44pt minimum.
Not verified. [Inferred]
Insets and system bars
Expected on iOS: safe areas, status bar.
Handled by the platform. [Inferred]
Icons
Expected on iOS: SF Symbols or custom.
Material-style icons. [Inferred]
Account and sign-in rules
Expected on iOS: equivalent login option when third-party sign-in exists (Guideline 4.8) and in-app account deletion. Note the date checked.
Sign-in is to the user's own server, with optional single sign-on through the server. Account deletion is on the server. [Inferred] Checked: 2026-10-06 against source only.
Platform conformance
Expected on iOS: system components and Dynamic Type.
Low fidelity, with Material 3 on iOS and one look on both platforms. [Inferred]
Platform: Android
How the Android app looks and behaves. Items come from public source files.
Back and up navigation
Expected on Android: system back and gesture, up arrow in the top bar.
System back and an up arrow. [Inferred]
Primary navigation
Expected on Android: navigation bar, rail on tablets.
A Material navigation bar. [Inferred]
Main action
Expected on Android: floating action button.
Not verified. Upload and sync actions are in the app bar. [Inferred]
Sheets, dialogs and messages
Expected on Android: bottom sheets, dialogs, snackbars.
Material bottom sheets, dialogs and snackbars. [Inferred]
Controls
Expected on Android: Material switches, pickers, chips.
Material 3 controls styled by the generated scheme. [Measured]
Text sizing
Expected on Android: font scale.
Follows the system font scale. [Inferred]
Touch and pointer targets
Expected on Android: 48dp minimum.
Not verified. [Inferred]
Insets and system bars
Expected on Android: edge to edge, system bars.
Not verified. [Inferred]
Icons
Expected on Android: Material Symbols or custom.
Material-style icons. [Inferred]
Account and sign-in rules
Expected on Android: account deletion and data safety requirements. Note the date checked.
Own-server sign-in. Account deletion and data safety were not checked. [Inferred] Checked: 2026-10-06 against source only.
Platform conformance
Expected on Android: Material 3 components and roles.
High fidelity: seeded Material 3 schemes, ten presets and dynamic color. [Measured]
Platform: Web
The immich.app site and the web application.
Back and up navigation
Expected on Web: browser back, breadcrumbs.
Browser back with a sidebar for sections. [Inferred]
Primary navigation
Expected on Web: top nav or sidebar.
A left sidebar that collapses at the 850px breakpoint, 4.5rem wide when collapsed. [Measured]
Main action
Expected on Web: page-level button.
An upload button in the header. [Inferred]
Sheets, dialogs and messages
Expected on Web: modals, toasts.
Modals and toasts in the shared UI package. [Inferred]
Controls
Expected on Web: native or custom.
Custom controls from the shared @immich/ui package, with gray-100 inputs and a ring on focus. [Measured]
Text sizing
Expected on Web: browser zoom.
Sizes in rem. [Measured]
Touch and pointer targets
Expected on Web: pointer and keyboard.
Not verified. [Inferred]
Insets and system bars
Expected on Web: viewport, scrollbars.
Responsive with breakpoints from 639px to 1535px. [Measured]
Icons
Expected on Web: any.
SVG icons. [Inferred]
Account and sign-in rules
Expected on Web: not applicable unless the product has accounts.
Own-server accounts. [Inferred]
Platform conformance
Expected on Web: web norms for links and forms.
Follows web norms with a shared brand with the mobile app. [Measured]
Cross-platform consistency
The same brand indigo and its dark-mode counterpart, the same Google Sans family and the same logo colors appear on mobile and web. The mobile app adds ten user-selectable presets that the web does not. [Measured]
Do's and Don'ts
Do
- Use
#4250afon light and#accbfaon dark for the brand color. - Set type in Google Sans with semibold titles.
- Use
15radius for inputs and10for buttons on mobile. - Offer color presets generated from seeds, including a neutral gray.
- Keep the logo's five colors for illustration and branding moments.
Don't
- Don't use pure white text on the light brand color without checking contrast.
- Don't hand-pick scheme colors that Material 3 can generate.
- Don't use the logo colors for functional UI states.
Known Gaps
- No on-device capture was done. All app statements come from reading source, so layouts and behavior are not confirmed.
- The shared web UI package (
@immich/ui) was not read, so web component details are partly missing. - Navigation structure and the main action are inferred from product knowledge.
- Spacing on mobile and web screens was not measured beyond a few tokens.
- Account deletion and store policy rules were not verified.