Static snapshot · $99

Vintage Shop — Inventory, POS & Storefront

A self-hosted Flask app for vintage, thrift and antique resale. Photograph a piece, draft the listing with your own AI key, print a QR price tag, sell it at the counter or on your own storefront, ship it, and see the margin.

Watch it

A 1¾-minute walkthrough with voiceover and captions, recorded from the real app running the demo data: photo to AI listing, QR tag, the counter, the storefront, orders and reports. Like every item photo in the demo, the lamp photo in the AI step was generated with an image model; the listing text was then drafted live by the app’s own AI generator using an OpenAI key.

Try it

Click through the real app

520 pages saved from the running program while it held the included demo seed: dashboard, inventory, every item, its edit form and price tag, orders, customers, shipping, returns, reports, settings, the help centre and the public storefront. It is read-only — see below for what that means.

Open the live demo →
Everything here is demo data. The shop “Rosewater & Rust” is fictional: 80 items in 12 categories, 25 orders, 15 shipments, 6 return requests and 5 consigners, all written by the seed_demo.py script that ships with the code. The item photos were made with OpenAI’s image model for this demo, one per item from its own description: they show fictional pieces, not real stock. (The seed_demo.py in the download draws simple placeholder cards instead.) The screenshots and the snapshot are captures of the real application running that data — nothing is mocked up or retouched.

What it looks like

The dashboard: stock, retail value, sold count, potential profit, items to list, second-look items, categories, low stock and recently added.
The dashboard. Stock and retail value at a glance, the queue of items ready to list, and the “Second Look” items that have sat unsold past the number of days you set.
The inventory grid with inline status, category, tags, cost and price fields.
The inventory grid. One row per one-of-a-kind piece, with inline quick-edit of status, category, tags, cost and price, bulk actions, and per-item storefront visibility.
An item page with photo, era, condition, brand, material, consigner split, stock and pricing.
An item. Era, condition, brand, material, measurements, location, the consigner and their split, margin, view count and USPS cost estimates (from a built-in rate table, not a live rate API).
The AI listing generator: drop photos and add context, with a notice that no API key is configured.
The AI listing generator. Drop in photos and it drafts the name, description, era, condition, materials, tags and a price range for you to review. It uses your own Anthropic or OpenAI key; the demo has none, which is why the page says so.
A round QR price tag for a clothing item.
A QR price tag. Rendered as a print-ready PNG and PDF, styled differently for clothing and hard goods. Scanning the code opens the counter checkout with that item already in the cart.
The scan checkout page with three items in the cart and an Open Square Checkout button.
The counter. Scan tags with the phone camera (QR codes and 1D barcodes) or type a SKU, build a cart, then open one Square payment link for all of it. Square is your own account.
The scan checkout page on a phone.
The same page on a phone, which is where it is meant to be used.
The public storefront product grid with filters.
Your own storefront. A public shop with filters, item pages, a cart, promo codes and Square checkout, plus editable About, FAQ, Contact and policy pages. Themes are switchable with a live preview.
Reports for the last 12 months: revenue, cost of goods, gross profit, units in stock and a revenue and profit chart.
Reports over preset or custom date ranges: revenue, cost of goods, profit, margin, units sold, best sellers and inventory valuation.
Settings: store identity, operating mode (both, in person only, online only) and integrations.
Settings. Three operating modes — hybrid, in-person only, online only — hide the features you do not use. Integrations for AI, Square and S3-compatible photo storage take your own keys.

What the live demo can and cannot do

Works

  • Every page in the admin and the storefront, and every link between them
  • Filtering by one status (inventory, orders, returns, shipping), by one category on the storefront, and the report periods
  • The counter: type an exact SKU from a price tag, such as VNT-REC-0004, and it goes in the cart
  • The storefront theme picker and its live preview
  • Charts, tabs, menus and modals

Switched off

  • Anything that saves: forms, inline edits, bulk actions, uploads, sell/restock, delete
  • AI drafting, price checks and background removal (they need your API key)
  • Square payment links and checkout
  • Free-text search, filter combinations, exports and the PDF tags

Each of these shows a short notice instead. Nothing on this site sends data anywhere.

What it does

  • Inventory for one-of-a-kind stock: SKU generation per category, categories, tag groups, suppliers, consigners with split tracking and payout reports, a stock ledger, bulk actions and “Second Look” flagging.
  • Photos: multi-photo upload with compression; AI background removal (OpenAI or Replicate, your key); local disk or any S3-compatible bucket.
  • AI with your own Anthropic or OpenAI key: the listing generator and an AI Price Check against your own sold items.
  • Labels: QR price tags, shelf labels, batch label sheets and printable shipping label sheets.
  • Point of sale: camera scanning, cart, promo codes, Square payment links, a receipt page, and a Cashier role that cannot see reports or settings.
  • Storefront, orders and fulfilment: public shop, orders and customers, a shipping queue with tracking, returns with a status workflow, promo codes.
  • Operations: date-range reports, activity and error logs, users and roles, CSV import and export, a migration wizard and a built-in help centre.
  • A bonus studio site module for a second business on the same premises, with fictional placeholder content. Removable in one line.

What it does not do

  • No marketplace integrations. It does not list to, sync with, or pull prices from eBay, Etsy or any other selling site. Your online channel is the built-in storefront. For books there is a plain “View on AbeBooks” search link that opens in your own browser.
  • No API keys or accounts are included. AI needs your own Anthropic or OpenAI key, payments need your own Square account, cloud photos need your own S3 bucket. Usage is billed to you by those providers.
  • No hosting, and not a one-click install. You need a Python virtualenv and environment variables. SQLite works locally; PostgreSQL is recommended for a hosted deploy.
  • USPS shipping estimates come from a hard-coded rate table, not a live rate API.
  • No database migration framework, and the tests are one end-to-end script rather than a unit-test suite.
  • No login rate limiting or two-factor auth on the admin. Read the deployment guide's security checklist before putting it on the internet.
  • Support is by email, best effort, with no guaranteed response time.

What I ran before shipping it

  • The end-to-end test script seeds a throwaway shop and drives the storefront and the main admin screens: all 80 checks pass, run again from the packaged zip in a clean virtualenv.
  • A wheel-only install (no compiler) on Python 3.12, and a sweep of every GET route with zero server errors, recorded in the shipped HEALTHCHECK.md.
  • All 520 pages of the snapshot were opened in a headless browser with zero script errors. Doing that found two front-end bugs in the app — a cart script loaded twice and a tooltip script that ran before Bootstrap had loaded — and a broken link in the studio module. All three are fixed in the version for sale.

Get it

Vintage Shop — $99

Complete Flask source: about 17,000 lines of Python and 84 templates, with a commercial licence for your own business. Python 3.12 or newer.

Get it — $99 →