🥪 Sandwitches
Sandwiches so good, they haunt you!
✨ Overview
Sandwitches is a modern, recipe management platform built with Django. It is made as a hobby project for my girlfriend, who likes to make what I call "fancy" sandwiches (sandwiches that go beyond the Dutch normals), lucky to be me :). Sandwiches so good you will think they are haunted !. See wanted to have a way to advertise and share those sandwiches with the family and so I started coding making it happen, in the hopes of getting more fancy sandwiches.
To view the live website go to sandwitches.vandijke.xyz
🎯 Features
Sandwitches comes packed with comprehensive features for recipe management, community engagement, and ordering:
- 🍞 Recipe Management - Upload and create sandwich recipes with images, ingredients, and instructions
- 👥 Community Page - Discover and browse sandwiches shared by community members
- 🛒 Ordering System - Browse recipes and place orders with cart functionality and order tracking
- ⭐ Ratings & Reviews - Rate recipes on a 0-10 scale with detailed comments
- 🔌 REST API - Full API access for recipes, tags, ratings, orders, and user management
- 📊 Admin Dashboard - Comprehensive admin interface for recipe approval and site management
- 🌍 Multi-language Support - Internationalization for multiple languages
- 📱 Responsive Design - Mobile-friendly interface with BeerCSS framework
- 🔔 Notifications - Email and Gotify push notification integration
- 📈 Order Tracking - Real-time order status tracking with unique tracking tokens
- 📊 Analytics - Umami analytics integration for tracking user behavior
- 🖨️ TRML – Official TRML plugin support.
TRML
If you happen to have a TRML laying arround be sure to check out this recipe which is an official plugin for your TRML.
📥 Getting Started
services:
sandwitches:
image: martynvandijke/sandwitches:latest
container_name: sandwitches
environment:
- ALLOWED_HOSTS=localhost,127.0.0.1,[::1]
- CSRF_TRUSTED_ORIGINS=http://localhost:8000,http://127.0.0.1:8000
- SECRET_KEY=superdupersecretkey
- DATABASE_FILE=/config/db.sqlite3
- MEDIA_ROOT=/config/media
ports:
- 6270:6270
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:6270/api/ping"]
interval: 5s
timeout: 10s
retries: 3
volumes:
- /path/to/sandwitches:/config
restart: always
Environment variables
Below is a list of all supported environment variables.
| Variable | Required | Description |
|---|---|---|
| ALLOWED_HOSTS | Yes | A list of strings representing the host/domain names that this Django site can serve. |
| CSRF_TRUSTED_ORIGINS | Yes | A list of trusted origins for safe cross-site requests (e.g., https://example.com). |
| SECRET_KEY | Yes | A unique, secret value used for cryptographic signing and session security. |
| DATABASE_FILE | Yes | The file path to the SQLite database or the name of the database being used. |
| MEDIA_ROOT | Yes | The absolute filesystem path to the directory that will hold user-uploaded files. |
| SMTP_USE_TLS | No | Boolean (True/False) to enable/disable TLS encryption for outgoing emails. |
| SMTP_HOST | No | The hostname or IP address of the mail server used to send emails. |
| SMTP_PORT | No | The port number to use for the SMTP server (usually 587 for TLS or 465 for SSL). |
| SMTP_FROM_NAME | No | The display name that appears in the "From" field of outgoing emails. |
| SMTP_FROM_EMAIL | No | The actual email address used as the sender for system-generated messages. |
| SMTP_USER | No | The username required to authenticate with the SMTP server. |
| SMTP_PASSWORD | No | The password required to authenticate with the SMTP server. |
| GOTIFY_URL | No | The base URL of your Gotify server instance for push notifications. |
| GOTIFY_TOKEN | No | The application-specific token used to authenticate with Gotify. |
| UMAMI_HOST | No | UMAMI analytics tracking host. |
| UMAMI_WEBSITE_ID | No | UMAMI analytics website id. |
Development setup
Prerequisites
- Python 3.12+
- uv (recommended) or pip
Installation
-
Clone the repository:
git clone https://github.com/martynvdijke/sandwitches.git cd sandwitches
-
Sync dependencies:
uv sync -
Run migrations and collect static files:
uv run src/manage.py migrate uv run src/manage.py collectstatic --noinput
-
Start the development server:
uv run src/manage.py runserver
🧪 Testing & Quality
This project wraps all tests, linting and formatting in invoke tasks so you can run:
- Run tests:
uv run invoke tests - Linting:
uv run invoke linting - Type checking:
uv run invoke typecheck
Made with ❤️ for sandwich enthusiasts.
Metadata
Release files for sandwitches 2.13.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| sandwitches-2.13.9.tar.gz | 71.0 kB | Without provenance | Details for sandwitches-2.13.9.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sandwitches-2.13.9-py3-none-any.whl | Python 3 | none | any | Details for sandwitches-2.13.9-py3-none-any.whl |
Total release size: 189.9 kB
Release files / sandwitches-2.13.9.tar.gz
| Download URL | sandwitches-2.13.9.tar.gz |
|---|---|
| Size | 71.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7ab5647d20cb43b762c27bb13e8c8a56bc40d33fb48f56db3c540c67afd5bf27
|
|
BLAKE2b-256 checksum How to use checksums |
79cd12fd6287bc65c653f1394a09ff617ffdd7121235d3475e9c8a889866061b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.2 {"installer":{"name":"uv","version":"0.12.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sandwitches-2.13.9-py3-none-any.whl
| Download URL | sandwitches-2.13.9-py3-none-any.whl |
|---|---|
| Size | 118.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ec7c1fa82e82586a7d6dfdf3019a59b525f3f3842227531641537cc650958eb
|
|
BLAKE2b-256 checksum How to use checksums |
cf26a76d9dbfcc5afd70e96a26fd1daea2c2392dec6d1f7125655cc13a05e0f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.2 {"installer":{"name":"uv","version":"0.12.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for sandwitches 2.13.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.