Skip to content

Latest commit

Β 

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Snapdini

πŸ“Έ A digital disposable camera for events. Guests scan a QR code β€” no app to install β€” snap a limited roll, and the whole gallery reappears when the event ends. Free for small events, open-source, and self-hostable.

πŸ”— Hosted version: snapdini.com Β· πŸ“– How to use it: docs/GUIDE.md

See it in action

Scan a QR code, shoot a limited roll, and the whole gallery reappears when the event ends

In-browser camera with a limited roll β€” no app to install Every guest's photos in one shared gallery
Guests scan & shoot
A limited roll, right in the browser
One shared gallery
Reveal at the end, download the lot
Create an event in about a minute Printable QR table poster with the logo in the code
Set up in a minute
Name it, pick the roll size & reveal
Print the QR poster
Drop it on the tables β€” guests join in a tap

Quick start β€” self-host it

No build step. Pulls the prebuilt images and runs them with Postgres + nginx.

mkdir snapdini && cd snapdini
curl -O https://raw.githubusercontent.com/paytah232/snapdini/main/app/docker-compose.yml
mkdir nginx && curl -o nginx/default.conf https://raw.githubusercontent.com/paytah232/snapdini/main/app/nginx/default.conf
curl -o .env https://raw.githubusercontent.com/paytah232/snapdini/main/app/.env.example
# the upgrade helper β€” it checks the traps that `pull && up -d` alone will not
curl -o upgrade.sh https://raw.githubusercontent.com/paytah232/snapdini/main/app/scripts/upgrade.sh && chmod +x upgrade.sh

# edit .env β€” at minimum set BASE_URL (your public https URL) + POSTGRES_PASSWORD
docker compose pull
docker compose up -d

Snapdini is now on HTTP_PORT (default 8080) β€” put your own TLS / reverse proxy in front.

  • Fully free, no limits, when self-hosted. Billing, email, the admin panel and analytics stay off until you add their keys (STRIPE_*, MAILGUN_*, ADMIN_*, GTAG_ID/MSUET_ID in .env β€” all optional; no tag id β‡’ zero third-party tracking). .env.example documents every setting.
  • Upgrades: run ./upgrade.sh [version], or see UPGRADING.md. DB migrations apply on boot, but pull && up -d alone is not always enough β€” a release can add settings that must go in both .env and docker-compose.yml (compose passes env explicitly, so a variable missing from it is silently ignored), and it never updates your docker-compose.yml or nginx/default.conf.

Optional: "find the photos I'm in" (self-host only)

Guests can upload a selfie and pull out just the photos they appear in. It is off in the hosted service and shipped off by default, because face templates are biometric data and the compliance picture varies by jurisdiction β€” but if you run your own instance for your own events, it is a genuinely good feature and it is fully built.

Point MACHINE_LEARNING_URL at an Immich machine-learning container. It talks over plain HTTP with image bytes in the request, so the ML container needs no access to your photo storage β€” no shared volume, no bind mount. It can live on the same box or a different one.

  machine-learning:                       # add to your docker-compose.yml
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes: [ model-cache:/cache ]       # models only β€” never your photos
    restart: unless-stopped
MACHINE_LEARNING_URL=http://machine-learning:3003

With it unset the feature does not exist: no host toggle, no guest control, no privacy-policy section, and the endpoints return 503. With it set, it is still off per event until a host turns it on, and then off per guest until that guest ticks an unticked consent box. A guest's selfie is deleted in the same request that creates their template; every other face in a photo is compared and discarded in memory. "Stop and delete" removes the template and every match it produced, and keeps working even if you later switch the ML container off.

Think carefully before turning this on for anyone other than yourself. Face templates are biometric data in most jurisdictions. Two things in particular need an answer you are comfortable with: you necessarily process the faces of guests who never consented in order to find the one who did, and events often include minors. Take your own advice on it β€” this project cannot give you legal advice for your country.

  • Pin a version with IMAGE_TAG in .env (e.g. IMAGE_TAG=1.0.2; default latest). Point at your own registry with IMAGE_PREFIX.

Built with

Express + TypeScript + Postgres (Drizzle ORM) for the API, SvelteKit for the web app, behind nginx β€” all in Docker. Building from source, developing, or publishing your own images? See the development & maintainer guide.

Support

Snapdini is free and self-hostable. If it's useful to you and you'd like to support the work, you can buy me a coffee β˜• β€” much appreciated, never required.

License

Released under the GNU AGPL-3.0. You're free to self-host, modify and redistribute it; if you run a modified version as a network service, you must make your source available under the same licence. Β© 2026 paytah232.

About

πŸ“Έ A digital disposable camera for events β€” guests scan a QR, shoot a limited roll, and the gallery reappears when the party ends. Self-hostable & free (AGPL).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages