A personal parcel tracking app accessible from any device. Built with React, Supabase, and deployed on GitHub Pages.
- Multiple products per parcel — add as many items as you want (name + quantity); the parcel title is generated automatically from the product list
- Add, edit, and delete parcels with confirmation modal to prevent accidental deletion
- Fields per parcel: products, AWB, courier, shop, amount, status, order number, date, notes
- Quick status change — one click directly on the parcel card (Ordered → In delivery → Delivered)
- Direct tracking link — opens the courier's official tracking page
- Filter by status and search by name, AWB, or shop
- Export to CSV and Excel (includes all fields and products)
- Share a parcel via a read-only public link — no account needed for the viewer
- Groups — create groups, invite people via link, add parcels shared within the group
- Move parcels between personal space and any group
- Real-time sync — data updates across all open tabs instantly
- Google Sign-In — each user sees only their own parcels
- Light / Dark theme — toggle between a clean light look and a neutral dark look; the choice is remembered per device
- Modern glassmorphism UI — frosted-glass surfaces, neutral palette with a single blue accent
- English / Romanian language switcher
- PWA — installable on any device directly from the browser, works offline
FAN Courier, Cargus, Sameday, DPD, GLS, Posta Romana, DHL, FedEx, UPS, Sinapseria, Dragon Star, PTT Express
| Layer | Technology |
|---|---|
| Frontend | React 18 + Vite |
| Hosting | GitHub Pages (via GitHub Actions) |
| Database | Supabase (PostgreSQL) |
| Auth | Google OAuth via Supabase |
| Realtime | Supabase Realtime subscriptions |
| Export | SheetJS (xlsx, lazy-loaded) |
| Offline | PWA / Service Worker |
- Go to supabase.com → Sign Up (free) → New project
- Wait ~2 minutes for the project to initialize
The full schema lives in this repo:
-
supabase/migrations/0001_init.sql— complete schema for new installs. Open it in Supabase → SQL Editor → New query → paste and run. -
supabase/migrations/0002_upgrade.sql— idempotent upgrade for existing databases created from an older version of this app (adds the missingstatus_history,archived,estimated_deliverycolumns, the group RLS policies, and theget_group_members/remove_group_memberRPCs). Run it after0001if you already have data.
The migration includes:
- RLS on all tables (users manage their own parcels; group members can view and update parcels in shared groups; owners can manage their groups)
- Public read of shared parcels only through the
get_shared_packageRPC (owners can also revoke a shared link by deleting the row) - The two group RPCs the app calls:
get_group_membersandremove_group_member
In Supabase → Settings → API Keys:
- Copy the Project URL (format:
https://xxxx.supabase.co) - Copy the Publishable key (starts with
sb_publishable_)
- Go to console.cloud.google.com → New Project
- APIs & Services → Credentials → Create Credentials → OAuth Client ID
- Configure OAuth Consent Screen if prompted (External, fill in app name and email)
- Application type: Web application
- Authorized redirect URIs:
https://YOUR_PROJECT_ID.supabase.co/auth/v1/callback - Copy Client ID and Client Secret
- In Supabase → Authentication → Sign In / Providers → Google → Enable → paste credentials → Save
In Supabase → Authentication → URL Configuration:
- Site URL:
https://YOUR_GITHUB_USERNAME.github.io - Redirect URLs → Add:
https://YOUR_GITHUB_USERNAME.github.io/parcels-tracking/
The app builds its redirect URL dynamically from window.location.origin +
Vite BASE_URL, so the same settings work on custom domains and forks.
Go to github.com → New repository → name: parcels-tracking → Create
In the repo → Settings → Secrets and variables → Actions → New repository secret:
| Name | Value |
|---|---|
VITE_SUPABASE_URL |
Project URL from Step 3 |
VITE_SUPABASE_ANON_KEY |
Publishable key from Step 3 |
This repo includes .github/workflows/deploy.yml, which:
- Builds the app on every push to
main(withVITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEY, andVITE_BASE_URL=/parcels-tracking/from the secrets / workflow) - Copies
index.htmlto404.htmlso deep links (#share/…,#invite/…) work after a refresh - Publishes the
dist/folder to GitHub Pages
Push the code, then go to repo → Settings → Pages → Source: GitHub Actions → Save.
After ~2 minutes the app is live at:
https://YOUR_GITHUB_USERNAME.github.io/parcels-tracking/
All asset paths (
index.html,manifest.json,sw.js, icons) are relative, so the app also works on a custom domain or any other base path.
Create a .env.local file in the repo root:
VITE_SUPABASE_URL=your_project_url
VITE_SUPABASE_ANON_KEY=your_anon_keyThen run:
npm install
npm run devTo point the app at a different base path (e.g. when testing the Pages
deployment locally), set VITE_BASE_URL:
VITE_BASE_URL=/parcels-tracking/ npm run devOpen the app URL in your browser:
- Android (Chrome): tap the three-dot menu → Add to Home Screen
- iPhone (Safari): tap Share → Add to Home Screen
The app works offline and behaves like a native app.
O aplicație personală pentru urmărirea coletelor, accesibilă de pe orice device. Construită cu React, Supabase și publicată pe GitHub Pages.
- Mai multe produse per colet — adaugi câte articole vrei (nume + cantitate); titlul coletului se generează automat din lista de produse
- Adaugă, editează și șterge colete cu modal de confirmare pentru a evita ștergerea accidentală
- Câmpuri per colet: produse, AWB, curier, magazin, sumă, status, număr comandă, dată, note
- Schimbare rapidă de status — un singur click direct pe cardul coletului (Comandat → In livrare → Livrat)
- Link direct de tracking — deschide pagina oficială a curierului
- Filtrare după status și căutare după nume, AWB sau magazin
- Export în CSV și Excel (include toate câmpurile și produsele)
- Distribuie un colet printr-un link public read-only — vizitatorul nu are nevoie de cont
- Grupuri — creează grupuri, invită persoane prin link, adaugă colete partajate în cadrul grupului
- Mută colete între spațiul personal și orice grup
- Sincronizare în timp real — datele se actualizează instantaneu pe toate tab-urile deschise
- Autentificare cu Google — fiecare utilizator vede doar propriile colete
- Temă Light / Dark — comută între un look luminos curat și unul întunecat neutru; alegerea e reținută pe fiecare device
- Interfață glassmorphism modernă — suprafețe din sticlă mată, paletă neutră cu un singur accent albastru
- Comutator de limbă Engleză / Română
- PWA — instalabilă pe orice device direct din browser, funcționează offline
FAN Courier, Cargus, Sameday, DPD, GLS, Posta Română, DHL, FedEx, UPS, Sinapseria, Dragon Star, PTT Express
| Strat | Tehnologie |
|---|---|
| Frontend | React 18 + Vite |
| Hosting | GitHub Pages (via GitHub Actions) |
| Bază de date | Supabase (PostgreSQL) |
| Autentificare | Google OAuth via Supabase |
| Timp real | Supabase Realtime subscriptions |
| Export | SheetJS (xlsx, încărcat la cerere) |
| Offline | PWA / Service Worker |
- Mergi pe supabase.com → Sign Up (gratuit) → New project
- Așteaptă ~2 minute până pornește proiectul
Schema completă e în acest repo:
-
supabase/migrations/0001_init.sql— schema completă pentru o instalare nouă. Deschide fișierul în Supabase → SQL Editor → New query → lipește și rulează. -
supabase/migrations/0002_upgrade.sql— upgrade idempotent pentru bazele de date existente create cu o versiune mai veche a aplicației (adaugă coloanele lipsăstatus_history,archived,estimated_delivery, policy-urile RLS pentru grupuri și RPC-urileget_group_members/remove_group_member). Rulează-l după0001dacă ai deja date.
Migrarea include:
- RLS pe toate tabelele (utilizatorii își gestionează propriile colete; membrii unui grup văd și pot actualiza coletele din grup; owner-ii își gestionează grupurile)
- Citire publică a coletelor distribuite doar prin RPC-ul
get_shared_package(owner-ul poate și revoca un link prin ștergerea înregistrării) - Cele două RPC-uri de grup apelate de aplicație:
get_group_membersșiremove_group_member
În Supabase → Settings → API Keys:
- Copiezi Project URL (format:
https://xxxx.supabase.co) - Copiezi Publishable key (începe cu
sb_publishable_)
- Mergi pe console.cloud.google.com → New Project
- APIs & Services → Credentials → Create Credentials → OAuth Client ID
- Configurezi OAuth Consent Screen dacă îți cere (External, completezi numele aplicației și emailul)
- Application type: Web application
- Authorized redirect URIs:
https://ID_PROIECT.supabase.co/auth/v1/callback - Copiezi Client ID și Client Secret
- În Supabase → Authentication → Sign In / Providers → Google → Enable → lipești credențialele → Save
În Supabase → Authentication → URL Configuration:
- Site URL:
https://USERNAME_GITHUB.github.io - Redirect URLs → Add URL:
https://USERNAME_GITHUB.github.io/parcels-tracking/
Aplicația construiește URL-ul de redirect dinamic din window.location.origin +
VITE BASE_URL Vite, deci aceleași setări funcționează pe domenii custom și pe fork-uri.
Mergi pe github.com → New repository → nume: parcels-tracking → Create
În repo → Settings → Secrets and variables → Actions → New repository secret:
| Nume | Valoare |
|---|---|
VITE_SUPABASE_URL |
Project URL din Pasul 3 |
VITE_SUPABASE_ANON_KEY |
Publishable key din Pasul 3 |
Acest repo include .github/workflows/deploy.yml, care:
- Construiește aplicația la fiecare push pe
main(cuVITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEYșiVITE_BASE_URL=/parcels-tracking/din secrete / workflow) - Copiază
index.htmlîn404.htmlpentru ca linkurile deep (#share/…,#invite/…) să funcționeze după refresh - Publică folderul
dist/pe GitHub Pages
Uploadezi codul, apoi mergi la repo → Settings → Pages → Source: GitHub Actions → Save.
După ~2 minute aplicația e live la:
https://USERNAME_GITHUB.github.io/parcels-tracking/
Toate path-urile către asset-uri (
index.html,manifest.json,sw.js, iconițele) sunt relative, deci aplicația funcționează și pe un domeniu custom sau pe orice alt base path.
Creezi un fișier .env.local în rădăcina repo-ului:
VITE_SUPABASE_URL=url_proiectului
VITE_SUPABASE_ANON_KEY=cheia_anonApoi rulezi:
npm install
npm run devPentru un base path diferit (ex. când testezi local deploy-ul pe Pages), setezi VITE_BASE_URL:
VITE_BASE_URL=/parcels-tracking/ npm run devDeschizi URL-ul aplicației în browser:
- Android (Chrome): meniu trei puncte → Adaugă pe ecranul principal
- iPhone (Safari): butonul Share → Adaugă pe ecranul principal
Aplicația funcționează offline și se comportă ca o aplicație nativă.