A desktop point-of-sale and inventory management system built for Pet Supply, powered by Tauri (Rust + React) with a local SQLite database. Designed for barcode-driven checkout workflows, customer loyalty tracking, and deep inventory analytics — no internet connection required.
| Layer | Technology |
|---|---|
| Frontend | React 19, React Router 7, Tailwind CSS 4, Vite |
| Backend | Tauri 2, Rust, Tokio async runtime |
| Database | SQLite with WAL journaling via sqlx |
| Auth | bcrypt password hashing |
| File import | calamine (Excel/ODS), csv |
| Backups | PowerShell USB drive detection |
- USB barcode scanner integration with real-time input capture
- Add items by scanning UPC or manual product selection
- Tax calculation and live cart totals
- Customer lookup with autocomplete (search by nickname, name, or phone)
- Loyalty points: earn 1 point per dollar spent; redeem at 100 points for a free treat
- Handles duplicate UPCs (prompt to choose the right product) and products without a UPC (manual selection modal)
- Transaction completion screen with points summary
- Scan or search products by UPC, name, brand, or keyword
- Full product detail cards: brand, flavor, weight, format, category, SKU
- Price-per-unit calculation — automatically derives cost per oz, fl oz, or per unit based on weight and base unit
- Side-by-side product comparison
- Ingredient data displayed inline
- Search products by ingredient — include and exclude lists, comma-separated
- Results highlight which ingredients matched
- Useful for customers with dietary restrictions or specific feeding preferences
- Full CRUD for products with fields: name, brand, flavor, weight, format, category, SKU, UPC, price, keywords, description, thumbnail URL
- Format options: canned, kibble, freeze-dried, frozen, broth, treat, leashes/collars, bottle, toy, dehydrated, topper
- Barcode scanner integration in admin for quick product lookup
- Active/inactive flag (soft delete)
- Duplicate product detection and atomic merge — reassigns all transaction history, costs, and ingredients to the surviving product
- Full CRUD: nickname (unique), full name, phone, email, Astro ID
- View and edit loyalty point balances
- Full loyalty event history (earn / redeem / manual adjust)
- Admin manual point adjustment with notes
- Astro Loyalty API integration stub (ready for credentials)
- Supports
.xlsx,.xls,.ods, and.csv - Raw preview of headers and rows before mapping
- Auto-detection of column mappings based on header names
- Format normalization: e.g.,
"freeze dry"→freeze_dried - Price parsing: strips
$, commas, and other formatting - Base unit detection from weight field patterns
- Preview parsed rows before committing
- Separate price update mode — updates prices on existing products without touching other fields
- Per-product activity report with:
- Last sale timestamp (all-time)
- Last price lookup timestamp (all-time)
- Units sold in a configurable time window
- Price lookup count in a configurable time window
- Time window filtering: days, weeks, months, years
- Status categories: never sold, scanned but not sold, both, neither
- Identify slow-moving or obsolete stock at a glance
Sales Analytics
- Daily chart of units sold, transaction count, and price lookups
- Automatic aggregation by day / week / month based on selected window
Customer Analytics
- Top customers leaderboard ranked by total spend
- Per-customer summary: visit count, total spend, average spend per visit
- Customer spending/visit timeline with daily data points
- Search transactions by ID, customer name, or date
- Full detail view: line items, prices, tax, total, points earned/redeemed, void status
- Void transactions (non-destructive soft delete)
- Remove individual line items from a transaction
- Scheduled daily backup at 6 PM — automatically detects and writes to the last-used USB drive
- Manual backup — detect all connected removable drives, show label and free space, choose destination
- Preferred drive memory (persisted in
admin_config) - Retry and format-and-retry options for problem drives
BackupAlertcomponent shows backup status notifications in the UI
- Export the SQLite database as a file
- Restore from a backup file (full database import)
- Full database wipe / factory reset
- bcrypt-hashed password protection for all admin features
- First-time logon indicator on fresh installs
- Change password at any time
- Tab-based navigation covering all management features
| Table | Purpose |
|---|---|
products |
Product catalog with soft-delete (active flag) |
product_costs |
Cost-per-unit per product |
customers |
Customer profiles with loyalty balance |
loyalty_events |
Append-only loyalty history (earn / redeem / adjust) |
transactions |
Sale records with void flag |
transaction_items |
Line items per transaction |
product_ingredients |
Ingredient strings per product |
product_activity_log |
Append-only event log for all product interactions |
admin_config |
Single-row config (password hash, preferred backup drive) |
- SQLite with WAL — Write-Ahead Logging for concurrency safety and crash recovery
- Foreign key constraints enforced at the connection level
- Append-only event log —
product_activity_logrecords every creation, modification, price lookup, and purchase, enabling full historical analytics without data loss - ACID transactions — sale submission, product merges, and transaction voids are fully atomic
- Soft deletes — products and transactions are flagged inactive/voided rather than removed, preserving history
- ISO-8601 UTC timestamps throughout
- Indexed queries — activity log indexed on
(product_id),(event_type, created_at), and(created_at)for fast analytics
Windows: C:\Users\<user>\AppData\Roaming\Jackie POS\jackie_pos.db
No cloud sync. All data is local. Backups are file-based (USB or exported .db file).
| Screen | Route | Description |
|---|---|---|
| Home | / |
Logo, status indicator, navigation to the three main modes |
| Sale | /sale |
Full checkout flow with barcode scanner and loyalty |
| Price Lookup | /price-lookup |
Product info and price-per-unit comparison |
| Ingredient Search | /ingredient-search |
Find products by ingredient include/exclude |
| Admin | /admin |
Password-gated management panel with all tabs |
- Products — CRUD, barcode scanner, copy product
- Customers — CRUD, loyalty balance, loyalty history
- Transactions — Search, void, remove items
- Import — Excel/CSV wizard with preview and column mapping
- Duplicates — Find and merge duplicate UPC products
- Housekeeping — Inventory activity report with time-window filters
- Analytics — Sales trends and top customer leaderboard
- Database — Export, import, wipe
- Change Password — Update admin password
# Install frontend dependencies
npm install
# Start development server (Tauri + Vite hot reload)
npm run tauri dev
# Production build
npm run tauri buildRequirements: Node.js, Rust toolchain, Tauri CLI v2
Window size: 1280×800 (minimum 900×600)
App identifier: com.chowhound.jackie-pos