ONE PLATFORM WATCHING OVER EVERY ANIMAL IN THE STORY.
The one you love, the one you treat, and the one still waiting for a home. Argos unifies pet medical records, a citywide discovery map, a real-time lost-and-found network, and an animal-welfare marketplace — for three kinds of people, in one app.
NAMED AFTER THE WATCHER WHO NEVER SLEEPS
In Greek myth, Argos Panoptes was the hundred-eyed giant entrusted to watch over what mattered most. This product borrows the name on purpose: it exists to make sure no animal — owned, treated, or wandering unclaimed — falls outside someone's care.
THREE DOORS, ONE BUILDING
Argos doesn't force a single generic dashboard on everyone. Pick a character below to see how its home screen, tools and priorities differ — while the map, chat and notification engine underneath stay exactly the same.
EVERYTHING YOUR PET'S FILE NEEDS, IN YOUR POCKET
- Unlimited pet profiles with vaccine & treatment history
- Unique pet ID + scannable QR profile card
- One-tap lost-pet alert, broadcast citywide
- Browse and apply to surrender / adoption listings
- Book in-person vet appointments in a few taps
- Chat directly with finders, applicants, and clinics
A VERIFIED CLINIC PROFILE THAT BOOKS ITS OWN PATIENTS
- One verified clinic profile, pinned on the map
- Configurable weekly availability & auto-generated visit slots
- Instant notification + contact info on every booking
- Patient lookup by 10-digit pet ID or QR scan
- Public star ratings & written reviews
- Upcoming-appointments list on the dashboard
BUILT FOR OUTREACH, NOT JUST RECORD-KEEPING
- Organization profile: mission, city, socials, map pin
- Requires admin approval before posting publicly
- Every listing auto-boosted & broadcast to the whole city, free
- Can register & track fostered/rescued animals like an owner
- Full parity with the Owner dashboard, tuned for outreach
- Gender-aware default avatars if no photo is set
▸ FULL FEATURE MATRIX
| Capability | Owner | Vet | Supporter | Admin |
|---|---|---|---|---|
| Register & manage pets | ✔ | — | ✔ | — |
| Post map listings | ✔ | auto | ✔ boosted | ✔ any |
| Broadcast lost-pet alert | ✔ | — | ✔ | — |
| Run a verified clinic | — | ✔ | — | — |
| Configure appointment slots | — | ✔ | — | — |
| Requires approval to post | — | — | ✔ | — |
| Approve / reject accounts | — | — | — | ✔ |
| Boost / un-boost any listing | own only | own only | auto | ✔ |
| Bulk delete by filter | — | — | — | ✔ |
| City-wide analytics | — | — | — | ✔ |
THE FULL FEATURE CATALOG
Grouped by the job each feature does. Tap any card to expand it — this cartridge holds more than sixty individually shipped features.
🩹 PET HEALTH RECORDS
LIVEStructured medical profile
Species, breed, gender, birth date on the Jalali calendar, microchip & sterilization status, profile photo.
Vaccine log
Timestamped vaccine records, editable by the owner or an attending vet, with dates and vaccine names.
Treatment history
Free-form treatment notes attached to a pet's timeline, building a running medical story.
Unique pet ID
Every pet gets a permanent identifier the moment it's registered — the backbone of QR lookup and vet search.
QR profile card
A generated QR code links straight to the pet's profile, so any vet or finder can pull it up instantly.
Species-matched avatars
Dog, cat, bird, turtle, and rabbit default illustrations, used automatically when no photo is set.
🗺️ DISCOVERY MAP & LISTINGS
LIVECity-aware feed
Auto-detects the visitor's city from geolocation on load.
Province-grouped picker
Manual city fallback, alphabetically sorted, multi-select chips, "all of Iran" toggle.
Boost & ranking
Listings boosted for a set number of days, newest-boosted sorted first with a rocket badge.
Pre-login map preview
The landing screen shows a live map above the fold to signed-out visitors.
Category filters
Filter by any single category or view all five at once, with matching colors and icons.
Mini-map on every listing
Each listing detail includes an embedded preview map plus a "view on map" deep link.
🚨 LOST & FOUND NETWORK
LIVEOWNER RAISES THE ALARM
One tap from the pet's profile — or a pin dropped on the map — files a lost-pet alert with the current GPS location.
CITY-WIDE BROADCAST
A free 72-hour boosted map listing is created automatically; every user resolved to that city gets a push + in-app notification and an auto-generated story with a red ring.
72-HOUR COOLDOWN
The same pet can't be re-alerted for 72 hours, preventing accidental duplicate broadcasts.
"I SAW THIS PET" REPORTING
Anyone who spots the animal opens a dedicated report screen and starts a private thread with the owner.
DIRECT CONTACT, BOTH WAYS
Both sides get an in-thread call button and real-time chat until the pet is safely back home.
🏡 ADOPTION & SURRENDER WORKFLOW
LIVEAPPLICANT REQUESTS
A prospective adopter applies to a surrender listing with a short message.
OWNER DRAFTS A COMMITMENT FORM
The current owner attaches custom clauses the new caretaker must agree to.
APPLICANT SIGNS (OR DECLINES)
Signing unlocks a private chat and revealed phone numbers on both sides.
FINALIZE THE TRANSFER
The owner confirms the handover is complete, closing every other pending applicant automatically.
📅 VETERINARY APPOINTMENTS
LIVERule-based weekly schedule
e.g. Saturdays 09:00–14:00, Mondays 15:00–21:00 — with its own visit length.
Auto-generated time slots
Each window is sliced into fixed-length appointments; already-booked slots are hidden.
14-day booking window
Patients pick a day, then an open slot, then confirm with name and phone.
Instant vet notification
A booking pushes straight to the clinic with the patient's info.
Upcoming appointments list
The clinic dashboard shows every booked visit, soonest first.
Double-booking proof
Database-level uniqueness on clinic + date + time — two patients can never grab the same slot.
⭐ REVIEWS & TRUST
LIVE1–5 star ratings
Any signed-in user can rate and review a veterinary clinic once, editable any time.
Aggregate scoring
Clinics show an averaged rating with total review count on both the map popup and full listing view.
Written comments
Optional free-text reviews displayed newest-first beneath the star summary.
🔔 COMMUNITY & NOTIFICATIONS
LIVEStories bar
Instagram-style circles for admin announcements and lost-pet alerts, red ring for lost pets.
Unified notification center
Web push plus an in-app bell with unread counts from messages, requests, and bookings alike.
Guided first-run tour
A spotlight-style walkthrough highlights every major control the first time a new owner arrives.
Offline-first fallback
A dedicated offline screen and service-worker cache keep the app usable when connectivity drops.
Blinking unread badge
The bottom-nav heart icon turns solid red and pulses when there's something new to see.
Terms & permissions page
A plain-language explainer of location use, phone visibility, and data handling.
🛍️ PET MARKETPLACE
COMING SOONStorefront per shop
A minimal, uniform template — 10 products free, then a flat monthly fee per extra listing.
Cart, checkout & payment
Full cart → confirm → payment gateway → order-status flow, shared across every shop.
Configurable fulfillment
Sellers choose courier, post, or Tipax per order; postal shipments get in-app tracking.
Promotions & discounts
Sellers can run time-boxed sales and discount pricing on individual products.
HARD PROBLEMS, SOLVED
Real engineering challenges encountered while building this — and the fix that beat each one.
DEPLOYS THAT WOULDN'T SHOW UP
Symptom: Fresh code deployed to the server, but users kept seeing the old version.
Root cause: index.html — the file that points to the current JS bundle — had no cache-control header, so browsers held onto it indefinitely.
Fix: Force index.html to always revalidate, while hashed /assets/ bundles cache forever — every deploy is instantly visible.
THE MAP THAT WOULDN'T STAY BEHIND
Symptom: Full-screen dialogs and city pickers kept showing the Leaflet map bleeding through on top.
Root cause: Leaflet's own control layers use a z-index up to 1000 — higher than most app overlays.
Fix: Every full-screen overlay was audited and raised above Leaflet's stacking range.
CHAT SEND BUTTONS HIDING BEHIND THE KEYBOARD
Symptom: On some mobile browsers, the on-screen keyboard covered the message input.
Fix: Track visualViewport height directly and resize the chat container to match, instead of trusting 100vh.
TWO PATIENTS, ONE TIME SLOT
Symptom: Two people could theoretically book the exact same visit slot in a race condition.
Fix: A database-level unique constraint on clinic + date + time makes double-booking impossible, not just unlikely.
A SMALL, BORING, RELIABLE STACK
No exotic infrastructure — a single Postgres-backed API, one React codebase rendering three shells, and container-per-service deployment behind a single reverse proxy.
REACT + VITE
Single-page app, Persian RTL, client-side view-state routing with native back-button support.
NODE.JS + EXPRESS
REST API, JWT session tokens, role-based middleware, PostgreSQL via the pg driver.
POSTGRESQL
Relational core plus a generic key-value table for flexible profile blobs.
LEAFLET + OSM
Dark/light tile layers, custom markers, popups, in-app location picker.
CADDY
Automatic HTTPS, reverse-proxies each subdomain to its own container.
DOCKER COMPOSE
Four independently built & deployed services: frontend, admin, backend, landing.
ZERO-CACHE HTML
index.html always revalidated; hashed assets cache forever.
WEB PUSH (VAPID)
Standards-based push with a service-worker fetch handler and offline fallback.
▸ POWER-UPS (LIBRARIES & TOOLS)
▸ CORE DATA MODEL
| TABLE | PURPOSE |
|---|---|
| users | Phone-authenticated accounts, one of owner/vet/supporter, with an approved gate for supporters. |
| kv_storage | Per-user JSON profile blobs (pet records, clinic details, supporter org info). |
| map_items | Every discoverable pin — clinics, shops, surrenders, support cases, lost-pet alerts. |
| adoption_requests/forms/messages | The full surrender-to-adoption pipeline and its resulting private chat. |
| sightings/sighting_messages | "I saw this pet" reports and their private chat threads. |
| vet_appointments | Booked visit slots, unique per clinic/date/time. |
| vet_reviews | One rating + review per user per clinic. |
| notifications/stories | City-scoped and user-scoped alerts; ephemeral story posts. |
| visits/installs | Anonymous visit and install analytics, resolved to city/province. |
▸ SYSTEM STATUS
ONE BUILD, THREE DISTRIBUTION CHANNELS
Argos ships from a single web codebase, wrapped natively for each platform rather than maintained as three separate apps.
WEB / PWA
- Installable from any modern browser
- iOS-tuned meta tags, safe-area insets, Apple touch icon
- Offline fallback screen & service-worker caching
- Full dark/light theming, RTL Persian layout
ANDROID (TWA)
- Trusted Web Activity via Bubblewrap — a real installable APK
- Distributed via direct APK, Cafe Bazaar, and Myket
- Digital Asset Links-verified, full-screen, no browser chrome
- Native install detection via
android-app://referrer
iOS
- Capacitor-based native wrapper pointed at the live site
- Camera, photo library, location & microphone permissions declared
- App Store-ready asset catalog and launch icon
- Every web update ships instantly — no store review for content
A CONTROL ROOM FOR THE WHOLE PLATFORM
A separate admin application — same design language, different mission: moderate, approve, and understand what's happening across every city.
Analytics dashboard
Visits, unique visitors, and native installs by category and period.
Per-category breakdown
Everything on the map, tallied by type — including lost-pet alerts.
Map item management
Search, filter, edit, boost/un-boost, or bulk-delete by type, city, or province.
Owner & phone visibility
Every listing shows its creator's name and phone, both searchable.
User directory
Every account, searchable — with inline editing and deletion.
Approve / reject accounts
One-click approval workflow for supporter and vet accounts.
Content & promotions
Publish admin-authored stories and manage sitewide promotions.
City-level insight
Visit and install analytics resolved down to city and province.
SECURITY BUILT FOR A PHONE-FIRST AUDIENCE
Phone + OTP authentication
SMS one-time codes via a template-based provider integration; no passwords required by default.
Optional biometric login
WebAuthn support for Face ID / fingerprint / Windows Hello as a faster return-visit path.
Role-scoped JWT sessions
Every API request carries a signed token identifying the account's role, enforced server-side.
Supporter vetting
New NGO/supporter accounts stay pending — invisible to the public map — until an admin approves them.
Duplicate-booking protection
Database-level constraints, not just UI checks, prevent race conditions.
Rate-limited alerts
A 72-hour cooldown between lost-pet broadcasts for the same animal.
DARK BY DEFAULT, WARM AT HEART
A deep navy interface built around a single teal accent, punctuated by warm gold for boosted content and coral red for anything urgent — matched by a hand-illustrated "Adopt · Care · Protect" mark.
Typography, iconography, and copy are all set in Persian (Farsi), right-to-left, with Persian numeral formatting throughout — this document is the English-language exception, written for engineering and business audiences.