Svelte Commerce
A standalone open-source storefront built with SvelteKit, headless across 26 commerce backends. MIT licensed.
翻译准备中
Open dataset of the additives declared in wines sold by Systembolaget
翻译准备中
正在加载完整 README。
查看完整 README ↗A public dataset of the additives declared in wines sold by Systembolaget, and a bilingual site on top of it at vindeklaration.se.
Since 8 December 2023 the EU requires wine to declare its ingredients and nutritional values. Systembolaget shows that declaration on each product page, but it cannot be searched, filtered or compared — you can look up one wine at a time and nothing more. This project reads every wine's declaration, turns the free text into structured data, and publishes the result.
| File | Contents |
|---|---|
data/wines.json | The dataset: one record per wine, with parsed additives. Not in git — download wines.json.gz, mirrored on the latest release. Monthly snapshots live in their own releases. |
data/wines.sqlite | The same rows, for querying — built by src.build from wines.json, not committed |
data/additives.yaml | The substance dictionary — names, E-numbers, aliases |
data/unknown.json | Text the parser could not identify, ranked by impact |
data/producer-declarations.json | A second source: declarations found at the producer's own e-label where Systembolaget carries none. Kept separate and never merged into the dataset |
src/site.py, templates/ | The site — a static build, uv run python -m src.site |
worker/index.js, cf-build.sh | What serves the dataset at /data/*, and what Cloudflare's build runs |
Most wines declare nothing yet. The requirement turns on when the wine was produced: wine produced before 8 December 2023 may be sold under the old rules until stocks run out. "The 2024 harvest onwards" is the Commission's own shorthand for this, and it is not the criterion — a wine produced in, say, January 2024, or a non-vintage sparkling wine whose second fermentation happened later, is covered without carrying a 2024 vintage.
The dataset has no production date, and Systembolaget publishes none, so vintage is used as a stand-in throughout. The error runs one way: every wine of vintage 2024 or later was necessarily produced after the cutoff, so nothing is counted as covered when it is not. But 33.2% of the catalogue carries vintage 2023 or none at all, and an unknown share of that sits inside the requirement while a vintage filter cannot see it. Any figure here computed "over the wines the requirement covers" means the wines it certainly covers.
20.4% of the assortment currently carries a declaration, rising to 66%
among wines of vintage 2024 or later. Coverage improves on its own as stock
rotates. See docs/legal-notes.md §1f for the sources.
The text is supplier-entered. Each importer types the declaration by hand,
so spelling, terminology and completeness vary. raw_ingredients is kept on
every record so any claim here can be checked against the source.
Counting is a judgement call, and here is the one made. additive_count
counts declared additives, sulfites included. Grapes, must and added sugar are
raw materials and are not counted. Bottling gases (nitrogen, CO₂, argon) are
recorded separately in gases and not counted, because they are a packaging
step rather than something that stays in the wine. A wine with text the parser
could not read is marked parse_status: "partial" and is excluded from any
ranking — omitting a wine is better than understating its additives.
Fewer additives does not mean healthier. This is a record of what is on the label, not a health assessment. Wine is alcohol; that is the relevant risk.
The label wins. The bottle in your hand is more current than this dataset.
{
"product_number": "253108",
"name": "Adobe Sauvignon Blanc",
"vintage": "2025",
"country": "Chile",
"price": 249.0,
"declaration_status": "declared",
"parse_status": "complete",
"additive_count": 2,
"additives": [
{"id": "sulfites", "e_number": "E220-E228", "category": "preservative",
"name": {"sv": "Sulfiter", "en": "Sulfites"}, "allergen": "sulfites"}
],
"gases": [{"id": "carbon_dioxide", "e_number": "E290"}],
"base_ingredients": [{"id": "grapes"}],
"processing_notes": [{"id": "protective_atmosphere"}],
"allergens": ["sulfites"],
"nutrition": {"kcal_per_100ml": 73, "sugar_g_per_100ml": 0.2},
"raw_ingredients": "Druvor*, koldioxid, konserveringsmedel (SULFITER), ...",
"source_url": "https://www.systembolaget.se/produkt/vin/x-253108/"
}
declaration_status is declared or not_declared; parse_status is
complete, partial or not_declared. Undeclared wines are kept in the
dataset — leaving them out would hide how much of the assortment says nothing.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗