• 8 posts
  • 7 comments
Joined 2 months ago
Cake day: April 27th, 2026
  • Here is what i see as some differences today between CookTrace and Tandoor:

    CookTrace:

    • Pantry is a real first-class catalog, not a tag list. Barcode scanner, Open Food Facts + USDA lookup, per-item stock / serving size / nutrition, plus an “8 / 10 in pantry” match pill on every recipe card. Tandoor has the food list; CookTrace treats it as a primary surface.
    • AI assistant with tool use — not just a chat bubble. Trace can log a cook, plan a cook, add things to the shopping list, mark a pantry item out of stock, import a recipe URL, etc. by reading and writing your real data
    • FDA-style Nutrition Facts box auto-computed per recipe from pantry-linked ingredients
    • Android app with full offline mode (on-device SQLite, differential sync when you reconnect)
    • NutriTrace federation can import foods from NutriTrace directly into CookTrace’s pantry.

    Where Tandoor still wins today: PDF / image OCR bulk import, longer track record, larger ecosystem, iCal meal-plan feeds.

    Importer’s there in CookTrace, so you can move a copy over to compare with zero risk to your existing library whenever the time shows up.

  • Honestly, not automagically. CookTrace’s bulk importers today handle JSON, HTML, schema.org Recipe markup, and full-backup zips from Mealie / Tandoor / Paprika. Plain text, RTF, and PDF aren’t on that list yet, and there’s no “point at a folder and import everything” mode.

    What works today for the same end goal:

    • Photo Import — point Trace AI at an image of any recipe (including a PDF you’ve screenshotted) and it extracts it. Fine for a handful, probably painful for hundreds.
    • Trace AI chat — paste the recipe text into the assistant and ask it to create a recipe. Same idea, no image step.

    A proper OCR import is a worthwhile feature. I created a feature enhancement request in the GitHub repo, so that in the near future I can set aside some time to explore how feasible it would be to implement.

  • That URL should import cleanly; it’s a standard food blog with the markup the importer expects.

    TikTok though, honestly, no. TikTok pages don’t expose the recipe text to scrapers and the AI fallback has almost nothing to work with. A real TikTok URL importer would need to call TikTok’s caption API and transcribe the video audio, which isn’t built yet.

    Workaround that may possibly work today: screenshot the recipe overlay (or the comment where the creator wrote it out) and use Photo Import the AI extracts the recipe from the image. Two taps, same result.

First public release of CookTrace, a self-hosted, fully-featured recipe manager for keeping every recipe you cook in one place, with the pantry, cook diary, shopping list, and Android app to match. Inspired by apps like Mealie, built as the third app in the Trace family alongside NutriTrace (nutrition) and LiftTrace (lifting). Single Docker container, AGPL-3.0, no telemetry, no cloud sync, no subscriptions.

Repo: https://github.com/TraceApps/cooktrace Release: https://github.com/TraceApps/cooktrace/releases/tag/v1.0.0-rc.1 Docker (amd64 + arm64): ghcr.io/traceapps/cooktrace:latest

Recipes

  • Full recipe model: hero photo, ratings, ingredient groups, step-by-step instructions with per-step photos, kitchen gear, source / video URLs, rich-text notes
  • Live scaling with snap-to-cooking-fractions math (1 ½ cup not 1.5 cup)
  • Inline unit converter per ingredient with a built-in 250-entry density table, so volume → grams resolves correctly for flours, oils, dairy, sugars
  • Cook Mode with screen wake-lock, bigger fonts, persistent checkboxes
  • FDA-style Nutrition Facts box per recipe (31 nutriments, %DV column)
  • Cook log — date + notes + photo per cook, full per-recipe history
  • Sharing — per-user grants, public-link share tokens, Pinterest-style recipe-card image, Kitchens for fanning shares to a whole household

Bring your existing library

If you already keep recipes somewhere, you don’t have to start over:

  • Any recipe URL — three engines: schema.org JSON-LD (fast), recipe-scrapers Python library (300+ site-specific extractors), AI Smart mode for sites that block scrapers
  • Photo import — snap a cookbook page, the AI assistant extracts the recipe
  • Mealie / Tandoor / Paprika — paste-import single recipes from JSON, or bulk-import a full-backup zip. Picker shows thumbnails so you can choose exactly which 10 of 200 to bring over
  • NutriTrace foods → Pantry — search your NT food library and bulk-import as pantry items with nutrition + image

Everything else

  • Pantry with barcode scanning (ML Kit on Android, QuaggaJS on web), Open Food Facts + USDA lookup, and an “8 / 10 in pantry” match pill on every recipe card
  • Cook Diary + Meal Planner — list and month-calendar views, drag-to-re-plan, one-tap mark as cooked
  • Shopping list that pulls missing ingredients from a recipe and skips anything already stocked
  • Trace AI assistant — bring your own Claude / OpenAI / Gemini key, or point at a local Ollama / LM Studio / LocalAI. Tool use reads + writes your real data; hold-to-record voice for hands-free logging
  • NutriTrace federation — pull foods from your NT instance, log cooked recipes back to its diary
  • Android app — runs standalone (fully offline) or connected to the server, with differential sync, biometric sign-in, native barcode scanning
  • Multi-user — invites, password reset, OIDC SSO (Authentik, Keycloak, Authelia, Pocket-ID, Google)
  • Backup — scheduled auto-backups, full ZIP restore, portable JSON, Android local-mode .zip for phone-to-phone transfer

First public release — bugs expected

Stable in solo testing for months, but real-world deployment surfaces things one person never will. Bug reports, feature requests, importer-failure URLs, and translation PRs are all genuinely wanted. Use the in-app Diagnostics view (Settings → Diagnostics → View Logs → Share) to attach logs to bug reports.

Issues: https://github.com/TraceApps/cooktrace/issues

LiftTrace is a self-hosted weightlifting tracker (Docker + Android, AGPL-3.0). rc.5 is the next public roll-up, bundling everything since the rc.4 release.

What’s new

Scheduled automatic backups. Settings → Backup → Schedule lets you pick a time + frequency (daily / weekly). Server installs get an admin UI with optional ENV lock for managed deployments; the Android app does the same for offline-only users, writing scheduled backups to device storage or the share sheet.

Multi-architecture Docker image. The public image at ghcr.io/traceapps/lifttrace now ships both amd64 and arm64 builds, so Raspberry Pi 4 / 5 and other ARM self-hosters can docker compose up -d without building from source.

Default session length raised. From 30 days to 1 year so PWA users stop getting signed out every month. Admins can still set their own session length under Settings → User Management → Session Length.

Better biometric failure path on Android. When a stored auth token has expired, biometric sign-in now surfaces a clear “Session Expired” prompt instead of silently bouncing back to the Login screen with no explanation.

Fixes

  • INSECURE_COOKIES is now called out inline in the example docker-compose.yml with a comment explaining the failure mode (every request 401s after a successful login because the browser drops the Secure cookie over plain HTTP); README troubleshooting entry expanded with the exact Firefox console message that confirms the diagnosis (#4)
  • Sync pulls no longer clobber local pending edits. An incoming server pull respects in-flight local changes instead of overwriting them with older data.
  • Sync now clears local auth state on a 401 response so the user gets prompted to sign in again, instead of the app looping silently on every subsequent request.

Install / upgrade

  • Docker: pull the new image and restart your stack (see the README for compose snippets)
  • Android: signed APK on the release page
  • Full CHANGELOG: main repo

What is LiftTrace?

Self-hosted weightlifting tracker. Diary (sets, reps, weights, RPE, supersets, warm-ups, persistent rest timer, natural-language Smart Add), Programs (mesocycles, templates, week-by-week progression), Exercises (full library from wger / free-exercise-db / exercisedb plus your own custom entries with images, GIFs, or YouTube links), Statistics (volume, PRs, frequency, body stats trends, RPE overlays), Coaching (trainer prescribes workouts to athletes, per-set feedback, two-way reply threads), AI assistant (Claude / OpenAI / Gemini / Ollama, BYOK, opt-in), built-in music player (Subsonic / Jellyfin / Plex / Emby libraries plus Icecast / Shoutcast / HLS streaming stations with lockscreen controls), OIDC SSO (Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, anything OIDC 1.0), workout import from Strong / Hevy / FitNotes / Jefit CSVs, federation with NutriTrace (auto-log workout calories burned to your NT diary). Docker on the server, Capacitor app on Android. AGPL-3.0 licensed.

  • Thanks for asking. Reception of this app has actually been positive overall since my first post here, with upvotes well ahead of downvotes.

    Last week I posted about my newer app LiftTrace, which I also build with AI assistance. Once folks realized AI was part of how I work, “AI slop” became the read on that post and the downvotes came fast. I assume some of this week’s downvotes here are coming from the same crowd reacting to a familiar name, which is fair. Everyone is entitled to their opinon and I respect that.

    I’ve never hidden the AI involvement, and from what I can tell on the NutriTrace GitHub page real users are getting value out of it: stars are steadily climbing and issues and enhancement requests are coming in. I’ll keep posting these updates because I think the apps are genuinely useful, I use them every day myself, and I wouldn’t share them if I didn’t believe they could help someone with their own health or fitness journey.

    Happy to answer any other questions folks have.

NutriTrace is a self-hosted nutrition + wellness tracker, alternative to MyFitnessPal / Cronometer / LoseIt. Runs entirely on your own server: no telemetry, no analytics, no account hosted by anyone but you. First public release was 26 April 2026; currently at v1.0.0-rc.42.

Repo (AGPL-3.0) · Release notes + APK · CHANGELOG

What’s new in this release

  • AI Meal Photos. Attach a meal photo and Trace returns an editable FDA-style Nutrition Facts card. Save as Quick Calories (one-off) or as a reusable Food entry in your library. Estimates cover the full ~30-nutrient profile, not just the headline macros.
  • LiftTrace workout sync. The sister weightlifting app can now push completed workouts to NutriTrace via the federation API. Sessions appear in Workout History alongside Fitbit / Garmin / Health Connect, and feed the dynamic calorie goal.
  • Smart Log Voice Input Language picker. Pick the mic language independently of device locale (useful if your device is set to English but you speak another language at meals).
  • API Tokens panel is now open to single-user installs (was multi-user + env-gated before).
  • Wizard celebration screen on onboarding completion.

Fixes worth calling out

  • Local Open Food Facts mirror search returning empty results despite the backend finding real hits (DuckDB Node v1.x VARCHAR shape regression).
  • Tapping a reminder notification on Android no longer just dismisses without opening the app.
  • Env-locked AI deployments now actually run Trace’s tools instead of silently dropping every tool call (this one was invisible: the model would reply in plain text instead of using your real data).

App overview (for anyone new)

  • Diary: calories, ~30 macros / micros, water, body stats, meal photos, per-day notes
  • Food sources: your own foods, Open Food Facts (with optional local DuckDB mirror for offline / air-gap), USDA, Mealie cookbook federation
  • Saved meals + recipes, copy / move / clone across meal slots and dates
  • Wellness sync: Fitbit, Garmin, Withings, Google Health (Health Connect on Android)
  • Calorie goals: fixed, dynamic (target = base + daily burn), or adaptive TDEE
  • Intermittent fasting tracker with schedules and reminders
  • Optional Trace AI Assistant: multi-provider (Claude / OpenAI / Gemini / any OpenAI-compatible endpoint), BYO key, off by default, browser calls the provider directly so the server never sees your key
  • Multi-user with invites, per-user admin, optional OIDC SSO (Authentik / Pocket-ID / Authelia tested)
  • Android app (Capacitor 8): offline-first SQLite + sync, biometric sign-in, native Health Connect, native barcode scanner
  • Backup: full server ZIP + per-user JSON export / import. Nothing leaves your server.

Deployment

services:
  nutritrace:
    image: ghcr.io/traceapps/nutritrace:latest
    ports: ["3000:3000"]
    volumes: ["./data:/data"]
    environment:
      - JWT_SECRET=<long-random-string>

Full docker-compose + env reference in DEPLOY.md. Signed Android APK attached to every GitHub release; in-place upgrades work.

Quick update post for the new v1.0.0-rc.4 release.

LiftTrace is a self-hosted lifting tracker I posted here a few days ago. It’s an open, AGPL-3.0 alternative to subscription apps like Strong ($5/mo), Hevy ($6/mo Pro), Jefit ($7/mo Pro), Fitbod (~$80/yr), and the coaching tier of Trainerize / Caliber. Single Docker container, PWA plus a signed Android APK.

Repo: https://github.com/TraceApps/lifttrace Image: ghcr.io/traceapps/lifttrace Latest release (with APK): https://github.com/TraceApps/lifttrace/releases/latest Full changelog: https://github.com/TraceApps/lifttrace/blob/main/CHANGELOG.md

What’s new in v1.0.0-rc.4

  • NutriTrace federation: if you also self-host my sister app (NutriTrace), each completed workout’s estimated calories burned auto-logs to your NutriTrace diary. Wearable data (Fitbit / Garmin / Health Connect) still wins for overlap so you don’t double-count. Set up in Settings → Integrations → NutriTrace with a personal access token.
  • Editable workout duration on the completion summary: the Duration tile is now a button. Tap to pick from quick presets (30 / 45 / 60 / 75 / 90 / 120 min) or enter a custom value. Useful for the “forgot to start the timer” case, and the kcal estimate updates live.
  • Fallback kcal estimate when no duration was tracked, derived from completed set count and badged “rough” so you know it’s less precise than a timed session.
  • Persistent “Connected” pill on the federation card so you can tell at a glance the integration is still healthy, plus a shared loading spinner across Diary, Programs, Coaching, Exercise detail, Statistics, and the Workout editor.
  • Polish pass: stronger affordance on the editable Duration tile, title-case sweep across about 20 button and menu labels, better error surfacing for Settings → Backup and Radio when the upstream isn’t reachable, and a small wizard celebration screen at the end of first-run setup.
  • Fixed: workout-complete notification firing on every set toggle when re-opening a completed workout’s summary (rc.3 caught the main flow; this patches the toggle edge case).

What’s in it (full feature list)

  • Diary with sets, reps, weights, RPE, persistent rest timer that survives navigation, supersets, warm-up generator, and natural-language Smart Add (e.g. “bench 3x5 @ 225, A1: curls 3x12 @ 30”).
  • Programs: build mesocycles, assign templates by day, progress through weeks.
  • Exercises: full library from wger, free-exercise-db, and exercisedb, plus your own custom entries with images, GIFs, or YouTube links.
  • Statistics: volume, PRs, frequency, body stats trends, RPE overlays, sparklines.
  • Coaching: trainers can prescribe workouts to athletes, leave per-set feedback, two-way reply threads. Replaces a Trainerize or Caliber subscription for small training rosters.
  • Trace AI: optional chat coach, multi-provider (Claude, OpenAI, Gemini, or any OpenAI-compatible endpoint like Ollama, LM Studio, DeepSeek, Groq). BYOK, opt-in, disabled by default.
  • Radio: built-in music player for Subsonic, Jellyfin, Plex, and Emby libraries plus Icecast, Shoutcast, and HLS streaming stations. Lockscreen controls, now-playing metadata, frequency visualizer on the FAB.
  • OIDC SSO: Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, anything OIDC 1.0. Multi-provider supported.
  • Import from Strong, Hevy, FitNotes, and Jefit CSV exports so you can leave your existing app in about a minute.
  • Android: local SQLite mirror with optional server sync, native ExoPlayer for radio, biometric sign-in, signed release APK on every release.

Deployment

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    ports:
      - "3002:3003"
    volumes:
      - ./data:/data
    environment:
      JWT_SECRET: ${JWT_SECRET}        # required in production
      INSECURE_COOKIES: "1"            # only if not terminating TLS

docker compose up -d, browse to http://localhost:3002/, finish the first-run wizard. Full env-var reference, reverse-proxy examples (Caddy, nginx), OIDC setup, SMTP setup, and the four supported “connecting from Android” paths are in DEPLOY.md.

Signed APK SHA-256 is published with each GitHub Release for verification. Debug APK (accepts HTTP and self-signed certs) is npm run android:debug for LAN-only setups.

No telemetry, no analytics, no anonymous usage pings. The app phones home only to your own server, or doesn’t phone home at all in Android local mode.

Just made LiftTrace public after months of development. It’s a self-hosted weightlifting / training log that runs in a single Docker container on your own hardware, with a PWA frontend and a signed Android APK. Sister app to NutriTrace under the same TraceApps umbrella.

LiftTrace Diary

What it does:

  • Diary with sets, reps, RPE, warm-up flagging, supersets, rest timer
  • Smart Add — type or speak your workout (“bench 3x5 @ 225, A1: curls 3x12, A2: pushdowns 3x12”) and the AI parses it into structured sets
  • Programs with mesocycles, weekly templates, coach prescriptions for trainer / athlete pairs
  • Exercise library seeded from wger + Free Exercise DB (~1,500 exercises with images), plus your own custom uploads
  • Statistics: volume, PRs, frequency heatmap, body weight trends
  • OIDC SSO for Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, etc.
  • Workout History Import from Strong, Hevy, FitNotes, and Jefit CSVs (so you don’t lose your history switching over)
  • Radio player built in for Subsonic / Jellyfin / Plex / Emby plus internet stations (because lifting and lockscreen media controls > switching apps mid-set)
  • AI coach with live workout context — bring your own Claude / OpenAI / Gemini key, or point it at Ollama / LM Studio / any OpenAI-compatible endpoint
  • Android app with offline-first SQLite, biometric sign-in, native ExoPlayer, optional WorkManager reminders

Self-hosted principles:

  • AGPL-3.0, source is open, no telemetry, no central server, no analytics, no cloud sync to anybody else
  • Single Docker container + bind-mounted volumes for DB and uploads
  • Your data stays on your hardware. Back up with cp, restore with cp.

Quick start:

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    ports: ["3002:3003"]
    volumes:
      - ./data/db:/data/db
      - ./data/uploads:/data/uploads
    environment:
      - DB_PATH=/data/db/lifttrace.db
      - UPLOADS_PATH=/data/uploads
      - JWT_SECRET=change-me

Features

  • Bulk Food Import via paste JSON or upload CSV (Settings → Import & Export)
  • Live nutrition preview on the Add to Diary sheet (macros update with portion / unit / servings)
  • Mass-aware unit conversion when scaling nutrition (g ↔ oz ↔ lb, ml ↔ cup, tsp ↔ tbsp)
  • Custom Units in Settings (“shot”, “scoop”, “stick”, etc.)
  • Scan Label: snap a photo of a nutrition label and the AI Assistant fills in the values
  • Smart Share / View on OFF: existing Open Food Facts products link straight to their wiki page for editing; new ones get a Share button to contribute back
  • Connection status banners across every integration with one-tap Test / Sync / Disconnect
  • Settings auto-save by default; no Save button to remember
  • Day rollover at midnight when the app stays open overnight
  • Barcode scanner now fully on-device on Android, no Google Play Services required (works on GrapheneOS / CalyxOS / e/OS)
  • Custom nutriment order from Settings is reflected everywhere (food editor, meal editor, diary nutrition bar)
  • Vitamin D, Calcium, Iron, and Potassium visible by default on new installs (FDA Nutrition Facts label mandatory fields)
  • Svelte 5 + Vite 6 + Express 5 + bcryptjs 3 framework upgrade (main bundle ~22% smaller)

Fixes

  • Disabling user management no longer triggers the setup wizard on every reload (#34)
  • Data APIs in single-user mode no longer return 503 “Setup required” on every call (#34 part 2)
  • Single-user mode: only the first food item added each day was visible in the UI. SQLite quirk on null user_id. Includes a one-time migration that recovers items already in the database (#37)
  • Food saves on Android no longer duplicate the previous food (#32)
  • “Most Used” / “Recently Used” food sort on Android now reflects real usage
  • MyFitnessPal Reports → Export CSV imports cleanly now (aggregate-per-meal shape)
  • Wellness scores refresh if today’s sleep finishes syncing after the morning snapshot
  • Import Nutrition History action row no longer overlaps the duplicate-date radios (#33)
  • Barcode scanner no longer gets stuck re-opening the camera after a scan
  • Barcodes that don’t match anything in OFF now drop you in the food editor with the code prefilled instead of a dead-end toast, so you can contribute the product back
  • Open Food Facts contribution now sends correct per-serving values and uploads your product image (both were silently broken)
  • AI Assistant respects AI_ENABLED=true and the full AI_* env-var set; toggle, settings card, and chat all honour the proxy (#36)
  • kcal / kJ values are consistent everywhere now: food editor, diary footer, meal totals, statistics, goals, weekly summary email, push notifications (#38)
  • AI Assistant Gemini models updated to 2.5 Flash + Lite (Google retired 2.0 Flash and 1.5 Flash)
  • nodemailer updated to 8.0.7 (patches an SMTP command-injection advisory)
  • Several smaller things, see the full changelog

Signed APK + docker image on the release page.

Self-hosted, AGPL-3.0, no telemetry, no account needed. docker compose up and go.

Quick update for anyone following the project. NutriTrace is a self-hosted nutrition tracker I’ve been building. Single Docker container, your data stays on your hardware, no external accounts.

This release ships the first native Android app alongside the existing PWA. Signed APK is attached to the GitHub release.

What you get on Android:

  • Standalone, or connect it to a NutriTrace server for sync
  • Health Connect for steps, sleep, heart rate, body weight
  • Native barcode scanning
  • Native notifications for water reminders, meal prompts, weigh-ins, and goal celebrations
  • OIDC SSO via deep link if you run Authentik, Keycloak, Pocket ID, etc.

Release: https://github.com/TraceApps/nutritrace/releases/tag/v1.0.0-rc.14 Repo: https://github.com/TraceApps/nutritrace

Still on the v1.0 release-candidate cadence so there will be be bugs. Please feel free to post issues here or on Github.

Thanks to everyone who’s tried it, provided suggestions and filed bugs along the way. If you find it useful, a star on the repo or a mention to someone looking for a self-hosted nutrition/fitness alternative helps a lot.

EDIT 2026-05-03: v1.0.0-rc.14 is out and adds a native Android app.

Full announcement: https://lemmy.world/post/46382994

(original post below)


Hey all, sharing what I’ve been working on. NutriTrace is a self-hosted nutrition and wellness tracker that runs entirely on your own server in a single Docker container.

I built it because every commercial nutrition app has the same shape. You hand them years of food data, body measurements, and biometrics, and your data is held hostage when they pivot or paywall. I wanted to track macros and pull in my Fitbit data without participating in that.

Daily food diary with multi-ingredient meals, recipes, body stats, water tracking, day-level notes. Personal food database, barcode scanner, imports from Open Food Facts and USDA, plus optional Mealie integration. Statistics with trend charts, full backup, exports as CSV / JSON / full ZIP.

Optional wellness device sync from Fitbit, Withings, Garmin, and Android Health Connect. Sleep / readiness / stress scores computed from your data.

Optional AI assistant where you bring your own Claude / OpenAI / Gemini key. It queries your real data via tool use so it can answer things like “what was my average protein this month” without making numbers up. There’s a voice food logger too. Both fully optional, off by default.

Tech: Svelte 4 + Express + better-sqlite3, multi-stage Dockerfile, AGPL-3.0. Native Android app is in active development; PWA installs to home screen on any modern browser today.

Repo and docker-compose example: https://github.com/TraceApps/nutritrace

Happy to answer questions.