Internal Tool, Visuals are representative
VetCar24 Staff App
Native Android app for the VetCar24 team: bookings, customers, messaging, analytics, and blog management, one app, fully offline-capable.
Internal business tool. All visuals shown are representative mockups without real customer data, at the explicit request of the client.
Privacy & Confidentiality
This app is an internal business tool belonging to the client. All visuals on this page are representative illustrations, no real app screenshots, no real customer data. Only architecture, tech stack, and feature scope are shown.
Mockups
Representative Views
Feature Scope
Everything a mobile veterinary team needs, day to day.
-
Dashboard
At-a-glance overview: today's bookings, next appointment, unread messages, quick actions
-
Booking Management
Week calendar strip, filter by status, swipe to cancel or complete, real-time status updates
-
Customer CRM
Full customer profiles, booking history, notes, per-booking messaging thread
-
Message Inbox
Per-booking messaging between customers and the practice, real-time
-
Analytics
Revenue charts, booking statistics, period-over-period comparisons, all data cached locally
-
Blog Editor
Full rich text editor on mobile, create articles with SEO settings, publish directly to vetcar24.de
-
Time Blocker
Block time slots, set vacation days or breaks, instantly synced to the booking system
-
Permission System
Owner vs. staff roles: granular rights per feature, who sees what, who can edit what
-
Offline Mode
Fully functional without network: SQLite cache, action queue, automatic sync on reconnect
-
Biometric Lock
Automatic app lock after inactivity, unlock via fingerprint or Face ID
-
Push Notifications
Push alerts for new bookings, messages, cancellations, via Expo + Firebase
-
Staff Management
Invite team members, assign roles, manage access, all from mobile
Tech Stack
in Detail
-
React Native 0.81
Native Android experience, real native components, no WebView
-
Expo 54 + Router
Expo Router v6 with file-based navigation, OTA updates via EAS
-
TypeScript 5.9
Strict mode, branded types, complete type safety end-to-end
-
Cloudflare Workers, D1, R2
Auth, real-time updates, file storage. On Cloudflare since October 2026, previously Supabase
-
expo-sqlite + Drizzle ORM
Local SQLite database, full offline capability with sync engine
-
TanStack Query v5
Query persistence via AsyncStorage, optimistic updates, background sync
-
Reanimated 4 + Moti
60fps animations on the JS thread, spring physics, layout transitions
-
TipTap Editor
Full rich text editor inside the app, create and publish blog posts on mobile
-
Victory Native + Skia
GPU-accelerated analytics charts with React Native Skia
-
Firebase Crashlytics
Real-time crash reporting, performance monitoring, stack traces
-
expo-local-authentication
Biometric unlock: fingerprint or face recognition
-
MMKV + Zustand 5
Native key-value store 10× faster than AsyncStorage, global state
Development
Phase by Phase
- 01
Analysis & Architecture
Week 1–2- Requirements workshop with client
- Workflow analysis
- Tech stack decision
- Database schema & API design
- 02
Auth & Core
Week 3–4- Auth + Google Sign-In
- Biometric unlock
- Navigation with Expo Router v6
- Permission system (owner/staff)
- 03
Bookings & Customers
Week 5–7- Booking list with calendar strip
- Status management with swipe gestures
- Customer CRM & booking history
- Per-booking messaging with Realtime
- 04
Offline & Sync
Week 8–9- expo-sqlite + Drizzle ORM setup
- Action queue for offline operations
- Conflict resolver for sync conflicts
- TanStack Query persistence adapter
- 05
Advanced Features
Week 10–12- Analytics dashboard with Skia charts
- TipTap blog editor on mobile
- Time blocker modal
- App update system via EAS
- 06
Testing & Deploy
Week 13–14- Firebase Crashlytics integration
- Performance profiling (Skia + FlashList)
- APK build via Gradle
- Internal release process
Offline Architecture
SQLite Cache
expo-sqlite + Drizzle ORM store all critical data locally. The app remains fully usable without a network connection.
Action Queue
Mutations are buffered in a local queue and automatically synced with the backend when connectivity is restored.
Conflict Resolver
Optimistic updates with server-side validation. Conflicts resolved via last-write-wins strategy with rollback support.