nordealdi is a small Go application that keeps an eye on the weekly deals at ALDI Nord for you. The name is a portmanteau of ALDI Nord and deal: Nord + deal + ALDI → nordealdi.
- Periodically fetches the offers page of ALDI Nord.
- Persists every fetch as a timestamped JSON snapshot, so offer history is kept and changes can be tracked.
- Filters the offers against your configured relevance keywords.
- Sends a push notification to your device via ntfy.sh when matching offers are found.
- Exposes the latest snapshot through a small REST API:
GET /offers— the latest offers, optionally filtered with?search=...GET /health— a health check
Configuration is loaded from a config.json file in the working directory (or
provided at the configured path). If the file is missing, sensible defaults are
used.
| Attribute | Type | Default | Description |
|---|---|---|---|
relevant_offers |
[]string |
[] |
Case-insensitive keywords that make an offer relevant. When non-empty, only offers whose name or brand matches at least one keyword trigger a notification. Empty means all offers are relevant. |
ntfy_topic |
string |
"nordealdi" |
The ntfy.sh topic that push notifications are sent to. |
enable_notifications |
bool |
true |
Whether push notifications are enabled at all. When false, the application still fetches and stores offers, but sends no notifications. |
cron_expression |
string |
"0 * * * *" |
The 5-field CRON expression that controls how often offers are fetched. "0 * * * *" means "every hour at minute 0". |
scheduler_max_retries |
int |
3 |
Maximum number of times a failed fetch-and-notify task is retried. |
scheduler_max_backoff_seconds |
int |
60 |
Upper bound (in seconds) for the exponential backoff between retries. |
scheduler_initial_backoff_seconds |
int |
1 |
Initial backoff (in seconds) before the first retry. |
store_dir |
string |
"./data" |
Directory where the offer snapshot files are persisted. |
store_retention |
int |
10 |
Maximum number of snapshot files to keep. Older files are deleted once the limit is exceeded. A value <= 0 keeps all snapshots. |
{
"relevant_offers": ["Schokolade"],
"ntfy_topic": "a2d1b5c8-022a-43fe-91b5-c8022a33fea5",
"enable_notifications": true,
"cron_expression": "0 * * * *",
"scheduler_max_retries": 3,
"scheduler_max_backoff_seconds": 60,
"scheduler_initial_backoff_seconds": 10,
"store_dir": "./data",
"store_retention": 10
}- Update the
config.jsonfile to your needs (see Configuration above). - Update the docker setup if necessary.
- Start the application using docker compose (recommended)
or run it without docker.
docker compose up -dgo run ./cmd
go build ./... # compile everything
go test ./... # run all unit tests
go vet ./... # static analysisSee AGENTS.md for the full developer guide.
This project was developed with the support of artificial intelligence (AI). The large language model DeepSeek V4-Flash was used to assist with writing and reviewing parts of the codebase.
This is an independent, unofficial project and is not affiliated with or endorsed by ALDI Nord. It retrieves publicly available offer data from the ALDI Nord website for informational purposes only. All trademarks, product names, and other content remain the property of their respective owners.