Product
One photo. A full EU 1169/2011 compliance sheet.
1 · What goes in, what comes out
From a label photo to a decision-ready sheet
Etiq accepts the artefacts a small food producer actually has on hand — a phone photo of the jar, a supplier PDF, a design proof — and returns one artefact: the compliance sheet.
Inputs
- JarPhone photo of a curved glass jar under shop lighting.
- PouchFlexible pouch, crinkled surface, matte or gloss.
- BottleCylindrical bottle, foil label, partial reflections.
- Artwork PDFVector proof exported from Illustrator or InDesign.
Output
Compliance sheet
Product identity, mandatory mentions, allergen check, findings with rule references, and a print-ready corrected copy — in the target market's language.
Confiture d'abricot 350 g
France · EU 1169/2011
74 / 100
| Rule | Severity | Finding | Fix |
|---|---|---|---|
| Art. 21 §1(b) | Violation | Trace allergens (hazelnuts, milk) are declared but not emphasised in the ingredient list. | Bold 'fruits à coque' and 'lait' in the 'peut contenir des traces' statement. |
| Art. 24 §2 | Violation | Durability date reads 'DDM 09/2026' — missing the 'À consommer de préférence avant' wording required by Annex X. | Print as 'À consommer de préférence avant fin 09/2026'. |
| Art. 9(1)(e) | Review | Net quantity '350 g' present, but the metrological '℮' sign is missing. | Print '350 g ℮' if the container is filled by weight. |
| Annex XIII | OK | Nutrition declaration per 100 g present (energy, carbs, sugars, protein, salt). | No change required. |
Corrected label copy
Confiture d'abricot — 350 g ℮ Ingrédients : abricots 55 g/100 g, sucre, gélifiant (pectines), acidifiant : acide citrique. Peut contenir des traces de **fruits à coque** et de **lait**. À consommer de préférence avant fin 09/2026 · Lot AB-2409 Après ouverture, à conserver au réfrigérateur. Conserverie du Verger, 12 rue des Abricots, 84000 Avignon (France).
2 · Why this needs a vision model
The parts a keyword scanner can't reach
Rule-based tools handle the mechanical checks. A vision model is needed for the judgement calls that make or break a label audit.
What rule-based software can do here
- —Check ingredient text against a keyword list of known allergens.
- —Validate date syntax (DD/MM/YYYY, MM/YYYY, YYYY).
- —Flag missing fields when the label is already structured data.
- —Compare declared net quantity against a numeric range.
What only a vision model can do
- +Read a curved foil label under uneven lighting where OCR alone gives up.
- +Decide whether allergen emphasis is visually adequate — bold weight, contrast, size relative to the ingredient list.
- +Judge whether a claim like "NO ADDED SUGAR" is substantiated when honey appears in the ingredients.
- +Infer the legal denomination from a stylised brand name when the required generic name is missing.
3 · The pipeline
Five stages from photo to sheet
- 01PhotoPNG or JPG of the label, up to 8 MB, uploaded directly from the browser.
- 02GPT-4o visionThe image is sent to OpenAI with a system prompt scoped to EU 1169/2011.
- 03Structured OutputsA strict JSON schema forces every field to be present and typed.
- 04INCO rule packPost-processing maps each finding to the exact article and severity.
- 05Compliance sheetThe sheet and corrected copy are rendered in the market's language.
4 · The output schema
What the edge function actually returns
The same JSON shape powers the demo, the private dashboard and any future API. Every field is required by the schema; unknown values return null rather than being omitted.
response_format · json_schema · strict
{
"product_name": "string", // Legal denomination as printed, not the brand.
"ingredients": ["string"], // Ordered list, decreasing by weight, as read from the label.
"allergens_detected": ["string"], // Allergens found in the ingredient list, mapped to Annex II.
"allergen_emphasis_ok": boolean, // True only if each allergen is visually emphasised.
"mandatory_mentions": { // Presence check for the four Art. 9 mentions.
"net_quantity": boolean,
"durability_date": boolean,
"storage_conditions": boolean,
"operator_name_address": boolean
},
"violations": [ // One entry per finding, with rule reference and suggested fix.
{
"rule_ref": "string",
"severity": "ok" | "review" | "violation",
"finding": "string",
"fix": "string"
}
],
"compliance_score": 0-100, // 0 to 100; deductions are weighted by severity.
"corrected_label_text": "string" // A print-ready block of copy that resolves every violation.
}5 · Accuracy and limits
What it handles well, what it doesn't
Handles well
- ✓Flat or lightly curved labels shot straight on.
- ✓Printed type at 4 pt or larger, in a standard European language.
- ✓Ingredient lists, net quantities, durability dates, allergen emphasis.
- ✓French and EU-generic market at launch.
Still struggles with
- –Heavy glare, foil reflections that erase whole lines of type.
- –Handwritten labels and hand-stamped batch codes.
- –Type smaller than 4 pt, or dark ink on a dark background.
- –Non-Latin scripts and languages not yet in the rule pack.
Measured demo latency
18 to 24 seconds end-to-end per label, dominated by the vision call.
Etiq is an audit assistant, not legal advice. Every output must be reviewed by a qualified labelling expert before printing.