Release notesWhat’s new in ¡Qué rico!Every version of the app, newest first — what changed on iOS, Android and the web. The text of a version is the same text that goes into the store release notes.
1.9.1
Store release
October 15, 2026
Changed
Expo SDK 57 patch updates as npx expo doctor recommends them; no visible change. (iOS, Android, Web)
1.9.0
Over-the-air update
October 15, 2026
Added
"What's new": every version of the app with its release notes, newest first, rendered from this changelog. Linked from About us (under the shipped milestones), from the footer on the web, and from the About section of the profile on iOS and Android, also when signed out. Each version has a copy button that gives the store-ready text — the same text that goes into App Store Connect and the Play Console. (iOS, Android, Web)
Fixed
iOS, Android: the filter button in the cookbook stayed in place while typing a search, but jumped to the top of the screen the moment the search had no results, and back with the next keystroke. The no-results state now renders inside the same list as the results.
1.8.0
Store release
October 14, 2026
Added
A staging app next to the store app, from the same code (iOS, Android): "¡Qué rico! Staging", net.que-rico.app.staging / net.querico.app.staging, built against the staging host and the staging Auth0 tenant. Every merge into main reaches it through TestFlight internal testing and the Play internal track when native code changed, and as an over-the-air update on the preview channel otherwise (.eas/workflows/deploy-staging.yml, replacing the preview-channel update). Store users are untouched. One-time store registration: docs/staging-app-runbook.md.
Changed
Local prebuilds and the EAS development profile produce the staging app, so a development install no longer shares the store app's identity. The Universal Links entry for the Auth0 callback follows the tenant the build authenticates against (it was fixed to production, which left builds against the staging tenant unable to verify their callback on iOS).
1.7.0
Store release
October 14, 2026
Rolled out together with backend 0.5.0 and MCP server 1.1.1; the backend is promoted first.Changed
Every ingredient and every tool a recipe lists must be placed in one of its steps, and the steps may only mark things the recipe lists. The wizard already placed chips and warned; it now stops before "Next" and before publishing until the lists and the steps agree, and the review step says so. A recipe without any placed chips used to publish regardless — the backend now rejects it the same way, naming what is missing, so an older app version sees that message at publish. (iOS, Android, Web)
The MCP address shown in the assistant setup guides (Claude, ChatGPT, Le Chat) is the address of the environment the app runs in: staging shows the staging server, production the production server. It used to be the production address everywhere, including on staging. On the web it is read from the host's container environment (QUE_RICO_MCP_SERVER_URL); native builds carry it per EAS profile. (iOS, Android, Web)
1.6.0
Over-the-air update
October 14, 2026
Ingredient substitution, food photos and "what I have at home" — one release (needs backend 0.4.0; contracts ../que-rico/.claude/plans/2026-10-10_ingredient-substitution-graph-contract.md and ../que-rico/.claude/plans/2026-10-11_substitute-swaps-and-pantry-search-contract.md). Three sources of a substitute, always labelled, in this order: reviewed alternatives from the catalogue, the recipe author's own, and suggestions from an automatic mapping that are always marked as estimates. (iOS, Android, Web)
Every ingredient's detail sheet lists its substitutes: reviewed rules with the converted amount, role, where the swap holds and a note; the author's alternatives; then, apart under the estimate notice, the suggestions with the reasons they were found. Signed in, entries that do not fit your allergens, diet or never-list stay listed, greyed, with the reason.
"Adapt this recipe": vegan, vegetarian, pescetarian or for your profile — the recipe is shown with the swaps in place and nutrition, labels and claims recomputed; what could not be swapped is listed; nothing is stored. The steps follow the swaps: "Die Eier (120 g) halbieren" becomes "Tofu (120 g) halbieren", by its short name and without the original's article, and the same word elsewhere in the steps ("das Hähnchen wenden") changes with it.
Every substitute in an ingredient's sheet has Verwenden: the recipe switches to that exact swap. Own picks stack with a diet chip and stay when you change it; "Original" undoes everything. A swapped-in suggestion reads as an estimate in the ingredient list too ("≈ 300 g").
Cookbook filter Habe ich: pick foods you have at home. The cookbook then also shows recipes where a reviewed swap or the author lets your food replace an ingredient, with the swap on the photo ("Rapsöl → Olivenöl"). Opening such a recipe shows it already adapted with that swap.
Food photos: most foods in the catalogue now come with a photo of the food as bought — in the wizard's ingredient search, at the top of the ingredient detail sheet and in the editor's food list. Replacing or removing a food's photo keeps the editors' choice for good.
Recipe steps name the amount after each ingredient ("die Kartoffeln (300 g) schälen"), scaled with the servings, the same as the ingredient list — at its first mention, and not where the author already says how much ("eine Prise Safran", "die Hälfte der Butter"). While writing a recipe, steps still show the name alone. A food listed twice in one recipe keeps the plain name in the steps. Units read in the plural where the language has one ("2 Prisen"), and swaps show short names ("Rapsöl" rather than "Rapsöl, zum Verzehr geeignet") in the steps, the adapt banner and the "Habe ich" badge.
Recipe wizard: each ingredient shows the catalogue's alternatives and lets the author add up to three of their own for the special case, with an optional amount and note; drafts keep them. An alternative is narrowed like the ingredient itself: its kind and bought-as chips pick "Olivenöl nativ" rather than just "Olivenöl".
Editor: a kind's substitution rules — own and inherited — can be added, changed and hidden, and a suggestion promoted to a reviewed rule; the rule being edited opens in place under its row, and "Kontext" explains that no selection means everywhere. A food's photo sits above its name, and deleting a food uses the same destructive button as the profile.
Fixed
The wizard's header (back, step name, save draft, close, progress) stays at the top while a long step scrolls, like the Back/Next bar at the bottom. It used to scroll away with the content.
"Alternative hinzufügen" in the wizard works again: its search results lay under the note field, so a tap landed there, and on iOS the first tap on a result only closed the keyboard. The same first tap now also picks a food in the cookbook's "Habe ich" search, and on iOS both result lists scroll up above the keyboard instead of opening behind it. Editing a published recipe keeps its alternatives: they load into the wizard, and saving sends them back instead of removing them.
iOS and Android: the app no longer falls back to the privacy page when it rebuilds its screens (for example after a reload); the cookbook is the base screen, and a page opened from a link has the cookbook to go back to.
Web: a visitor who is not signed in keeps the language the page was served in (the cookie or the browser's preference). The client used to switch to the browser locale after the HTML arrived, which flipped the text and raised a hydration error whenever the two differed.
1.5.1
Over-the-air update
October 13, 2026
Internal: one web image for every environment. The image no longer bakes the backend, the Auth0 tenant or the origin: the compose file of each host sets them as QUE_RICO_* container variables, the server writes them into the page per request and the browser bundle reads them from there. The same image is :next on staging and, re-tagged on promotion, :latest on production — as the backend and MCP images already were. The second export that 1.5.0 added to release.yml is gone; its :next image had in fact still carried the production values, because Metro's cache served the first export's modules. Requires the matching compose change in que-rico on the hosts before this version is promoted. Fallbacks without any configuration are the staging environment throughout (constants/api.ts, constants/site.ts included). (Web)
1.5.0
Over-the-air update
October 13, 2026
Internal: every build that is not a production artefact now runs against the staging environment — the staging backend and the staging Auth0 tenant: local development (the fallbacks in the code), the EAS development and preview profiles, the over-the-air updates on the preview channel, and the web image tagged :next, which release.yml now exports a second time with staging values. Production builds, the production channel and the web image tagged :<version> / :latest are unchanged: their values come from the workflows, which now also set the web client id explicitly. Background: the production Auth0 tenant loses its localhost callbacks (que-rico, Auth0 as code, 2026-10-03). Existing preview and development builds must be rebuilt once — their Auth0 domain, part of the native build, changed to staging. (iOS, Android, Web)
1.4.3
Over-the-air update
October 13, 2026
Changed
Internal, documentation only: the web deployment runbook describes the current pipeline (GHCR image built on merge, promoted on release, served by the Node server behind the edge cache) instead of the retired static export on Docker Hub; the Claude agent briefs (.claude/agents/) describe the current styling, navigation, data and auth setup; CLAUDE.md records that the Auth0 configuration for the native HTTPS callbacks is done. No change to the app.
1.4.2
Over-the-air update
October 10, 2026
The profile screen shows which version this installation runs: the version always, the store build once an over-the-air update has moved past it, and the short id of the running update — so "which version do you have?" has one answer even when the store listing shows an older number. Web shows the version alone, and also in the footer of every page, without login. (iOS, Android, Web)
1.4.1
Store release
October 10, 2026
time (the version fields leave it); every later release without native changes is an over-the-air update.
Releases without native changes reach installed apps as over-the-air updates again instead of a store build: the native fingerprint no longer includes the version fields (version, build number, version code), which change with every pull request. (iOS, Android)
Every changelog section now opens with its delivery path — Delivery: over-the-air or Delivery: store release — <native change> — so the store steps (App Store Connect "What's New", Play Console rollout) are decided per change, not discovered at promotion time. The pull-request check enforces the line.
1.4.0
October 4, 2026
The ingredient catalogue is now EFSA's FoodEx2 food classification, with nutrition from the German BLS 4.0 and USDA. Needs backend 0.3.0.Added
Pick the kind and the form of an ingredient (iOS, Android, Web). Below each ingredient in the recipe wizard you choose the kind ("Pink salmon", "Wholemeal rye flour") and how it was bought (raw, frozen, smoked …); the "cooked as" menu offers only the ways that food is actually cooked. Search also finds a kind directly ("Canned fish › Canned salmon") and marks foods without nutrition data.
Skip whole food groups in the cookbook (iOS, Android, Web). "No fish", "No pork", "No nuts" … hide every recipe containing any food of the group, including what is made from it. Your profile's never-foods show as standing rules.
Ingredient details (iOS, Android, Web). Tap an ingredient in a recipe for its allergens, traces, diet label, density and nutrition per 100 g, with the data source.
Editor: FoodEx2 food items (Web). Browse by FoodEx2 category, edit a food's kinds and forms (allergens, diet tier, density, piece weight), create foods, kinds and forms FoodEx2 does not name, and see each food's FoodEx2 classification path with its codes and each kind's FoodEx2 code.
Editor: nutrition values on every form (iOS, Android, Web). Editors enter or correct the nutrition of any form, also where the catalogue has no data (Baklava). The eight core values are required; minerals, vitamins, fats, carbohydrate detail and amino acids each have their own section, and a note says where the values come from. The editor's values replace the source values in recipes; "Reset to BLS" brings the source back.
Changed
Ingredient names come from the FoodEx2 catalogue; German and Spanish names are machine-translated until reviewed.
Fixed
The +/− steppers (servings, times) now react to a single click on the web; holding still repeats. (Web)
German filter chips keep nouns capitalised ("Kein Fisch", not "Kein fisch").
Liquids can be entered in ml as well as g (iOS, Android, Web). A food whose form has a density (milk, oil, juice, broth) now offers g, kg, ml and l in the recipe wizard, with ml as the default; solids keep g, kg, Prise and Stück. This matches what the backend accepts, so "Prise" on a liquid can no longer fail at publish.
The keyboard no longer covers the field being typed in — in the editor ("Add kind"), the recipe wizard (video link, steps, notes), the profile and My Area; the screen scrolls it into view. (iOS)
Names of cuisines, recipe types, tools, food groups and ingredients start with a capital letter everywhere — wizard, filters, profile, recipe page, editor — and keep the rest as written ("Brühe (Würfel oder Pulver)", not "Würfel Oder Pulver"; "Deutsch", not "deutsch").
Recipe wizard: the ingredients, preparation and step lists scroll with a swipe anywhere on a row, not only beside the list. Reordering starts on the ⋮⋮ grip, as before. (iOS, Android; the web keeps its plain lists)
Internal: Argent (native UI testing by Claude) is registered in the repo; the German/Spanish chip, search and editor behaviour above were verified on all three platforms.
1.3.5
September 28, 2026
Changed
Internal: the logic modules (API clients, utilities, constants, types, i18n bootstrap) are now covered by unit tests — 869 tests, 99.9 % of lines and 97.8 % of branches, up from 66 % / 76 %. No change to the app.
1.3.4
September 27, 2026
Fixed
My Area: the "Published" count in the kitchen summary no longer changes when the Favourites tab is selected — it counts published recipes only.
Android: a resumed draft's photo now shows in the photo step, the review and the draft card. The private draft image is downloaded with the account token into the app cache and shown from there (iOS and web unchanged in behaviour).
Changed
Internal: dependency updates from npm audit fix (25 advisories → 14; the rest are inside Expo SDK 57's own dependency tree and wait for upstream). CI installs with --ignore-scripts and runs the tools through package scripts instead of npx.
Internal: every pull request is analysed by SonarCloud and its quality gate (coverage on new code, new issues) fails the CI job. Coverage is measured on the logic modules (api, utils, types, constants); the React tree is analysed but not coverage-gated, as the project has no component tests.
1.3.3
September 27, 2026
Changed
Internal: the code base is lint-clean under the React Compiler rules, and the CI lint now fails on any warning. Lists reset to page 1 and URL-requested tabs are derived during render instead of in an effect, so the first frame after a new search or a deep link already shows the right page and tab (all platforms; no visible change otherwise).
1.3.2
September 27, 2026
Changed
CI only: the web image is built in minutes again. The bundle is exported natively on the ARM build runner and only copied into the amd64 image; running the export inside the image build meant Metro under emulation and the release job hit its 30-minute timeout. The Dockerfile is unchanged for a self-contained build (the local stack).
1.3.1
September 27, 2026
Changed
CI only, nothing in the app: the GitHub Actions the workflows use are moved to their Node 24 releases (actions/checkout@v7, actions/setup-node@v7, docker/setup-buildx-action@v4, docker/build-push-action@v7). Every run had been warning that GitHub is retiring Node 20 for actions.
1.3.0
September 27, 2026
Added
Update required screen (iOS, Android). The app now asks the backend for the oldest supported version on launch and when it returns to the foreground. A build older than that shows a full-screen prompt with an "Update now" button to the App Store or Google Play; an available over-the-air update is applied first. Nothing changes while the check is loading or unreachable. From the next store release on, older builds are asked to update once the new one is live in both stores.
1.2.1
September 27, 2026
Changed
The display name of a new account is no longer set by the app. The backend now gives every account "Chef Incognito" on first contact, whichever client that is, and the profile screen shows it right away; you still choose your own name on the profile screen as before. New accounts no longer start with the name from the sign-in provider — a pseudonym until you decide is the safer default for a name that appears on public recipes. Existing accounts keep their names. (iOS, Android, Web)
1.2.0
September 26, 2026
Added
The web app remembers an explicit light or dark choice in a cookie and renders it on the server, so a page never flashes the wrong theme (Web).
This changelog, bumped together with the version in every pull request into main, and pr-checks.yml to check it.
release.yml (git tag, GitHub Release, web image :x.y.z + :next) on every merge into main, promote.yml (:latest) on a push to release, and an OTA update on the preview channel on every merge into main (iOS, Android).
Changed
The app talks to the backend's versioned API (/v1/...), so future breaking API changes can ship next to the old routes without breaking installed builds.
The assistant setup guides show the new MCP address https://mcp.que-rico.net/mcp (Web).
Upgraded to Expo SDK 57 (React Native 0.86) on all three platforms. New store builds are required; older installs stop receiving over-the-air updates.
Over-the-air compatibility now follows the native code fingerprint instead of the version number, so the version can be bumped for every release without orphaning the update channel (iOS, Android).
Gluestack core and utils moved from alpha tags to the stable 5.0.15 / 5.0.6, and every local customisation in the vendored components is marked.
Fixed
The server address on the assistant setup guides no longer logs a React warning: the web text component now maps selectable to CSS instead of passing it to the DOM (Web).
The profile menu on the web uses a fixed trigger id, so the menu stays attached to its button across server render and hydration (Web).
## [1.1.0] and earlierReleased before this changelog existed; see the git history and the merged pull requests.