The app is called Just Dough It; the open-source project is SourDough.
Bake better bread by listening to your kitchen, not a textbook.
SourDough takes the guesswork out of sourdough baking. It auto-detects your local temperature, water hardness, and location, then calculates your ideal final dough temperature (FDT), hydration targets, and fermentation timeline — all adjusted to your actual environment.
Most sourdough recipes assume a warm, standard kitchen and medium-hard water. But your kitchen might be chilly in winter, your tap water might be soft, and your flour might have different protein than what the recipe expects. SourDough adapts everything to where you really are:
- 🌡 Live ambient temperature via Open-Meteo weather data
- 💧 Regional water hardness from open water-quality datasets
- 🌾 Flour-specific protein data from a built-in catalogue of 60+ flours
- 📍 Location-aware — auto-detects your city via GPS or postcode lookup
Built with Expo SDK 56, React Native 0.85, and TypeScript. Runs on web, iOS, and Android from a single codebase. A landing page greets you with three cards — pick bread, yogurt, or lacto-fermentation — then dive into the full calculator.
- Auto-location — one-tap GPS → weather + water hardness for your exact spot
- Postcode refinement — enter a postcode for precise local conditions
- Manual mode — set temperature and postcode without granting location
- Flour picker — browse 60+ Shipton Mill flours by category, with protein %
- Multi-flour blends — mix flours at custom ratios; weighted protein and fermentation
- FDT calculation — computes your final dough temperature from the four inputs
- Dynamic fermentation — hour-by-hour model accounting for ambient drift, inoculation, hydration, and flour type
- Fermentation timeline — step-by-step schedule: autolyse → folds → bulk → shape → proof → bake
- Water hardness advice — tailored tips for soft, hard, and ideal water
- Feeding log — record each feeding by flour, water, and ratio
- Notifications — configurable feeding reminders via expo-notifications (coming soon)
- History — browse past bakes, search and filter saved recipes
- Private by design — no accounts, all data stored locally via AsyncStorage (weather and water-hardness detection need network; manual mode works offline)
- Local recipe data — no account or cloud recipe storage; optional cookieless website analytics are described in the privacy policy
- Location is transient — with permission, coordinates are sent to fetch weather and geocode your city; they are not saved with recipes
- Opt-in assistant — "Ask the baker" on the bread page answers questions with the app's own calculators via a Cloudflare Function and DeepSeek (based in China); nothing is sent until you press Ask and consent, no content is stored, and it stays hidden unless
EXPO_PUBLIC_ASSISTANT_ENABLED=1
- Installable PWA — add to home screen; works offline once loaded
- Share-friendly — every page has Open Graph/Twitter card metadata and a generated share image
- Optional cookieless analytics — set the
EXPO_PUBLIC_CF_BEACON_TOKENrepo variable in GitHub Actions to enable Cloudflare Web Analytics (privacy-respecting, no cookie banner needed)
- 10 starter cultures — thermophilic and mesophilic, each with its own incubation model
- Milk picker — cow, goat, sheep, and plant-based milks with adjusted yield
- Incubation timeline — target window, min/max range, and temperature cap
- Yield & nutrition — accounts for evaporation and straining losses
- Previous-batch starter — use yesterday's yogurt as today's inoculum
- 7+ ferment styles — dry salt, brine, and mash methods with volume conversion
- 25+ vegetables — density and water-release data for common ferments
- Salt calculator — converts between grams, percentage, and volume measures
- Day-by-day timeline — LAB succession from Leuconostoc to Lactobacillus
- Conditions-aware timing — the duration starts from the recipe's own documented baseline and is adjusted to your kitchen: forecast temperature (a cardinal-temperature curve, not a flat Q10), salt level, water chemistry, vegetable mix and how finely you cut it — with the arithmetic shown in the app and carried into the calendar event
- Fermentation ceiling — measured acid-demand vs sugar data flags vegetables that cannot reach full sourness (broccoli stops near pH 4.3) instead of pretending they will
- Cut size, starter culture — the two levers that matter most after salt, modelled from trial data rather than guesswork
- Automatic history — every ferment you calculate is recorded (no save button) and kept for 12 months, with one tap to load the inputs back into the calculator
- Add to Google Calendar — one tap drops the ready day, the first taste check, or the whole ferment into your calendar, with batch, salt and the day-by-day schedule filled in
cd SourDoughMobile
# Install dependencies
npm install
# Start the Expo dev server
npx expo start
# Run on a specific platform
npx expo start --ios
npx expo start --android
npx expo start --webRequirements: Node.js 22+, Expo SDK 56. Use the Expo Go app for quick testing on a physical device, or build a development client with EAS Build.
The web version is deployed on every push to main via GitHub Actions →
Cloudflare Pages.
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ GPS / │ ──▶ │ Open-Meteo │ ──▶ │ Ambient Temp │
│ Postcode │ │ Weather API │ │ + Forecast │
└─────────────┘ └──────────────┘ └──────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Nominatim │ │ Water │ │ FDT Calculator │
│ Geocoding │ │ Hardness DB │ │ + Hydration │
└─────────────┘ └──────────────┘ └──────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌──────────────────────────────────────┐
│ City Name │ │ Final Recipe: │
│ + Region │ │ • Water temperature to use │
└─────────────┘ │ • Ingredient weights │
│ • Bulk ferment duration │
│ • Step-by-step timeline │
└──────────────────────────────────────┘
| Directory | What it is |
|---|---|
SourDoughMobile/ |
React Native (Expo) app — iOS, Android, and web |
Note: The original Python CLI/GUI (
optimizer.py) has been retired. The mobile/web app is the canonical SourDough experience. The baking science lives inSourDoughMobile/src/lib/calculations.ts.
Contributions are welcome! Whether it's a bug fix, a new flour profile, or a feature idea:
- Fork the repository
- Create a branch —
git checkout -b fix/somethingorgit checkout -b feature/your-idea - Make your changes — follow the existing TypeScript/React Native patterns
- Test — run
npx expo startand verify on web or device - Commit — use clear commit messages describing what changed and why
- Push and open a Pull Request
- New flours — add entries to
SourDoughMobile/src/data/flours.ts - Bug fixes — include steps to reproduce in your PR description
- New features — open an issue first to discuss the approach
- Docs — improvements to READMEs, comments, or error messages
- TypeScript: follow the existing Expo/React Native patterns
- Keep it readable — this is a baking tool, not a spaceship
This project is licensed under the MIT License — see LICENSE for the full text.
In short: you can use, modify, distribute, and even sell this code. Just keep the copyright notice and don't hold us liable.
SourDough takes your privacy seriously:
- ❌ No accounts required — no sign-up, no login
- ✅ Privacy-minded analytics — optional Cloudflare Web Analytics measures site use without cookies; no account or recipe data is sent
- ❌ No cloud storage — your recipes stay on your device
- ✅ Location is transient — if you allow location access, coordinates are used to fetch weather and identify your area; they are not saved with recipes
See SourDoughMobile/PRIVACY.md for details.
- Weather data: Open-Meteo — free, open-source weather API
- Geocoding: OpenStreetMap / Nominatim
- Flour data: Shipton Mill — amazing flour, amazing mill
- Built with Expo and React Native