{
  "slug": "yem",
  "name": "Yem",
  "shortDescription": "A shared-household app: recurring tasks, calendars, recipes, shopping lists and chat. Offline-first, and installable as PWA, or on iOS and Android from one codebase.",
  "creationDate": "2026-01",
  "liveUrl": "https://app.yemapp.com",
  "sourceCodeUrl": null,
  "category": {
    "slug": "work",
    "name": "Work"
  },
  "skills": [
    {
      "slug": "balsamiq",
      "name": "Balsamiq",
      "type": "design",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/4a9b2695a390e8dc2b25e231e23c2d2d38eee1c9-178x225.png",
        "width": 178,
        "height": 225
      },
      "brandColor": "#AE1C59"
    },
    {
      "slug": "figma",
      "name": "Figma",
      "type": "design",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/28d0c14203bd49292ae34a248b3130c479da597d-924x922.png",
        "width": 924,
        "height": 922
      },
      "brandColor": "#F24E1E"
    },
    {
      "slug": "typescript",
      "name": "TypeScript",
      "type": "language",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/10c3fd02286006610ffcd2e259141eecc6d5f7f4-630x630.svg",
        "width": 630,
        "height": 630
      },
      "brandColor": "#3178C6"
    },
    {
      "slug": "react",
      "name": "React",
      "type": "framework",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/4b45e2040cfef06a80f4539d5075579e7becbe83-23x20.svg",
        "width": 23,
        "height": 20
      },
      "brandColor": "#61DAFB"
    },
    {
      "slug": "tailwind",
      "name": "Tailwind CSS",
      "type": "styling",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/e57b025e7e95638d5f3dbe5f48f7be995d03d203-3840x2347.webp",
        "width": 3840,
        "height": 2347
      },
      "brandColor": "#06B6D4"
    },
    {
      "slug": "react-router",
      "name": "React Router",
      "type": "framework",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/7ae51fe1a6bd15e49eb1420122f3d41a67df9996-602x360.svg",
        "width": 602,
        "height": 360
      },
      "brandColor": "#CA4245"
    },
    {
      "slug": "capacitor",
      "name": "Capacitor",
      "type": "framework",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/1c7682ca6083fff448c6f2a4ebde3ea4a5a055c8-1875x1875.png",
        "width": 1875,
        "height": 1875
      },
      "brandColor": "#119EFF"
    },
    {
      "slug": "cloudflare",
      "name": "Cloudflare",
      "type": "hosting",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/d2d4bf55deb274563e94bca0da66bed1b5a5a14c-66x30.svg",
        "width": 66,
        "height": 30
      },
      "brandColor": "#F38020"
    },
    {
      "slug": "posthog",
      "name": "Posthog",
      "type": "analytics",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/7d482e4db4edb887de88e11838b8c34d0de17e4e-60x60.svg",
        "width": 60,
        "height": 60
      },
      "brandColor": "#F54E00"
    },
    {
      "slug": "sentry",
      "name": "Sentry",
      "type": "analytics",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/1f479d7ba5115a132e46aa3cdf0f8b6ecee1f749-1280x1150.png",
        "width": 1280,
        "height": 1150
      },
      "brandColor": "#362D59"
    },
    {
      "slug": "claude-code",
      "name": "Claude Code",
      "type": "tools",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/229bd3d66c437d1aa538d88bc1b58f5bac72692a-1200x1200.png",
        "width": 1200,
        "height": 1200
      },
      "brandColor": "#c15f3c"
    },
    {
      "slug": "hono",
      "name": "Hono",
      "type": "framework",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/5e2014f3c39f9e6d932cef485d86f5024b456158-76x98.svg",
        "width": 76,
        "height": 98
      },
      "brandColor": "#E36002"
    },
    {
      "slug": "bun",
      "name": "Bun",
      "type": "tools",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/daa11bb8f737e9b874f9aaed1bd18d25a43004af-80x70.svg",
        "width": 80,
        "height": 70
      },
      "brandColor": "#000000"
    },
    {
      "slug": "stripe",
      "name": "Stripe",
      "type": "tools",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/944ad3e9dce4f68d4673a62d52f375dbe6951649-1000x1000.png",
        "width": 1000,
        "height": 1000
      },
      "brandColor": "#635BFF"
    },
    {
      "slug": "tinybase",
      "name": "TinyBase",
      "type": "tools",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/92c13e984c90049a318096edcb9546d7098abbc7-680x680.svg",
        "width": 680,
        "height": 680
      },
      "brandColor": "#D81B60"
    },
    {
      "slug": "drizzle",
      "name": "Drizzle",
      "type": "database",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/a067652ff570dbd7f367098a3bf077014dd00959-60x60.png",
        "width": 60,
        "height": 60
      },
      "brandColor": "#C5F74F"
    },
    {
      "slug": "motion",
      "name": "Motion",
      "type": "styling",
      "logo": {
        "url": "https://cdn.sanity.io/images/94tq599c/production/43c46c93e2e53acecc7bdce3537e6a02de6c9d6f-33x12.svg",
        "width": 33,
        "height": 12
      },
      "brandColor": "#fbd509"
    }
  ],
  "content": "# Introduction\n\nYem is a growing suite of household management tools. As an organization and productivity nerd, this was my dream project for many years - and is my biggest project to date. Building tools to help organize my personal life where the tools could communicate with each other and help reduce mental load was the inspiration for the project - and in January 2026 I started building it full-time. \n\nThe project is ongoing, and way too large for me to keep a full write-up up-to-date, so I will list out the features and technologies here for those interested.\n\n## Links\n\n- [Business website](http://www.yemapp.com)\n- [PWA/Web](http://app.yemapp.com)\n- [Play Store](https://play.google.com/store/apps/details?id=com.yemapp.app)\n- [App Store](https://apps.apple.com/app/id6790150556)\n- [Microsoft Store](https://apps.microsoft.com/detail/9plcnh7f1lqc)\n\n# Features\n\n_Last updated August 2026_\n\n- Suite of tools\n    - **Task manager**\n    - **Calendar** system (compatible with the RFC 5545 iCalendar specification)\n    - Household **chat** (one-to-one or group chats)\n    - **Shopping lists** (private, shared, real-time updates)\n    - **Recipe book** (with multiple import options; text, URL, photo)\n- **Offline mode**\n- Push **notifications**\n- Self-serve **data export**\n- **Reminder** system (in beta)\n- **MCP** connection (in beta)\n\n# Technologies\n\n## Design and UI\n\n- Original ideas wireframed in **Balsamiq**\n- Full **design library in Figma** with custom colors, fonts, sizings, etc.\n- 56 custom **React UI components** packaged as a shared library between codebases\n- **Storybook** setup with all base components, layouts and pages\n\n## Frontend\n\n- **React 19** + **React Router 7** (SSR) on **Cloudflare Workers**, wrapped as a native app via **Capacitor**\n- Offline-first **CRDT data layer** using **TinyBase**\n    - Each user gets a merged store persisted to IndexedDB and synced over WebSocket to a server Durable Object\n    - A centralized mutation queue handles optimistic writes, cross-tab coordination, mutation coalescing, and rollback with error classification\n- Bi-lingual UI (English / Norwegian) with translation keys\n\n## Backend\n\n- **Hono** on Cloudflare Workers\n- 169 **OpenAPI** endpoints\n- **MCP** server with **OAuth** (in Beta)\n- **Postgres** on **Neon**\n    - Normalized database structure\n    - RLS on tables where needed\n- 3 payment platforms (**Stripe**, Google Play, App Store) reconciled into one entitlement system\n\n## Infrastructure & CI/CD\n\n- **Bun** + **Turborepo** monorepo\n- **Biome** config with custom lint plugins\n- 8+ **Github Actions** workflows\n    - Full testsuite (~1700 test cases)\n    - TestFlight runner\n    - Android internal track runner\n    - Cross-repo branch resolution to avoid drift\n- 16 monitored **cron jobs**\n- Error monitoring through **PostHog**\n\n## Documentation\n\n- 89-page internal **developer wiki** built with Astro Starlight\n- 37 project-specific **Claude Code skills**\n\n## Marketing\n\n- **Astro** business site with tailored **SEO**/**GEO**\n- **Playwright** asset factory that generated ~70 store-ready screenshots across all platforms in 9 seconds"
}
