e1145b9448fa025e1c8d1fcb59719dc89697ae3c
Memer
A self-hosted meme gallery with quick-share for text message and Telegram. Runs as a single Docker container, designed for Unraid.
Features
- Masonry gallery — responsive, dark-themed grid
- Upload — drag & drop or click, supports JPG/PNG/GIF/WebP (up to 100 MB)
- Tags — organize with comma-separated tags, filter by tag in the gallery
- Search — full-text search across titles and descriptions
- Quick share — copy link, Telegram, SMS, or download from any card or detail view
- Non-destructive rescale — creates a child image at a new size without touching the original
- Persistent — SQLite database + image files on Docker volumes (easy to back up or export)
Quick Start
cp .env.example .env
# Edit .env: set PUBLIC_URL to your domain
docker compose up --build -d
Open http://localhost:3000.
Unraid Setup
- In Unraid, go to Docker > Add Container (or use Community Applications).
- Use the image
memer:latest(build locally or push to a registry). - Map port 3000 to your desired host port.
- Add two path mappings:
/data/images→/mnt/user/appdata/memer/images/data/db→/mnt/user/appdata/memer/db
- Set environment variable
PUBLIC_URLtohttps://meme.alwisp.com. - Set up your reverse proxy (Nginx Proxy Manager, Swag, etc.) to point
meme.alwisp.com→ port 3000.
Environment Variables
| Variable | Default | Description |
|---|---|---|
PUBLIC_URL |
http://localhost:3000 |
Used to build absolute share links |
PORT |
3000 |
Port the server listens on |
DATA_DIR |
/data |
Root for images and DB inside the container |
API
| Method | Path | Description |
|---|---|---|
GET |
/api/memes |
List memes (?tag=, ?q=, ?page=, ?limit=, ?parent_only=) |
POST |
/api/memes |
Upload meme (multipart: file, title, description, tags) |
GET |
/api/memes/:id |
Get meme + children |
PUT |
/api/memes/:id |
Update title/description/tags |
DELETE |
/api/memes/:id |
Delete meme and all rescaled copies |
POST |
/api/memes/:id/rescale |
Create rescaled child ({ width?, height?, quality?, label? }) |
GET |
/api/tags |
List tags with counts |
DELETE |
/api/tags/:id |
Delete tag |
Local Development
# Terminal 1 — backend
cd backend && npm install && npm run dev
# Terminal 2 — frontend (proxies /api and /images to :3000)
cd frontend && npm install && npm run dev
Frontend dev server: http://localhost:5173
Backend API: http://localhost:3000
Backup
All data lives in two directories:
memer-imagesvolume — the actual image filesmemer-dbvolume —memer.db(SQLite)
Copy these two directories to back up everything.
Description
Languages
TypeScript
97.9%
Dockerfile
1.3%
HTML
0.4%
CSS
0.3%