Repository navigation
Releases: alexphillips-dev/GearBeacon
Release list
GearBeacon V1.4.1
GearBeacon 1.4.1 — Delivery recovery and safer state changes
This patch includes every change since the last main release, v1.4.0. GearBeacon remains a private, single-owner, self-hosted UniFi Store monitor. Monitoring and notification delivery continue on the server while the browser is closed.
Notification recovery and Operations
- Resolve failed deliveries: Settings > Operations > Delivery now offers Retry failed, Dismiss, and Dismiss all failed. The attention banner opens that section. Dismissal clears the active warning and keeps the failed attempt in Activity and the delivery log; it does not send or recall a message.
- Recover after a connection outage: after a failed Store check, the next successful, complete check requeues eligible network-related terminal delivery failures, including interrupted notification responses, for one more bounded retry cycle. The recovery window survives partial catalogs and service restarts. Expired alerts and channels that are no longer allowed remain ineligible. Credential or other permanent failures still need correction and manual retry.
- Stay current without losing focus: Operations refreshes counts and warnings during background polling and after the connection returns while preserving keyboard focus.
See notification delivery and recovery for the controls, retry limits, and manual recovery path.
Monitoring, watches, and purchase state
- The Store request timeout now covers response-body parsing, so a stalled response cannot hold the monitor loop indefinitely.
- Each successful Store check commits product state, observation evidence, Activity events, and queued delivery jobs together. A failed commit cannot leave a recorded stock event with stale product state.
- Adding a watch and its alert rule now commits as one operation. Single and bulk watch removals, bulk pause/resume/purchased/wanted actions, product alert settings, and auto-buy arming commit their related database changes together. If a write fails, the request leaves watches, rules, collection purchase state, and delivery state unchanged.
- Removed a redundant delayed whole-state save after watch changes. It could previously fail after an otherwise successful request when another SQLite writer held a lock.
Backups, restore, and local security
- Primary SQLite backups become visible only after validation; failed copies are removed. A secondary-copy failure does not invalidate a successful primary backup.
- Backup retention and abandoned-temp cleanup recognize only GearBeacon-owned copies. Secondary copies now carry an installation ID, saved before the first primary snapshot so the copy remains discoverable after restore. One installation leaves another installation's files alone. Old copies recorded in backup history remain available; unrecorded older copies may need manual cleanup. Abandoned primary and secondary temporary files are removed only when at least a day old and their creating process has exited.
- Secondary retention leaves unrelated files in a shared destination alone. GearBeacon no longer changes permissions on an existing secondary directory; plaintext copies receive owner-only file permissions on Unix.
- Portable restore rejects incompatible regions before changing purchase state and rolls back all regions and settings together if the restore fails.
- The optional Windows checkout companion now protects its vault with private ACLs and an account-scoped DPAPI key. A writable open migrates an older raw key without replacing its underlying key bytes. The vault must stay with its original Windows account or use the documented recovery process.
Windows installation and diagnostics
- Reinstalling the Windows service now replaces the web assets without nesting another web directory or keeping obsolete pages.
- Source launchers no longer display a stale version. Malformed API paths return a client error.
- Added deterministic coverage for watch and rule write failures, backup ownership and cleanup, restore rollback, outage recovery, Windows vault migration, service web replacement, and update startup behavior. CI includes the Windows checkout vault test.
Upgrading from v1.4.0
- In Settings > General, choose Prepare safe update and confirm the backup before replacing application files. Keep a compatible database and the separate installation key for rollback.
- Install the matching 1.4.1 server files or image and restart GearBeacon. If you use the optional checkout companion, update it from the matching 1.4.1 Source archive and keep its private vault with the original Windows account.
- Hard-refresh the dashboard. Review Settings > Operations > Delivery for failures left by an outage; correct permanent channel errors before using Retry failed.
- GearBeacon remains on SQLite schema v15 and portable export format v10. This patch adds no schema migration or intentional sign-out. Existing watches, rules, collections, history, settings, encrypted integrations, and owner access are retained.
Source installations require Node.js 22.13 or newer. Standalone packages include their server runtime. The optional auto-buy feature remains experimental: it requires an existing reusable saved card, explicit owner authorization, and a separately running companion. Authenticated live checkout compatibility remains unverified with a real owner account; automated tests use isolated fixtures. No automatic update or purchase is performed by this patch.
Full comparison: v1.4.0…v1.4.1
GearBeacon remains independent from Ubiquiti. UniFi and Ubiquiti are trademarks of Ubiquiti Inc.
GearBeacon V1.4.0
GearBeacon 1.4.0 — Optional purchasing, stronger security, and clearer Activity
This release includes all changes since the last published main release, v1.3.0: optional experimental auto-buy, a checkout companion with clearer setup and verification, new-product Activity labels, owner-access and local-data hardening, signed update verification, and release/CI maintenance.
GearBeacon remains a private, single-owner, self-hosted UniFi Store monitor. Monitoring and notifications need no Store account and continue when the browser is closed. Purchasing is optional and requires separate setup and explicit authorization.
Optional experimental auto-buy
- Authorize one exact purchase: choose a watched variant, quantity, maximum final order total including shipping/tax/surcharges, expiry, and the watch or collection that receives the purchase record. Each authorization allows one successful order. Arming an already available item permits checkout after the next complete Store check.
- Dedicated checkout companion: pair the optional Node.js/Playwright companion with a one-time code and sign in directly in its sandboxed Store browser. The server and companion must remain running; the dashboard can be closed. A NAS, Docker, or headless installation can use a companion on a separate browser-capable computer over HTTPS.
- Checkout checks and recovery: validate the exact cart contents, quantity, region, currency, account, address fingerprints, shipping service, selected saved card, and final total. Unrecognized Store write endpoints, visible challenges, changed checkout details, or an uncertain submission stop further checkout and require review. The companion retains an encrypted browser session and durable submission journal locally.
- Dashboard controls: Watchlist purchase setup/status, Settings > General > Auto-buy, pause/disconnect controls, and Settings > Operations > Purchases expose rules and outcomes. Recovery restores purchase instructions paused and does not reactivate old companion tokens.
- Setup that explains its result: numbered steps, aligned checks, failed checks first, wrapped guidance, retries in the same browser, and explicit SAVED/cancelled summaries. The address label is a GearBeacon nickname, not an address created in the Store. Local
profilesand browserverifycommands check saved profiles without replacing them. - Pairing improvements: connection instructions expand automatically only while unpaired. The mode/expiry label sits beside a compact field that selects and copies only the pairing code; pairing clears both.
- Checkout setup fixes: cart preparation is no longer blocked by purchase/payment words in response fragments; the guard checks executed mutation fields. Account confirmation is separate from visible challenge detection, so Stripe's one-pixel background helper no longer falsely reports a signed-out account. Expanded helpers and active challenges still require owner attention.
Compatibility limitation: unattended checkout requires an existing reusable saved card with a visible masked label. Entering a card number, expiry, and security code does not create a supported saved payment method. If Use saved payment has no usable card, auto-buy setup cannot finish; do not place an order just to try to save a card. The companion does not collect raw payment-field values, solve CAPTCHAs, or bypass MFA/payment challenges. Authenticated live Ubiquiti checkout, regional account behavior, and unattended payment compatibility remain unverified with a real owner account; automated coverage uses isolated checkout fixtures. Stock availability does not reserve an item or guarantee an order.
See the auto-buy setup, profile verification, and troubleshooting guide. Standalone and Docker users install the companion separately from the matching Source archive; the base server does not install a browser.
Clearer new-product Activity
- Teal NEW TO STORE badges distinguish newly discovered listings and show their availability at detection.
- NOW AVAILABLE distinguishes Coming soon → In stock launches from ordinary restocks. Launch timing says Coming soon for; unchanged upcoming listings say Still coming soon.
- The same context appears in accessible descriptions and event details. Events remain individual compact cards, including separate product and variant events, with live arrivals and reading-position preservation retained.
Owner access and local-data security
- Fail-closed access: local mode always refuses non-loopback binds, including the former insecure remote override. Invalid saved configuration stops startup instead of silently falling back to environment defaults.
- Session policy: configurable absolute sign-in lifetime (default 24 hours) and inactivity lock (default 30 minutes). Background polling does not renew activity; monitoring, delivery, and an independently running companion continue while the dashboard is locked.
- Fresh owner verification: sensitive configuration, data-transfer/recovery, password/session, and authenticator operations require a recent sign-in or verification. The verification dialog supports keyboard cancellation, focus recovery, mobile layouts, and both themes.
- Optional authenticator codes: local TOTP enrollment, replay protection, and ten single-use recovery codes. No cloud account or external QR service is required. Setup secrets clear on lock/sign-out; MFA material and local security policy stay out of portable exports.
- Protected installation keys: Windows uses account-scoped DPAPI and verified private ACLs for application data and the installation key, including existing raw-key migration without changing the underlying key. Linux/macOS retain owner-only directory/key permissions. These installation-key protections are separate from the companion's own local vault.
- Restricted notification requests: exact configured origins, DNS-validated address pinning, redirect rejection, TLS validation, timeouts, bounded responses, and metadata/link-local/reserved-address blocking. Private DNS destinations require explicit hostname approval; configured private IPs and localhost remain supported.
See owner security and recovery for session limits, authenticator setup, account recovery, and private-host approvals.
Updates, packaging, and maintenance
- Native and Docker update helpers require GitHub artifact attestations tied to the official repository, signer workflow, release tag, and source commit, and reject self-hosted signer runners. Packages include signed verification bundles. Docker pins the verified immutable image digest. Updates remain owner-initiated and backup-confirmed; GitHub CLI is required by these helpers.
- Source and standalone packaging include the new backend modules while excluding companion state and keys. Companion dependencies receive their own Dependabot checks.
- Updated pinned actions: CodeQL 4.38.1, Docker Buildx setup 4.4.1, Docker build/push 7.4.0, and QEMU setup 4.4.0. CodeQL actions update together and are enforced by the security contract.
- Release promotion uses a merge commit, then fast-forwards dev to the reviewed main commit. This preserves shared ancestry and prevents already-released development commits from appearing ahead of main again.
- Expanded backend, browser, profile, recovery, and security regression coverage, including the v1.3.0 upgrade. Fixed relative-time fixture races, contrast scans during CSS transitions, updater deadline timing, slow first-use Windows startup, and mock webhook/application port collisions. Updater fixtures also cover delayed health and retries.
Upgrading from v1.3.0
- Use Prepare safe update and test the backup before replacing files. Keep the compatible pre-upgrade database and pre-upgrade encryption key for rollback. Stop an existing companion and update it to the matching version before reconnecting.
- Follow the installation-specific update procedure, restart GearBeacon, and hard-refresh the browser. Source and companion installs require Node.js 22.13 or newer; standalone packages include their server runtime.
- Startup validates a safety backup before upgrading schema v13 to v15. Existing watches, rules, collections, history, settings, encrypted integration secrets, and owner credentials are preserved. Existing browser sessions are signed out once; sign in again to continue.
- If notifications use a hostname resolving to a private LAN/VPN address, approve the exact hostname in Settings > Security > Sessions. Review access configuration if the removed insecure remote override was previously used.
- On Windows, the upgraded installation key is tied to its original account and DPAPI profile. Prepare an encrypted data export before moving machines or changing service identity; copying the wrapped key alone is insufficient.
Recovery exports use format v10. Supported older exports remain importable. Portable exports exclude owner credentials, MFA material, browser sessions, private-network approvals, and local integration secrets. Purchase instructions restore paused; pair the companion again on a restored installation. Companion session files and keys stay on the companion host and are excluded from GearBeacon backups.
Older applications cannot open a schema-v15 database, a format-v10 export, or a DPAPI-wrapped key. Rollback requires the compatible pre-upgrade database, pre-upgrade key, and matching older application. Update helpers do not automatically restore a database.
Full comparison: v1.3.0…v1.4.0
GearBeacon remains independent from Ubiquiti. UniFi and Ubiquiti are trademarks of Ubiquiti Inc.
GearBeacon V1.3.0
GearBeacon 1.3.0 — Live Activity, flexible alerts, and easier settings
This release includes all development changes since the last published main release, 1.2.0. It improves everyday monitoring with automatic Activity arrivals, more useful event details, saved views, flexible delivery rules, shorter Settings pages, and update notices for the installed branch.
GearBeacon remains a private, single-owner, self-hosted UniFi Store monitor. Monitoring and external notifications run on your server, even when the browser is closed.
Activity
- Automatic arrivals: the visible Activity tab checks for new cards every second. At the top, new events appear immediately; when scrolled down, the card being read and keyboard focus stay in place. No button click is required to reveal arrivals.
- Stable history and pagination: retain filters and the selected historical page while newer events appear above it. Bounded batches handle large bursts without skipping events; reconnects and expired reading boundaries recover automatically. The 20/50/100 page sizes remain available.
- Individual events: every event remains its own compact card, including separate parent products and exact variants. Events are never combined or collapsed into groups.
- Current status beside original evidence: see current availability and check freshness, current Watchlist and collection membership, exact variant identity, and the event price compared with the current target. Original detection snapshots remain unchanged.
- Observed price context: a 30-day observed-low indicator requires sufficient retained history for that Store and exact item, ending at the event. Limited history is not presented as a proven low.
- Clear delivery outcomes: badges identify successful channels and suppression reasons. Delivery outcomes refresh automatically; details retain the underlying evidence.
- Dates and totals: Today, Yesterday, and date separators help navigation without combining cards. Totals cover all matching events across pages, and calendar filters and headings follow the configured timezone.
- Consistent colors: price decreases use blue for the icon and savings amount/percentage; increases retain amber. Sold out text matches the red icon, and In stock text matches green. Both themes retain readable text, arrows, and before/after values.
Watches, views, and collections
- Saved views: save, rename, replace, and delete named Watchlist and Browse views per regional Store. Views are stored on the installation for use across browsers and are included in recovery data. Revision checks prevent conflicting edits from silently overwriting a newer view.
- Compact lists: choose Cards or Compact list while retaining product images, prices, availability, collection memberships, and actions.
- Simpler Watchlist controls: search, status, collection, and sorting share one primary row. View options contains category, layout, optional Watchlist collection grouping, and saved views; Manage contains collection management, imports, and bulk selection. Browse saved views use the same dropdown styling.
- Budget-aware readiness: optionally require a collection to be within budget before it can send a ready alert. Qualification combines recorded spending, remaining quantities, and confirmed qualifying prices; unknown costs and pending prices block qualification. Cards and explanations identify the blocker. This condition defaults off for existing collections.
- Safer collection rule changes: budget and rule edits establish a new baseline and cancel obsolete pending deliveries. Existing item-alert overrides, quantities, recorded payments, and purchased state are preserved.
Notifications and monitoring evidence
- Choose delivery channels per watch or collection: use the configured defaults or select ntfy, Discord, Gotify, Webhook, and Email. Previews explain disabled or unconfigured selections. Collection routes apply to collection-ready events; member watches keep their own routes. Browser popups remain controlled separately.
- Apply route changes to queued work: removing a channel cancels its pending and failed jobs. Adding a channel affects future events and does not resend earlier alerts. An in-progress delivery cannot be recalled.
- Optional alert expiry: set a time limit for restock, target-price, price-drop, and collection-ready alerts, including time spent in quiet hours, digests, and retries. Queued jobs retain their original expiry ceiling; shorter current limits apply immediately. Expired alerts remain visible in Activity and cannot be revived with Retry failed. Existing rules default to no expiry.
- Context for delayed alerts: messages delayed by at least one minute show the original detection time alongside separately labeled current confirmed or last-known status. Exact-variant context remains tied to the triggering SKU. Supported server channels, email, and grouped/digest messages include this context without rewriting the original event.
- Product freshness: Watchlist cards and compact lists, Browse, and product details distinguish confirmed checks, pending changes, delayed checks, and unknown coverage. Freshness labels update without rebuilding the card or discarding an open rule form. Monitoring gaps never count as confirmation.
- Explain effective rules: item and collection summaries describe inherited settings, target conditions, pauses, purchased state, collection-only overrides, channels, scheduling, and cooldowns. Actual notification jobs are shown separately from hypothetical delivery timing.
Settings, accessibility, and interface fixes
- Shorter Settings pages: each existing category has section tabs. General separates Application from Stores & access; Notifications separates Alert types, Channels, Delivery, and Email; Data separates Schedule & retention from Backups & transfer; Security separates Overview, Password, and Sessions; Privacy separates Catalog & updates from Notifications; Operations separates Overview, Monitoring, Delivery, Backups, Diagnostics, and Logs.
- Remember navigation and preserve drafts: each Settings category remembers its last section in this browser. Switching tabs preserves unsaved inputs; explicit Save controls still apply changes. Passwords and drafts are not stored as navigation preferences.
- Accessible section navigation: scoped arrow-key/Home/End handling, visible focus, responsive wrapping, and deep links reveal the relevant section. Operations remains the final Settings category, including compatibility with old Operations links.
- Compact help controls: card and rule explanation buttons now display a question mark with descriptive labels and tooltips. The explanation dialog has padded content, a contained sticky header, and wrapping long titles. Empty results no longer leave an extra bar, and horizontal overflow is removed.
- Stores & access spacing: Store choices, field rows, and access options have consistent vertical gaps, including stacked mobile fields, so labels no longer crowd the controls above them.
- Smoother refreshes: unchanged product, collection, and Activity nodes and dropdown options are reused. Overlapping refreshes are coalesced and stale responses after edits or region changes are rejected. Unsaved rules and notification preferences remain intact. Hidden tabs defer expensive rendering while server monitoring and delivery continue.
- Current Operations data: older Operations responses and errors cannot overwrite a newer result, keeping warning shortcuts and recovery status consistent during overlapping refreshes.
Updates and deployment
- Update button: a compact blue
update available · vX.Y.Zbutton appears below the header on every tab. It opens matching release notes in a new tab, or the local update details when a notes link is unavailable. Its arrival preserves Activity reading position and focus. - Branch-aware checks: main follows newer published stable releases and excludes drafts and prereleases. Dev compares the running commit with the dev branch, detecting newer commits even when the version number is unchanged. It opens matching prerelease notes when available, otherwise the changelog for that commit.
- Automatic checking: the server checks at startup and daily, sharing cached results across browsers. Manual checks remain in Settings. Offline failures preserve the last confirmed result; retries respect rate limits. Automatic checking can be disabled, and downloads and installation remain owner-initiated.
- Build identity: packaged source archives, standalone packages, and container builds retain branch, version, and commit metadata so update checks can identify the installed build.
- Prerelease channels: candidate packages follow dev even when the package workflow is dispatched from main; stable packages built from main keep the stable channel.
- Verified updates: native helpers check local startup health and the expected version after restart, support custom ports, retain build metadata, and report recovery steps if verification fails. Docker updates persist the selected image tag in the Compose project
.env, preserve other settings, and verify the resolved and running image. All helpers retain mandatory backup confirmation.
Documentation, privacy, and maintenance
- Reorganized release history and getting-started guidance under
docs/, source startup scripts underlaunchers/, and contribution/security guidance under.github/. Standalone packages retain their top-level getting-started file and appropriate service helpers. - Simplified the README and deployment overview, connected the complete Wiki, and added badges for releases, main CI, license, platforms, Docker, and documentation. Clarified source archive layout, saved-setting precedence, Windows Scheduled Task management, Docker version pinning, configuration, and re...
GearBeacon V1.2.0
GearBeacon 1.2.0 — Smarter watches, collections, and browsing
This update brings together everything added since the last published release, 1.0.0, including the 1.0.1 security improvements and 1.1.0 precision-watch features developed on dev.
GearBeacon remains a private, single-owner, self-hosted UniFi Store monitor. Monitoring and notifications run on your server, and you manage them through a desktop or mobile browser.
Features
Exact products and smarter alerts
- Watch exact variants: track a particular SKU, color, or pack option with its own availability, price history, image, and regional Store link. Existing watches keep their Any variant behavior.
- Import exact variants: pasted Store links retain their selected variant, and SKU imports match exact options. An unknown explicit variant produces an error instead of silently adding a different product.
- Combine availability and price: choose to alert only when an item is in stock at or below your target. For Any variant watches, the same variant must satisfy both conditions.
- Preview before saving: see how a rule would behave and what its notification would contain, including regional currency, configured delivery channels, and any All activity override.
- Track purchased watches: Purchased stops individual alerts while retaining the watch, rules, and history. Still wanted enables the saved rules again.
Collections and project planning
- Organize watches into regional collections: create projects, select members with a searchable picker, and add selected watches in bulk. A watch can belong to multiple collections without duplicating its individual notification jobs.
- Add directly from Browse: choose Watchlist, an existing collection, or a new collection while adding a product. Select an exact variant and a desired quantity for the project.
- Reuse existing watches: adding a watched product to a collection preserves its alert rules. Re-adding an existing membership preserves its quantities and recorded spending.
- Plan quantities and partial purchases: record desired units, purchased units, and the total actually paid for each collection item. Purchase records belong to the project; per-unit target prices remain shared watch settings.
- Set a project budget: see recorded spending, estimated remaining cost, estimated project total, and how far the project is over or under budget. Unknown costs are identified so an incomplete subtotal is not presented as a complete total.
- Monitor collection readiness: see which remaining items qualify, which are waiting, and which have unknown monitoring coverage.
- Receive collection-ready alerts: opt in to one notification when all remaining items meet their availability and individual target-price conditions. These alerts use GearBeacon's existing channels, quiet hours, grouping, digests, and durable delivery queue.
- Use Collection alerts only: optionally suppress members' individual notifications while an active collection alert is enabled. Saved item rules remain intact, and overlapping collection overrides are identified.
- Archive completed or paused projects: retain items, quantities, spending, and saved alert settings while keeping the project out of active readiness summaries. Restoring a collection starts a fresh alert baseline.
- Undo item removal: restore a removed collection membership, including its quantity and purchase record, during the current page session. Undo remains available after closing and reopening collection management until dismissed or the page is refreshed.
Stock insights and Watchlist overview
- Observed availability timelines: review recorded restocks, observed available durations, and explicit gaps caused by outages, restarts, overdue checks, partial catalogs, or pending confirmation.
- Price insights: compare the lowest recorded prices over 7, 30, and 90 days, including the lowest price observed while available and comparisons with your watch target. Comparisons stay within the same variant, region, and currency.
- Actionable Watchlist summaries: select Ready to buy, At target price, or Collections ready to open the matching products or projects. Counts account for remaining quantities in active projects and exclude stale or relevant unconfirmed observations.
UI / UX
- Store-inspired Browse: illustrated category tiles, larger product previews, separated cards, blue action accents, clearer model/SKU labels, and a prominent Watchlist/collection action.
- Browse filters and sorting: combine availability, Watching / Not watched, category, and search; sort by name, price, or availability. Filters and sorting are remembered in the browser and can be reset together.
- Variant-aware Browse cards: search exact SKUs, see variant counts, and recognize a parent product as watched when an exact variant is watched. Multi-variant cards show a From price when every current variant has a known price.
- Mobile Browse: filters fold into a compact expandable panel, categories scroll within their own navigation strip, and cards reflow to preserve readable names, prices, and controls.
- Collection cards: collections use the same grid as individual watches, preview up to four product images, indicate additional members, and show the estimated project total in the normal price position.
- Optional folder-style grouping: collected watches appear inside their collection cards without duplicate individual cards in the default Watchlist view. Open a collection to see its items; search also finds matching members.
- Focused collection management: a dedicated dialog includes a guided empty state, Active / Archived / All views, thumbnail member selection, and accessible editing controls.
- Always-visible collection items: thumbnail rows show product names, variant/SKU details, prices, and readiness, with Edit item, Record purchase, Store, and Remove actions.
- Accessible collection alerts: Alerts actions are available from collection cards, management, details, and the bottom of the editor. Returning from alerts preserves unsaved selections and keyboard focus.
- Clear membership badges: item badges now explicitly read Collection: followed by the collection name.
- Activity pagination: choose 20 entries per page by default, or 50 or 100. Additional entries appear on subsequent pages, and the selected size is remembered.
- Collection activity: filter collection-ready events, inspect their details, follow links back to the project, and receive collection details in email notifications.
- Keyboard and theme support: category arrow-key navigation, focus restoration, live status announcements, image retry behavior, dark/light contrast, mobile reflow, and 200% equivalent zoom coverage extend across the new workflows.
Fixes and reliability
- Verified collection saves: name and membership changes save together. The UI checks server capabilities and returned membership data before reporting success, preventing false Collection updated messages against an older running backend.
- Predictable deletion: deleting a collection returns to the Watchlist instead of reopening an empty Manage collections window.
- Preserved purchase records: membership edits retain existing plans; archived spending is preserved when shared watches are marked Purchased or Still wanted; recorded payments remain fixed when catalog prices change.
- Safe Undo behavior: restoring a removed membership never overwrites a newer membership or recreates a deleted watch or collection.
- Correct alert transitions: qualifying state survives restarts, enabling or editing conditions establishes a baseline, and empty or fully purchased collections do not alert. Restore does not replay past collection-ready notifications.
- Delivery cancellation: disabling, archiving, deleting, or changing relevant collection conditions cancels obsolete pending/failed jobs. Delivery checks active collection-only suppression before sending individual alerts.
- Reliable catalog evidence: incomplete or invalid variant catalogs cannot advance destructive-change confirmation. Insights show unknown periods instead of inventing availability during missing coverage.
- Honest variant pricing: missing prices display Prices vary, unknown prices sort after known values, zero prices remain valid, and retired variants are excluded from current variant price summaries.
- Correct standalone validation: package startup checks now use the release manifest's application version and schema rather than an outdated schema assertion. Identity mismatches are reported separately from startup timeouts.
Security and self-hosting
- Stricter host validation: validate Host and forwarded-host authorities before routing, enforce loopback-only local mode, and require explicit reverse-proxy authority settings to resist DNS rebinding.
- Stronger password hashing: new owner passwords use a stronger versioned scrypt profile; valid older hashes are upgraded after successful sign-in.
- Bounded HTTP resources: apply header, request, keep-alive, header-count, and per-socket request limits while retaining no-store API responses.
- Lower-privilege services: Windows and macOS service installation uses dedicated restricted identities; Linux keeps application files root-owned and applies additional systemd sandboxing.
- Hardened Docker isolation: Compose runs with a read-only root filesystem, dropped capabilities, no-new-privileges, a process limit, and constrained temporary storage while preserving writable application data.
- Privacy-preserving diagnostics: support bundles exclude product identities, variant metadata, collection contents, and pending product observations while retaining useful operational counts.
- Repository safeguards: security contracts check service identities, containe...
GearBeacon V1.0.0
GearBeacon 1.0.0 — First stable release
GearBeacon 1.0.0 is the first stable release of a private, single-owner, self-hosted Ubiquiti and UniFi Store inventory monitor. Run it on your own Windows PC, Mac, Linux server, NAS, or Docker host and manage it from a responsive web browser.
There is no GearBeacon cloud account, hosted database, public registration, subscription, analytics, or telemetry. Monitoring and notifications run on your server, so a browser does not need to remain open.
What GearBeacon does
Regional UniFi Store monitoring
- Monitors the United States, Canada, Europe, and United Kingdom UniFi Stores from one installation.
- Keeps watchlists, product state, activity, and monitoring health separated by region.
- Discovers catalog products with their name, SKU, category, price, availability, image, and regional Store link.
- Provides a searchable and filterable Browse catalog with category tabs, paging, image retry/fallback behavior, and dark/light themes.
- Shows detailed product drawers with availability, price, SKU, region, first-observed and last-checked times, last change, price history, recent changes, and a direct UniFi Store link.
- Detects restocks, sellouts, price changes, other status changes, newly listed products, and products removed from a complete catalog.
Reliable change detection
- Records a restock immediately when it appears in a complete, valid catalog.
- Requires two matching complete observations before committing a sellout, price change, ordinary status change, or catalog disappearance.
- Preserves the last-known-good value while a potentially destructive change is awaiting confirmation.
- Marks a product Unlisted after two complete catalogs omit it instead of silently deleting it.
- Prevents partial or malformed catalogs from advancing missing-product evidence or creating false transitions.
- Persists pending confirmation evidence across restarts.
- Honors upstream
Retry-Afterguidance and uses exponential backoff with jitter after failures.
Watchlists and alert rules
- Adds products directly from Browse or imports them from pasted UniFi Store URLs, SKUs, product slugs, TXT, CSV, or JSON files.
- Reviews regional matches, duplicates, and already-watched products before an import changes the watchlist.
- Searches, filters, sorts, selects, pauses, resumes, and removes watched products individually or in bulk.
- Supports global alert defaults and per-product overrides for restocks, sellouts, price changes, status changes, price drops, and target prices.
- Supports temporary or indefinite alert pauses.
- Allows selected restocks to bypass quiet hours and digest scheduling for immediate delivery.
Activity, evidence, and history
- Keeps a durable Stock activity feed with exact before-and-after transitions, prior-state duration, price movement, region, detection time, and notification outcome.
- Provides confirmation evidence for each event, including the policy used, observation count, first-observed time, confirmed time, and server-alert result.
- Supports text, region, event-type, date, and notification-outcome filters with pagination.
- Exports retained activity to CSV or JSON.
- Stores change-only product observations for price history and recent-change views.
- Uses independently configurable product-history and activity-retention periods.
Notifications
GearBeacon can deliver alerts through:
- Responsive HTML and plain-text SMTP email
- ntfy, including self-hosted servers
- Discord webhooks
- Gotify
- Generic JSON webhooks
- Browser notifications
Notification jobs are stored durably in SQLite before delivery. Failed deliveries use bounded exponential retries and remain visible in Operations, where the owner can retry them. GearBeacon also supports notification grouping, per-product cooldowns, timezone-aware quiet hours, daily digests, test notifications, and an optional All activity updates mode for every new Activity entry—including unwatched products.
Email notifications include event-specific layouts for restocks, target prices, price drops, sellouts, status changes, new products, operational warnings, tests, and grouped digests. Appearance controls include compact/standard/detailed layouts, automatic/light/dark themes, subject prefixes, price calculations, alert explanations, embedded product images, digest limits, and desktop/mobile previews. Email contains no tracking pixels, scripts, remote fonts, or analytics.
Generic webhooks support optional bearer authentication and HMAC-SHA256 signatures over the exact body and timestamp. SMTP uses implicit TLS on port 465 or requires STARTTLS by default on other ports, validates certificates by default, and never sends credentials over an unencrypted connection.
Operational health
- Shows an overall Healthy, Degraded, or Action Required state.
- Displays per-region check timing, catalog results, product/watch counts, pending confirmations, and retry state.
- Reports queued, delivered, and failed notifications with next-delivery timing and failure details.
- Tracks database size, available disk space, backup health, secondary-copy health, recovery readiness, access-security warnings, runtime architecture, build commit, and container image information.
- Can alert the owner about repeated monitor failures, exhausted notification deliveries, scheduled-backup failures, and low disk space.
- Provides filtered downloadable logs without exposing raw secrets to the browser.
- Runs installation diagnostics covering SQLite integrity, data and backup access, encryption-key decryption, restore readiness, free space, notification delivery, Store connectivity, and access-mode security.
- Generates a privacy-redacted support bundle that excludes owner credentials, integration secrets, webhook URLs, local paths, private host addresses, and product/watchlist data.
Upgrade-safe data and recovery
- Stores persistent state in an operating-system application-data directory or Docker
/datavolume rather than the application directory. - Uses transactional, append-only SQLite migrations with automatic safety backups before schema upgrades and imports.
- Creates validated scheduled, manual, pre-import, and pre-update backups.
- Verifies primary backups with SQLite integrity checks and consistent snapshots.
- Can copy backups to a separate disk, mounted share, or NAS location.
- Supports passphrase-encrypted secondary recovery exports using AES-256-GCM with a scrypt-derived key.
- Tests the latest primary or secondary backup non-destructively without changing the active database.
- Exports encrypted transfer files, previews imports, and preserves watchlists, rules, history, and settings through supported upgrades.
- Keeps a successful primary backup valid even if its optional secondary copy fails.
Private owner access and security
GearBeacon has three explicit access modes:
| Mode | Default bind | Owner password | Intended use |
|---|---|---|---|
| Local | 127.0.0.1 |
Optional | One computer |
| Private | 0.0.0.0 |
Required | Trusted LAN, private VPN, server, or container |
| Proxy | 127.0.0.1 |
Required | HTTPS reverse proxy on the same host |
- Refuses unauthenticated local mode on a non-loopback address.
- Uses a one-time setup token for the first authenticated setup.
- Protects owner access with scrypt password hashing, throttled sign-in, hashed sessions, CSRF validation, origin validation, secure cookie controls, session inspection/revocation, and password rotation/recovery.
- Restricts reverse-proxy forwarded-header trust to a same-host loopback proxy and supports secure cookies and HSTS when an HTTPS public URL is configured.
- Encrypts saved notification credentials with an installation key stored outside SQLite and protected with restricted filesystem permissions.
- Applies a restrictive Content Security Policy and standard browser security headers.
- Fetches product images only from an exact Ubiquiti host allowlist with redirect, timeout, size, and content-type limits.
GearBeacon is designed for local networks, private VPNs, or a maintained HTTPS reverse proxy with restricted access. Do not expose it directly to the unrestricted internet.
Browser experience and accessibility
- Responsive dashboard for desktop, tablet, and mobile browsers; no native mobile application is required.
- Tested at a 390-pixel viewport and 200% browser zoom without horizontal page overflow.
- Supports keyboard navigation, visible focus indicators, accessible tab and dialog behavior, focus containment/restoration, Escape handling, live status announcements, and axe WCAG scans.
- Supports dark and light themes plus reduced-motion preferences.
- Remembers navigation and filters locally in the browser.
- Preserves the last loaded dashboard during brief disconnections and reports offline, reconnecting, and restored states.
- Includes copy actions for SKUs and Store links, clear filter reset states, compact Activity rows, image fallbacks, and a keyboard-accessible animated To top control.
Installation options
Standalone packages
Standalone downloads include their own Node.js runtime:
- Windows x64:
GearBeacon-v1.0.0-windows-x64.zip - macOS Apple Silicon:
GearBeacon-v1.0.0-macos-arm64.tar.gz - macOS Intel:
GearBeacon-v1.0.0-macos-x64.tar.gz - Linux ARM64:
GearBeacon-v1.0.0-linux-arm64.tar.gz - Linux x64:
GearBeacon-v1.0.0-linux-x64.tar.gz
Each package can run directly or be installed for automatic startup using the included Windows service, macOS LaunchDaemon, or Linux systemd helper. Uninstallers preserve GearBeacon data unless their explicit data-removal option is used.
Docker Compose
docker compose up -d
docker compose logs gearbeaconThe published image is ghcr.io/alexphillips-dev/gearbeacon:1.0.0 and supports linux/amd64 and linux/arm64. Compose publishes only 127.0.0.1:8787 by default, runs Gear...