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
nodemailer9.0.3 → 10.0.13,resend6.17.1 → 6.27.0,@types/nodemailer8.0.1 → 8.0.2,react-i18next17.0.8 → 17.0.13,recharts3.9.2 → 3.10.1,vite8.1.3 → 8.3.0,concurrently9.2.4 → 10.0.5,electron-builder26.15.3 → 26.16.1, andwait-on9.0.1 → 9.1.0.
1.3.4 — 2026-08-23
Changed
- Bumped actions/stale
10to11. - 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
overridespinningminimatchto^10.2.5andbrace-expansionto^5.0.8across the dependency tree, closing the high-severity out-of-memory DoS in every nested copy without bumpingeslint-plugin-reactorelectron-builderto 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
betaupdate 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.orgnow has a separatebetadistribution. Users can opt in without affecting their stable install. - Beta COPR and OBS projects: separate
aster1630/before-its-gone-betaCOPR project andhome:aster1630:before-its-gone-betaOBS 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
betaupdate 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.orgnow has a separatebetadistribution. Users can opt in without affecting their stable install. - Beta COPR and OBS projects: separate
aster1630/before-its-gone-betaCOPR project andhome:aster1630:before-its-gone-betaOBS 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/.tsxfiles before every commit. Runnpm installonce to activate the hook. - Extended test suite: 38 additional unit tests in
packages/corecoveringcalculateExpiryStatusboundary conditions,normalizeDateformat variants,getShoppingListthreshold logic, andgetFrequentItemssorting and limit behaviour. Total test count: 102. docs/data-model.md: dedicated reference page for theInventoryItemfield 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:
electron42.5.1 → 43.0.0 (electronVersion in packaging scripts updated to match),@supabase/supabase-js2.108.2 → 2.110.0,nodemailer9.0.1 → 9.0.3,resend6.16.0 → 6.17.1,recharts3.9.0 → 3.9.2,i18next26.3.3 → 26.3.4,vitest+@vitest/coverage-v84.1.9 → 4.1.10,prettier3.9.3 → 3.9.4,@types/node26.0.1 → 26.1.0.
Fixed
- Coverage report tracked in git:
packages/core/coverage/was committed despite*.tsbuildinfoalready being gitignored. Added explicitpackages/core/coverage/entry to.gitignoreand removed the directory from the index.
1.2.1 — 2026-06-19
Fixed
tsc --buildfailure on cold/clean builds:packages/core/src/storage.tsimportedLocalStorageAdapterandStorageAdapterfrom@aetherAssembly/corevia 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 instorage.ts, removing the external dependency entirely.
Changed
- Workspace package names:
@before-its-gone/coreand@before-its-gone/uirenamed to@aetherAssembly/big-coreand@aetherAssembly/big-ui. The@before-its-gonenpm scope has no matching GitHub owner, causingnpm publishto return a 403. The new names use the@aetherAssemblyorg scope, which matches the GitHub organisation. @aetherAssembly/big-corepublish tarball: added afilesfield (["dist", "LICENSE"]) to excludecoverage/,src/,tsconfig.json, andvitest.config.tsfrom the published package.
1.2.0 — 2026-06-19
Added
.npmrc: scopes@aetherAssemblyto the GitHub Package Registry (https://npm.pkg.github.com) sonpm installresolves the shared packages without a global registry override.
Changed
- Shared package dependencies:
@aetherAssembly/coreand@aetherAssembly/uiare now consumed from the GitHub Package Registry (^1.0.0) rather than afile:path, making the repo self-contained for any contributor. - Local package names: BIG's own workspace packages renamed from
@aetherAssembly/coreand@aetherAssembly/uito@before-its-gone/coreand@before-its-gone/uito avoid name collision with the published shared packages now installed at the root. packages/corestorage: the localKeyValueStorageinterface andBrowserLocalStorageAdapterclass have been removed.packages/corenow re-exportsLocalStorageAdapterandStorageAdapterdirectly from@aetherAssembly/core, keeping the public API identical for all callers.apps/webVite aliases:@aetherAssembly/coreand@aetherAssembly/uialiases 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-themeto the RPM spec. OBScheck-filelistruns 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:
resizeImageinItemDrawer.tsxhad noimg.onerrorhandler. Uploading a corrupt or unsupported image file caused the returnedPromiseto 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 inbuildEditFormnow extracts the local date usinggetFullYear/getMonth/getDaterather than.toISOString().slice(0, 10). - Photo field cleared on edit: Passing
photo: undefinedin a patch toupdateInventoryItemcaused the spread to overwrite the stored photo withundefined, silently clearing it. The function now stripsundefinedvalues from the patch before spreading;nullstill explicitly clears the field. - Tags lost on CSV round-trip: The CSV export did not include a
tagscolumn, 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/rejectcallbacks in module-level globals. A second scan arriving while a save was in flight would overwrite them, causing the wrong promise to settle. AddedscannerSaveLockinmain.tsto reject concurrent saves until the first completes or times out. - Email digest double-fire after restart:
DigestSchedulerused an in-memorylastFiredDateguard 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 checkslastSentAtfromemail-settings.jsonfor daily digests. - Orphaned undo timer on edit: Editing an item while the "Use one" undo toast was pending left the undo
setTimeoutrunning. The timer now fires against stale state once it expires.onEditSavenow clears the pending undo before proceeding.
Added
normalizeDateutility (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 canonicalYYYY-MM-DDT23:59:59.000Zstring. Called automatically during CSV import. Invalid dates returnnulland cause the row to be skipped. 26 unit tests added.npm run package:linux:rpm: builds only the.rpmartifact 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 runsrpmbuild -bbagainst the spec file. Pass--skip-buildto reuse an existing artifact.- GHCR Docker image: the release pipeline now builds and pushes
ghcr.io/aetherAssembly/before-its-goneon every version tag. Tagged as{{version}},{{major}}.{{minor}}, andlatest. - Version consistency workflow (
.github/workflows/version-check.yml): runs on every push and PR; compares the version inpackage.json,before-its-gone.spec, and the topCHANGELOG.mdentry, failing with file-level annotations if any drift is found.
Changed
- CSV export now includes
tags(semicolon-separated),shelf_life_days, anddepletion_thresholdcolumns.expiresAtis 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,
undefinedvsnullpatch semantics, scanner save lock, digest deduplication layers, image upload error handling, and the CSV tag separator convention. - CI action versions:
actions/upload-artifactandactions/download-artifactbumped from@v4to@v7.
1.1.1 — 2026-06-17
Added
- Self-hosting documentation:
docs/self-hosting.mdcovers 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-ownsdocs/and.github/CONTRIBUTING.mdfor automatic review requests on relevant PRs..editorconfig: enforces consistent indentation (2 spaces),lfline 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.ymladds 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.
PKGBUILDlicense field: corrected fromMITtoAGPL-3.0-only.
Fixed
- NSIS installer:
customLicensePagemacro now referenceseula.rtfandlicense.rtffrom${BUILD_RESOURCES_DIR}instead of$PLUGINSDIR, ensuring both files are sourced from the correctbuild/directory. - Linux package naming: added
deb.packageNameandrpm.packageNametoelectron-builder.linux.ymlto prevent the Debian and RPM package names from inheriting the internal workspace name. - RPM spec
%filesconflict withfilesystempackage: replaced the/usr/*glob with explicit paths, resolving the COPR install conflict where the package claimed ownership of system directories already owned byfilesystem. - Miscellaneous Markdown lint fixes across documentation files.
1.1.0 — 2026-06-16
Added
- Self-hosted PWA:
apps/webis now deployable as a Progressive Web App via Docker + nginx. Adocker/folder contains a multi-stageDockerfile,nginx.conf, anddocker-compose.yml. Four convenience scripts added:docker:pwa:up,docker:pwa:down,docker:pwa:build, andbuild:pwa. - In-browser barcode scanner (
BarcodeScannerModal): new component uses@zxing/browserto 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.jsandpublic/manifest.webmanifestare replaced byvite-plugin-pwa(autoUpdatemode), generating a precache manifest and aNetworkFirstruntime cache for Open Food Facts API calls. - LAN dev server binding:
vite.config.tsnow setsserver.host: true, sonpm run dev:webbinds to0.0.0.0:5173and 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.orgfor automatic updates throughapt upgrade. - RPM
.specfor Fedora COPR / openSUSE OBS: addeddocs/packaging/linux/fedora/before-its-gone.spec, repackaging the upstream electron-builder.rpmfor distribution via COPR and OBS. - CI: RPM spec build test (
.github/workflows/test-rpm-spec.yml): verifiesbefore-its-gone.specbuilds cleanly across Fedora, CentOS Stream, openSUSE Leap, and Mageia containers.
1.0.1 — 2026-06-15
Changed
- Dependency bumps:
electron42.4.0,@types/node25.9.3,nodemailer9.0.0,@typescript-eslint/parser8.61.0,@supabase/supabase-js2.108.2,vitest4.1.9,prettier3.8.4,electron-builder26.15.3,@typescript-eslint/eslint-plugin8.61.0.
Fixed
- Release notes script: glob
*x64.AppImagedid not match electron-builder's*x86_64.AppImageoutput, 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
.rpmartifact (*aarch64.rpm). Row added. - Release notes: Linux Wayland override examples referenced
x64.AppImage; corrected tox86_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/tabpanelpattern witharia-selectedandaria-controls. Tag filter chips havearia-pressed. Tab count badges include visually-hidden context text. Bulk "Move to" buttons are wrapped in a labelledrole="group". Skip-to-main-content link added.@axe-core/reactwired 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 -sito install directly from the release AppImage.
Internal
- Version bumped to
1.0.0-rc.4across all fivepackage.jsonfiles. - Replaced all em dashes project-wide with context-appropriate punctuation.
1.0.0-rc.3 — 2026-06-11
Added
- Web Worker for storage:
InventoryServicenow 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-i18nextscaffolding added. English strings live inapps/web/src/locales/en.json.
Changed
- Electron startup:
qrcodeis now dynamically imported inside thescanner:startIPC handler instead of at module load time, reducing startup overhead. - Rendering performance:
.inventory-cardgainscontent-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.jsreadcolNode.innerHTMLand wrote it back as HTML. Replaced withcreateElement+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/coreandpackages/uiare no longer private. Both carry apublishConfigpointing to GitHub Packages and are published automatically on everyv*tag. - Bundle size:
SyncService(Supabase + realtime/gotrue/storage-js, ~202 kB) is now a dynamicimport()inside the startupuseEffectinstead 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 coveringcalculateExpiryStatus,getShoppingList,getFilteredInventory,createInventoryItem, decrement/update/increment/delete operations, all CSV/JSON import-export functions, and waste log functions. 87% branch coverage oninventory.ts. - React error boundaries:
ErrorBoundaryclass 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:
useFocusTrapconstrains Tab/Shift+Tab navigation within open modals. Applied to the keyboard shortcuts modal and About dialog.
Changed
StatsChartsandSettingsPanelare now lazy-loaded viaReact.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, andItemDrawerall gained appropriate roles and attributes.
0.9.1 — 2026-06-03
Changed
- Dependency updates only:
@typescript-eslint/eslint-plugin8.60.1,@typescript-eslint/parser8.60.1,concurrently10.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-rotateanimation on the page background (0–8 degrees over 12 seconds). - Glass morphism panels: all
.paneland.stat-cardelements now usebackdrop-filter: blur(12px)with a semi-transparent background. - Toast notification system: a
ToastProvidercontext 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-rowvertically 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.
Nfocuses add-item name field;/focuses search;Esccloses 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
InventoryItemandNewInventoryItemgainphoto?: 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.ymlbuilds all four platform targets on av*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-updaterchecks GitHub Releases on startup and shows an in-app banner. - arm64 cross-compilation:
npm run package:linux:arm64builds arm64 AppImage/deb/rpm locally from any x86_64 machine. - arm64 CI:
ubuntu-24.04-armadded to the CI matrix.
0.7.0 — 2026-05-19
Added
- + Add one button: every inventory card now has a
+ Add onebutton 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
.csvfiles 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. InventoryItemmodel gains an optionalshelfLifeDays?: numberfield. 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
InventoryServiceandImportExportServiceinpackages/core/src/services/.App.tsximports singleton instances instead of calling storage functions directly. - TypeScript project references:
packages/coreandpackages/uiare nowcompositeprojects.build:packagesnow runstsc --buildfor 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
getUserMediaworks 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/coreandpackages/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.tswhere both arms calledloadURLidentically; collapsed to a single call. JSON.parsein the localStorage notification adapter now catches malformed data and returnsnullinstead of throwing.- Removed collision-prone UUID fallback in
createInventoryItem.crypto.randomUUID()is always available in Chromium/Electron. - Startup
notifyExpiringItemswas 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_BACKENDoverride support. - Linux packaging for AppImage and
.debartifacts. - Release workflow that creates a draft GitHub release from a version tag.