Repository navigation
Releases: spielkind/shop-notify
Releases · spielkind/shop-notify
Release list
v1.2.0
Immutable
release. Only release title and notes can be modified.
Added
- Filters: exclude or include items by keyword or regular expression and limit
the price, in.env(NOTIFY_EXCLUDE,NOTIFY_INCLUDE,
NOTIFY_EXCLUDE_REGEX,NOTIFY_INCLUDE_REGEX,NOTIFY_MIN_PRICE,
NOTIFY_MAX_PRICE) or in a YAML file (FILTER_CONFIG, see
filters.example.yml); documented with many examples indocs/filters.md - Filtered items are recorded in the history (
filteredwith the rule) and
notified once they pass, e.g. after the title changed shop-notify check-filterstests a title or the items of a period against
the filters
Changed
- Database schema version 2 (column
filtered); upgraded automatically with a
backup copy<DB_PATH>.bak-v1
v1.1.0
Immutable
release. Only release title and notes can be modified.
Added
- History of every listing: when it appeared, was notified, went missing, was
gone or came back, and changes of price and title; plus a log of the polls
(kept forPOLL_HISTORY_DAYS, default 14) shop-notify historyshows the events of a period or of one listing, and
the polls (--polls)- Items that come back after being gone are notified as back in the shop,
with their previous price and when they were last seen;NOTIFY_BACK=false
only records them - Template variable
item.backand filterago
Changed
- Listings are no longer deleted from the database when they are gone. The
database is upgraded automatically on the first start; a backup copy
<DB_PATH>.bak-v0is kept - An incomplete answer from Etsy is logged as info; a warning follows if it
lasts longer than an hour, and afterFORGET_AFTER_HOURSit is processed
anyway
v1.0.2
Immutable
release. Only release title and notes can be modified.
Fixed
- An item that was briefly missing from Etsy's response (gaps in Etsy's
listing index, or items moving between pages while paginating) was
forgotten and notified again as new. Notified items are now only
forgotten after they have been gone forFORGET_AFTER_HOURS(default 24),
and never after an incomplete response. - Notifications show when the item went online instead of when it was last
modified
Added
FORGET_AFTER_HOURSsetting; forgotten items are logged
v1.0.1
Immutable
release. Only release title and notes can be modified.
Added
- Published on PyPI:
uv tool install shop-notifyorpipx install shop-notify, with trusted
publishing and signed attestations - Package metadata (project links, classifiers, keywords)
Changed
- README links and images are absolute, so they also work on PyPI
v1.0.0
Immutable
release. Only release title and notes can be modified.
First stable release: verified against the real Etsy API – a new listing in a
live shop was notified exactly once.
Added
- Releases include the signed build provenance as in-toto JSON lines
(*.intoto.jsonl) forslsa-verifier - Documentation of the architecture, the security model (threat model and
assurance case), governance and the vulnerability handling process;
Code of Conduct - End-to-end test of the Docker image in CI
Fixed
- The build provenance of releases no longer lists
dist/.gitignoreas subject
v1.0.0-rc.4
Immutable
release. Only release title and notes can be modified.
Security
- Fixed vulnerabilities in the Docker image: pip, which is not needed at
runtime, was removed together with its outdated vendored libraries –
certifi (GHSA-6q48-6c7w-9gw2, critical), urllib3 (CVE-2026-97687,
CVE-2026-97689, CVE-2026-97688), msgpack (GHSA-6v7p-g79w-8964) and
setuptools (CVE-2025-47273, CVE-2026-59890). The application's own
dependencies were not affected. - The Docker image is scanned for vulnerabilities (Trivy) on every build and
weekly; critical and high findings fail the build, medium ones are reported - Base images are pinned by digest
- Secret scanning with gitleaks in pre-commit and CI, with rules for
passwords and bot tokens in notification URLs - Release tags can only be created by maintainers, must be signed and must
point to a commit onmain; published releases are immutable
Added
- Releases include the wheel, the source archive, a CycloneDX SBOM and the
Sigstore bundle of the signed build provenance - Weekly maintenance run: rebuild of
main, scan of the released image and
cleanup of old commit images
Changed
- The container runs as numeric user and group
1000:1000 compose.yaml: container is namedshop-notify(wasshop-notify-shop-notify-1)
v1.0.0-rc.3
First release verified against the real Etsy API (#6).
Added
- Push and chat services (ntfy, Telegram, …) get one message per new item
with its picture; e-mail stays one HTML message with all items.
NOTIFY_IMAGES,NOTIFY_IMAGES_MAX(default 5, above that one summary
message) andNOTIFY_IMAGES_IN_SUMMARY(attach pictures to the summary,
e.g. as Telegram album); new templatesitem_subject.txt.j2and
item_body.txt.j2(#10)
Changed
- New items are notified newest first (in Etsy's order) instead of by listing ID
- HTTP requests are only logged with
LOG_LEVEL=DEBUG
v1.0.0-rc.2
Added
shop-notify test-notifysends a sample notification to all configured
targets and reports the result per target; works without Etsy credentials,
--urltests a single Apprise URL (#9)- German notification messages with
NOTIFY_LANGUAGE=de; dates and prices
are formatted per language, new template filtermoney(#11)
Fixed
- A single malformed listing in an Etsy response no longer fails the whole
poll: it is skipped with a warning; a malformed price is ignored - Docker image: install time zone data so that
TZ(e.g.Europe/Berlin)
applies to dates in notifications and logs
Changed
- English messages now use English date and price formats
(Oct 14, 2026, 19:46,€24.50); built-in templates moved to
templates/<language>/ - Notifications are sent to each target separately; the warning for partial
failures names the failed targets
v1.0.0-rc.1
Complete rewrite of the original 2019 tool as Shop Notify. Release candidate
until it has been verified against the real Etsy API with an approved key.
Added
- Etsy Open API v3 client: API key authentication, pagination,
retry-after
handling on429, daily quota tracking with a warning below 20 % left ETSY_SHOP_NAMEas alternative toETSY_SHOP_ID; the ID is looked up at startup- Notifications via Apprise: e-mail, ntfy,
Telegram and 100+ other services, configured innotify.yml(NOTIFY_CONFIG)
orNOTIFY_URLS; credentials are masked in the log - HTML e-mails with item image, price and date; plain text for other services;
customisable Jinja2 templates (NOTIFY_TEMPLATE_DIR) NOTIFY_CONSOLEto print notifications to stdout in addition to other targets- First run: items already in the shop are only recorded and shown on the
console (NOTIFY_EXISTING_ON_FIRST_RUNto send them anyway) - Every notified item is logged with title and URL
shop-notify healthcheckbased on a heartbeat file,shop-notify --version- Docker image for
linux/amd64andlinux/arm64on GHCR with SBOM and
signed build provenance,compose.yaml - systemd unit with sandboxing and
Type=notify(readiness, status line, watchdog) - Graceful shutdown on
SIGINT/SIGTERM; Etsy and notification errors no
longer stop the polling loop - CI: ruff, mypy (strict), pytest with 100 % coverage, pip-audit, actionlint,
Docker builds for both architectures; pre-commit hooks
Changed
- Renamed from
etsy-notifytoshop-notify(package, command, image, service) - Python 3.14+, dependency management with uv instead of Pipenv
POLL_INTERVALdefaults to 300 seconds and is configurable- All settings are read from
.envor environment variables; nothing is
hard-coded anymore - SQLite storage keeps only listing ID, title, URL, price and modification time
Removed
- Etsy API v2 and OAuth 1 (shut down by Etsy)
- Built-in Gmail sender (
GMAIL_*,MAIL_*settings); use an Apprise
mailtos://URL instead - Travis CI and Rancher pipeline configuration