// Social app UI

Pinterest-Style App UI Design in Expo

Mosaic is an original visual discovery app with the layout people search for when they want a Pinterest-style UI: a two-column masonry feed, category chips, pin detail, search and saved boards.

Screens
4
Built with
Expo SDK 58
Fonts
System font
License
Free (MIT)
Pin detail screen with a large photo, save button and more like this section

Mosaic Discovery app screens

Pinterest-style app home feed with a two-column masonry grid of photos

Masonry home feed

Category chips above a two-column masonry grid. Every pin has a bookmark that fills when saved.

Pin detail screen with a large photo, save button and more like this section

Pin detail

A rounded hero image with back and share actions, author row, follow toggle, save button and a More like this grid.

Search screen with a search field and photo topic tiles

Search and topics

A pill search field over topic tiles. Typing swaps to live masonry results, with an empty state when nothing matches.

Saved pins screen with a profile, boards and masonry grid

Saved boards

Profile header, horizontal boards built from saved categories, and every saved pin in one masonry grid.

Copy the Mosaic Discovery kit

Use the artifact as a design brief, the skill to generate the UI with an AI agent, or the code to run it right away.

Design artifact

The full design: tokens, screens and source

# Mosaic Discovery: design artifact

Mosaic is an original visual discovery app with the layout people search for when they want a Pinterest-style UI: a two-column masonry feed, category chips, pin detail, search and saved boards.

- Type: Social mobile app UI
- Screens: 4
- Artboard: 390 × 844
- Target: Expo SDK 58, Expo Router, TypeScript, @expo/vector-icons, @shopify/flash-list, expo-image
- Live page: https://developermill.com/app-designs/pinterest-style-app-ui-design

## Design direction

Warm paper tones and a persimmon accent let photography lead, with soft rounded image cards in a two-column masonry grid.

- Two-column masonry feed on FlashList v2
- Saved pins grouped into boards automatically
- Live search with a real empty state
- Light and dark themes from one token file

## Foundations

### Colour

| Token | Hex |
| --- | --- |
| Persimmon | `#C8401A` |
| Paper | `#FAF7F2` |
| Ink | `#1E1B18` |
| Stone | `#6F675D` |
| Sand | `#EFE9DF` |
| Night | `#141210` |

### Typography

- Typefaces: System font
- Common sizes (px): 11, 12, 14, 15, 20, 24, 28

### Shape and depth

- Common corner radii (px): 12, 20, 28, 999
- Shadows: `None. Depth comes from image cards.`

## Screens

### 1. Masonry home feed

Category chips above a two-column masonry grid. Every pin has a bookmark that fills when saved.

Preview: https://developermill.com/app-designs/pinterest-style-app-ui-design/feed.webp

### 2. Pin detail

A rounded hero image with back and share actions, author row, follow toggle, save button and a More like this grid.

Preview: https://developermill.com/app-designs/pinterest-style-app-ui-design/pin.webp

### 3. Search and topics

A pill search field over topic tiles. Typing swaps to live masonry results, with an empty state when nothing matches.

Preview: https://developermill.com/app-designs/pinterest-style-app-ui-design/search.webp

### 4. Saved boards

Profile header, horizontal boards built from saved categories, and every saved pin in one masonry grid.

Preview: https://developermill.com/app-designs/pinterest-style-app-ui-design/saved.webp

## Design tokens in code

```ts
import { useColorScheme } from 'react-native';

const light = {
  background: '#FAF7F2',
  surface: '#FFFFFF',
  surfaceMuted: '#EFE9DF',
  text: '#1E1B18',
  textMuted: '#6F675D',
  border: '#E6DFD3',
  accent: '#C8401A',
  onAccent: '#FFFFFF',
};

const dark: typeof light = {
  background: '#141210',
  surface: '#211E1A',
  surfaceMuted: '#2C2823',
  text: '#F5F0E8',
  textMuted: '#A99F92',
  border: '#37322B',
  accent: '#FF8A5C',
  onAccent: '#1E1B18',
};

export const space = { xs: 4, sm: 8, md: 12, lg: 16, xl: 24 };
export const radius = { sm: 12, md: 20, lg: 28, pill: 999 };

export type Theme = typeof light;

export function useTheme(): Theme {
  return useColorScheme() === 'dark' ? dark : light;
}
```

## Data model

```ts
export const CATEGORIES = ['Travel', 'Nature', 'Architecture', 'Cars', 'Food', 'Pets'] as const;

export type Category = (typeof CATEGORIES)[number];

export type Pin = {
  id: string;
  title: string;
  description: string;
  category: Category;
  author: string;
  /** Width divided by height. Drives the masonry rhythm, so vary it. */
  ratio: number;
  uri: string;
};
```

SKILL.md

Save as .claude/skills/pinterest-style-app-ui/SKILL.md

---
name: pinterest-style-app-ui
description: Build the Mosaic Discovery mobile app UI in Expo React Native. Use when asked to create a Pinterest style app UI or a new screen in this visual style.
---

# Mosaic Discovery app UI

Build this UI in an Expo SDK 58 app with Expo Router and strict TypeScript. Match the spec below rather than inventing a new look. The finished reference lives at https://developermill.com/app-designs/pinterest-style-app-ui-design

## Visual direction

Warm paper tones and a persimmon accent let photography lead, with soft rounded image cards in a two-column masonry grid.

Keep these signature details:

- Two-column masonry feed on FlashList v2
- Saved pins grouped into boards automatically
- Live search with a real empty state
- Light and dark themes from one token file

## Set up

```bash
npx expo install @expo/vector-icons @shopify/flash-list expo-image
```

## Tokens

| Token | Hex |
| --- | --- |
| Persimmon | `#C8401A` |
| Paper | `#FAF7F2` |
| Ink | `#1E1B18` |
| Stone | `#6F675D` |
| Sand | `#EFE9DF` |
| Night | `#141210` |

- Typefaces: System font
- Common sizes (px): 11, 12, 14, 15, 20, 24, 28
- Common corner radii (px): 12, 20, 28, 999

Define these once and reuse them. Do not add new colours.

## Screens

Build one Expo Router route per screen, in this order:

1. **Masonry home feed**: Category chips above a two-column masonry grid. Every pin has a bookmark that fills when saved.
2. **Pin detail**: A rounded hero image with back and share actions, author row, follow toggle, save button and a More like this grid.
3. **Search and topics**: A pill search field over topic tiles. Typing swaps to live masonry results, with an empty state when nothing matches.
4. **Saved boards**: Profile header, horizontal boards built from saved categories, and every saved pin in one masonry grid.

## Build rules

- Design on a 390 × 844 artboard, then scale to the device width so layouts match on every phone.
- Load each custom font weight by its own family name with expo-font. Do not rely on `fontWeight` with custom fonts.
- Draw icons, charts and illustrations with react-native-svg rather than image files or chart libraries.
- Use `Pressable` with an `accessibilityLabel` for every icon-only control, and keep touch targets at 44 px or larger.
- Wire navigation with `router.navigate`, and keep sample data in constants at the top of each file so it is easy to replace.
- Use expo-image for photos, with `contentFit` set explicitly.

## Done when

- Every screen above exists as a route and they link together.
- Colours, type and radii match the tokens exactly.
- `npx tsc --noEmit` and `npx expo lint` both pass.
- Layouts hold up on small and large phones.

Set up the project

npx create-expo-app@latest pinterest-style-app --template default
cd pinterest-style-app
rm -rf src
npx expo install @expo/vector-icons @shopify/flash-list expo-image

src/app/_layout.tsx

import { DarkTheme, DefaultTheme, Stack, ThemeProvider } from 'expo-router';
import { StatusBar } from 'expo-status-bar';
import { useColorScheme } from 'react-native';

import { useTheme } from '@/lib/theme';

export default function RootLayout() {
  const scheme = useColorScheme();
  const theme = useTheme();
  const base = scheme === 'dark' ? DarkTheme : DefaultTheme;

  return (
    <ThemeProvider
      value={{
        ...base,
        colors: { ...base.colors, background: theme.background, card: theme.background },
      }}>
      <StatusBar style="auto" />
      <Stack screenOptions={{ headerShown: false }}>
        <Stack.Screen name="(tabs)" />
        <Stack.Screen name="pin/[id]" />
      </Stack>
    </ThemeProvider>
  );
}

About this design

The feed runs on FlashList v2 masonry, so it stays smooth with long lists, and saving a pin updates the Saved tab straight away. Light and dark themes are both included.

Warm paper tones and a persimmon accent let photography lead, with soft rounded image cards in a two-column masonry grid.

  • Two-column masonry feed on FlashList v2
  • Saved pins grouped into boards automatically
  • Live search with a real empty state
  • Light and dark themes from one token file

Colour palette

  • Persimmon

    #C8401A

  • Paper

    #FAF7F2

  • Ink

    #1E1B18

  • Stone

    #6F675D

  • Sand

    #EFE9DF

  • Night

    #141210

How to use this design

  1. 01

    Pick what to copy

    Copy the Mosaic Discovery artifact, skill or code from this page.

  2. 02

    Run it or generate it

    Paste the code into a new Expo app and start it, or give the skill to your AI coding agent.

  3. 03

    Make it yours

    Replace the demo images and sample content, then connect your own data.

Frequently asked questions

Is this a copy of the Pinterest app?

No. Mosaic is an original design that uses the same well-known masonry layout. It has its own name, colours and interface, and it is not affiliated with or endorsed by Pinterest.

How is the masonry grid built?

It uses the masonry prop on FlashList v2 with two columns. Each pin keeps its own aspect ratio and FlashList places it in the shortest column.

Is the Mosaic Discovery design free to use?

Yes. The design, skill and Expo code are free and MIT licensed, including for commercial apps. Replace the demo images and sample content with your own before you ship.

What is the difference between the artifact, skill and code?

The artifact is the full design: tokens, screens and source. The skill is a SKILL.md that teaches an AI coding agent to build the UI. The code is the finished Expo app you can paste in and run.

Which Expo version does the code use?

It targets Expo SDK 58 with Expo Router and TypeScript. It uses packages installed through npx expo install, with no custom native code.

More app UI designs