Releases: cmadzz/cegin
Release list
v1.3.3 — Security, Performance & Quality
v1.3.3 — Security, Performance & Quality Release
Security
Critical Fixes
- Auth middleware hardened — invalid/expired JWT tokens now return 401 instead of silently passing through. Missing tokens still allowed in open mode.
- WebSocket authentication — server verifies JWT token on connection (
/ws?token=<jwt>), rejects invalid tokens with code 4001. Mobile client now sends token on connect. - ALLOW_ANONYMOUS env var — anonymous access is now explicit opt-in (
ALLOW_ANONYMOUS=trueby default for backward compatibility). Set tofalseto require auth on all routes. - Path traversal fix —
scanIdin Terry Vision upload is sanitized to alphanumeric characters only.
Hardening
- Helmet security headers — X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, etc.
- Auth rate limiting — 10 requests/minute on
/api/auth/loginand/api/auth/registerto prevent brute-force. - Input length validation — recipe title (200 chars), description (2000), notes (2000), ingredients (100 items), steps (100 items), tags (20 items).
- Email format validation on registration endpoint.
- Gemini model list cached server-side (1-hour TTL) — API key no longer sent to clients via proxy.
Database
Performance
- 11 new indexes added (from 2 → 13 total):
recipes(user_id),recipes(user_id, updated_at DESC)recipe_images(recipe_id)meal_plans(user_id, date)scanned_items(user_id, consumed, expires_at)push_tokens(user_id),cookbook_entries(user_id)chat_history(user_id, timestamp DESC)dietary_profiles(user_id),terry_vision_scans(user_id),shopping_list(user_id)
Data Integrity
- 9 functions wrapped in transactions:
clearStats,addRecipeImage,deleteRecipeImage,deleteCookbookEntry,clearCookbookEntries,deleteTerryVisionScan,clearTerryVisionScans,recordCook,registerPushToken,upsertNotificationSubscription. - user_id added to UPDATE WHERE clauses in
updateRecipeandupdateCollectionfor defense-in-depth. - Migration system —
server/migrations/directory withmigrate.jsrunner,schema_migrationstracking table, and baseline migration.
Server
Performance
- Async image writes —
saveBase64Imageconverted fromwriteFileSynctofs.promises.writeFile, no longer blocks the event loop. - Graceful shutdown — SIGTERM/SIGINT handlers close HTTP server, WebSocket server, and database cleanly.
- WebSocket ping interval
.unref()'d so it doesn't prevent process exit.
Architecture
- Shared utilities —
isPrivateIPextracted toserver/utils.js(was duplicated in index.js and ai.js). - Config module — magic numbers extracted to
server/config.js(rate limits, timeouts, body parser limits, WS ping interval). - Prompt module — AI prompts extracted to
server/prompts.jsfor easy tuning. - Request ID middleware — UUID per request attached to
req.requestIdfor log correlation. - Structured logging —
server/logger.jswith JSON format in production, pretty in dev, log levels (error/warn/info/debug). - Enhanced health check —
/api/health/detailedreports uptime, DB status, WebSocket connections, memory usage.
Mobile
Stability
- Error boundaries — reusable
ErrorBoundarycomponent wraps root navigator and all screen groups. Catches render errors, shows fallback UI with "Try Again" button. - 42+ empty catch blocks replaced with
__DEV__-gatedconsole.warnwith context-specific messages. - 123 console calls gated behind
__DEV__check (no more logs in production builds).
Accessibility
- Accessibility labels added to all interactive elements across 6+ screens: RecipeListScreen, RecipeDetailScreen, EditRecipeScreen, ShoppingListScreen, MealPlannerScreen, CookModeScreen, SettingsScreen, CookbookScreen, BottomNav.
- Includes
accessibilityLabel,accessibilityHint,accessibilityRole, andaccessibilityStatefor tabs/checkboxes.
Code Quality
- Deduplicated utilities —
splitLines,parseTimerMins,findAllTimers,buildRecipeObjectextracted to shared modules. - expo-image replaces
react-nativeImage in AssistantScreen and SettingsScreen. - Pressable replaces TouchableOpacity in SwipeableRow for consistency.
- Hardcoded colors in Markdown.js, SwipeableRow.js, VersionBanner.js replaced with theme values.
- Lazy screen loading — heavy screens (TerryVisionScreen, ScanRecipeScreen) use dynamic imports.
- GlobalTimerBar — 1-second interval only runs when active timers exist.
- WebSocket auth — mobile client passes JWT token in connection URL.
DevOps
- GitHub Actions CI/CD —
ci.yml(syntax + tests on push/PR),docker.yml(build + push on tag),mobile.yml(expo-doctor on tag). - Docker — healthcheck fixed, log rotation configured, non-root user, resource limits.
Documentation
- README.md — rewritten with features, tech stack, quick start, architecture overview.
- docs/API.md — all 59 REST API endpoints documented.
- ARCHITECTURE.md — system diagrams, data flows, auth flow, offline strategy, DB schema, security model.
- 22 review reports in
reviews/directory covering code quality, security, database, frontend, DevOps, and performance.
Download: Cegin-v1.3.3.apk (or from GitHub releases)
v1.3.2 — Bug Fix Release
v1.3.2 — Bug Fix Release
Server + Docker
- Fixed healthcheck: replaced
localhostwith127.0.0.1indocker-compose.ymland added properHEALTHCHECKto the Dockerfile (BusyBox wget on alpine was resolving to IPv6 first). - Bumped server version to 1.3.2 and synced
LATEST_SERVER_VERSION/LATEST_CLIENT_VERSION. - Refactored body-parser and auth middlewares with
getRoutePath()helper (usingoriginalUrl) for consistent route matching. - Improved
npm testto run real smoke tests (syntax + core modules). - Reduced noisy WebSocket connect/disconnect logs in production.
- Rebuilt and published Docker image
callum2254/cegin:1.3.2+:latest.
Mobile
- Fixed Expo dependency issues (missing
expo-fontpeer, duplicate versions). - Fixed app.json schema validation for splash by configuring via
expo-splash-screenplugin. - Bumped to 1.3.2 (versionCode 17).
expo-doctornow clean (20/21 checks pass).
Release & Docs
- Full release process: commits, tag
v1.3.2, GitHub push. - Built
Cegin-v1.3.2.apk(release). - Updated all version references, badges, and changelog on the site.
- Added this release notes.
Download the APK: Cegin-v1.3.2.apk (or from GitHub releases)
v1.3.1 — Bug Fixes & GPL-3.0 License
Bug Fixes
Server
- Nutrition endpoint now returns result — fixed missing res.json()
- /api/auth/me returns 401 instead of crashing 500 when no token
- Meal planner accepts client goal param, passes to AI prompt
- Image-proxy SSRF protection — blocks private/reserved IPs
- Vision model OpenAI path returns JSON — fixes empty fridge scans
- Collections uniqueness scoped per user
- Recipe photo upload: base64 images from camera/gallery now saved to disk
Mobile
- Terry meal plan actions land on correct day
- AI nutrition fallback fixes undefined/zeros
- Local shopping list accepts recipe arrays
- USDA DB staleness check re-copies on version bump
- Offline temp IDs remapped after sync
- Optional Bearer auth header
- Recipe photos: local file:// images converted to base64 before server upload
- HTTP cleartext allowed to any LAN IP (not just hardcoded ones)
License
- Switched MIT → GPL-3.0
- SPDX headers on all 71 source files
v1.3.0 — Local Nutrition Pipeline & Dietary Intelligence
v1.3.0 — Local Nutrition Pipeline & Dietary Intelligence
Summary
This release transforms Cegin from a recipe manager into a fully offline nutrition-aware cooking app. Every recipe now gets instant macro calculations, allergen warnings, and dietary audit suggestions — all powered by a 2.7MB local USDA database with 14,046 foods. No internet required for nutrition lookups.
Local USDA Nutrition Engine
The biggest feature in this release. A bundled SQLite database containing 14,046 foods from the USDA SR Legacy and Foundation Foods datasets, with full macro data (calories, protein, carbs, fat, fiber) for every entry. The engine uses a 6-strategy search pipeline to match user-written ingredient lines to USDA foods: exact description match, starts-with matching, UK/AU/CA alias matching, FTS5 full-text search, de-pluralization fallback, and last-word fallback. Each food has per-unit gram weights (e.g., 1 cup oats = 81g, not a generic 240g), and the system handles metric volumes (ml/litre), colloquial units ("1 handful", "1 tin"), and count-based items ("2 carrots"). A UK-to-US translation dictionary with 80+ mappings ensures British recipes like "lamb mince" correctly match "ground lamb" in the American database. The entire pipeline runs locally on the device — no server calls, no API keys, no latency.
Instant Allergen Detection
When a recipe loads, the app instantly checks every matched ingredient against a local allergen flags table (7,119 foods flagged). Colored badges appear at the top of the recipe: 🌾 GLUTEN, 🥛 DAIRY, 🥜 NUTS, 🫘 SOY, 🥚 EGGS, 🦐 SHELLFISH. This is completely offline and takes milliseconds — no AI call needed. The flags are based on USDA food categories, not AI guesses, so they're reliable for common whole ingredients.
Terry's Dietary Suggestions
When the dietary audit identifies ingredients that conflict with a profile's needs, Terry now suggests specific substitutions with exact quantities (e.g., "swap 100g butter for 100g ghee"). A new "Apply Terry's Suggestions" button collects all substitutions and opens a picker modal where users can choose between multiple options (e.g., ghee or coconut oil) or add their own custom swaps. When applied, the AI modifies the recipe and opens the editor with Terry's changes highlighted in red — only the new/changed lines appear as red text above each field, and the highlighting clears once the user starts editing. A dark loading overlay with spinner shows while the AI processes. The original recipe image is preserved through the substitution flow.
Pre-processing Pipeline
Before any ingredient line hits the database search, it passes through a multi-stage pre-processor. Compound lines like "For the sauce: 100g butter, 150g dark sugar, 200ml double cream" are split into separate items. Narrative prefixes ("For the filling:", "Toppings:") are stripped. Bracket weights are extracted — "1 tin coconut milk (400ml)" becomes "400ml coconut milk". Prep instructions are trimmed — "500g chicken thighs, diced" becomes "500g chicken thighs". Count-based items get estimated weights — "2 carrots" becomes 120g, "1 clove garlic" becomes 5g. This pre-processing ensures the maximum number of ingredients match the database, which is why nutrition accuracy jumped from ~50% to ~90%+ ingredient coverage.
Dietary Audit Intelligence
The dietary audit now only audits for people in the Health & Diet profiles — Terry never invents names. When all profiles are safe, the audit auto-collapses into a compact green bar ("✓ DIETARY AUDIT — ALL SAFE") that users can tap to expand. The audit prompt now includes explicit instructions to use exact quantities in substitutions and to only return entries for the people listed in the profiles.
🧠 Local USDA Nutrition Engine
- Bundled SQLite database — 14,046 foods (SR Legacy + Foundation Foods), 14,630 unit conversions, 7,119 allergen flags, 3,396 global aliases — all offline at 2.7MB
- 6-strategy search pipeline — exact match → starts-with → UK/AU/CA alias match → FTS5 full-text → de-pluralization fallback → last-word fallback
- UK-to-US translation dictionary — 80+ mappings: lamb mince→ground lamb, courgette→zucchini, plain flour→all-purpose flour, double cream→heavy cream, etc.
- Global aliases column — foods indexed with UK/AU/CA/CA synonyms for instant cross-locale matching
- Per-food unit conversions — exact USDA gram weights per cup/tbsp/tsp for each specific food (not generic densities)
- Custom unit conversions — 82 entries for produce ("1 medium banana"→120g), colloquial ("1 handful spinach"→30g), and tins/cans (400g)
- Metric liquid volumes — ml/litre handled as 1:1 gram equivalents
- Atwater validation — calories recalculated from macros if missing, with correct net-carb formula (fiber subtracted, not double-counted)
- FTS5 protein preference — when multiple foods match, prefers entries with actual protein data over sparse Foundation Foods entries
🥗 Instant Allergen Detection
- Local allergen flags — gluten, dairy, nuts, soy, eggs, shellfish detected instantly from USDA database (no API needed)
- Colored badges — 🌾 GLUTEN, 🥛 DAIRY, 🥜 NUTS, 🫘 SOY, 🥚 EGGS, 🦐 SHELLFISH displayed on recipe load
- Batched queries — allergen lookups chunked in groups of 20 to avoid SQLite parameter limits
🤖 Terry's Dietary Suggestions
- "Apply Terry's Suggestions" button — collects all audit substitutions and sends to AI to modify the recipe
- Substitution picker modal — when Terry suggests multiple options (e.g., "ghee or coconut oil"), user picks with radio buttons
- Custom substitution entry — user can type their own swaps and add them to the list
- Quantified substitutions — Terry now includes exact quantities in suggestions ("swap 100g butter for 100g ghee")
- Change highlighting — Terry's additions shown as red text above each field, with red banner "✏️ TERRY CHANGED: INGREDIENTS, STEPS"
- Edit tracking — red highlighting clears once user starts editing the field
- Image preservation — original recipe image preserved when applying suggestions
- Loading overlay — dark overlay with spinner and "Changes will be highlighted in red" while AI processes
- Profile-only audits — Terry only audits for people in Health & Diet profiles, never invents names
🔧 Pre-processing Pipeline
- Compound line splitter — "For the sauce: 100g butter, 150g dark sugar, 200ml double cream" → 3 separate items
- Narrative prefix stripper — removes "For the sauce:", "For the filling:", "Toppings:", etc.
- Bracket weight extractor — "1 tin coconut milk (400ml)" → "400ml coconut milk"he biggest feature in this release. A bundled SQLite database containing 14,046 foods from the USDA SR Legacy and Foundation Foods datasets, with full macro data (calories, protein, carbs, fat, fiber) for every entry. The engine uses a 6-strategy search pipeline to match user-written ingredient lines to USD
- Prep-instruction stripper — "500g chicken thighs, diced" → "500g chicken thighs" (strips comma + prep verbs)
- Count-based produce weights — "2 carrots"→120g, "2 potatoes"→340g, "1 clove garlic"→5g
🐛 Bug Fixes
- Crash fix: App reset no longer crashes —
clearFavoriteswas missing from favorites module - Data fix: Recipe updates no longer silently ignore
cookTime/prepTime/imagefields - Data fix: Activity cache now properly clears when diet profiles are cleared
- Import fixes: Restored missing
AppState,useState,useMemoimports that caused render errors - Food name fix: Commas in food names no longer break FTS5 search syntax
- Unit fix: "tin" unit now correctly maps to 400g
- Unit fix: ml/litre units handled as 1:1 gram equivalents (was falling through to 100g default)
- Count fix: "2 carrots" without explicit unit now defaults to 60g per carrot (was 1g)
- Fallback fix: Count-based items (qty > 1, no unit) default to 100g per piece instead of 1g
⚡ Performance
- Favorites and chat history now use in-memory cache for instant reads
- Timer context value memoized — prevents unnecessary re-renders
- Cookbook screen no longer fires redundant duplicate fetches
- Version banner replaced 60s polling with focus-based re-check
- Dietary audit auto-collapses when all profiles are safe
🧹 Cleanup
- Removed ~360 lines of dead code, unused imports, and duplicate logic
- Extracted shared
SwipeableRowcomponent - Extracted shared
fmtClockandparseTimerMinsutilities - Refactored
scanRecipeImageto reuse vision model dispatch - Unified duplicate recipe card rendering branches
- Server: extracted
parseId,cookbookEntryToResponse,saveBase64Imagehelpers - Server: added
applySubstitutionsendpoint for Terry's suggestions
v1.2.4
Changelog
1.2.4 — 2026-06-20
Timer Bar
- Tap timer pill to jump back to the exact step in cook mode
- Finished timers stay visible in the bar with green border and "0:00"
- DISMISS button to clear a finished timer (stops alarm and vibration)
- Cook mode stays mounted in background — returning from timer bar is instant
- Keep-awake only active when cook mode is focused
Timer Notifications
- Fixed notification trigger format for SDK 56 (old format silently rejected)
- Fixed notification channel initialization at app startup
- Fixed duplicate timer notifications (one per timer, scheduled at start)
- Timer uses
setAlarmClock()for exact scheduling (bypasses OEM battery optimization) - Notification channel uses longer vibration pattern for alarm feel
Timer Alarm
- Fixed timer alarm not stopping when dismissed (audio kept looping)
- Added
stopAlarmcallback socancelTimercan stop audio before removing from state - Fixed
player.stop()not being called beforeplayer.release()(Android needs both) - Removed duplicate vibration useEffect block in CookModeScreen
Timer Accuracy
- Fixed timer drift — now uses wall-clock time (
endTime = Date.now() + seconds * 1000) - Each tick recalculates remaining time from
endTime - Date.now()instead of decrementing by 1 - Timer and notification stay perfectly in sync regardless of interval drift
Fixes
- Added
initNotifications()called at app startup to eagerly create notification channels - Added
USE_EXACT_ALARMpermission for Android 12+ exact alarm scheduling - Added native
ExactAlarmmodule to check/request exact alarm permission at runtime
v1.2.3
Changelog
1.2.3 — 2026-06-20
Terry Vision
- Photos now sync to server — scans are shared across all your devices
- Server stores photos and ingredient data per scan
- Falls back to local storage when server is offline
- Deleting a scan removes it from server too
Terry AI Assistant
- Terry can now perform actions: add to shopping list, add to meal plan, save recipes
- Action results show as confirmation messages in chat
- Updated system prompt with action capabilities
Cook Mode
- Global timer bar visible on every screen (top in cook mode, bottom elsewhere)
- Tap a timer pill to navigate back to the correct step in cook mode
- Timer shows background notifications when app is closed
- "Something's Wrong" and "Adjust" buttons restyled as floating pill bar
Recipes
- Delete is now instant (optimistic removal) with undo toast
- Recipe count restored in top nav bar
WebSocket Sync
- Added ping/pong keepalive (15s interval, 10s timeout)
- Force reconnect on app foreground (drops stale connections)
- Debounced change callbacks (150ms) to prevent redundant fetches
- Server-side dead connection cleanup every 30s
Fixes
- Fixed FAB touch area when timer bar is present
- Fixed Terry Vision camera crash on Android (ActivityResultLauncher)
- Fixed hook ordering crash in TerryVisionScreen
1.2.2 — 2026-06-20
Terry Vision
- Multi-photo support: scan multiple fridges, cupboards, or freezers per section
- Photos display in a horizontal scroll with camera/gallery buttons on the left
- Auto-remove photos when AI can't identify any items (with red error toast)
- "FROM YOUR RECIPES" — matches scanned ingredients against your saved recipes (top 3, expandable)
- "TERRY SUGGESTS" — AI-generated recipe ideas with "GENERATE MORE" button for fresh suggestions
- Match scores show how many of the recipe's ingredients you have (e.g. 5/7)
Recipes
- New "URL" vs "MANUAL" mode when adding recipes — URL import shows dedicated input first, form appears after import with "MAKE EDITS" header
- Renamed "SCAN PHOTO" to "SCAN RECIPE" in add recipe menu
Fixes
- Fixed Terry Vision camera crash (ActivityResultLauncher error on Android)
- Fixed URL import missing from new recipe screen
- Toast component now supports custom text color and duration
- Fixed hook ordering crash in TerryVisionScreen
1.2.1
- Previous release
v1.2.2
Changelog
1.2.2 — 2026-06-20
Terry Vision
- Multi-photo support: scan multiple fridges, cupboards, or freezers per section
- Photos display in a horizontal scroll with camera/gallery buttons on the left
- Auto-remove photos when AI can't identify any items (with red error toast)
- "FROM YOUR RECIPES" — matches scanned ingredients against your saved recipes (top 3, expandable)
- "TERRY SUGGESTS" — AI-generated recipe ideas with "GENERATE MORE" button for fresh suggestions
- Match scores show how many of the recipe's ingredients you have (e.g. 5/7)
Recipes
- New "URL" vs "MANUAL" mode when adding recipes — URL import shows dedicated input first, form appears after import with "MAKE EDITS" header
- Renamed "SCAN PHOTO" to "SCAN RECIPE" in add recipe menu
Fixes
- Fixed Terry Vision camera crash (ActivityResultLauncher error on Android)
- Fixed URL import missing from new recipe screen
- Toast component now supports custom text color and duration
- Fixed hook ordering crash in TerryVisionScreen
1.2.1
- Previous release
v1.2.1 — Scan Recipe, Cookbook Fix, Vision AI
v1.2.1
Released: June 20, 2026
Scan Recipe — Vision AI
- Added "Clean & Fix with Terry" button on Scan Recipe screen
- Sends the photo to your configured vision AI to extract recipe fields
- Auto-fills title, ingredients, instructions, time, servings, and tags
- Privacy note shown: photo is shared with your configured vision AI
- New server endpoint: POST /api/ai/scan-recipe
Improvements
- Image URL text field replaced with Camera/Gallery buttons on manual recipe page
- "Clean up with AI" renamed to "Clean up with Terry"
- Help buttons (?) on Manual and Scan screens explain each section
- HISTORY button moved to far right in Terry chat header
Fixes
- Fixed cookbook entries duplicating in server mode — was double-writing to local cache and WebSocket refresh
- Fixed delete/update cookbook entries also double-writing to cache
- Fixed scan recipe crashing app on startup — ML Kit native module now lazy-loaded
- Fixed expo-file-system deprecation error — switched to expo-image-manipulator base64
v1.2.0 — Scan Recipe, Floating Navs, Material You
v1.2.0
Released: June 19, 2026
Real-Time Sync
- Added WebSocket-based real-time sync between devices sharing the same server
- Changes made on one device (add, edit, delete) appear instantly on all other connected devices
- Pull-to-refresh now fetches fresh data from the server instead of returning cached data
- No configuration needed — connects automatically using the existing server URL
Server
- WebSocket server on same port as HTTP (no extra setup or port forwarding)
- All mutating endpoints broadcast change events to connected clients
- Supported: recipes, collections, meal plans, shopping lists, favorites, cookbook, stats, dietary profiles, activity context, chat history, scanned items
Responsive Layout
- All 12 screens now scale dynamically to any device size (phones, tablets, foldables)
- Added responsive scaling utility (
useResponsivehook) —s()for spatial values,fs()for fonts - Base reference updated to 412px wide (Pixel 7 / typical modern Android)
- Scale capped at 1.0 — elements never get bigger than the base size, only smaller on compact phones
- Applied to: padding, margins, gaps, font sizes, icon sizes, border radius, component dimensions
Material You
- Implemented native Android module to read wallpaper accent color for Material You theming
- Reads accent from Android system settings first, falls back to WallpaperManager
- Falls back to default purple seed if device doesn't expose wallpaper colors
Scan Recipe (New)
- Take a photo or pick from gallery — on-device OCR reads the text (no internet needed)
- Automatically extracts title, ingredients, instructions, time, and servings
- Preview and edit results before saving
- Uses Google ML Kit for fast, private text recognition
UI Polish
- Floating pill-shaped nav bars on Recipe List, Shopping List, and Pick Recipes screens
- Nav bars contain title, search, action buttons — matching the bottom nav aesthetic
- Recipe list: CEGIN wordmark, search bar, sort, view mode, settings in top nav
- Shopping list: title, add input, AUTO and ⚡ buttons in top nav
- Category tabs (ALL, FAVES, QUICK, etc.) float below the nav bar with surface backgrounds
- Top navs float transparently over content — recipes/items visible when scrolling
- All rounded corners across 12 screens softened to match pill aesthetic (buttons, cards, inputs, badges, segments)
- Search bar and sort button in pill shape matching bottom nav
- Added CLEAR button to search history chips
- Search now filters locally — no server fetch per keystroke, no more flashing
- History only saves on submit (Enter), not on every keystroke
- Recipe images fade in smoothly over 600ms instead of popping in abruptly
- Default view mode changed to grid (two columns)
- FAB button shows menu with URL, Manual, and Scan Photo options
- Help buttons (?) on Manual and Scan screens explain how each section works
- "Clean up with AI" renamed to "Clean up with Terry"
- HISTORY button moved to far right in Terry chat header
- Image URL input replaced with Camera/Gallery buttons on manual recipe page
Fixes
- Fixed Terry Vision screen layout on smaller devices — capture buttons and photos no longer get cut off
- Reduced section card padding, photo height, and button sizes for better small-screen fit
- Fixed noisy
[WS] Error: unknownconsole spam in React Native - Fixed crash on Settings screen —
styleswas never assigned, causingProperty 's' doesn't existerror - Fixed crash on Cookbook and Shopping List —
swipeStyleswas callings()/fs()at module level before the hook existed - Fixed standalone components (
TerryAvatar,HistoryModal,MessageBubble,TypingDots,ToggleRow) referencingstylesfrom parent scope — now passed as prop - Fixed search saving partial words while typing — now only saves on submit
- Removed import URL section from manual recipe edit page
v1.1.6
v1.1.6
Released: June 19, 2026
Performance
- Reduced memory usage by ~35% (screens now unmount when navigated away)
- Image memory cache cleared on screen transitions and app backgrounding
- Stats, recipes, and cookbook load from cache instantly (no blank screens)
- Recipes page renders cached data on mount before fetching fresh data
- Removed unused google-signin dependency (-12MB bundle)
Server
- Added image proxy with on-the-fly resizing (sharp)
- Added try/catch to meal-plan/sync endpoint (was returning silent 500)
- Bumped body limit for cookbook endpoints (image uploads)
- Hardened syncMealPlan against malformed data
- Stats cached to AsyncStorage for instant loads
Fixes
- Fixed meal plan sync 500 errors
- Fixed 413 errors when uploading cookbook photos
- Fixed server cache not clearing when switching between servers
- Fixed stats not loading from local cache