A simple chore app.
Explore the docs »
Report Bug
·
Request Feature
LenoreChore is a smart, customizable chore management app. Designed for households or small groups, LenoreChore helps you keep track of tasks, assign chores efficiently, and maintain a consistent routine—even when life gets busy.
I originally built LenoreChore for my wife and me to simplify our weekly chore routine. After our daughter was born, I expanded the app to include parent/child user roles so we could introduce responsibility in a fun and manageable way.
- ✅ Custom Areas – Define and organize chores by specific locations (like rooms or zones) in your home.
- 🗂️ Area Grouping – Group multiple areas for batch management and easier scheduling.
- 👪 Child/Parent Users – Support for family-style roles with tailored visibility and controls.
- 👤 Chore Assignment – Assign tasks to specific users with clear accountability.
- 📈 Chore History Graph – Visualize completed chores over time to track progress and consistency.
- 🛫 Vacation Mode – Pause chore assignments when you're away, then resume with your schedule intact.
- 📱 Progressive Web App (PWA) – Install LenoreChore as an app on desktop or mobile. Works offline with automatic background sync when reconnected.
LenoreChore is built for self-hosting and is fully responsive—mobile- and desktop-friendly out of the box.
Whether you're managing your own chores or teaching kids how to contribute around the house, LenoreChore helps bring structure, fairness, and visibility to your daily routines.
Welcome to LenoreChore! This guide will help you set up and run the application using Docker and Docker Compose.
Make sure you have the following installed on your system:
Create a .env file in the root directory of the project.
- PostgreSQL is optional — if the
SQL_*variables are omitted, LenoreChore falls back to SQLite automatically. - Redis is bundled into the container and used automatically for caching and real-time sync — no configuration required. To use your own Redis server instead, set
REDIS_URL(see Using an external Redis); the bundled instance is then skipped.
Minimal setup (SQLite + bundled Redis):
DEBUG=0
SECRET_KEY=mysupersecretkey
DJANGO_ALLOWED_HOSTS=localhost
CSRF_TRUSTED_ORIGINS=http://localhost
DJANGO_SUPERUSER_PASSWORD=supervisorpassword
DJANGO_SUPERUSER_EMAIL=someone@somewhere.com
DJANGO_SUPERUSER_USERNAME=supervisor
TIMEZONE=America/New_YorkFull setup (PostgreSQL + external Redis):
DEBUG=0
SECRET_KEY=mysupersecretkey
DJANGO_ALLOWED_HOSTS=localhost
CSRF_TRUSTED_ORIGINS=http://localhost
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=LenoreChore
SQL_USER=LenoreChoreuser
SQL_PASSWORD=somepassword
SQL_HOST=db
SQL_PORT=5432
DJANGO_SUPERUSER_PASSWORD=supervisorpassword
DJANGO_SUPERUSER_EMAIL=someone@somewhere.com
DJANGO_SUPERUSER_USERNAME=supervisor
TIMEZONE=America/New_York
REDIS_URL=redis://redis:6379/0Adjust these values according to your environment and application requirements.
REDIS_URL is optional. When it is unset (or points at localhost /
127.0.0.1), LenoreChore uses the Redis bundled inside the container. To use
your own Redis server instead, set REDIS_URL to point at it — the bundled
instance is then skipped automatically, so no redundant Redis runs.
Format: redis://[:password@]host:port/db
| Scenario | REDIS_URL |
|---|---|
| Bundled Redis (default) | unset |
Redis running as a Compose service named redis |
redis://redis:6379/0 |
| External host by address | redis://10.1.10.50:6379/0 |
| Password-protected | redis://:yourpassword@redis.internal:6379/0 |
| TLS | rediss://redis.internal:6380/0 |
Redis is used only for ephemeral caching and SSE pub/sub, so no persistence is required on the external server.
Minimal setup (single container, SQLite, no Redis):
services:
app:
image: novanglus96/lenorechore:latest
container_name: LenoreChore
ports:
- "8080:80"
volumes:
- LenoreChore_data_volume:/home/app/web/data
- LenoreChore_media_volume:/home/app/web/mediafiles
env_file:
- ./.env
restart: unless-stopped
volumes:
LenoreChore_data_volume:
LenoreChore_media_volume:Full setup (PostgreSQL + Redis):
services:
app:
image: novanglus96/lenorechore:latest
container_name: LenoreChore
ports:
- "8080:80"
volumes:
- LenoreChore_static_volume:/home/app/web/staticfiles
- LenoreChore_media_volume:/home/app/web/mediafiles
depends_on:
- db
- redis
env_file:
- ./.env
restart: unless-stopped
db:
image: postgres:15
container_name: LenoreChore_db
volumes:
- LenoreChore_postgres_data:/var/lib/postgresql/data/
env_file:
- ./.env
environment:
- POSTGRES_USER=${SQL_USER}
- POSTGRES_PASSWORD=${SQL_PASSWORD}
- POSTGRES_DB=${SQL_DATABASE}
redis:
image: redis:7-alpine
container_name: LenoreChore_redis
restart: unless-stopped
volumes:
LenoreChore_postgres_data:
LenoreChore_static_volume:
LenoreChore_media_volume:-
Start the services:
docker compose up -d
-
Access the application in your browser at
http://localhost:8080.
- Adjust exposed ports as needed for your environment.
- If you encounter any issues, ensure your
.envfile has the correct values and your Docker and Docker Compose installations are up to date.
PWA features (installability, service worker, offline sync) require LenoreChore to be served over HTTPS via a reverse proxy (e.g. Traefik, nginx with SSL termination). The reverse proxy must forward the X-Forwarded-Proto header to the container.
Plain HTTP deployments will not support PWA features. The install prompt will not appear and the service worker will not register.
Example Traefik label to ensure the header is forwarded (most Traefik setups do this automatically):
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"Example nginx upstream config if you are using nginx as your outer proxy:
proxy_set_header X-Forwarded-Proto $scheme;Note: If you previously accessed the site while it had a certificate error and clicked "Proceed anyway" in your browser, Chrome may remember that exception and block PWA installation. To fix this, go to Chrome Settings → Privacy and Security → Site Settings, find your site, and click Reset permissions — then reload the page.
LenoreChore can send each user a daily Web Push summarizing what's due and overdue, at a time they choose. Users opt in (and pick a time) on their Profile page.
To enable it on the server, generate a VAPID key pair once and add it to your .env:
docker compose exec app python manage.py generate_vapid_keysCopy the printed values into .env:
VAPID_PUBLIC_KEY=...
VAPID_PRIVATE_KEY=...
VAPID_SUBJECT=mailto:you@example.comRestart the container. If these are unset, push notifications are simply disabled (the rest of the app is unaffected).
Caveats:
- Web Push requires HTTPS via a reverse proxy — the same requirement as the PWA features above.
- On iOS/iPadOS (16.4+), the user must first install the app to their home screen; Safari does not deliver Web Push to a regular browser tab.
Enjoy using LenoreChore!
v1.3 consolidates the separate frontend, backend, worker, and nginx containers into a single app container. PostgreSQL and Redis are now optional.
| Before (≤ v1.2) | After (v1.3+) |
|---|---|
novanglus96/lenorechore_frontend |
(removed) |
novanglus96/lenorechore_backend |
(removed) |
novanglus96/lenorechore_worker |
(removed) |
novanglus96/lenoreapps_proxy (nginx) |
(removed) |
| — | novanglus96/lenorechore ✅ |
-
Stop your existing stack:
docker compose down
-
Replace your
docker-compose.yml— remove thefrontend,backend,worker, andnginxservices and add the singleappservice. See the Getting Started examples above. -
Update your
.env— remove theDATABASE=postgresline if present (no longer required). All other variables remain the same. -
Start the new stack:
docker compose up -d
Yes. PostgreSQL data is stored in a named Docker volume (LenoreChore_postgres_data) that exists independently of the containers. As long as your docker-compose.yml references the same volume name and your SQL_* env vars are unchanged, all data is preserved through the upgrade.
Note: If you choose to drop the
dbservice and switch to SQLite, your existing PostgreSQL data will not be migrated automatically. Export your data first if needed.
- v1.3 Release
- Redis caching with write-through invalidation
- Form validation (vee-validate + yup)
- Dark/light theme toggle (persisted per browser)
- Mobile UI improvements (edge-to-edge cards, fullscreen forms)
- PWA support (installable, offline queuing, background sync)
- Demo Data
See the open issues for a full list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the MIT License. See LICENSE.txt for more information.
Or
John Adams - Lenore.Apps@gmail.com
Project Link: https://github.com/Novanglus96/LenoreChore
A heartfelt thanks to our Patrons for their generous support! Your contributions help us maintain and improve this project.
Want to see your name here? Support us on Patreon to join our amazing community and shape the future of LenoreChore!

