Key takeaways
- Moved the AI proxy behind Refuel AI off a temporary self-hosted server onto an AWS Lambda Function URL, with Anthropic, OpenAI and Gemini all supported behind one contract.
- Fixed a real bug: custom Info.plist keys (backend URL, support URL, privacy URL) were silently not reaching the app because of how Xcode generates Info.plist.
- Ran a full production-readiness audit: auth-gated AI access, honest error states instead of fake replies, synced crisis-keyword safety across every backend, and tightened data export.
- Updated the app's App Privacy declarations and public privacy policy (EN/UK) now that AI requests genuinely leave the device.
- Shipped TestFlight builds 5 and 7 (1.4.0), and gave mommyrefuel.com an honest rewrite for testers, and future investors.
Where the day started
The self-hosted AI proxy from two days earlier worked, but it was never meant to be permanent — it lived on infrastructure I did not want to depend on long term, and it only spoke to one AI provider cleanly. On 2026-09-02 I rebuilt it properly, and then spent the rest of the day auditing everything downstream of it, because an AI feature that reaches into a mother's wellbeing data is not something I am willing to ship on faith.
A real home on AWS Lambda
I built a small, dependency-free AWS Lambda handler behind a Function URL that speaks the same contract as the rest of the backend, across three providers — Anthropic, OpenAI and Gemini. It runs the deterministic safety gate before any model is called, rejects any request carrying a field it should never see, and requires a bearer token on every request, since a public Function URL with no guard is not a proxy, it is an open door. Along the way I also added Gemini as a third provider option in both the Supabase edge function and the earlier self-hosted proxy, so the architecture stays consistent everywhere the AI can run.
One decision I want to be explicit about: Gemini is not part of automatic fallback by default. Its free tier may use request content to improve Google's products, which is not acceptable for the kind of sensitive context this app sends, unless billing is explicitly enabled. So if Anthropic or OpenAI fail, the app does not quietly slide over to Gemini behind your back — it only uses Gemini when explicitly chosen, and I documented exactly what has to change before that default can move.
A bug that had been hiding since the first build
While wiring the app to the new Lambda URL, I found something that had been broken from the very beginning: the app's custom settings — its backend URL, its support URL, its privacy URL — were set as build settings, but Xcode only auto-generates an Info.plist from settings it recognizes itself. Our custom keys were simply never making it into the app. That explains a small mystery from a few days earlier: why the new Support and Privacy rows I wired up on 2026-08-29 were dead. The fix was to give the app a real, explicit Info.plist file that carries these keys, verified end to end, live, against the real Lambda: health check confirms the key is configured, a missing token gets a 401, a crisis phrase gets routed to the safety path without ever reaching a model, and a forbidden field gets rejected. All four checks passed before I trusted this build.
A full production-readiness audit
Once the AI proxy was solid, I stepped back and asked a harder question: if this shipped to real people right now, where would it lie to them? I went through eleven specific items. A few worth naming: the app now returns a typed outcome for every AI request instead of ever quietly substituting a fake reply when the backend or your sign-in fails — you see "offline" or "temporary problem, try again" instead of a hallucinated response pretending to be normal. When Supabase per-user authentication is configured, that becomes the real production path, with a gentle Sign in with Apple prompt for guests rather than a silent failure, and guests keep every local feature. I also synced the crisis-keyword safety list across the client, the Supabase edge function, the self-hosted proxy and the AWS Lambda — the two node-based backends had been missing close to a dozen English and Ukrainian phrases, which is exactly the kind of gap that matters most in a safety system, and I added regression tests so it cannot silently drift apart again. On the data side, the account-export function had been leaking two internal fields (push token, installation ID) that had no business in a personal data export, so I removed them and tightened what devices' exports actually contain.

Being honest about what the AI sends
Once requests genuinely left the device to reach a live AI backend, the app's own App Privacy declaration stopped being accurate — it still said "data not collected," which was true before that day and false after. I updated it to describe exactly two things that leave the device: a minimized set of mood, energy, sleep, symptom and Refuel Score signals, and the free-text message you type to the assistant — both marked as not linked to you for tracking, no advertising use. Private notes, recovery notes and journal entries never leave the device; that boundary is enforced on the server, not just promised in a settings screen. I updated the public privacy policy at mommyrefuel.com to say the same thing, in plain English and Ukrainian, including that a message may be routed to a third-party AI provider (Anthropic, OpenAI or Google), and that crisis text is always handled on-device before anything is sent anywhere.

TestFlight builds 5 and 7
Build 4 (version 1.4.0) had already gone to App Store Connect before this day; build 5 shipped the production-ready backend and audit work above. A build 6 went out with a redrawn app icon — but it turned out to still ship the old, blurry version, since the icon source was a 360px image stretched to 1024. I redrew it as a real vector, matching the original design exactly rather than reinterpreting it, and build 7 shipped with the crisp version, confirmed valid in App Store Connect.
An honest rewrite of the website
I closed the day by rewriting mommyrefuel.com, which still described the app as "heading to TestFlight" — it had been in TestFlight for days. I removed an unsourced "backed by science" badge in favor of "safety-first by design," which I can actually back up, added a "built, not promised" section listing only verifiable facts (TestFlight builds, the passing test count, two supported languages, zero ad trackers), and a roadmap that is honestly labelled: what is here now, what is next, what is later, with every target marked as a target, not a promise. I also added a short, honest section for future investors — no revenue, no paying users, no traction claims, stated plainly, because a founder update that oversells itself is worth nothing to anyone.
Where and when
- 2026-09-02, 10:54–15:10 — Anthropic workspace headers, Claude Opus 5 support, cost-efficient default models, Gemini/Vertex added as a third AI provider on both backends, on-device wellbeing ML architecture scaffolded (unshipped, no model bundled) (6c94be2, 925963e, 7f901b1, ab7f5f7, 3df23cb).
- 2026-09-02, 14:40 — AWS Lambda AI proxy built and deployed, Function URL, three-provider support, safety gate, bearer-token guard (dbc1f62).
- 2026-09-02, 14:52 — iOS Info.plist bug fixed; app now genuinely reads its backend/support/privacy URLs; verified live against the AWS Lambda (f45809a).
- 2026-09-02, 15:17–20:32 — App Privacy declarations reclassified, public privacy policy updated EN/UK, AWS deploy runbook written, Gemini excluded from automatic fallback by default (c8338d8, 128b936, 2dd8058, c7f6033).
- 2026-09-02, 20:41–21:13 — Per-user Supabase authentication wired as a config-only switch for the AI path, plus a Sign in with Apple setup runbook (e6ce352, 126a07e, 79e01d8).
- 2026-09-02, 21:07–21:08 — Production-readiness audit shipped: typed AI outcomes, auth-gated production path, synced crisis-keyword safety, tightened data export, documented VERIFIED/EXTERNAL/BLOCKED status (23d301e, 0154076).
- 2026-09-02, 21:45 — TestFlight build 5 (1.4.0) (9c26074).
- 2026-09-02, 21:56–22:12 — App icon redrawn as a crisp vector; build 6 briefly shipped the old blurry icon, corrected in build 7, confirmed valid in App Store Connect (8f06674, 920dedf, 556b9f4).
- 2026-09-02, 22:22 — mommyrefuel.com rewritten: honest "built, not promised" section, labelled roadmap, investor section (f4f7109, 51f0e07).
What this means if you use the app
If you talked to Refuel AI after this day, your message travelled further than before — to a proxy I control, and from there to one AI provider, never more than one, never Gemini unless the setup allows it. If anything about your sign-in or connection failed, you saw an honest message instead of a fabricated answer. And if you typed anything that looked like a crisis, it was caught before it reached any model at all, on every single backend path, in English and Ukrainian.

Questions mothers ask
Where does my message to Refuel AI actually go?
To an AWS-hosted proxy I run, which applies a safety check first, then forwards a minimized context and your message to one AI provider (Anthropic, OpenAI, or Gemini only when explicitly configured). Private notes, recovery notes and journal entries are never sent.
What was the Info.plist bug, in plain terms?
The app's custom settings, like its backend and support URLs, were configured in a way Xcode does not automatically carry into the app. They looked set in the project but were silently missing at runtime. Fixed by giving the app an explicit Info.plist file.
Does the app ever send my private journal to an AI?
No. That boundary is enforced on the server side with automated tests, not just a setting — private notes, recovery notes and journal entries are excluded before any request is built.
What happens if the AI backend is down?
You get an honest "offline" or "temporary problem, try again" message. The app never quietly fabricates a reply and presents it as if the assistant answered normally.
Did TestFlight builds 5 and 7 add new features?
Build 5 shipped the production-readiness work above. Build 6 and 7 were both about a single change: fixing the app icon so it renders crisp instead of blurry; build 7 is the corrected version.
Availability can vary with the installed app version. Statuses are founder-confirmed at the time of writing.



