Daily "On This Day" push notifications from your Immich server — like Google Photos memories, but self-hosted.
- Features
- Quick Start
- Immich API Key Permissions
- Screenshots
- Common Commands
- Configuration
- Self-Hosting ntfy
- Dashboard Authentication
- Troubleshooting
- Requirements
- Contributing
- Daily Memories — Photos from this day in previous years, with face preference and location context
- Then & Now — Side-by-side comparison of the same person across years
- Trip Highlights — Collage from a past trip (same city, same month), with smart date clustering
- Weekly Collages — 12 template combinations (Grid, Mosaic, Polaroid, Strip) with face-based smart cropping
- Web Dashboard — Manage settings, users, messages, and trigger tests from a browser
- Multi-User — Each user gets personalized notifications from their own library
- Guided Setup —
setup.sh+ first-run dashboard wizard - Bundled ntfy — Optionally spin up a pre-configured ntfy server
- Privacy First — Everything runs on your network
git clone https://github.com/ismaildakrory/immich-memories-notify.git
cd immich-memories-notify
bash setup.shThe setup script generates your config, optionally starts a bundled ntfy server, and launches the dashboard. A wizard walks you through connecting Immich, ntfy, and adding your first user. The scheduler runs automatically inside the dashboard container.
When creating an API key in Immich, grant these permissions:
| Permission | Used for |
|---|---|
memory.read |
On-this-day notifications |
person.read |
Face recognition features |
asset.read |
Asset details and metadata search |
asset.view |
Thumbnail previews in notifications |
asset.upload |
Weekly collage upload |
album.read |
Album notifications |
album.create |
Creating the collage album |
albumAsset.create |
Adding collages to the album |
If you don't use the weekly collage and Trip features, you can skip asset.upload, album.create, and albumAsset.create.
# Test a specific slot
docker compose run --rm notify --slot 1 --test --no-delay
# Dry run (preview without sending)
docker compose run --rm notify --slot 1 --dry-run --no-delay
# Force resend
docker compose run --rm notify --slot 1 --force --no-delay
# Logs
docker compose logs -f dashboard
# Rebuild after code changes
docker compose down dashboard && docker compose up -d --build dashboardAll settings are manageable from the web dashboard. For manual editing:
| File | Purpose |
|---|---|
.env |
Secrets — API keys, passwords, server URLs |
config.yaml |
Everything else — users, settings, messages |
state/state.json |
Notification tracking (auto-generated) |
Settings reference (config.yaml)
settings:
memory_notifications: 3 # Memory slots per day
person_notifications: 1 # Person photo slots (when memories exist)
fallback_notifications: 3 # Person photos when no memories today
top_persons_limit: 5 # Top N named people to feature
exclude_recent_days: 30 # Skip recent photos for person notifications
year_range: 20 # How far back to look (collage, trip, TaN)
include_location: true # Add city/country context
include_album: true # Show album name
video_emoji: true # Add film emoji for videos
prefer_group_photos: true # Prioritize multi-person photos
min_group_size: 2 # Min faces for "group photo"
# Then & Now
then_and_now_enabled: true
then_and_now_cooldown_days: 7
then_and_now_min_gap: 3 # Min years between "then" and "now"
# Trip Highlights
trip_highlights_enabled: true
trip_highlights_cooldown_days: 7
trip_highlights_min_photos: 5
# Weekly Collage
weekly_collage_enabled: true
weekly_collage_day: 6 # 0=Sun, 6=Sat
weekly_collage_slots: 1
collage_template: random # or: grid_custom, mosaic_custom, polaroid_custom, strip_custom
collage_album_name: Weekly Highlights
# Notification windows (one per slot)
notification_windows:
- start: "08:00"
end: "10:00"
- start: "12:00"
end: "14:00"Message templates
messages:
- "A little trip back to {year}..."
- "Remember this day {years_ago} years ago?"
person_messages:
- "A lovely moment with {person_name}..."
video_messages:
- "Watch this moment from {year}..."
then_and_now_messages:
- "Look how much {person_name} has changed! {then_year} vs {now_year}"
trip_highlights_messages:
- "Remember this trip to {city}? Back in {year}!"Placeholders: {year}, {years_ago}, {person_name}, {city}, {country}, {gap}, {then_year}, {now_year}
Bundled (easiest): Say yes when setup.sh asks. Everything is configured automatically.
Bring your own: Your ntfy server.yaml needs attachment support for thumbnail previews:
base-url: "https://notify.yourdomain.com"
auth-file: /var/lib/ntfy/user.db
auth-default-access: deny-all
attachment-cache-dir: /var/lib/ntfy/attachments
attachment-total-size: 5G
attachment-file-size: 15M
attachment-expiry-duration: 3hSet in .env to password-protect the dashboard:
DASHBOARD_TOKEN=your-secret-token
If not set, the dashboard is open (fine for local network).
v2.5.0 merges the scheduler into the dashboard container. To upgrade:
git pull
docker compose down --remove-orphans
docker compose up -d --build dashboardThe old scheduler container is no longer needed. If you skip docker compose down and just rebuild, the dashboard will automatically stop the old scheduler on startup to prevent double notifications.
Bundled ntfy users:
docker compose downstops all containers including ntfy. Make sure to restart it alongside the dashboard:docker compose up -d --build dashboard ntfyOr simply
docker compose up -d --buildto restart everything.
| Problem | Fix |
|---|---|
| No notifications | docker compose run --rm notify --slot 1 --dry-run --no-delay to check for memories |
| No thumbnails | Run with --test --force, look for upload warnings in output |
| No person photos | Name your people in Immich, ensure photos older than 30 days exist |
| Already sent today | Use --force flag, or delete state/state.json |
| Dashboard not loading | docker compose logs dashboard to check errors |
git pull fails with local changes |
git stash && git pull && git stash pop — your .env and config.yaml are preserved |
- Immich (self-hosted)
- ntfy (self-hosted or bundled)
- Docker & Docker Compose
- ntfy mobile app (Android / iOS)
- Named people in Immich for face features
Built with AI assistance, manually reviewed and tested. PRs, issues, and feedback welcome!
See CONTRIBUTORS.md for a list of contributors.
MIT — see LICENSE.
Made with love for the Immich community








