Skip to content

Releases: cmadzz/cegin

v1.3.3 — Security, Performance & Quality

Choose a tag to compare

@cmadzz cmadzz released this 11 Jul 18:15

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=true by default for backward compatibility). Set to false to require auth on all routes.
  • Path traversal fixscanId in 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/login and /api/auth/register to 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 updateRecipe and updateCollection for defense-in-depth.
  • Migration systemserver/migrations/ directory with migrate.js runner, schema_migrations tracking table, and baseline migration.

Server

Performance

  • Async image writessaveBase64Image converted from writeFileSync to fs.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 utilitiesisPrivateIP extracted to server/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.js for easy tuning.
  • Request ID middleware — UUID per request attached to req.requestId for log correlation.
  • Structured loggingserver/logger.js with JSON format in production, pretty in dev, log levels (error/warn/info/debug).
  • Enhanced health check/api/health/detailed reports uptime, DB status, WebSocket connections, memory usage.

Mobile

Stability

  • Error boundaries — reusable ErrorBoundary component wraps root navigator and all screen groups. Catches render errors, shows fallback UI with "Try Again" button.
  • 42+ empty catch blocks replaced with __DEV__-gated console.warn with 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, and accessibilityState for tabs/checkboxes.

Code Quality

  • Deduplicated utilitiessplitLines, parseTimerMins, findAllTimers, buildRecipeObject extracted to shared modules.
  • expo-image replaces react-native Image 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/CDci.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

Choose a tag to compare

@cmadzz cmadzz released this 29 Jun 19:14

v1.3.2 — Bug Fix Release

Server + Docker

  • Fixed healthcheck: replaced localhost with 127.0.0.1 in docker-compose.yml and added proper HEALTHCHECK to 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 (using originalUrl) for consistent route matching.
  • Improved npm test to 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-font peer, duplicate versions).
  • Fixed app.json schema validation for splash by configuring via expo-splash-screen plugin.
  • Bumped to 1.3.2 (versionCode 17).
  • expo-doctor now 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

Choose a tag to compare

@cmadzz cmadzz released this 21 Jun 12:54

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

Choose a tag to compare

@cmadzz cmadzz released this 21 Jun 02:25

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 — clearFavorites was missing from favorites module
  • Data fix: Recipe updates no longer silently ignore cookTime/prepTime/image fields
  • Data fix: Activity cache now properly clears when diet profiles are cleared
  • Import fixes: Restored missing AppState, useState, useMemo imports 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 SwipeableRow component
  • Extracted shared fmtClock and parseTimerMins utilities
  • Refactored scanRecipeImage to reuse vision model dispatch
  • Unified duplicate recipe card rendering branches
  • Server: extracted parseId, cookbookEntryToResponse, saveBase64Image helpers
  • Server: added applySubstitutions endpoint for Terry's suggestions

v1.2.4

Choose a tag to compare

@cmadzz cmadzz released this 20 Jun 21:35

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 stopAlarm callback so cancelTimer can stop audio before removing from state
  • Fixed player.stop() not being called before player.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_ALARM permission for Android 12+ exact alarm scheduling
  • Added native ExactAlarm module to check/request exact alarm permission at runtime

v1.2.3

Choose a tag to compare

@cmadzz cmadzz released this 20 Jun 12:45

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

Choose a tag to compare

@cmadzz cmadzz released this 20 Jun 10:55

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

Choose a tag to compare

@cmadzz cmadzz released this 20 Jun 02:23

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

Choose a tag to compare

@cmadzz cmadzz released this 20 Jun 01:05

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 (useResponsive hook) — 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: unknown console spam in React Native
  • Fixed crash on Settings screen — styles was never assigned, causing Property 's' doesn't exist error
  • Fixed crash on Cookbook and Shopping List — swipeStyles was calling s()/fs() at module level before the hook existed
  • Fixed standalone components (TerryAvatar, HistoryModal, MessageBubble, TypingDots, ToggleRow) referencing styles from 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

Choose a tag to compare

@cmadzz cmadzz released this 19 Jun 12:57

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