A mobile-first web app to manage personal inventory using QR/barcode scanning and LLM-assisted cataloguing.
- 📱 Mobile-first responsive design
- 📦 Box-based item organization
- 🔍 Full-text search across items
- 📸 Photo management with hero image selection
- 🤖 AI-powered metadata generation (OpenRouter GPT-4o)
- 📷 QR code and barcode scanning
- 🌙 Dark mode interface
- 💾 Real-time sync with Convex backend
- 📝 Notes with photos
- 🏷️ Keyword tagging
- ♻️ Soft-delete (archive) items
- Frontend: React 19 + TypeScript (strict mode)
- Styling: Tailwind CSS
- Routing: React Router v7
- Backend & DB: Convex
- Barcode Scanning: @zxing/browser
- QR Code Display: qrcode.react
- LLM: OpenRouter (gpt-4o)
- PWA: Vite PWA plugin
- Testing: Vitest + Testing Library
- Build: Vite 8
- Package Manager: pnpm
- Node.js 24+
- pnpm
- Convex account (free tier available)
- OpenRouter API key (for AI features)
pnpm installThe Convex project has already been initialized. Make sure you have the .env.local file with:
CONVEX_DEPLOYMENT=...
VITE_CONVEX_URL=...
VITE_CONVEX_SITE_URL=...
Set the OpenRouter API key in your Convex dashboard:
- Go to https://dashboard.convex.dev
- Select your project
- Go to Settings → Environment Variables
- Add:
OPENROUTER_API_KEY=your_key_here
pnpm devThe app will be available at http://localhost:5173
In a separate terminal:
pnpm convex devpnpm dev- Start Vite development serverpnpm build- Build for productionpnpm lint- Run ESLintpnpm test- Run tests with Vitestpnpm test:ui- Run tests with UIpnpm preview- Preview production buildpnpm convex dev- Run Convex development server
convex/
schema.ts # Data model (items, boxes, notes)
items.ts # Item queries & mutations
boxes.ts # Box queries & mutations
notes.ts # Note queries & mutations
llm.ts # OpenRouter LLM action
src/
components/
Scanner.tsx # Barcode/QR scanner overlay
ItemCard.tsx # Item card component
PhotoCarousel.tsx # Photo carousel with hero selection
NotesList.tsx # Notes list with add/delete
IdentifierList.tsx # Barcode/QR identifier list
BoxBadge.tsx # Clickable box badge
pages/
HomePage.tsx # Items list with search
ItemDetailPage.tsx # Item details
BoxDetailPage.tsx # Box details with QR code
App.tsx # Router configuration
main.tsx # App entry point
- Title, description, keywords (LLM-generated, editable)
- Photos with hero selection
- Box assignment (required)
- Identifiers (barcodes/QR codes)
- Soft-delete with
archivedAt
- Name, description
- Optional photo
- Auto-generated UUID identifier (displayed as QR code)
- Attached to items
- Text + photos
- Newest-first ordering
- Open scanner → scan item barcode → navigate to item details
- Open scanner → scan box QR → navigate to box with contents
- Create item → assign box (required) → add photos → optionally use "Generate with AI"
GitHub Pages deployment is configured in .github/workflows/deploy-pages.yml.
- In GitHub, go to Settings → Pages → Build and deployment.
- Set Source to GitHub Actions.
- Add these repository secrets in Settings → Secrets and variables → Actions:
VITE_CONVEX_URLVITE_CONVEX_SITE_URL
- Push to
main, or run the Deploy GitHub Pages workflow manually.
The workflow runs linting, type checking, unit tests, and the production build before publishing dist/. The app is hard-coded to run under /stuff/, so the Pages URL should be https://<user>.github.io/stuff/.
Build the image:
docker build -t stuff-manager .Run the container:
docker run -p 80:80 stuff-manager- Build:
pnpm build - Deploy
dist/folder to your hosting provider - Configure environment variables for production Convex deployment
GitHub Actions workflow runs on push to main:
- Linting (fails on errors, allows warnings)
- Tests
- Build
Configure secrets in GitHub repository settings:
VITE_CONVEX_URLVITE_CONVEX_SITE_URL
MIT