1. Wiki
  2. Before It's Gone
  3. Changelog

Changelog

All notable changes to Before It's Gone. Format follows Keep a Changelog; versioning follows Semantic Versioning.

The repo CHANGELOG.md tracks the most recent releases. This page is the complete history.

1.3.5 — 2026-10-02

Changed

  • Bumped nodemailer 9.0.3 → 10.0.13, resend 6.17.1 → 6.27.0, @types/nodemailer 8.0.1 → 8.0.2, react-i18next 17.0.8 → 17.0.13, recharts 3.9.2 → 3.10.1, vite 8.1.3 → 8.3.0, concurrently 9.2.4 → 10.0.5, electron-builder 26.15.3 → 26.16.1, and wait-on 9.0.1 → 9.1.0.

1.3.4 — 2026-08-23

Changed

  • Bumped actions/stale 10 to 11.
  • Updated installation command to use correct package name.
  • Removed test RPM spec from workflow.

1.3.3 — 2026-07-2

Added

  • Recipes tab: recipe suggestions (TheMealDB, triggered when 3+ items are expiring or expired) now live in a dedicated Recipes tab instead of an inline dismissible banner. The tab shows a badge with the suggestion count.

Fixed

  • App icon rendering wrong at small sizes: the icon shipped in 1.3.1 only filled the top-left ~301x301 px of its 512x512 canvas, leaving the rest transparent. At taskbar/dock/panel sizes (16-48px) this made the icon look off-center or broken on Windows, macOS, and Linux alike. The PNG has been re-rendered to fill the full canvas; the SVG sources were already correct and are unaffected.

Security

  • brace-expansion DoS (GHSA-mh99-v99m-4gvg): added overrides pinning minimatch to ^10.2.5 and brace-expansion to ^5.0.8 across the dependency tree, closing the high-severity out-of-memory DoS in every nested copy without bumping eslint-plugin-react or electron-builder to a breaking major version.

1.3.2-beta.1 — 2026-07-22

Added

  • Recipes tab: recipe suggestions (TheMealDB, triggered when 3+ items are expiring or expired) now live in a dedicated Recipes tab instead of an inline dismissible banner. The tab shows a badge with the suggestion count.

Fixed

  • App icon rendering wrong at small sizes: the icon shipped in 1.3.1 only filled the top-left ~301x301 px of its 512x512 canvas, leaving the rest transparent. At taskbar/dock/panel sizes (16-48px) this made the icon look off-center or broken on Windows, macOS, and Linux alike. The PNG has been re-rendered to fill the full canvas; the SVG sources were already correct and are unaffected.

1.3.1 — 2026-07-11

Added

  • Beta release channel: CI now builds and publishes a separate beta release for any tag matching vX.X.X-beta.X. Beta builds use a distinct package name (before-its-gone-beta) to avoid conflicts with stable across apt, RPM, and electron-builder targets.
  • Beta auto-updater: the Electron auto-updater detects beta builds at startup and switches to the beta update channel, so beta users receive beta updates and stable users are never prompted to install a prerelease.
  • Beta apt distribution: the apt repo at apt.aetherassembly.org now has a separate beta distribution. Users can opt in without affecting their stable install.
  • Beta COPR and OBS projects: separate aster1630/before-its-gone-beta COPR project and home:aster1630:before-its-gone-beta OBS project for rpm beta packaging.

Changed

  • App icon: replaced the placeholder icon with the BIG carrot rocket logo across all targets (Electron, PWA 192px/512px, Linux release bundles). SVG and PNG assets updated.

1.3.1-beta.1 — 2026-07-07

Added

  • Beta release channel: CI now builds and publishes a separate beta release for any tag matching vX.X.X-beta.X. Beta builds use a distinct package name (before-its-gone-beta) to avoid conflicts with stable across apt, RPM, and electron-builder targets.
  • Beta auto-updater: the Electron auto-updater detects beta builds at startup and switches to the beta update channel, so beta users receive beta updates and stable users are never prompted to install a prerelease.
  • Beta apt distribution: the apt repo at apt.aetherassembly.org now has a separate beta distribution. Users can opt in without affecting their stable install.
  • Beta COPR and OBS projects: separate aster1630/before-its-gone-beta COPR project and home:aster1630:before-its-gone-beta OBS project for rpm beta packaging.

Changed

  • App icon: replaced the placeholder icon with the BIG carrot rocket logo across all targets (Electron, PWA 192px/512px, Linux release bundles). SVG and PNG assets updated.

1.3.0 — 2026-07-06

Added

  • Virtual scrolling: the inventory list now uses a windowed virtualizer, rendering only the visible cards rather than the full list. Large inventories no longer cause layout jank on lower-end hardware.
  • Pre-commit hook: Husky + lint-staged added. ESLint runs automatically on staged .ts/.tsx files before every commit. Run npm install once to activate the hook.
  • Extended test suite: 38 additional unit tests in packages/core covering calculateExpiryStatus boundary conditions, normalizeDate format variants, getShoppingList threshold logic, and getFrequentItems sorting and limit behaviour. Total test count: 102.
  • docs/data-model.md: dedicated reference page for the InventoryItem field schema, linked from the Docs section of the README.
  • Screenshots in README: inventory list, add item form, charts, shopping list, and settings views.
  • docs/demo-data.json: sample dataset with 15 items across all three locations and all three expiry statuses, importable via Data → Import JSON for development and testing.

Changed

  • Dependency bumps: electron 42.5.1 → 43.0.0 (electronVersion in packaging scripts updated to match), @supabase/supabase-js 2.108.2 → 2.110.0, nodemailer 9.0.1 → 9.0.3, resend 6.16.0 → 6.17.1, recharts 3.9.0 → 3.9.2, i18next 26.3.3 → 26.3.4, vitest + @vitest/coverage-v8 4.1.9 → 4.1.10, prettier 3.9.3 → 3.9.4, @types/node 26.0.1 → 26.1.0.

Fixed

  • Coverage report tracked in git: packages/core/coverage/ was committed despite *.tsbuildinfo already being gitignored. Added explicit packages/core/coverage/ entry to .gitignore and removed the directory from the index.

1.2.1 — 2026-06-19

Fixed

  • tsc --build failure on cold/clean builds: packages/core/src/storage.ts imported LocalStorageAdapter and StorageAdapter from @aetherAssembly/core via a symlinked cross-repo dependency. TypeScript resolved the module through the build cache but failed on clean builds where the cache was absent. Both types are now inlined directly in storage.ts, removing the external dependency entirely.

Changed

  • Workspace package names: @before-its-gone/core and @before-its-gone/ui renamed to @aetherAssembly/big-core and @aetherAssembly/big-ui. The @before-its-gone npm scope has no matching GitHub owner, causing npm publish to return a 403. The new names use the @aetherAssembly org scope, which matches the GitHub organisation.
  • @aetherAssembly/big-core publish tarball: added a files field (["dist", "LICENSE"]) to exclude coverage/, src/, tsconfig.json, and vitest.config.ts from the published package.

1.2.0 — 2026-06-19

Added

  • .npmrc: scopes @aetherAssembly to the GitHub Package Registry (https://npm.pkg.github.com) so npm install resolves the shared packages without a global registry override.

Changed

  • Shared package dependencies: @aetherAssembly/core and @aetherAssembly/ui are now consumed from the GitHub Package Registry (^1.0.0) rather than a file: path, making the repo self-contained for any contributor.
  • Local package names: BIG's own workspace packages renamed from @aetherAssembly/core and @aetherAssembly/ui to @before-its-gone/core and @before-its-gone/ui to avoid name collision with the published shared packages now installed at the root.
  • packages/core storage: the local KeyValueStorage interface and BrowserLocalStorageAdapter class have been removed. packages/core now re-exports LocalStorageAdapter and StorageAdapter directly from @aetherAssembly/core, keeping the public API identical for all callers.
  • apps/web Vite aliases: @aetherAssembly/core and @aetherAssembly/ui aliases updated to resolve to the renamed @before-its-gone/* local workspace packages.

1.1.2 — 2026-06-18

Fixed

  • OBS packaging: Added BuildRequires: hicolor-icon-theme to the RPM spec. OBS check-filelist runs at build time and requires the package to be present in the build chroot. Requires: is runtime-only and does not install the package into the build chroot, causing Tumbleweed and Leap builds to fail. Fedora/COPR found it transitively.
  • Image upload hang: resizeImage in ItemDrawer.tsx had no img.onerror handler. Uploading a corrupt or unsupported image file caused the returned Promise to never settle, freezing the photo upload UI indefinitely. Added rejection with cleanup of the object URL.
  • CSV date timezone shift: Expiry dates in CSV import were constructed as new Date('YYYY-MM-DDT23:59:59').toISOString(), which treats the time as local time. In UTC− timezones this shifted the stored date forward by one day. Dates are now stored as explicit UTC (T23:59:59.000Z) and the display code in buildEditForm now extracts the local date using getFullYear/getMonth/getDate rather than .toISOString().slice(0, 10).
  • Photo field cleared on edit: Passing photo: undefined in a patch to updateInventoryItem caused the spread to overwrite the stored photo with undefined, silently clearing it. The function now strips undefined values from the patch before spreading; null still explicitly clears the field.
  • Tags lost on CSV round-trip: The CSV export did not include a tags column, so tags were silently dropped on export and could not survive a re-import. Tags are now exported (semicolon-separated) and survive a full export → re-import cycle.
  • Scanner save race condition: The phone scanner stored the active save's resolve/reject callbacks in module-level globals. A second scan arriving while a save was in flight would overwrite them, causing the wrong promise to settle. Added scannerSaveLock in main.ts to reject concurrent saves until the first completes or times out.
  • Email digest double-fire after restart: DigestScheduler used an in-memory lastFiredDate guard that reset on restart, allowing the digest to fire again within the same day if the app restarted during the target minute. Added a disk-backed guard that checks lastSentAt from email-settings.json for daily digests.
  • Orphaned undo timer on edit: Editing an item while the "Use one" undo toast was pending left the undo setTimeout running. The timer now fires against stale state once it expires. onEditSave now clears the pending undo before proceeding.

Added

  • normalizeDate utility (packages/core/src/inventory.ts): accepts expiry dates in any common human-written format (ISO date, ISO timestamp, MM/DD/YYYY, M/D/YYYY, YYYY/MM/DD, DD-MM-YYYY, "June 1, 2026", "1 Jun 2026", etc.) and returns a canonical YYYY-MM-DDT23:59:59.000Z string. Called automatically during CSV import. Invalid dates return null and cause the row to be skipped. 26 unit tests added.
  • npm run package:linux:rpm: builds only the .rpm artifact via electron-builder, skipping AppImage and .deb.
  • npm run test:rpm-spec: builds the x86_64 RPM if not already present, stages it as both sources for rpmbuild, and runs rpmbuild -bb against the spec file. Pass --skip-build to reuse an existing artifact.
  • GHCR Docker image: the release pipeline now builds and pushes ghcr.io/aetherAssembly/before-its-gone on every version tag. Tagged as {{version}}, {{major}}.{{minor}}, and latest.
  • Version consistency workflow (.github/workflows/version-check.yml): runs on every push and PR; compares the version in package.json, before-its-gone.spec, and the top CHANGELOG.md entry, failing with file-level annotations if any drift is found.

Changed

  • CSV export now includes tags (semicolon-separated), shelf_life_days, and depletion_threshold columns. expiresAt is now exported as a date-only string (YYYY-MM-DD) rather than a full ISO timestamp.
  • Packaging docs: standardised "Supported versions" sections across all Linux packaging READMEs.
  • CONTRIBUTING.md: Added "Gotchas and non-obvious behaviour" section documenting date storage rules, undefined vs null patch semantics, scanner save lock, digest deduplication layers, image upload error handling, and the CSV tag separator convention.
  • CI action versions: actions/upload-artifact and actions/download-artifact bumped from @v4 to @v7.

1.1.1 — 2026-06-17

Added

  • Self-hosting documentation: docs/self-hosting.md covers deploying the PWA via Docker and nginx, configuring a custom port, serving over HTTPS with Tailscale, updating the container, and installing as a PWA once running.
  • .github/CODEOWNERS: Aster owns all files by default; Milo (@EvilLickCompany) co-owns docs/ and .github/CONTRIBUTING.md for automatic review requests on relevant PRs.
  • .editorconfig: enforces consistent indentation (2 spaces), lf line endings, UTF-8 charset, and trailing whitespace trimming across all editors and contributors. Markdown files are exempt from trailing whitespace trimming.
  • Support issue template: .github/ISSUE_TEMPLATE/question.yml adds a dedicated "Question / Support" template, keeping non-bug traffic out of the bug report queue.

Changed

  • EULA governing law: section 8 now specifies the Commonwealth of Pennsylvania as the governing jurisdiction.
  • EULA section 7 (Updates): added a forward-looking note that future PWA versions handle updates via service workers; the GitHub Releases auto-update description now applies explicitly to the current Electron build only.
  • EULA section 3 (Third-Party Services): tightened wording to clarify AetherAssembly is not responsible for the availability or conduct of third-party services.
  • PKGBUILD license field: corrected from MIT to AGPL-3.0-only.

Fixed

  • NSIS installer: customLicensePage macro now references eula.rtf and license.rtf from ${BUILD_RESOURCES_DIR} instead of $PLUGINSDIR, ensuring both files are sourced from the correct build/ directory.
  • Linux package naming: added deb.packageName and rpm.packageName to electron-builder.linux.yml to prevent the Debian and RPM package names from inheriting the internal workspace name.
  • RPM spec %files conflict with filesystem package: replaced the /usr/* glob with explicit paths, resolving the COPR install conflict where the package claimed ownership of system directories already owned by filesystem.
  • Miscellaneous Markdown lint fixes across documentation files.

1.1.0 — 2026-06-16

Added

  • Self-hosted PWA: apps/web is now deployable as a Progressive Web App via Docker + nginx. A docker/ folder contains a multi-stage Dockerfile, nginx.conf, and docker-compose.yml. Four convenience scripts added: docker:pwa:up, docker:pwa:down, docker:pwa:build, and build:pwa.
  • In-browser barcode scanner (BarcodeScannerModal): new component uses @zxing/browser to open the device camera directly in the browser. Appears in the add-item form when not running inside Electron.
  • vite-plugin-pwa: the manual public/sw.js and public/manifest.webmanifest are replaced by vite-plugin-pwa (autoUpdate mode), generating a precache manifest and a NetworkFirst runtime cache for Open Food Facts API calls.
  • LAN dev server binding: vite.config.ts now sets server.host: true, so npm run dev:web binds to 0.0.0.0:5173 and is reachable from other devices on the local network.
  • Self-hosted apt repository: Debian, Ubuntu, and Raspberry Pi OS users can install via apt.aetherassembly.org for automatic updates through apt upgrade.
  • RPM .spec for Fedora COPR / openSUSE OBS: added docs/packaging/linux/fedora/before-its-gone.spec, repackaging the upstream electron-builder .rpm for distribution via COPR and OBS.
  • CI: RPM spec build test (.github/workflows/test-rpm-spec.yml): verifies before-its-gone.spec builds cleanly across Fedora, CentOS Stream, openSUSE Leap, and Mageia containers.

1.0.1 — 2026-06-15

Changed

  • Dependency bumps: electron 42.4.0, @types/node 25.9.3, nodemailer 9.0.0, @typescript-eslint/parser 8.61.0, @supabase/supabase-js 2.108.2, vitest 4.1.9, prettier 3.8.4, electron-builder 26.15.3, @typescript-eslint/eslint-plugin 8.61.0.

Fixed

  • Release notes script: glob *x64.AppImage did not match electron-builder's *x86_64.AppImage output, omitting the x86_64 AppImage from the download table.
  • Release notes script: glob *Setup*.exe (capital S) did not match *setup*.exe, omitting the Windows NSIS installer from the download table.
  • Release notes script: no row existed for the arm64 .rpm artifact (*aarch64.rpm). Row added.
  • Release notes: Linux Wayland override examples referenced x64.AppImage; corrected to x86_64.AppImage.

1.0.0 — 2026-06-13

Changed

  • Promoted from release candidate to stable. No functional changes from rc.4.

Removed

  • Removed Flatpak plan (not viable for Flathub submission). a2d77b4

1.0.0-rc.4 — 2026-06-12

Added

  • WCAG 2.1 AA accessibility: full sweep of interactive elements. Tab navigation uses the correct ARIA tablist/tab/tabpanel pattern with aria-selected and aria-controls. Tag filter chips have aria-pressed. Tab count badges include visually-hidden context text. Bulk "Move to" buttons are wrapped in a labelled role="group". Skip-to-main-content link added. @axe-core/react wired into dev builds to surface remaining violations.
  • Arch Linux PKGBUILD: generated and attached to every GitHub release automatically. Arch users can download it and run makepkg -si to install directly from the release AppImage.

Internal

  • Version bumped to 1.0.0-rc.4 across all five package.json files.
  • Replaced all em dashes project-wide with context-appropriate punctuation.

1.0.0-rc.3 — 2026-06-11

Added

  • Web Worker for storage: InventoryService now runs inside a dedicated Web Worker (inventory.worker.ts) exposed via Comlink. All IndexedDB reads and writes happen off the main thread.
  • PWA install prompt: when the browser fires beforeinstallprompt, an Install button appears in the app header.
  • i18n foundation: i18next + react-i18next scaffolding added. English strings live in apps/web/src/locales/en.json.

Changed

  • Electron startup: qrcode is now dynamically imported inside the scanner:start IPC handler instead of at module load time, reducing startup overhead.
  • Rendering performance: .inventory-card gains content-visibility: auto; contain-intrinsic-size: 0 200px, enabling browser-native off-screen rendering skipping.

1.0.0-rc.2 — 2026-06-09

Fixed

  • XSS in coverage reporter: packages/core/coverage/sorter.js read colNode.innerHTML and wrote it back as HTML. Replaced with createElement + appendChild (CWE-79).

Changed

  • Package names renamed to match the GitHub organisation scope: @before-its-gone/core → @aetherAssembly/core, @before-its-gone/ui → @aetherAssembly/ui.
  • GitHub Packages publishing: packages/core and packages/ui are no longer private. Both carry a publishConfig pointing to GitHub Packages and are published automatically on every v* tag.
  • Bundle size: SyncService (Supabase + realtime/gotrue/storage-js, ~202 kB) is now a dynamic import() inside the startup useEffect instead of a static import. Main JS chunk shrinks from ~460 kB to ~258 kB.

1.0.0-rc.1 — 2026-06-08

Added

  • Unit test suite: Vitest infrastructure added for packages/core. 64 tests covering calculateExpiryStatus, getShoppingList, getFilteredInventory, createInventoryItem, decrement/update/increment/delete operations, all CSV/JSON import-export functions, and waste log functions. 87% branch coverage on inventory.ts.
  • React error boundaries: ErrorBoundary class component wraps the inventory card grid and item drawer. A render crash now shows a recovery panel instead of blanking the whole screen.
  • Focus trap hook: useFocusTrap constrains Tab/Shift+Tab navigation within open modals. Applied to the keyboard shortcuts modal and About dialog.

Changed

  • StatsCharts and SettingsPanel are now lazy-loaded via React.lazy + Suspense. The recharts bundle (~355 kB) is split into a separate chunk and only fetched when the charts panel is first opened.
  • Various ARIA improvements: stat cards, sort direction buttons, bulk-select buttons, custom location remove buttons, ScanModal, AboutDialog, and ItemDrawer all gained appropriate roles and attributes.

0.9.1 — 2026-06-03

Changed

  • Dependency updates only: @typescript-eslint/eslint-plugin 8.60.1, @typescript-eslint/parser 8.60.1, concurrently 10.0.3. No functional changes.

0.9.0 — 2026-05-29

Added

  • Dark/light mode toggle: sun/moon button in the header switches between dark (default) and light themes. Choice is persisted in localStorage. All colors are now CSS custom properties.
  • Animated background: subtle hue-rotate animation on the page background (0–8 degrees over 12 seconds).
  • Glass morphism panels: all .panel and .stat-card elements now use backdrop-filter: blur(12px) with a semi-transparent background.
  • Toast notification system: a ToastProvider context replaces all static status messages. Toasts appear bottom-right, auto-dismiss after 3 seconds, and have success (cyan), warning (amber), and error (rose) variants.
  • Responsive layout: new breakpoint at 480px stacks .controls-row vertically and makes all form fields full-width. Button min-height is 44px for touch targets.
  • Loading skeleton states: while the inventory loads on first render, 6 shimmer placeholder cards are shown.
  • Stats charts: a "Show charts" toggle reveals three Recharts visualisations: items by location (pie), items by category (horizontal bar, top 8), and items expiring within each of the next 7 days (vertical bar).
  • Expiry timeline view: a "List / Timeline" control switches to a horizontal scrollable timeline with color-coded dots on a date axis.
  • Item detail drawer: clicking any inventory card opens a slide-in drawer with all item fields and an inline edit form.
  • Item photos: a file picker (canvas resize to 200x200 max, JPEG 0.75) is available on both add-item form and drawer edit form. Thumbnails appear on cards; full image shown in the drawer.
  • Keyboard shortcuts: global keydown handler. N focuses add-item name field; / focuses search; Esc closes drawer; ? toggles shortcuts modal.
  • Drag-and-drop location move: each inventory card is draggable. A strip of drop targets appears above the grid while the inventory tab is active.

Changed

  • InventoryItem and NewInventoryItem gain photo?: string (base64 data URL, stored in IndexedDB).
  • Various dependency bumps.

0.8.0 — 2026-05-22

Added

  • Settings panel: default location, default shelf life, configurable expiry warning window, per-notification-type toggles, and custom storage locations. All settings persist in localStorage.
  • Custom storage locations: add named locations beyond fridge / freezer / pantry. Custom locations appear in all location selects and the inventory filter.
  • Tag filtering: clickable tag chips above the inventory list narrow the view to items that match all selected tags (AND semantics).
  • Shopping list tab: automatically populated with any item whose quantity is at or below its low-stock threshold. Includes copy-to-clipboard and export-as-text buttons.
  • Waste log tab: expired items are recorded to IndexedDB when deleted. The Waste Log panel groups entries by calendar month.
  • Recurring / auto-restock items: items marked "auto-restock when depleted" automatically create a new item with the configured restock quantity when their quantity reaches zero.
  • Email notifications: optional email alerts delivered via Resend or SMTP. Configurable in Settings → Email Notifications. Supports daily or weekly digest with pause/snooze.
  • HTML email templates: expiry alert, low-stock alert, and digest emails rendered with inline CSS and dark-brand styling.
  • Nutritional info from Open Food Facts: barcode scans now extract kcal/100g and allergen tags.
  • Recipe suggestions: when 3+ items are expiring or expired, a dismissible banner fetches recipe suggestions from TheMealDB.
  • Batch barcode import: "Import barcodes (.txt)" accepts a plain text file with one barcode per line. Each barcode is looked up on Open Food Facts.
  • Optional Supabase cloud sync: opt-in sync to a user-owned Supabase project. Last-write-wins conflict resolution by updatedAt.
  • Auto-release CI: .github/workflows/release.yml builds all four platform targets on a v* tag push.

0.7.1 — 2026-05-19

Added

  • Splash screen: fridge icon and app name shown on the native background colour while the renderer loads, with a smooth fade-out once React mounts.
  • About dialog: ⓘ button in the header opens a modal with the app icon, version number, description, GitHub link, and license.
  • Auto-update: electron-updater checks GitHub Releases on startup and shows an in-app banner.
  • arm64 cross-compilation: npm run package:linux:arm64 builds arm64 AppImage/deb/rpm locally from any x86_64 machine.
  • arm64 CI: ubuntu-24.04-arm added to the CI matrix.

0.7.0 — 2026-05-19

Added

  • + Add one button: every inventory card now has a + Add one button alongside − Use one.
  • Undo "Use one": after tapping − Use one, a slide-in toast appears for 5 seconds with an Undo button that restores the previous quantity.
  • CSV import: the Data section now accepts .csv files alongside .json. Supported columns: name, quantity, location, expires_at, barcode, category, shelf_life_days, tags (semicolon-separated), depletion_threshold.

Changed

  • Search is debounced: the inventory filter now uses useDeferredValue, eliminating synchronous re-renders during fast typing.
  • InventoryItem model gains an optional shelfLifeDays?: number field. The edit form now shows the original shelf life instead of recalculating days remaining from today.
  • Service layer: all database interactions are now routed through InventoryService and ImportExportService in packages/core/src/services/. App.tsx imports singleton instances instead of calling storage functions directly.
  • TypeScript project references: packages/core and packages/ui are now composite projects. build:packages now runs tsc --build for incremental compilation.

0.6.0 — 2026-05-16

Added

  • Phone-as-primary scanner: after scanning the QR code, the phone's camera auto-detects barcodes, looks up the product on Open Food Facts, and shows a full product card. Tapping "Save & scan next" saves the item directly to the desktop inventory.
  • Expiry prediction: rule-based shelf life algorithm maps Open Food Facts category tags to per-location shelf life estimates for dairy, meat, fish, produce, bread, canned, pasta/rice, beverages, snacks, frozen, eggs, and condiments.
  • In-place item editing: inventory cards now have an Edit button that opens an inline edit form pre-filled with all existing fields.
  • Multiple tags per item: the Add and Edit forms accept a comma-separated tags field. Tags are stored as string[] on each inventory item.
  • Bulk actions: a "Bulk select" toggle enables checkboxes on every card. Selecting items reveals a toolbar with "Delete selected" and "Move to" buttons.

0.5.5 — Private Beta

Added

  • Phone barcode scanner: "Scan with phone" button opens a modal with a QR code. Scanning it opens a camera view on any phone browser that decodes barcodes and sends the result to the desktop form.
  • Scanner page is served over HTTPS with a self-signed certificate so getUserMedia works across all browsers.
  • BarcodeDetector API used natively on browsers that support it (Chromium); falls back to ZXing for Safari and others.

0.5.0 — 2026-05-14

Added

  • Categories: inventory items now support an optional category field displayed as a pill on each card.
  • Item history & quick-add buttons: the top 5 most-used items appear as one-click quick-add buttons that pre-fill the form.
  • Quantity depletion tracking: each item can set a "low stock alert" threshold. Clicking "− Use one" decrements the quantity; when it hits the threshold a desktop notification fires.
  • Export to JSON/CSV: download a full inventory snapshot as JSON or CSV.
  • Import from JSON: restore or merge a previous JSON export back into the app.
  • Search: real-time filter across item name, barcode, and category.
  • Filter by location, sort controls, stats dashboard.
  • Consolidated monorepo: Linux, macOS, and Windows now live in one repo with shared packages/core and packages/ui.

0.3.0 — 2026-05-10

Added

  • Color-coded expiry status on inventory cards: amber left-border for expiring soon, rose left-border for expired.
  • Loading state on the "Lookup barcode online" and "Save" buttons.

Fixed

  • Dead if/else branch in Electron main.ts where both arms called loadURL identically; collapsed to a single call.
  • JSON.parse in the localStorage notification adapter now catches malformed data and returns null instead of throwing.
  • Removed collision-prone UUID fallback in createInventoryItem. crypto.randomUUID() is always available in Chromium/Electron.
  • Startup notifyExpiringItems was being called twice on load. Removed the redundant call.

0.2.0 — 2026-04-16

Major rework from a basic scaffold into a desktop-first Linux application with practical food tracking features, packaging, and release infrastructure.

Added

  • Native Linux desktop app workflow using Electron as the primary runtime.
  • Barcode-aware inventory entry with local barcode profile storage for repeat item autofill.
  • Optional online product lookup using Open Food Facts.
  • Expiry tracking with shelf-life days and explicit expiry date support.
  • Item expiry status classification: fresh, expiring soon, and expired.
  • Local desktop notifications for expiring and expired inventory items.
  • Wayland-aware Linux startup behavior with BIG_LINUX_DISPLAY_BACKEND override support.
  • Linux packaging for AppImage and .deb artifacts.
  • Release workflow that creates a draft GitHub release from a version tag.
Last updated: 2026-10-04 AetherAssembly/Before-Its-Gone → License: GNU AGPLv3