Blockchain-backed product authentication. Mint a digital twin for every product, log each handoff on the supply chain, and let anyone scan to prove it's real.
Open the live app · Docs · Architecture · Presentation (PDF)
No backend or wallet needed to try it. On the Verify page, paste the demo token
0xde70a11ce0000001into the search bar and step the item from factory to shopper.
- Mint: a manufacturer registers a serialized product (GTIN + serial). It becomes a digital twin with a printable QR code.
- Hand off: distributors and retailers log shipping, receiving, storing and selling as GS1 EPCIS events.
- Verify: a shopper scans the QR code or searches the token ID and sees the full provenance trail.
- Own: the buyer connects a wallet to confirm they are the registered owner.
Writes need a wallet sign-in when AUTH_REQUIRED=true (the default in production). Each role does one job:
| Role | Can record |
|---|---|
| Manufacturer | mint, shipping |
| Distributor | shipping, receiving |
| Retailer | receiving, storing, selling |
| Admin | everything, plus granting roles |
Events must follow the lifecycle: commissioning → shipping → receiving → storing → selling, with shipping allowed again after receiving or storing. A sold item is final. GTINs are checked against the GS1 check digit, and a token ID or GTIN + serial can only be registered once.
Each lookup is scored for the pattern a photocopied label leaves: many different networks scanning one code, or scans in bursts. The product page shows a Scan risk meter and flags a likely clone. Try it on the demo item with Simulate a cloned label. Details in backend/README.md.
| Folder | What it is |
|---|---|
frontend/ |
React 19 + Vite + TypeScript web app. Includes an in-browser demo mode, so it runs with no API. |
backend/ |
Express + TypeScript API. MongoDB in production, in-memory store for local development. |
contracts/ |
Solidity (Hardhat 3): RoleManager, AuthenTickNFT, OwnershipRegistry. |
docker/ |
Compose stack: MongoDB, API, nginx-served frontend. |
docs/ |
Architecture notes. |
Requires Node 20+.
git clone https://github.com/Phantom8420/AuthenTick.git
cd AuthenTick
npm install
npm run devThe web app is on http://localhost:5173 and the API on http://localhost:4000. Without MONGODB_URI the API keeps data in memory. If the API is unreachable the frontend falls back to demo mode automatically.
Copy backend/.env.example to backend/.env to configure the API (MongoDB, wallet sign-in, chain).
JWT_SECRET=$(openssl rand -hex 32) ADMIN_ADDRESSES=0xYourWallet npm run docker:upThe stack serves the app on http://localhost:8080. In production mode the API requires a wallet sign-in for writes; ADMIN_ADDRESSES can then grant roles.
npm test # all workspaces
npm run test:contracts # Hardhat
npm run test:backend # Vitest
npm run test:frontend # Vitest
npm run e2e -w frontend # Playwright: demo journey + accessibility (needs `npx playwright install chromium` once)
npm run smoke:chain -w backend # real local chain: deploy, mint, full lifecycle, revokefrontend/vercel.json rewrites all routes to the SPA. Build with npm run build -w frontend and deploy frontend/dist to any static host. Set VITE_API_URL to point at a hosted API; without it the app runs in demo mode.
The repo can deploy main to Vercel on every push (.github/workflows/deploy.yml). Add VERCEL_TOKEN, VERCEL_ORG_ID and VERCEL_PROJECT_ID as repository secrets to turn it on; until then the job skips itself.
See CONTRIBUTING.md. Issues and pull requests are welcome.