Track Everything
Log feedings, diapers, sleep, tummy time, and measurements
Baby Buddy is a free, open-source application designed to help caregivers track and manage all aspects of infant care. Built with Django and Python, Baby Buddy provides a comprehensive dashboard for logging feedings, diaper changes, sleep patterns, tummy time, and growth measurements—helping parents and caregivers identify patterns and predict their baby’s needs without relying on guesswork.
With over 2,600 GitHub stars and an active community, Baby Buddy offers mobile apps for Android and iOS, Home Assistant integration, and support for 20+ languages, making it an ideal solution for families worldwide.
Track Everything
Log feedings, diapers, sleep, tummy time, and measurements
Insightful Reports
Visualize patterns with charts and statistics
Mobile Ready
Native Android app and responsive web design
Multi-Language
Support for 20+ languages worldwide
Baby Buddy provides comprehensive baby tracking capabilities:
| Feature | Description |
|---|---|
| Feeding Tracking | Log breast, bottle, and solid feedings with duration and amount |
| Diaper Changes | Record wet, solid, and mixed diapers |
| Sleep Logging | Track naps and nighttime sleep patterns |
| Tummy Time | Monitor tummy time sessions for development |
| Growth Measurements | Record weight, height, head circumference, and BMI |
| Temperature Logging | Track temperature readings |
| Timers | Built-in timers for activities |
| Notes & Tags | Add notes and organize with tags |
| Reports & Statistics | Visualize data with charts and trends |
| Multi-Child Support | Track multiple children in one instance |
| REST API | Full API access for integrations |
Before deploying Baby Buddy on Klutch.sh, ensure you have:
Set up your Baby Buddy deployment repository:
Baby Buddy uses the LinuxServer.io Docker image, which provides a well-maintained, multi-architecture container. Create a Dockerfile in your repository:
FROM lscr.io/linuxserver/babybuddy:latest
# LinuxServer.io image exposes port 8000 by default# Configuration is handled via environment variables
# Persistent data is stored in /configVOLUME /config
EXPOSE 8000If you prefer to build from the official Baby Buddy source:
FROM python:3.12-slim
# Install system dependenciesRUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ libpq-dev \ libjpeg-dev \ zlib1g-dev \ libopenjp2-7-dev \ && rm -rf /var/lib/apt/lists/*
# Create app userRUN useradd -m -s /bin/bash babybuddy
WORKDIR /app
# Clone and install Baby BuddyRUN apt-get update && apt-get install -y git && \ git clone --depth 1 --branch master https://github.com/babybuddy/babybuddy.git . && \ pip install --no-cache-dir pipenv && \ pipenv install --system --deploy && \ apt-get remove -y git && apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/*
# Create data directoryRUN mkdir -p /app/data/media && chown -R babybuddy:babybuddy /app
# Set environment defaultsENV DJANGO_SETTINGS_MODULE=babybuddy.settings.productionENV ALLOWED_HOSTS=*
USER babybuddy
EXPOSE 8000
# Run with gunicornCMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "2", "babybuddy.wsgi:application"]Baby Buddy is configured through environment variables. Here are the key settings:
| Variable | Description | Example |
|---|---|---|
SECRET_KEY | Django secret key (random, unique string) | your-random-secret-key-here |
ALLOWED_HOSTS | Allowed hostnames | example-app.klutch.sh |
CSRF_TRUSTED_ORIGINS | Trusted origins for CSRF protection | https://example-app.klutch.sh |
TZ | Timezone | America/New_York |
| Variable | Description | Default |
|---|---|---|
PUID | User ID for file permissions | 1000 |
PGID | Group ID for file permissions | 1000 |
TZ | Container timezone | Etc/UTC |
CSRF_TRUSTED_ORIGINS | Comma-separated trusted origins | Required |
Baby Buddy uses SQLite by default, but PostgreSQL is recommended for production:
| Variable | Description | Default |
|---|---|---|
DB_ENGINE | Database backend | django.db.backends.sqlite3 |
DB_HOST | Database host | - |
DB_NAME | Database name | data/db.sqlite3 |
DB_USER | Database username | - |
DB_PASSWORD | Database password | - |
DB_PORT | Database port | 5432 |
DATABASE_URL | Full connection string (alternative) | - |
| Variable | Description | Default |
|---|---|---|
SECRET_KEY | Django secret key | Required |
DEBUG | Enable debug mode | False |
SECURE_PROXY_SSL_HEADER | Trust X-Forwarded-Proto header | None |
CSRF_COOKIE_SECURE | Secure CSRF cookie | False |
SESSION_COOKIE_SECURE | Secure session cookie | False |
| Variable | Description | Default |
|---|---|---|
ALLOW_UPLOADS | Allow child photo uploads | True |
SUB_PATH | Subdirectory path if hosted in subfolder | - |
| Variable | Description |
|---|---|
AWS_ACCESS_KEY_ID | AWS S3 access key |
AWS_SECRET_ACCESS_KEY | AWS S3 secret key |
AWS_STORAGE_BUCKET_NAME | S3 bucket name |
AWS_S3_ENDPOINT_URL | Custom S3-compatible endpoint |
Test your Baby Buddy setup locally:
services: babybuddy: image: lscr.io/linuxserver/babybuddy:latest container_name: babybuddy environment: - PUID=1000 - PGID=1000 - TZ=America/New_York - CSRF_TRUSTED_ORIGINS=http://localhost:8000,http://127.0.0.1:8000 volumes: - babybuddy_config:/config ports: - "8000:8000" restart: unless-stopped
volumes: babybuddy_config:For production deployments, use PostgreSQL:
services: babybuddy: image: lscr.io/linuxserver/babybuddy:latest container_name: babybuddy environment: - PUID=1000 - PGID=1000 - TZ=America/New_York - CSRF_TRUSTED_ORIGINS=http://localhost:8000 - DB_ENGINE=django.db.backends.postgresql - DB_HOST=postgres - DB_NAME=babybuddy - DB_USER=babybuddy - DB_PASSWORD=your-secure-password - DB_PORT=5432 - SECRET_KEY=your-random-secret-key volumes: - babybuddy_config:/config ports: - "8000:8000" depends_on: postgres: condition: service_healthy restart: unless-stopped
postgres: image: postgres:16-alpine container_name: babybuddy-db environment: POSTGRES_DB: babybuddy POSTGRES_USER: babybuddy POSTGRES_PASSWORD: your-secure-password volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U babybuddy -d babybuddy"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped
volumes: babybuddy_config: postgres_data:For personal use with a single family, SQLite provides a simple deployment:
Push your repository to GitHub
git initgit add .git commit -m "Initial Baby Buddy configuration"git remote add origin https://github.com/yourusername/babybuddy.gitgit push -u origin mainCreate a new app on Klutch.sh
Configure environment variables
| Variable | Value |
|---|---|
TZ | America/New_York (your timezone) |
PUID | 1000 |
PGID | 1000 |
SECRET_KEY | Generate a random 50+ character string |
ALLOWED_HOSTS | your-app.klutch.sh |
CSRF_TRUSTED_ORIGINS | https://your-app.klutch.sh |
SECURE_PROXY_SSL_HEADER | True |
Configure the internal port
Set up persistent storage
| Mount Path | Size |
|---|---|
/config | 5 GB |
Deploy your application
https://your-app.klutch.shFor production deployments or multi-user setups:
Deploy PostgreSQL database
babybuddyPush your Baby Buddy repository to GitHub
git initgit add .git commit -m "Initial Baby Buddy configuration"git remote add origin https://github.com/yourusername/babybuddy.gitgit push -u origin mainCreate a new app on Klutch.sh
Configure environment variables
| Variable | Value |
|---|---|
TZ | America/New_York |
PUID | 1000 |
PGID | 1000 |
SECRET_KEY | Generate a random 50+ character string |
ALLOWED_HOSTS | your-app.klutch.sh |
CSRF_TRUSTED_ORIGINS | https://your-app.klutch.sh |
SECURE_PROXY_SSL_HEADER | True |
DB_ENGINE | django.db.backends.postgresql |
DB_HOST | Your PostgreSQL hostname |
DB_NAME | babybuddy |
DB_USER | babybuddy |
DB_PASSWORD | Your database password |
DB_PORT | 5432 |
Configure the internal port
Set up persistent storage
| Mount Path | Size |
|---|---|
/config | 5 GB |
Deploy your application
https://your-app.klutch.shAfter deployment, configure your Baby Buddy instance:
Access Baby Buddy
https://your-app.klutch.shadmin / adminChange admin password
Add your first child
Configure user settings
Baby Buddy provides intuitive tracking for all baby activities:
Log a feeding
Log a diaper change
Log sleep
Timers make it easy to track activities in real-time:
Start a timer
End and record
Add family members or caregivers:
Create additional users
User permissions
Baby Buddy provides a comprehensive REST API:
Create an API key
# Get all childrencurl -X GET "https://your-app.klutch.sh/api/children/" \ -H "Authorization: Token YOUR_API_KEY"
# Add a feedingcurl -X POST "https://your-app.klutch.sh/api/feedings/" \ -H "Authorization: Token YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "child": 1, "type": "breast milk", "method": "bottle", "amount": 120, "start": "2024-01-15T14:30:00" }'
# Log a diaper changecurl -X POST "https://your-app.klutch.sh/api/changes/" \ -H "Authorization: Token YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "child": 1, "wet": true, "solid": false }'See the Baby Buddy API Documentation for complete API reference.
Baby Buddy offers several mobile options:
The Baby Buddy for Android app provides:
Baby Buddy’s responsive design works well on mobile browsers:
Add to home screen
Baby Buddy integrates with Home Assistant for smart home automation:
Install the integration
Available entities
For SQLite deployments:
# SQLite is stored in the /config volume# Regular volume backups will capture the databaseFor PostgreSQL deployments:
pg_dump -U babybuddy -d babybuddy > babybuddy_backup.sqlBaby Buddy supports data import/export:
Export data
Import data
Common issues and solutions:
| Issue | Cause | Solution |
|---|---|---|
| CSRF verification failed | Missing or wrong CSRF_TRUSTED_ORIGINS | Add your full URL with https:// prefix |
| 502 Bad Gateway | Wrong internal port | Ensure internal port is set to 8000 |
| Database errors | PostgreSQL connection issues | Verify database credentials and connectivity |
| Static files not loading | Volume permissions | Check PUID/PGID match volume ownership |
| Can’t upload images | ALLOW_UPLOADS disabled | Set ALLOW_UPLOADS=True |
Monitor logs through the Klutch.sh dashboard:
View application logs