Releases: lbruton/StakTrakr
Releases · lbruton/StakTrakr
v3.34.38 — Silverback · Lot/Each · Settings overhaul · Inventory safety
New Features
- Lot ⇄ Each purchase price toggle (STRK-4): Enter a lot total when buying multiples — the app divides by quantity and stores per-unit price. Purchase column now shows qty-multiplied totals.
- Silverback as a first-class metal type: Goldback and Silverback are now proper type categories with dedicated purity defaults and denomination handling.
- Fly.io→sqld reachability health probe (STRK-7): New health endpoint verifies the Fly.io poller can reach the sqld database.
Inventory Data Safety
- Seed guard (STRK-13): Startup no longer overwrites inventory with sample data when localStorage is missing or corrupt. Recovery banner appears instead of silent data replacement.
- Vault restore deduplication (STRK-14): Re-importing your own encrypted backup no longer produces duplicates. Items matched by serial → Numista ID → name+date before comparison. Volatile cache keys excluded from settings diff.
- Silverback weight unit fix (STRK-17): Silverbacks now use a dedicated
sbunit (0.001 troy oz), separate from Goldback retail pricing. Legacygbrecords migrate automatically on load, import, backup preview, and cloud restore.
Settings UI Overhaul
- Search tab merged into Filters (STAK-437): Fuzzy autocomplete toggle, search behavior controls moved into the Filters tab.
- Images tab redesign (STAK-439)
- Danger buttons moved to Inventory (STAK-442): Data reset relocated from Storage tab.
- API tab sectioned card layout (STAK-443): Multi-provider config with priority order, Numista/PCGS tabs, usage tracking.
- Activity Log tab redesign (STAK-446): Full change history with undo/redo.
- Currency tab redesign (STAK-570): 17-currency display with exchange rates and Goldback pricing controls.
- Force Refresh moved to About (STAK-564): Troubleshooting card in About tab.
Market & Retail
- Retail currency conversion phase 1 (STAK-581): Retail and market price surfaces honor selected display currency via shared
currencychangeevent bus. - Spot provider switch confirmation (STAK-571): Settings → API shows a confirmation dialog before switching providers.
- Mobile action button safe areas (STAK-578): Save/Cancel/Edit buttons clear Android gesture nav and iOS safe-area insets including landscape notch.
Bug Fixes
- STRK-11: PCGS API test button token fix
- STRK-12: Silverback denominations, unit label, purity default corrected
- STRK-15: Silverback denomination aria-label no longer references Goldback
- STRK-16: Placeholder regression + seed-guard test isolation
- STRK-19: eBay search button overlap with close button in view modal
- STRK-20: Backup conflict modal context-aware messaging (newer vs. existing)
- STAK-517: Market filter cache invalidated after vault restore
- STAK-546: Filter chip AND predicate semantics restored
- STAK-548: SQLD_URL rename in poller code
- STAK-549: Cloud sync header button silent failure fix
- STAK-551: Filter chip predicate logic fix
- STAK-565: JM Bullion scraper column fix
- STAK-573: API tab catalog UX, Bulk Sync rework
- STAK-576: Numista search UX when API key not configured
- STAK-577: Wire/eCheck price extraction from JSON-LD priceSpecification
Infrastructure & Tooling
- STRK-5: Codacy CLI switched from semgrep to opengrep
- STRK-6: Tailscale subnet route re-applied on every container start
- Home poller: byparr pinned to
ghcr.io/lbruton/byparr:2.1.0 - Prettier + lint-staged quality gates added
.coderabbit.yamladded- Accessibility hardening pass
- Issue tracking migrated from DocVault to Plane (
STRK-prefix)
v3.34.14 — STAK-558: Comma and semicolon delimiters in tag input
STAK-558: Comma and semicolon delimiters in tag input
- Added: Tag input fields in edit modal and view modal now support comma (
,) and semicolon (;) as delimiters. TypeSilver, Bullion, 2024orSilver; Bullion; 2024and all three tags are added at once. - Added: Empty tokens between delimiters are automatically skipped, and each token is trimmed of whitespace before adding.
- Added: Single-tag entry without delimiters behaves identically to before — no breaking changes.
- Added: Existing deduplication and max-tag limits apply per token, so bulk entry cannot bypass safety rules.
- Improved:
addItemTagcalls batched withpersist=false+ singlesaveItemTags(), reducing localStorage writes and sync churn. - Improved: Extracted
parseTagInput()utility tojs/utils.jsfor DRY tag parsing across edit and view modals.
v3.34.03
What's New
Features
- STAK-444: Dedicated Cloud tab in Settings — Dropbox, Cloud Sync Beta, backup/restore consolidated
- STAK-538: Remove first-run acknowledgment modal — app shown immediately on first load
- STAK-529: Sort direction toggle in Settings > Appearance (Asc/Desc)
- STAK-547: Replace What's New modal with toast card; changelog capped at 5 entries
UX / Header
- STAK-544: Header cloud button triggers manual sync (ready) or opens Settings (needs setup)
- STAK-545: Header market button triggers
syncRetailPrices()instead of opening panel - STAK-445: Move FAQ below LOG in Settings sidebar
Bug Fixes
- STAK-527: Clear
autoRefresh.STAKTRAKRwhen provider disabled - STAK-526: Atomic rollback on cloud sync settings write failure
- STAK-521: Quarantine unresolved slugs from market filter matrix
- STAK-533: Numista API key no longer stripped during cloud sync
- STAK-525: Market sync button stuck in "Syncing" state fixed
- STAK-520: Market filter deep validation on load
- STAK-519: Cloud sync API key loop on blank storage fixed
- STAK-516: Vendor prices refresh stuck on
file://fixed - STAK-510: APMEX Goldback prices — Check/Wire price now used
Infrastructure
- STAK-508: v2 API migration — frontend cutover complete
- STAK-509: V1 API dead code cleanup (~486 lines removed)
- STAK-531: Security hardening post-INC-001
- STAK-528: Shape-aware dimension fields (bars: Length/Width vs Diameter)
- Pre-commit hooks: gitleaks, release-artifact sync, CLAUDE.md guard
- Seed bundle: 47552 entries, 59 years (1968–2026)
v3.33.93 — Market Filters, Cloud Sync Fixes, Shape Dimensions, Security Hardening
Market Filters, Cloud Sync Fixes, Shape Dimensions, Security Hardening
Market Data & Filtering
- Market Filter Matrix — Settings > Market redesigned with per-metal checkbox matrix for items and vendors (STAK-515)
- V1 API dead code removal — ~486 lines removed. Market log tab shows dynamic vendor columns (STAK-509)
Data Integrity & Cloud Sync
- Cloud sync API key fix — Keys no longer destroyed as
[object Object]when synced (STAK-519) - StakTrakr API settings simplification — Cache settings no longer revert to 24h (STAK-518)
UI & Data Model
- Shape-aware dimension fields — Bars/ingots show Length/Width instead of Diameter. Shape dropdown drives conditional fields (STAK-528)
- Logo and theme refinements — Height-driven logo sizing, light/sepia palette improvements (STAK-514)
Security (STAK-531)
- Malicious GHA workflow removed, all secrets rotated
- SSH commit signing, CODEOWNERS, zero GitHub repo secrets, PR requirements on all branches
v3.33.88 — Ticker Duplication & Stale What's New Fix
Ticker Duplication & Stale What's New Fix (STAK-513)
- Fixed: Market ticker marquee duplicating into 4-5 stacked rows due to race condition in renderBestPriceTicker() — orphaned .ticker-track elements now swept on every finalize (STAK-513)
- Fixed: Removed redundant renderBestPriceTicker() call inside async _renderVendorTable completion that was the primary trigger for the race (STAK-513)
- Fixed: Stale What's New content on Cloudflare-proxied deployments — SPA fallback returning HTML instead of 404 for deleted announcements.md now detected and bypassed (STAK-513)
- Added: CSS max-height safety clamp on .market-ticker to prevent visual overflow if ticker tracks accumulate (STAK-513)
Reported by beta user PumpkinCrouton on r/Silverbugs.
v3.33.87 — Market Data Module, Inventory Modularization, Branding Refresh
Highlights
This release ships 13 patches (v3.33.71 → v3.33.87) — the biggest update since the DiffModal overhaul.
Market Data Module (STAK-504)
- Best Price Ticker — scrolling strip below spot cards showing cheapest vendor per coin with premium percentages
- Vendor Prices Table — metal-tabbed comparison table with per-vendor prices, premium badges, and clickable buy links
- Market Detail Modal — TradingView Lightweight Charts with 7-day spot history and per-vendor price comparison
- All sections toggleable and reorderable in Settings > Layout
Inventory Modularization (STAK-484)
- Split
inventory.js(3000+ lines) intoinventory-table.js,inventory-backup.js, andinventory-import.js - Extracted
chart-utils.jsfor shared charting code
Branding Refresh
- New favicon, PWA icons (192/512), banner logos, and icon-logo SVGs
- S-stack monogram with gold center bar on dark navy background
Infrastructure
- v2 API export pipeline (
api-export-v2.js) — vendor-centric endpoints - Slim Dockerfile for Fly.io remote poller
- Wiki → DocVault migration (entire
wiki/directory removed) - Removed deprecated test suites, Jules config, AGENTS.md, GEMINI.md
Bug Fixes
- Startup quota regression and market ticker stabilization (STAK-481)
- What's New modal content flash (STAK-500)
- JM Bullion price extraction, Goldback ghost cards (STAK-498)
- Cloud sync image vault erasure on cross-device push (STAK-497)
- Numista special character search (STAK-494)
- Graceful service worker update — auto-reload on cache miss (STAK-485)
- Chart daily average divergence on volatile days (STAK-483)
- Retail scraper consistency and OOS pipeline (STAK-475, STAK-495)
- Dashboard command injection fix (CodeQL)
Removed
- Grid/card view dead code (~260 lines) — list view now unconditional (STAK-473)
docs/announcements.md— replaced by embedded fallback in about.js
Full changelog: https://github.com/lbruton/StakTrakr/blob/main/CHANGELOG.md
Version tags shipped: v3.33.71, v3.33.74, v3.33.75, v3.33.76, v3.33.77, v3.33.78, v3.33.79, v3.33.80, v3.33.81, v3.33.82, v3.33.84, v3.33.86, v3.33.87
v3.33.70 — Intraday trends, aggregation fixes, CF bypass, security hardening
Intraday Trends, Aggregation Fixes, CF Bypass Hardening
- Added: Intraday trend toggle for Market Prices cards — pill button switches between current price and hourly % change (STAK-464)
- Added: Chart polish — dashed line segments for OOS vendors + 7-day Goldback baseline on spot charts (STAK-474)
- Fixed: aggregateWindows data merge — dropped UNIQUE constraint that caused data loss, upsert cache rows, 30-min consensus buckets carry forward vendor prices across windows (STAK-476)
- Fixed: Retail scraper CF bypass — Byparr before Firecrawl phase, JSON-LD price=0 treated as OOS, Camoufox shm_size 1g for shared memory (STAK-475)
- Fixed: Goldback cron staggered from :01 to :20 to avoid Fly.io overlap (STAK-477)
- Fixed: Storage hygiene — disposed filter preference no longer resets on reload, silent auto-merge for settings-only sync diffs (STAK-470)
- Fixed: Catalog Data fields no longer silently discarded for items without Numista number (STAK-469)
- Fixed: Retail price accuracy — Provident Metals spot ticker fix, Hero Bullion bulk price fix, Gainesville timeout elimination (STAK-467)
- Changed: Improved Cloudflare bypass fallback to Byparr/Camoufox cookies (STAK-462)
- Changed: Reverse tabnabbing mitigation on all window.open() calls
- Changed: Cached Intl.NumberFormat instances for faster rendering
- Changed: Removed wiki/ after DocVault migration (STAK-471), CodeQL warnings cleanup (STAK-460)
v3.33.60 — DiffModal Overhaul, Dropbox Multi-Account, Market Improvements, Numista Fixes
What's New
- DiffModal Complete Overhaul — Full card-based review UI for all import/sync/restore flows. Summary dashboard, per-item conflict cards, click-to-pick field selection, rich settings renderers, and orphan cards with action buttons (STAK-451, STAK-454, STAK-455)
- ZIP Backup Restore via DiffModal — ZIP restores now route through DiffModal for review instead of directly overwriting data (STAK-457)
- Dropbox Multi-Account UX — Connected account email/name displayed in settings; Switch Account and Sign Out of Dropbox links added (STAK-449)
- Market View Improvements — Metal filter pills (All/Silver/Gold/Goldback/Platinum/Palladium), mobile layout fixes, expand/collapse state reset on search, Australian coin display names (STAK-433, STAK-434, STAK-452)
- Numista N# Search Fixes — Image URLs and metal type now auto-populate when adding items via N# search (STAK-431)
- Date Sort Fix — Dateless items now sort as oldest instead of always to the bottom (STAK-448)
Version Tags Shipped
v3.33.52 · v3.33.53 · v3.33.54 · v3.33.55 · v3.33.56 · v3.33.57 · v3.33.58 · v3.33.59 · v3.33.60
v3.33.51 — Cloud Sync Hardening, Diff/Merge, Disposition, Market Redesign
Highlights
Cloud Sync & Encryption
- Bi-directional sync overhaul — multi-key decrypt, race condition fixes, deadlock fix (STAK-398)
- Cloud storage API hardening, sync scope & serialization (STAK-425, STAK-426)
- 10+ sync bug fixes: pull root cause, Keep Mine loop, empty diff, push racing, storage blowout
Diff/Merge Architecture
- DiffEngine + DiffModal — reusable change-review UI with UUID matching (STAK-184, STAK-380)
- Selective apply for cloud sync pull and vault restore (STAK-190)
Data Portability & Backup
- Import/restore completeness with cloud backup photos (STAK-427)
- Full backup for sync snapshots, separate manual backups (STAK-419)
- Backup integrity audit — import transparency & validation (STAK-374)
Inventory & Market
- Realized gains/losses — item disposition tracking (STAK-72)
- Market page redesign Phase 1 & 2 — list view, manifest-driven coins, Goldback vendor (STAK-369, STAK-371)
- Oklahoma Goldback G1, vendor medal ranking fix (STAK-370)
UI/UX
- Clone mode redesign, modal UX consistency (STAK-375, STAK-378)
- Numista search overhaul — fieldMeta, re-sync picker, tag controls (STAK-345/346/354/362/363)
- Summary bar items + weight, filter chip cap, disposed items view (STAK-418, STAK-169, STAK-388)
- Spot price card label fix + mobile long-press entry (STAK-274, STAK-285)
Security (Pre-ship Hardening — STAK-430)
- XSS fix in settings pattern rule innerHTML
- OAuth CSRF — state parameter validation on localStorage relay
- Sync flag leak fix, console log sanitization, dead code removal
Infrastructure
- Wiki migrated to in-repo /wiki/ with Docsify (STAK-390)
- Wiki accuracy sweep — ~85 fixes across 27 pages (STAK-392)
- Browserbase test runbook v2, Playwright test additions
- Skill cleanup — removed 27 obsolete/duplicate skill files
50 patch versions (v3.33.01 → v3.33.51) | 55 Linear issues | PR #756
v3.33.25
What's New in v3.33.25
Highlights
- Realized Gains/Losses (v3.33.17) — Disposition workflow: Sold, Traded, Lost, Gifted, Returned. Calculates realized gain/loss with badges, filters, portfolio summary, and CSV export
- DiffMerge Integration (v3.33.19) — Selective apply for cloud sync pull and encrypted vault restore. Preview changes before applying
- Disposed Items: Restore & View (v3.33.21) — Three-state disposed filter, changelog undo, restore-to-inventory button
- Backup Integrity Audit (v3.33.24) — exportOrigin metadata, pre-import validation, DiffModal count header, post-import summary
- Market Page Phase 1 & 2 (v3.33.06, v3.33.13) — Full market page redesign with manifest-driven coins and Goldback vendor support
All Patches (v3.33.01–v3.33.25)
| Version | Description |
|---|---|
| v3.33.25 | Browserbase Test Runbook v2 (STAK-396) |
| v3.33.24 | Backup integrity audit (STAK-374) |
| v3.33.23 | Chip max count setting (STAK-169) |
| v3.33.22 | Suppress storage error modal for intraday cache (STAK-383) |
| v3.33.21 | Disposed items restore and view (STAK-388) |
| v3.33.20 | Market panel bug fixes (STAK-389) |
| v3.33.19 | DiffMerge integration (STAK-190) |
| v3.33.18 | Diff/Merge architecture + modal UX (STAK-184/378/380) |
| v3.33.17 | Realized gains/losses — item disposition (STAK-72) |
| v3.33.16 | Clone mode redesign + edit modal UX (STAK-375) |
| v3.33.15 | Beta domain toast (STAK-376) |
| v3.33.14 | Goldback G½ slug resolution (STAK-373) |
| v3.33.13 | Market Page Phase 2 (STAK-371) |
| v3.33.12 | Version drift correction |
| v3.33.11 | Spot price card label root cause fix (STAK-274) |
| v3.33.10 | Mobile long-press spot price entry (STAK-285) |
| v3.33.09 | Spot price card cache label fix (STAK-274) |
| v3.33.08 | Vendor medal ranking fix (STAK-370) |
| v3.33.07 | Oklahoma Goldback G1 on market page (STAK-370) |
| v3.33.06 | Market Page redesign Phase 1 (STAK-369) |
| v3.33.05 | Search cache cleanup, dead code removal |
| v3.33.04 | NGC lookup, fractional oz, cloud sync reorder |
| v3.33.03 | Clean up announcements |
| v3.33.02 | Cloud sync safety overhaul (STAK-295/190/360) |
| v3.33.01 | Numista search overhaul (STAK-345/346/354/362/363) |
Release Archive Fix
.gitattributes updated to exclude wiki/, playground/, ui-standards/, and dev tooling from release downloads.