- Web-based meme board for images, GIFs and videos
- Tagging with suggestions and tag-based filtering
- Commenting system with per-user delete permissions
- Local authentication and OIDC Single Sign-On (SSO)
- Light and dark mode with responsive Bootstrap 5 UI
- Drag & drop and clipboard paste for uploads
- Media files stored on disk for easy backup and direct access
- Infinite scroll feed with pagination fallback
- Admin view with thumbnails, uploader info and tags
- Support for SQLite3 and PostgreSQL
# create volume dirs for persistence
mkdir -p ./volume-data/database ./volume-data/media
# adjust volume ownership to www-data (33)
sudo chown -R 33:33 volume-data/*
# spawn the stack
docker compose -f docker/docker-compose.yml up -d
# retrieve login credentials from container logs
docker compose -f docker/docker-compose.yml logs -fTip
An official Unraid app exists in the store. See wiki.
MemeLord takes various environment variables to configure settings.py:
| Variable | Description | Default | Optional/Mandatory |
|---|---|---|---|
DOMAIN |
Your Fully Qualified Domain Name (FQDN) or IP address. Used to define ALLOWED_HOSTS and CSRF_TRUSTED_ORIGINS for the Django framework. May define multiple ones by using a comma as delimiter. |
localhost |
Mandatory |
SECURE_COOKIES |
Set to True if you use a reverse proxy with TLS. Enables the secure cookie flag and HSTS HTTP response header, which will only work for SSL/TLS encrypted communication channels (HTTPS). |
False |
Optional |
SESSION_EXPIRE_AT_BROWSER_CLOSE |
Set to False if you want to keep sessions valid after browser close. |
True |
Optional |
SESSION_COOKIE_AGE |
Define the maximum cookie age in minutes. | 30 |
Optional |
SECRET_KEY |
Defines a fixed secret key for the Django framework. If missing, a secure secret is auto-generated on the server-side each time the container starts. | <auto-generated> |
Optional |
PORT |
Defines a custom port. Used to set CSRF_TRUSTED_ORIGINS in conjunction with the DOMAIN environment variable for the Django framework. Only necessary, if VoucherVault is operated on a different port than 8000, 80 or 443. |
8000 |
Optional |
TZ |
Defines the TIME_ZONE variable in Django's settings.py. |
Europe/Berlin |
Optional |
OIDC_ENABLED |
Set to True to enable OIDC authentication. |
False |
Optional |
OIDC_AUTOLOGIN |
Set to True if you want to automatically trigger OIDC flow on login page |
False |
Optional |
OIDC_CREATE_USER |
Set to True to allow the creation of new users through OIDC. |
True |
Optional |
OIDC_RP_SIGN_ALGO |
The signing algorithm used by the OIDC provider (e.g., RS256, HS256). | HS256 |
Optional |
OIDC_RP_IDP_SIGN_KEY |
The signing key used by the OIDC provider. If RS256 signing algo is used, either this or OIDC_OP_JWKS_ENDPOINT must be defined. |
None |
Optional |
OIDC_OP_JWKS_ENDPOINT |
URL of the JWKS endpoint for the OIDC provider. If RS256 signing algo is used, either this or OIDC_RP_IDP_SIGN_KEY must be defined. |
None |
Optional |
OIDC_RP_CLIENT_ID |
Client ID for your OIDC RP. | None |
Optional |
OIDC_RP_CLIENT_SECRET |
Client secret for your OIDC RP. | None |
Optional |
OIDC_OP_AUTHORIZATION_ENDPOINT |
Authorization endpoint URL of the OIDC provider. | None |
Optional |
OIDC_OP_TOKEN_ENDPOINT |
Token endpoint URL of the OIDC provider. | None |
Optional |
OIDC_OP_USER_ENDPOINT |
User info endpoint URL of the OIDC provider. | None |
Optional |
OIDC_RENEW_ID_TOKEN_EXPIRY_SECONDS |
The length of time it takes for an id token to expire in seconds. | 900 | Optional |
DB_ENGINE |
Database engine to use (e.g., postgres for PostgreSQL or sqlite3 for SQLite3). |
sqlite3 |
Optional |
POSTGRES_HOST |
Hostname for the PostgreSQL database. | db |
Optional |
POSTGRES_PORT |
Port number for the PostgreSQL database. | 5432 |
Optional |
POSTGRES_USER |
PostgreSQL database user. | memelord |
Optional |
POSTGRES_PASSWORD |
PostgreSQL database password. | memelord |
Optional |
POSTGRES_DB |
PostgreSQL database name. | memelord |
Optional |

