A self-hostable shopping list app designed for recurring grocery runs. Opinionated: one list, one workflow, minimum complexity.
Most shopping apps let you create multiple lists. RollingCart takes a different approach: one shopping list, always. Your catalog organizes items by category. Sessions handle timing. No list management overhead.
- One source of truth: Everything lives in one list. No more "did I put eggs on the grocery list or the weekly list?"
- Catalog as memory: Items you've bought before are always a quick search away
- Session-based workflow: Start a trip, check off items, finish. Unchecked items roll over to next time.
Read the User Guide to understand the full workflow and design philosophy.
Demo instance: https://rollingcart.mdgrd.net
Test accounts:
demo01@example.com/RollingCartDemo(has some pre-seeded catalog items)demo02@example.com/RollingCartDemo(starts with empty catalog)
Note: Demo instance has no uptime guarantee and data might be reset anytime
- Fuzzy search: Find items quickly even with typos
- Catalog system: Organize items by category, reuse them anytime
- Shopping trips: Track what you bought, review past trips
- Pre-seeded catalog: Common grocery items ready to use
- Mobile-friendly: Responsive design for on-the-go use
RollingCart is built with Ruby on Rails and supports both SQLite (default) and PostgreSQL.
Prerequisites: Docker and Docker Compose
- Clone and configure:
git clone https://github.com/chickenzord/rollingcart.git
cd rollingcart
cp .env.example .env- Edit
.env:
RAILS_MASTER_KEY=<content-of-config/master.key>
DB_PASSWORD=your-secure-password- Start:
docker compose up -d- Create user and seed catalog:
docker compose exec app bin/rails user:create EMAIL=you@example.com PASSWORD=yourpassword
docker compose exec app bin/rails catalog:seed EMAIL=you@example.com# Create user
docker compose exec app bin/rails user:create EMAIL=you@example.com PASSWORD=yourpassword
# List users
docker compose exec app bin/rails user:list
# Delete user
docker compose exec app bin/rails user:delete EMAIL=you@example.com# Seed all default catalogs
docker compose exec app bin/rails catalog:seed EMAIL=you@example.com
# Seed specific catalogs only
docker compose exec app bin/rails catalog:seed EMAIL=you@example.com FILES=grocery_fresh.yml,grocery_pantry.ymlSeeding is optional. You can start with zero catalog items and build your own from scratch.
Rails environment variables:
| Variable | Description | Default |
|---|---|---|
RAILS_MASTER_KEY |
Rails credentials key | Required |
DATABASE_URL |
PostgreSQL connection URL | (uses SQLite if not set) |
DATABASE_PATH |
SQLite database file path | storage/production.sqlite3 |
APP_HOST |
Application hostname | localhost |
CORS_ORIGINS |
Allowed CORS origins | http://localhost:3000 |
RAILS_LOG_LEVEL |
Log verbosity | info |
Error tracking (optional):
| Variable | Description | Default |
|---|---|---|
SENTRY_DSN_UI |
Sentry DSN for frontend errors | (disabled) |
SENTRY_DSN_API |
Sentry DSN for backend errors (not impl. yet) | (disabled) |
SENTRY_DSN |
Default DSN if specific ones not set | (disabled) |
SENTRY_ENVIRONMENT |
Override environment name sent to Sentry | Rails.env |
Compatible with Sentry.io, GlitchTip, or any Sentry-compatible service.
Versioning (automatically set by Docker build):
| Variable | Description | Default |
|---|---|---|
APP_VERSION |
Application version | dev |
GIT_COMMIT |
Git commit hash | - |
Docker Compose convenience variables (used to construct DATABASE_URL):
| Variable | Description | Default |
|---|---|---|
DB_HOST |
PostgreSQL host | db |
DB_PORT |
PostgreSQL port | 5432 |
DB_USERNAME |
PostgreSQL username | rollingcart |
DB_PASSWORD |
PostgreSQL password | changeme |
DB_NAME |
PostgreSQL database name | rollingcart |
Database selection: If DATABASE_URL is set, PostgreSQL is used. Otherwise, SQLite is used with the path from DATABASE_PATH.
# Quick start for development
bundle install && npm install
bin/rails db:setup
bin/rails user:create EMAIL=dev@example.com PASSWORD=password
foreman start -f Procfile.dev # Starts Rails + Vite- Backend: Rails 8, Rodauth (JWT auth), SQLite/PostgreSQL
- Frontend: React 19, Vite, Tailwind CSS, DaisyUI
- Search: Fuse.js
MIT