Matval — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Matval (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
I've built this project to order myself food. The process of thinking what recipes to eat and finding all the necessary ingredients for those recipes is an exhausting one (for me). As I do have a passion for cooking and since I've been doing automations for a long time I thought that I could make it more efficient and reduce this process from several hours (~4) each week to roughly 30 minutes. I like to spend time cooking or building some other fun stuff rather than looking up recipes and ingredients.
If someone is reading this and you think that this can help you, then this project is for you.
As I am living in Sweden currently, I've targeted the five main supermarkets:
Additional supermarkets might be added.
This is how you can try out the project (please do) and I would recommend running the mathem scraper, it's one of my favorite supermarkets.
cp .env.example .env
# Edit .env with your database credentials
# Provide a password to POSTGRES_PASSWORD
# Start PostgreSQL and the shelfwatch MCP server
docker compose up postgres shelfwatch
# Run a scraper (replace <store> with coop, hemkop, ica, mathem, or willys)
docker compose --profile scrape run --rm scraper <store>Copy-Item .env.example .env
# Edit .env with your database credentials
# Provide a password to POSTGRES_PASSWORD
# Start PostgreSQL and the shelfwatch MCP server
docker compose up postgres shelfwatch
# Run a scraper (replace <store> with coop, hemkop, ica, mathem, or willys)
docker compose --profile scrape run --rm scraper <store>The recommended setup runs each scraper once a week, staggered by one hour:
0 1 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper mathem >> /var/log/matval/mathem.log 2>&1
0 2 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper coop >> /var/log/matval/coop.log 2>&1
0 3 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper ica >> /var/log/matval/ica.log 2>&1
0 4 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper willys >> /var/log/matval/willys.log 2>&1
0 4 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper hemkop >> /var/log/matval/hemkop.log 2>&1robots.txt compliance: Willys and Hemkop both specify Crawl-delay: 10 and Visit-time: 0400-0845 UTC in their robots.txt. Their scrapers enforce the crawl delay via DOWNLOAD_DELAY = 10 and CONCURRENT_REQUESTS = 1. The cron entries above schedule both scrapers to start within the allowed visit window (04:00-08:45 UTC).
Every scraper collects the following for each product:
Coop additionally provides:
Price and availability changes are recorded automatically in a history table every time the scraper runs, so you can track how prices move over time without any extra configuration.
uv syncpytest tests/Tests use testcontainers to spin up a real PostgreSQL instance, so Docker must be running.
uv run ruff check .
uv run ruff format .
uv run mypy .Pre-commit hooks enforce these checks automatically. Install them with:
uv run pre-commit install~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.