All notable changes are documented here. The project uses Semantic Versioning. Until 1.0.0, all releases are pre-release and the public API may change.
- 0.0.1 - Initial consolidated public release
- 0.0.2 - Quote flow, public messaging, and theming release
- 0.0.3 - Pricing controls, reusable policies, and UX polish release
- 0.0.4 - Startup stability hotfix release
- 0.0.5 - In-app updater and extension fallback import release
- 0.0.6 - UI foundation and layout redesign release
- 0.0.7 - Projects-first workflow and operations tooling release
- 0.0.8 - Navigation, admin backup, UX polish, and hotfix stabilization release
- 0.0.9 - Security hardening and quote-workflow refactor release
- 0.0.10 - Workflow expansion, public quote polish, and release-readiness release
- 0.0.11 - Visibility, operations surfaces, and architecture-scaling release
- 0.0.12 - Operations, AI platform, and engine release
- Rust engine workspace and rollout guardrails - Added the full
rust-core/workspace, Rust lifecycle controls, parity reporting, a release guard, and Node-facing integration seams for availability/conflicts and pricing. - Quote Assistant and AI orchestration - Added quote-scoped assistant workflows, provider/model routing, richer item description controls, and managed local AI support through Ollama and Onyx integration.
- Notifications, Team Chat, and Team Groups - Added live notification routes/services/UI, notification settings, internal team chat, and grouped team-targeting workflows.
- Inventory operations tooling - Added set-aside workflows, product scan codes, serial numbers, barcode rendering, pull sheets, aggregate pull export, stronger stats, and expanded mobile/desktop inventory controls.
- Operator support surfaces - Added Help, Appearance settings, Clients, Venues, notification settings, team chat, aggregate pull export, and scan redirect pages.
- Release notes for 0.0.12 - Added
RELEASE_NOTES_0.0.12.mdfor release publishing and repository-facing version context.
- Public repo presentation - README, badges, release links, and release-facing docs now reflect the
0.0.12feature set and shipping story. - Inventory UX and search behavior - Inventory now supports loose/exact search modes, ranked matching, denser control over layout, mobile-safe one-column mode, and more operational AI edit flows.
- Quote/project operator flow - Quote detail now includes pull sheets and assistant workflows, the project list has column management and combined pull export, and quote-builder conflict visibility is clearer.
- Admin/runtime management - Admin > System now exposes richer runtime controls for Rust, Onyx, and Ollama instead of treating those subsystems as mostly hidden infrastructure.
- Settings architecture - Settings now has deeper AI provider/model control, appearance-specific settings, notification placement/icon controls, and team-chat fallback options.
- Startup and request noise - Dev startup now waits for API readiness more cleanly, and high-churn client requests were reduced with deduping/abort behavior on key flows.
- Notification dismissal behavior - Notification dismissals now persist correctly, mobile swipe interactions are faster, and tray placement/visibility issues were corrected.
- Inventory usability regressions - Inventory scrolling, mobile row controls, search filtering, and product-card interaction issues were corrected while keeping the recent performance work.
- Onyx failure handling - Team chat and quote-thread AI no longer hard-fail on common Onyx runtime/config errors and can fall back to the configured assistant path when enabled.
- Maps workspace and geocode API - Added operator-facing maps support with
server/routes/maps.js, Mapbox-backed geocoding services, and persisted quote map cache fields. - Sales analytics foundation - Added
/api/sales/analyticsplus a dedicated client sales-dashboard feature area for pipeline-style reporting. - Team, profile, and fulfillment surfaces - Added team workspace routes/UI, profile pages, and fulfillment panels/workflows for confirmed projects.
- Expanded API/integration docs - Added
AI/Api/*documentation covering authentication, inventory, quotes, public catalog use, data models, and integration planning. - Release notes for 0.0.11 - Added
RELEASE_NOTES_0.0.11.mdfor release publishing and repository-facing version context.
- Backend persistence architecture -
server/db.jsnow works alongside dedicatedserver/db/schema/*,server/db/migrations/*,server/db/defaults/*, andserver/db/queries/*modules instead of being the only schema/migration home. - Quote backend decomposition - More quote logic has moved out of route handlers and into focused services/repositories for list, finance, files, fulfillment, lifecycle, sections, and contract flows.
- Public repo presentation - README, badges, project structure notes, quickstart, and package metadata now reflect the
0.0.11feature set and setup expectations.
- Stale architecture docs - Project-overview and architecture notes now describe the current repo layout instead of older pre-fulfillment/pre-maps assumptions.
- Release metadata drift - Package manifests, lockfiles, README release links, and changelog state now align to
0.0.11.
- Section-aware quote workflows - Quote item areas now support editable titles, duplication/deletion, grouped subtotals, and richer public/export rendering aligned to client-visible structure.
- Settings-backed event and file governance - Added configurable event types, optional auto-append-city project naming, and a settings-driven extra allowed file type list for uploads.
- Signed contract artifact lifecycle - Contract signing now preserves versioned signed PDFs and surfaces stronger audit metadata around signature events/files.
- Release notes for 0.0.10 - Added
RELEASE_NOTES_0.0.10.mdto support packaging, tagging, and downstream release publishing.
- Public quote experience - Client quote views now show section titles, section date ranges, item descriptions, and section subtotals instead of flattening everything into one generic item list.
- Project financial clarity - Signed projects, unsigned changes, and outstanding balance visibility now follow signed-state rules more closely in list/tile and detail flows.
- Inventory editing UX - Inventory item editing can now stay in-context via a right-side slideout instead of forcing a full-page jump from the inventory grid.
- Route transition performance - App navigation now warms likely route bundles after auth and prefetches target pages on hover/focus for faster first-hit transitions.
- GitHub/discoverability metadata - README, package metadata, release badges, and release-facing copy were refreshed to better communicate product scope and engineering quality.
- Quote section deletion semantics - Deleting a quote item group now deletes the items inside it instead of orphaning/moving them unexpectedly.
- Public quote grouping bugs - Client-facing quote sections now use their actual configured titles and latest live-state data, including unsigned changes where appropriate.
- Project tile interaction - Clicking a project tile now opens the project instead of trapping the user in accidental multi-select behavior.
- Inventory card navigation - Clicking inventory card media/title from the inventory page now opens the edit workflow expected for that context.
- Quote workflow service modules - Added
server/lib/quoteActivity.js,server/services/itemStatsService.js, andserver/services/quoteService.jsso activity logging, item analytics bookkeeping, quote send, duplication, and status transitions are reusable outside the route layer. - Quote UI extraction primitives - Added
client/src/lib/quoteTotals.js,client/src/hooks/useQuoteDetail.js, extracted quote modals (ImagePicker,QuoteFilePicker,QuoteSendModal), and dedicatedquote-builder/panel components. - Release notes for 0.0.9 - Added a dedicated
RELEASE_NOTES_0.0.9.mdsummary for packaging/tagging and downstream release publishing.
- Quote detail architecture -
QuoteDetailPage.jsxhas been reduced substantially by moving shared state and modal/file-picker concerns into dedicated modules. - Quote builder architecture -
QuoteBuilder.jsxnow delegates line-item editing, adjustment management, and inventory browsing to smaller focused panels. - Shared pricing logic - Public and operator quote totals now derive from the same shared helper instead of duplicating pricing/adjustment math in two pages.
- Backend route structure -
server/routes/quotes.jsnow routes through extracted quote services/helpers instead of hosting the core orchestration inline.
- JWT and extension-auth fallback behavior - Auth middleware no longer leaves broad route access coupled to a generic extension token path.
- Public file and quote exposure - File serving and public quote payloads now use tighter access checks and smaller response surfaces.
- Upload and attachment safety - File uploads are validated from actual file signatures, and outbound quote mail only attaches files already linked to the quote.
- Public quote state mutation guardrails - Public approval/signing-related flows now have stronger state checks and safer backend handling.
- Admin database backup workflows - Added
GET /api/admin/db/exportandPOST /api/admin/db/import, plus Admin UI actions to download and restore SQLite.dbbackups. - Directory workspace - Added a dedicated Directory page that groups Leads and Vendors under one navigation entry.
- Dedicated settings subpages - Added Inventory Settings and Message Settings pages with persisted settings scaffolding for inventory display and outbound messaging preferences.
- Global crash fallback - Added a top-level React
ErrorBoundarywith a user-facing reload recovery screen. - Verbose error diagnostics toggle - Added the
verbose_errorssetting so operators can temporarily expose detailed server and crash-screen error messages while debugging.
- Sidebar information architecture - Reworked navigation into grouped sections with collapsible mode, hover flyouts, unread/pending badges, and live team presence context.
- Inventory and leads loading/search UX - Replaced spinner-only states with skeleton loaders, added contextual empty-search messages with reset actions, and lazy-loaded inventory thumbnails.
- Quote builder polish - Added add-to-project flash feedback and refined line-item spacing/thumbnail treatment.
- Theme consistency pass - Replaced remaining hardcoded accent/focus colors with theme tokens, fixed the Files page elevated-surface token mismatch, and added a max-width constraint to the main layout.
- Dashboard polish - Updated KPI accent styling to use theme variables and improved loading presentation during data fetches.
- Route-level bundle loading - Converted heavy operator and public screens to lazy-loaded routes so the initial client payload is smaller and secondary pages only load when visited.
- Quote detail editing safety - Quote detail now tracks dirty form state, blocks in-app navigation when edits are unsaved, and warns on browser reload/close.
- Messages mobile layout - The Messages workspace now swaps to a focused single-pane detail flow on smaller screens instead of forcing the desktop split-pane layout.
- Public quote browser tab title - Public quote pages now set
document.titlefrom the active quote name. - Toast accessibility - Toast notifications now announce through
role="status"andaria-live. - Inventory card action labels - Icon-only item card actions now expose accessible names for assistive technologies.
- Spreadsheet import title validation - Sheets import now rejects numeric-only item titles, preventing Excel date serials and bare numeric IDs from being imported as inventory names.
- Item API metadata parity - Item create/update/bulk upsert flows now preserve
contract_descriptionconsistently while also rejecting numeric-only titles. - Quote creation failure handling - Quote creation now returns a structured API error instead of bubbling an unhandled server failure.
- Projects/files linkage endpoint - Added
GET /api/files/:id/quotesso file management surfaces can show where assets are attached. - Unsigned-change dismissal endpoint - Added
DELETE /api/quotes/:id/unsigned-changesfor staff to acknowledge post-signature changes without forcing immediate resend. - Contract template editing API - Added
PUT /api/templates/contract-templates/:id. - Inventory item typing - Added
items.item_type(defaultproduct) with support in item create/update/list filtering. - Date range picker presets - Added quick presets plus month/year selectors in the shared range picker UI.
- Projects-first terminology and UX - Major UI language shift from “Quotes” to “Projects” across primary operational screens.
- Project list controls - Added sorting options and improved search/filter ergonomics in the projects index.
- Project detail experience - Improved lifecycle actions, expiration/unsigned-change visibility, payment/file detail handling, and logistics/payment-related workflows.
- Project creation flow - Consolidated from a 2-step wizard into a single-screen form.
- Files page operations - Added list/tile refinements, richer inspection drawer, linked-project visibility, and bulk action polish.
- Billing workspace - Added outstanding balances view and stronger search/sort/export handling.
- Leads workspace - Added search suggestions/autocomplete and sortable table columns.
- Inventory editing model - Added item type controls, subrental toggles, image-upload flow, and optional source indicator visibility setting.
- Public project page labels - Improved naming consistency and policy/terms title display.
- Image thumbnail auth in Files UI - File serve URLs now accept token query auth for image-tag compatibility.
- Upcoming event date normalization - Dashboard summary now normalizes non-ISO event dates before upcoming-range comparisons.
- Duplicate project token hygiene - Duplicated projects now clear inherited
public_token. - Expired signing enforcement - Expired projects are now consistently blocked from contract signing.
- Derived interactive theme tokens - Added
--color-primary-subtleand--color-primary-hoveracross built-in themes for consistent hover/active treatments. - Global interaction utilities - Added reusable
.skeletonshimmer and.quoteItemAddedflash animation classes for loading/feedback UI patterns.
- Foundation visual layer - Body background now uses a softer surface tone to improve card/page separation and long-session readability.
- Global interaction feel - Buttons now include subtle press feedback, and cards get smoother hover elevation transitions.
- Layout constraints - Main content now uses stronger side padding plus a max-width cap (
1440px) to avoid overstretched wide-screen layouts. - Sidebar navigation polish - Nav links have improved spacing, cleaner active indication (left accent), and clearer hover behavior.
- Dashboard clarity - Stat cards now use colored left accents by metric, and empty states for Upcoming Events/Inventory Conflicts were upgraded from plain text to illustrated placeholders.
- Inventory browsing polish - Category filters now scroll horizontally, item cards use fixed 4:3 media, and action overlays are hover-driven on desktop while remaining visible on touch devices.
- Quote detail presentation - Summary/totals panel is sticky, grand total emphasis increased, and quote/custom item row styling now reads as card-based UI.
- Table readability (Leads/Billing) - Row density and sticky header behavior were improved for scanability and click targets.
- Import flow step styling - Stepper visuals now include explicit completed states (green check progression) in addition to active/inactive styling.
- Messages empty/thread states - Thread rows have stronger minimum height and empty states now provide icon + contextual guidance.
- Packaged in-app updater endpoints - New authenticated routes
GET /api/updates,GET /api/updates/releases, andPOST /api/updates/applyprovide current-version status, GitHub release listing, and package-aware release installation. - Settings update console - Settings now includes an Updates card with version status, release picker, "What's New" body preview, install trigger, and restart health polling.
- Extension JSON fallback import - Import page adds an Extension JSON tab so scraped extension payloads can be pasted and imported directly.
- Bulk item ingestion route -
POST /api/items/bulk-upsertnow supports extension fallback import with create/update counts in one request.
- Extension connectivity model - Extension popup now stores a configurable server URL, and extension sync requests use that stored target instead of a hardcoded localhost API endpoint.
- Extension recovery behavior - Background sync now always saves the last scraped payload so the popup can export JSON even when network sync fails.
- Extension download URL resolution - ExtensionPage download action now respects
VITE_API_BASEinstead of relying on a hardcoded absolute localhost URL.
- Inventory empty-state crash on fresh startup - Removed an undefined
searchreference inItemGridthat could throw aReferenceErrorwhen items were empty. - Unhandled inventory load rejection during sql.js init -
InventoryPagenow catches failedgetItemsrequests so startup fetch failures degrade gracefully instead of cascading into a blank page.
- Per-item quote pricing controls - Quote lines now support discount metadata (
discount_type,discount_amount) alongside drag-to-reorder for cleaner quote composition. - Reusable quote policy content - New payment policy and rental terms templates can be managed centrally and attached to individual quotes.
- Item accessory relationships - Inventory items can now store accessory links for future quote-builder automation.
- Repo metadata polish - Added a real
LICENSEfile and refreshed the GitHub-facing README for clearer discovery and evaluation.
- Public quote experience - Quote expiration is now surfaced consistently, discounted pricing is reflected in public totals, and public approvals/signatures respect expiration state.
- Operator UX - Added UI scale controls, direct quote navigation from Messages, clearer quote status borders, and more polished quote-builder pricing affordances.
- Quickstart and discoverability - README now leads with product value, deployment options, badges, keywords, and a cleaner getting-started flow.
- Legacy public quote API parity -
/api/quotes/public/:tokennow returns expiration status, payment policy data, rental terms, and discount fields so the public React page matches the backend feature set. - Accessory messaging accuracy - InventoryPage no longer claims permanent accessories auto-add to quotes before that behavior exists.
- Local runtime noise -
.gitignorenow correctly excludes local lockfiles, runtime uploads, and editor-specific config so release diffs stay focused.
- Quote filtering API + UI -
GET /api/quotesnow supportssearch,status,event_from,event_to,has_balance, andvenuefilters. Quotes page adds filter controls and a date-range picker. - Public quote live thread - New no-auth endpoints
GET/POST /api/quotes/public/:token/messagesplus public quote UI for live polling and client message submission. - Theme + map settings - New Settings keys
ui_theme,google_places_api_key, andmap_default_style; new theme picker and Google Places setup UI. - Availability picker endpoint -
GET /api/availability/quote/:quoteId/items?ids=...returns stock/reserved/potential counts for specific item IDs on the quote date window. - Inventory contract description support -
items.contract_descriptioncolumn added and wired through item create/update/upsert and extension upsert payloads.
- Quote creation flow - Quotes page now uses a 2-step wizard (event details then client info) and can auto-complete client addresses with Google Places.
- Quote builder availability UX - Line items and inventory picker show explicit stock/booked badges and conflict states; subrental lines are labeled in-editor.
- Quote item update semantics - Updating quote or custom item quantity to
0now removes the line item server-side and logs activity. - Runtime port handling - Server auto-finds a free localhost port when
PORTis not set; chosen port is written intobadshuffle.lockand Vite proxy reads it. - Cross-platform dev script -
server/package.jsonnow usescross-envforNODE_ENV=development. - Billing labels and visibility rules - UI copy switched from "Contract total" to "Quote total"; remaining balance is shown only in statuses where it is meaningful.
- Goodshuffle extension scraping resilience - Content script extraction now uses layered strategies (label scan, ng-model, CSS/text fallback), improving coverage across catalog and item detail layouts.
- Public catalog - No-auth catalog at
/catalogand/catalog/item/:id, backed byserver/routes/publicCatalog.js,robots.txt,sitemap.xml, and/api/public/*JSON endpoints for SEO-friendly browsing. - Docker deployment -
Dockerfile,docker-compose.yml,docker-compose.dev.yml, anddocker-entrypoint.shfor containerized local and production-style runs with persistent/datastorage. - AI integration settings - Encrypted Claude, OpenAI, and Gemini API key fields plus per-feature enable/model controls in Settings.
- Availability and subrental foundation - Availability conflict endpoints, vendor/subrental support, and rental date fields shipped in the initial consolidated release baseline.
- Development launch flow - Added
npm run dev:hostandnpm run dev:docker; server dev mode now setsNODE_ENV=development, and dev-only/api/auth/dev-logincan seed a local admin automatically while developing. - Runtime configurability -
DB_PATH,UPLOADS_DIR, andAPP_URLare respected so Docker and production builds can use external storage and correct canonical URLs. - Operator UX - Mobile sidebar/overlay, better touch targets, category chips on Inventory, quote item drag-and-drop reordering, and broader responsive layout cleanup across the client.
- Deployment behavior - Production server can now serve the built React client from
client/dist. - Docs - Project docs and onboarding context were refreshed for the consolidated release line.