Installation
Installation
Docker set up is dead simple. Single container, portable SQLite database.
Docker
- In your project directory, create the .env and docker-compose.yml files using the respective .template files in the repo root:
curl -o .env https://raw.githubusercontent.com/jt196/vanilla-cookbook/main/.env.template
curl -o docker-compose.yml https://raw.githubusercontent.com/jt196/vanilla-cookbook/main/docker-compose.yml.template
- In the .env file
- Change the ORIGIN to the URL it's going to be hosted on. If you get any login CORS messages, this not being set correctly will be the reason. The default
ORIGIN=http://localhost:3000should work with the default docker-compose.yml file unless you have anything else on that port. - Create db and uploads folders for persistence in your docker folder, make sure the share paths are correct in the docker-compose file:
mkdir -p ./db ./uploads - Use
:latesttags for bleedin' edge,:stablefor stable release. - Run
docker-compose up -d - On first run, you'll be prompted to enter Admin user details.
- Optional: set
PUIDandPGID(in your shell or.env) if you want container file ownership to match a specific host user. Defaults are1000:1000.
Quick video run through of Docker setup:
Upgrade
- Grab the latest image:
docker pull jt196/vanilla-cookbook - Check the .env.template and docker-compose.yml.template files haven't been modified. Add any additional fields. The .env is the most likely to change.
- If upgrading from an older image that wrote files as root, run the migration guide below before restarting.
- From the project directory, run
docker-compose up -dordocker compose up -ddepending on how you have it installed on your system.
Docker Non-Root Migration Guide
Vanilla Cookbook now runs the app process as a non-root user in the container. Existing installs may need a one-time ownership fix on mounted volumes.
- Stop the container:
docker compose down- Back up your DB folder:
cp -r ./db ./db-backup-$(date +%Y%m%d-%H%M%S)- Start the updated container:
docker compose up -d- Validate:
docker compose logs -f appand confirm no writable-permission errors- create/edit a recipe
- upload an image
- Only if permission errors remain, run a manual ownership fix:
PUID=${PUID:-1000} PGID=${PGID:-1000} sudo chown -R "${PUID}:${PGID}" ./db ./uploads- then restart:
docker compose up -d - Optional: set
PUID/PGIDif you want a specific host-user mapping: export PUID=$(id -u)export PGID=$(id -g)
Local Docker Testing (No Docker Hub Push Required)
Use this before testing on a remote host.
- In
docker-compose.yml, switch fromimage:to:
- Build locally:
docker compose build --no-cache- Run:
docker compose up -d- Optional user-mapping test:
PUID=$(id -u) PGID=$(id -g) docker compose up -d- Verify the runtime user and permissions:
docker compose exec app iddocker compose exec app sh -lc 'touch /app/uploads/images/perm-test && rm /app/uploads/images/perm-test'- Validate upgrade path locally:
- temporarily create root-owned files in
./dbor./uploads - start the container and check logs for permission warnings
- run the migration guide
chownstep and confirm the warnings are gone
Reverse Proxy Configuration
If you're running Vanilla Cookbook behind a reverse proxy (nginx, Nginx Proxy Manager, Traefik, etc.), you may need to adjust some settings.
For Nginx / Nginx Proxy Manager, add these settings:
# Required for saving recipes with images (default 1MB is too small)
client_max_body_size 10M;
# Required to prevent 502 errors (SvelteKit sends many preload headers)
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
Common issues these settings fix:
- Recipes fail to save (spinner never stops, no error):
client_max_body_sizetoo small - 502 Bad Gateway on recipe pages: Proxy buffer settings too small
In Nginx Proxy Manager: Edit your proxy host → Advanced → Custom Nginx Configuration, and add the lines above.
In standard Nginx: Add these to your location block or server block for the Vanilla Cookbook site.
Local Dev
Prerequisites: You'll need build tools installed for native module compilation (better-sqlite3)
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux:
build-essentialpackage (Ubuntu/Debian:sudo apt-get install build-essential) - Windows: Visual Studio Build Tools or windows-build-tools npm package
Setup
- Clone the repo and the recipe-ingredient-parser submodule:
git clone --recursive https://github.com/jt196/vanilla-cookbook.git - At the root of the project, create the .env file:
cp .env.template .env - In the .env file
- Set
ORIGINtohttp://localhost:5173(dev). - Run it
pnpm i(node packages install)pnpm dev:setup(prisma client gen, migration)pnpm dev- You'll be prompted for admin user details on accessing root
Mobile
Most folks know how to do this but I'll chuck some instructions up anyway. It's pretty close to to an Android app experience. Install from Chrome (I've found Firefox doesn't offer the install option) with > settings > add to home screen > install:


