What's new in EAN Check. Every release documented.
v1.5.1
+Added
Callout component now supports `error` and `success` variants alongside the existing tip, warning, insight, and checklist. Both new variants use the semantic colour tokens (`--color-error-*` and `--color-success-*`) so they will pick up dark mode automatically when the rest of the app is retrofitted. Per-variant label text colour, so the heading reads cleanly against the tinted background on the two new variants
v1.5.0
+Added
ISBN Converter at /isbn-converter, single-input ISBN-10 to ISBN-13 and back tool. Side-by-side output cards with per-card copy buttons, automatic kind detection (10-char vs 13-char), X check digit handling, graceful 'not convertible' state for 979-prefixed ISBN-13 values that have no ISBN-10 equivalent, and invalid-check-digit surfacing with the expected character so broken inputs are not silently converted into broken outputs
~2000 words of research-backed content covering the 1966 Gordon Foster 9-digit SBN origins at Trinity College Dublin, ISO 2108 in 1970, the 2007 transition to the 13-digit GS1-compatible form, full ISBN-10 and ISBN-13 structural breakdowns, worked examples of both the mod-11 and mod-10 check digit algorithms, the 978 vs 979 Bookland prefix story, and real-world use cases in MARC library catalogues, ONIX metadata feeds, used-book marketplaces, and academic citation systems
lib/isbn.ts top-up: detectIsbnKind, canConvertIsbn13To10, and normalizeIsbn convenience predicates for the converter UI
lib/isbn-converter-examples.ts with 8 curated examples spanning English, German, Japanese, and French (979-10) ISBNs plus one X check digit and one intentionally broken value
Entities for iso-2108 and international-isbn-agency in lib/entities.ts
~Changed
Header tools dropdown, related-tools section, footer Tools column, sitemap, site-wide JSON-LD (Organization.makesOffer, SiteNavigationElement.hasPart, ItemList #tool-list 9 → 10 items), and home-page significantLink/relatedLink arrays all extended with the new tool
Cross-link added from /barcode-identifier to /isbn-converter via the related-reading block
.gitignore extended with preventative rules for Playwright and Chrome DevTools MCP artifacts (test-results, playwright-report, playwright/.cache, trace.zip, traces, and root-level screenshot*.{png,jpg,jpeg,webp}) so generated files never leak into source control
v1.4.0
+Added
Barcode Identifier at /barcode-identifier, single-input "what is this code?" detector. Recognises GTIN-8/12/13/14, ISBN-10/13, ISSN, SSCC-18, GLN-13, ITF-14, GS1-128 paren and FNC1 strings, GS1 Digital Link URLs, 17-character VIN (ISO 3779), 15-digit IMEI (Luhn), and Amazon ASIN. Primary plus secondary "Also matches" hints handle ISBN-13 vs GTIN-13 and GTIN-13 vs GLN-13 overlaps honestly. Inline Application Identifier breakdown for GS1-128 inputs, path-segment breakdown for Digital Link inputs, VIN segmentation into WMI/VDS/VIS. Live detection with 200ms debounce, transparent normalization notes that show every transformation applied, invalid-check-digit path that routes to the repair tool
lib/isbn.ts with calculateIsbn10Check, isValidIsbn10, isValidIsbn13, isbn10To13, isbn13To10, formatIsbn10Display, formatIsbn13Display (mod-11 engine reusable by the future /isbn-converter tool)
lib/issn.ts with calculateIssnCheck, isValidIssn, formatIssnDisplay (8-character mod-11 with X)
lib/imei.ts with calculateImeiCheck, isValidImei (15-digit Luhn)
lib/vin.ts with isVinFormat, calculateVinCheck, isValidVin, segmentVin (ISO 3779 transliteration table and weighted mod-11)
lib/asin.ts with isAsinFormat, isLikelyNonBookAsin (format-only validation for the Amazon namespace)
lib/barcode-identifier.ts dispatcher with normalized pipeline and priority dispatch, returning a structured IdentificationResult with primary, secondary, normalizationNotes, and whatWeTried
lib/barcode-identifier-examples.ts with 14 preloaded examples covering every supported type plus one intentionally broken GTIN-13 and one deliberate no-match
FeedbackBox primitive at components/shared/feedback-box.tsx, reusable across tools, submits to a new API route with honeypot plus 3-second bot gate and always surfaces a prefilled mailto fallback
First API route on the site at app/api/feedback/route.ts, accepts feedback submissions from allowlisted contexts and forwards them to contact@eancheck.com via the Resend HTTP API. Env vars RESEND_API_KEY, FEEDBACK_TO_EMAIL, FEEDBACK_FROM_EMAIL. No database, email is the store
Entities for isbn, issn, gtin, vin, imei, asin, and iso-3779 in lib/entities.ts
~Changed
Header tools dropdown, related-tools section, footer Tools column, sitemap, site-wide JSON-LD (Organization.makesOffer, SiteNavigationElement.hasPart, ItemList #tool-list 8 → 9 items), and home-page significantLink/relatedLink arrays all extended with the new tool
Cross-links added from /gs1-128-parser, /gs1-digital-link, and /barcode-repair to the new identifier via their related-reading blocks
v1.3.0
+Added
GS1-128 Parser at /gs1-128-parser, single-input educational tool. Accepts paren notation, FNC1-delimited scanner output, and GS1 Digital Link URLs in the same input. Rich per-AI breakdown cards with category-coloured borders, interactive anatomy widget, three-format export block, QR code, ~1700-word explainer
Bulk GS1-128 Parser at /gs1-128-parser-bulk, implementer workflow tool. TanStack table with dynamic AI columns, inline cell editing, sort + per-column filter, column visibility toggle, row selection, bulk edit dialogs (Edit AI, Find & Replace, Shift Date), row actions menu, QR preview dialog with 24-at-a-time lazy rendering, PNG/SVG ZIP exports
Full GS1 Application Identifier registry (~580 AIs) in lib/gs1-ai-registry.ts with hand-written validators for GTIN/SSCC/GLN check digits and YYMMDD dates, programmatic generation for the 3xxx measurement family
lib/gs1-ai-parser.ts with unified parser for paren, FNC1, and Digital Link URL formats plus round-trip serializers
Shared QrBlock primitive at components/shared/qr-block.tsx, extracted from DigitalLinkPreview with a new minimal render mode for grid contexts, and a new copy-as-image button using the Clipboard API
Shared QrPreviewDialog primitive with Radix Dialog grid, batched rendering, and in-dialog PNG/SVG ZIP downloads
Semantic colour token system (--color-error/warning/success/info with bg/border/text variants and dark-mode equivalents), retrofitted across barcode-repair-form, check-digit-animator, and the warning section class
@radix-ui/react-dialog dependency
~Changed
lib/gs1-qualifiers.ts refactored to a thin adapter that filters the new AI registry to the 12 Digital Link qualifiers and reshapes each into the legacy Qualifier type; existing QualifierPicker, DigitalLinkForm, DigitalLinkAnatomy, and QualifierReference consumers work unchanged
DigitalLinkPreview slimmed from 249 to 100 lines, now delegates the entire QR code block to the shared QrBlock primitive
Header tools dropdown, related-tools section, footer Tools column, sitemap, site-wide JSON-LD (Organization.makesOffer, SiteNavigationElement.hasPart, ItemList #tool-list 6 → 8 items), and home-page significantLink/relatedLink arrays all extended with the two new tools
Cross-links added from /gs1-digital-link and /gs1-digital-link-bulk to the new GS1-128 pages (and vice versa) via the related-reading blocks
v1.2.0
+Added
Barcode Repair Tool at /barcode-repair, recovers smudged or partially unreadable GTINs by marking unknown digits with `?` or `*` and brute-forcing the GS1 mod-10 check digit. Supports GTIN-8/12/13/14 with up to 3 unknown positions, strict and tolerant input modes, candidate filter, and one-click validation in the main calculator
CheckDigitAnimator widget: live mod-10 visualiser with per-digit weight/contribution grid and a "what if" panel showing the resulting check digit for every alternative digit at any focused position. Drop-in component, reusable across future barcode tool pages
URL parameter support on the main barcode calculator: `?validate=<code>` or `?calculate=<code>` (comma/newline separated for bulk) pre-fills the input and auto-runs the matching action, used by cross-tool links
~Changed
Reading time chip removed from the visible article byline; the data still flows into JSON-LD as `timeRequired` so search engines and AI agents can surface it
Em dashes removed app-wide in favour of commas, colons, periods, and semicolons
Article copy across all rich pages humanised: comma-splice fixes, fewer puffery words, more direct phrasing
Header tools dropdown, related-tools section, sitemap, site-wide JSON-LD (Organization.makesOffer, SiteNavigationElement.hasPart, ItemList #tool-list) and home-page significantLink/relatedLink all extended with the new tool
v1.1.0
+Added
GS1 Digital Link Generator at /gs1-digital-link, turn any GTIN into a canonical Digital Link URL and QR code with optional batch, expiry, serial and other GS1 Application Identifier qualifiers
Bulk GS1 Digital Link Generator at /gs1-digital-link-bulk, convert a whole product catalogue from a single paste with auto-detected newline/TSV/CSV formats, sortable results table, CSV export, and one-click QR ZIP export
Three GTIN input modes (Manual, Auto-complete, Tolerant) with animated help chips and localStorage persistence
Custom resolver domain support for production Digital Link deployments
Reusable article content system: article primitives, interactive widgets (Digital Link anatomy, qualifier reference, classic vs Digital Link comparison, inline mini demo), and interlinked JSON-LD @graph builder with auto-populated TechArticle.mentions