ProjectsAugust 5, 2026

Vet Tiaret — Bilingual Clinical Intake, Triage & Scheduling Platform

image
Core Mission: Replace phone-tag bottlenecks with real-time symptom triage, guaranteed data integrity, and seamless bilingual clinic workflows.
Veterinary practices operate in high-friction environments where medical triage must happen concurrently with client communication. At Vet Tiaret, veterinary staff and receptionists were losing 4+ hours daily to manual phone scheduling, managing walk-ins blindly, and risking patient health when critical emergencies were lost in voicemail queues. To solve this, I designed and engineered a full-stack clinical intake and appointment management platform. The system bridges non-technical pet owners and fast-paced veterinary staff through an intelligent, bilingual 4-step triage wizard and a real-time reactive staff dashboard.
65%Reduction in staff phone call load
40%Cut in appointment no-show rates
< 3 minAverage intake completion speed
0Critical medical emergencies missed
Vet Tiaret Daily Schedule and Appointment Calendar View
Veterinary Clinical Triage System Architecture
Before building the custom solution, the clinic evaluated standard calendar tools (Calendly, Google Calendar, generic salon booking tools). They failed for veterinary medicine for four fundamental reasons:
  1. No Medical Triage Layer: Generic booking apps treat a routine nail trim identically to a fatal gastric torsion. Staff had no way to intercept life-threatening emergencies.
  2. The Confirmation & "No-Show" Paradox: Automated self-service without clinic verification led to 30%+ ghost bookings and uncontactable clients.
  3. Local Linguistic Reality: Pet owners in Algeria alternate between French and Algerian Arabic. Existing tools offered broken translation and zero Right-to-Left (RTL) support.
  4. Data Fragmentation: When a pet returned, vets had no unified timeline linking past symptoms, prescriptions, and media attachments by phone number.
Pet owners booking a vet visit are often anxious. The client portal replaces intimidating medical forms with a progressive disclosure questionnaire:
  • Step 1: Owner Identification: Name, verified phone number, and residential area.
  • Step 2: Pet Profile: Instant visual selector for species (Dog, Cat, Bird, Exotic), breed, age, sex, and vaccination status (Rabies / Viral).
  • Step 3: Biological System & Symptom Picker: Grouped by physiological systems (Digestive, Respiratory, Reproductive, Skin, General State, Urinary).
  • Step 4: Summary & Instant Feedback: Clean summary card displaying estimated urgency and clinic instructions.
Vet Tiaret Mobile Pet Owner Intake & Step-by-Step Triage Wizard
Typescript
// Client-Side Zod Schema enforcing strict data integrity during intake
export const bookingFormSchema = z.object({
  ownerFullName: z.string().min(2, "Name required"),
  ownerPhone: z.string().regex(/^(0)(5|6|7)[0-9]{8}$/, "Valid Algerian phone number required"),
  ownerAddress: z.string().optional(),
  petName: z.string().min(1, "Pet name required"),
  petSpecies: z.string().min(1, "Species required"),
  petBreed: z.string().optional(),
  petAge: z.string().optional(),
  petSex: z.nativeEnum(PetSex).optional(),
  petRabiesVaccination: z.boolean().default(false),
  petViralVaccination: z.boolean().default(false),
  petSterilized: z.boolean().default(false),
  problemSystem: z.nativeEnum(ProblemSystem).optional(),
  symptoms: z.array(z.string()).default([]),
  category: z.nativeEnum(VisitCategory),
  description: z.string().max(1000).optional(),
});
As the pet owner checks off symptoms, a rule engine evaluates risk factors. If symptoms like Difficult breathing, Dystocia / labor complication, or Urinary blockage are flagged:
  • The UI renders an immediate high-visibility emergency banner directing users to call the emergency line.
  • The intake payload is tagged VisitCategory.EMERGENCY, automatically escalating the ticket to the top of the receptionist queue.
Symptom Selected: "Difficulté respiratoire" ──► Rule Match: [RESPIRATORY_EMERGENCY]
  ├── UI Action: Render High-Visibility Emergency Caution Banner
  ├── Tagging: Set category = VisitCategory.EMERGENCY (🔴)
  └── Backend Action: Bump Priority in Receptionist Call List
To ensure seamless Arabic and French usability, the frontend implements a dynamic directional theme provider:
  • Dynamic dir="rtl" and dir="ltr" attribute switching on root nodes.
  • Logical CSS property mappings (ms-*, me-*, start-*, end-*) preventing layout breakages across languages.
  • Culturally accurate colloquial terms rather than machine-translated medical terminology.
Layer
Technology
Decision Rationale
Frontend CoreReact 18 + TypeScript + ViteSub-second bundle load, strict type safety, predictable UI rendering on low-end mobile devices.
State & CacheRedux Toolkit + RTK QueryAutomated background cache revalidation, optimistic status mutations, granular tag invalidation.
UI & StylingTailwind CSS + Lucide IconsResponsive design tokens, fluid RTL/LTR support, and minimal CSS footprint.
Backend APINestJS (Node.js)Strict modular architecture, Dependency Injection, built-in validation pipelines, and clean separation of concerns.
ORM & DatabasePrisma ORM + PostgreSQLStrong relational modeling, auto-generated type safety, deterministic migrations, and efficient indexed queries.
ValidationZod (Client) + Class-Validator (API)End-to-end contract symmetry preventing malformed payloads from ever touching business logic.
Appointments follow a strictly governed state machine to prevent scheduling overlaps and lost records:
Veterinary Appointment Finite State Machine
Every state change creates an immutable StatusHistory record in PostgreSQL with the staff member's ID, previous status, new status, and timestamp:
Typescript
// Backend State Transition with Transactional Audit Trail (NestJS + Prisma)
async update(id: number, data: Prisma.AppointmentUpdateInput) {
  const updateData = { ...data };

  if (data.status) {
    const current = await this.prisma.appointment.findUnique({
      where: { id },
      select: { status: true },
    });

    updateData.statusHistory = {
      create: {
        status: data.status as AppointmentStatus,
        oldStatus: current?.status,
        changedById: (data as any).userId,
      },
    };
  }

  const appointment = await this.prisma.appointment.update({
    where: { id },
    data: updateData,
  });

  // Automated Ephemeral Asset Cleanup
  if (data.status && data.status !== AppointmentStatus.CASE_STUDY) {
    const terminalStatuses = [
      AppointmentStatus.COMPLETED,
      AppointmentStatus.CANCELLED,
      AppointmentStatus.NOT_RESPONDING,
    ];
    if (terminalStatuses.includes(data.status as AppointmentStatus)) {
      await this.cleanupAttachments(id);
    }
  }

  return appointment;
}
Veterinary diagnosis frequently involves clients uploading photos of injuries, rashes, or x-rays. Unrestricted file uploads quickly exhaust disk capacity and inflate hosting costs. I engineered a two-tier storage lifecycle strategy:
  1. Ephemeral Triage Files: Uploaded media for ordinary consultations are kept only while active. When an appointment transitions to COMPLETED or CANCELLED, the system automatically purges the files from disk and removes relational attachment entries.
  2. Persistent Clinical Case Studies: When an interesting medical case is flagged by the veterinarian (AppointmentStatus.CASE_STUDY), the data and media are permanently transferred into the clinic's internal knowledge base and research catalog.
Vet Tiaret Clinical Case Study Research Archive CMS
To guarantee instant dashboard queries even as patient volume scales to tens of thousands of records:
  • Added composite indexes on ownerPhone and petName.
  • Optimized calendar queries to UTC bounded ranges (gte: startOfDay, lte: endOfDay), avoiding unbounded database scans.
  • Applied Prisma lean select clauses in RTK Query endpoints, shipping only the fields consumed by each individual UI view.
Prisma
model Appointment {
  id                  Int               @id @default(autoincrement())
  status              AppointmentStatus @default(PENDING)
  ownerFullName       String
  ownerPhone          String
  petName             String
  petSpecies          String
  problemSystem       ProblemSystem?
  symptoms            String[]          @default([])
  category            VisitCategory
  scheduledDate       DateTime?
  startTime           DateTime?
  duration            Int?
  
  attachments         Attachment[]
  statusHistory       StatusHistory[]
  caseStudy           CaseStudy?
  
  @@index([ownerPhone])
  @@index([petName])
}
Rather than answering unvetted calls while assisting clients in the waiting room, receptionists work through an asynchronous call queue:
  • Color-coded badges for immediate triage (🔴 Emergency, 🟡 Consultation, 🟢 Vaccination, 🔵 Follow-Up).
  • Direct call triggers with instant status toggles (Called - No Answer, Confirmed).
  • Prevents double-booking and eliminates forgotten inquiries.
Vet Tiaret Receptionist Call List Queue and Triage Management
  • Time-slot grid displaying confirmed appointments grouped by veterinarian and treatment room.
  • Dynamic duration allocation (15 min for vaccines vs. 45 min for complex pathology consultations).
  • Drag-and-drop rescheduling with automated conflict detection.
Vet Tiaret Staff Planning and Daily Clinic Capacity Management
  • Receptionists or veterinarians enter a phone number to view all historical visits across all pets owned by that client.
  • Instant access to historical diagnoses, vaccination logs, and past medical notes in under 200ms.
  1. UX is Healthcare Infrastructure: In veterinary medicine, an ambiguous dropdown or a slow form isn't just bad design—it delays patient care. Simplifying the intake flow directly improved emergency response times.
  2. State Machines Prevent Chaos: Managing clinic operations with loose status flags causes race conditions. Encoding the clinic's real-life protocol into a strict state machine with an audit log created total accountability for staff actions.
  3. Automate Storage Hygiene Early: Allowing media uploads without a retention and pruning policy is an operational debt. Pairing ephemeral file pruning with permanent case study archiving kept infrastructure costs near zero while building a valuable clinical library.
  4. Local UX Drives Organic Adoption: Providing true bilingual support with native RTL layout eliminated digital hesitancy, leading to immediate self-service adoption across diverse demographic groups.

Related projects

Traceo — Offline-First Geofenced Field Operations & Route Management Platform

Traceo — Offline-First Geofenced Field Operations & Route Management Platform

Engineering an offline-first enterprise SaaS platform that eliminates falsified field reports, guarantees physical visit authenticity via GPS geofencing, and automates recurring route distribution.
Luma — Calm Client Operations Assistant & Temporal Memory System

Luma — Calm Client Operations Assistant & Temporal Memory System

Designing and engineering a calm client operations system that turns natural conversations into evolving attention, eliminating mental load for solopreneurs.
NordCode — High-Trust Technical Identity & Studio Platform

NordCode — High-Trust Technical Identity & Studio Platform

Designing and engineering a high-trust, engineering-grade web presence for a software solutions studio with precision design tokens, 0-runtime animations, and blueprint aesthetics.
Zambo Tattoo — Studio Landing Page & Artist Showcase

Zambo Tattoo — Studio Landing Page & Artist Showcase

Designing and building a bold, high-contrast digital showcase and landing page for Zambo Tattoo studio with an interactive artwork gallery, artist spotlight, and seamless client booking flow.
CRYOJET — B2B Industrial Growth Platform & Digital Transformation

CRYOJET — B2B Industrial Growth Platform & Digital Transformation

Designing and engineering an enterprise B2B platform for Algeria's leading cryogenic industrial cleaning contractor—demystifying dry-ice technology, eliminating sales cycle latency with instant WhatsApp routing, and capturing enterprise leads across 58 wilayas.