Shaker Mobile App - Technical Documentation
Shaker Mobile App - Technical Documentation
Section titled “Shaker Mobile App - Technical Documentation”Welcome to the technical documentation for Shaker, the mobile application component of the Bartendie home bar management system.
Overview
Section titled “Overview”Shaker is a React Native mobile application built with Expo that enables cocktail enthusiasts to manage their home bar inventory, discover and create recipes, plan events, and generate shopping lists. The app features a modern NeoBrutalism design system (RetroUI) and integrates with the Well backend for data persistence and real-time updates.
Quick Links
Section titled “Quick Links”- System Overview - Architecture, tech stack, and domain concepts
- Navigation & Routing - App structure and navigation patterns
- Component Architecture - UI components and design patterns
- Styling & Theming - RetroUI design system and NativeWind
Technology Stack
Section titled “Technology Stack”Core Technologies
Section titled “Core Technologies”- React Native - Cross-platform mobile framework
- Expo (SDK 54) - Development platform and tooling
- TypeScript - Type-safe development
- Expo Router - File-based navigation
State Management & Data
Section titled “State Management & Data”- Apollo Client - GraphQL client and state management
- GraphQL - API communication with Well backend
- Local Data Layer - TypeScript-based data structures for recipes, ingredients, products
- MMKV (
react-native-mmkv) - Fast on-device persistence for domain data
Styling
Section titled “Styling”- NativeWind - Tailwind CSS for React Native
- RetroUI Design System - NeoBrutalism design tokens and components
- Tailwind Variants - Type-safe component styling
Backend Integration
Section titled “Backend Integration”- Well - Elixir/Phoenix GraphQL backend
- Phoenix Channels - Real-time subscriptions
- Clerk - Authentication and user management
Key Features
Section titled “Key Features”- Barcode Scanning - expo-camera for UPC lookup
- Image Handling - expo-image for optimized images
- Secure Storage - expo-secure-store for sensitive data
- Haptic Feedback - expo-haptics for tactile responses
- Keep Awake - expo-keep-awake keeps screen on during bar service
App Structure
Section titled “App Structure”shaker/├── app/ # Expo Router screens│ ├── (tabs)/ # Tab navigation screens│ │ ├── index.tsx # Dashboard│ │ ├── events/ # Event planning (+ batch management)│ │ ├── recipes/ # Recipe management (+ batch cocktails, make flow)│ │ ├── inventory/ # Inventory tracking (+ products, ingredients, shopping)│ │ ├── settings/ # App settings + user profile│ │ └── venues/ # Venue management (hidden tab)│ ├── terms/ # Privacy policy and terms of service│ ├── _layout.tsx # Root layout (fonts, hydration, keep-awake)│ └── modal.tsx # Modal screens├── components/ # Reusable UI components (+ batch/, recipes/, tags/, skeletons/)├── data/ # Local data layer├── infra/ # Infrastructure (Clerk, MMKV storage, hooks)├── lib/ # Business logic utilities├── services/ # External services (UPC lookup)├── store/ # Lightweight in-memory stores (make completion state)├── styles/ # Design system and themes├── types/ # TypeScript type definitions└── utils/ # Helper functionsCore Concepts
Section titled “Core Concepts”Domain Model
Section titled “Domain Model”Shaker follows Domain-Driven Design principles aligned with the Bartendie domain:
- Recipes - Cocktail recipes with ingredients, instructions, and metadata
- Ingredients - Abstract ingredient concepts (e.g., “Vodka”, “Lime Juice”)
- Products - Physical items in inventory (e.g., “Tito’s Vodka 750ml”)
- Inventory - Stock tracking for products, equipment, glassware, tools
- Events - Occasions with menus, guest lists, and bar setups
- Shopping Lists - Auto-generated procurement lists based on recipes and events
Key Distinctions
Section titled “Key Distinctions”- Ingredient vs Product: Ingredients are abstract concepts; Products are specific physical items
- Recipe Ingredients: Recipes reference ingredient names, which map to products in inventory
- Flavor Profiles: 8-dimensional flavor vectors for ingredient matching and substitutions
Getting Started
Section titled “Getting Started”Prerequisites
Section titled “Prerequisites”- Node.js 18+
- pnpm (recommended) or npm
- Expo CLI
- iOS Simulator (Mac) or Android Emulator
Development Setup
Section titled “Development Setup”# Navigate to shaker directorycd shaker
# Install dependenciespnpm install
# Start development serverpnpm start
# Run on iOSpnpm ios
# Run on Androidpnpm androidTesting
Section titled “Testing”# Run all testspnpm test
# Run tests in watch modepnpm test:watch
# Run with coveragepnpm test:coverageDocumentation Sections
Section titled “Documentation Sections”Architecture & Setup
Section titled “Architecture & Setup”- System Overview - High-level architecture, tech stack, local storage layer
- Navigation & Routing - Expo Router, screen structure, Make Recipe flow, Batch Cocktails
- Component Architecture - Component patterns and organization
Design & UI
Section titled “Design & UI”- Styling & Theming - RetroUI design system and NativeWind
Features (Coming Soon)
Section titled “Features (Coming Soon)”- Recipe Management - Recipe CRUD, batch scaling, make-a-recipe flow
- Inventory & Products - Inventory tracking, barcode scanning, import/export
- Shopping Lists - Auto-generation and consolidation
- Cost Analytics - Price tracking and spending analytics
Data & State (Coming Soon)
Section titled “Data & State (Coming Soon)”- State Management - Apollo Client and data flow
- Authentication - Clerk integration and security
Development (Coming Soon)
Section titled “Development (Coming Soon)”- Custom Hooks - Reusable hooks and utilities
- Development & Testing - Dev workflow and testing practices
- Deployment & Builds - Expo builds and deployment
Integration (Coming Soon)
Section titled “Integration (Coming Soon)”- Real-time Features - Phoenix channels and subscriptions
- Backend Integration - Well backend and GraphQL
Contributing
Section titled “Contributing”When contributing to Shaker documentation:
- Follow the existing documentation style and format
- Include code examples for new features
- Update cross-references when adding new sections
- Test all code examples against the current codebase
- Update the “Last modified” date in YYYY-MM-DD format
Last Modified
Section titled “Last Modified”2026-03-06