# Peqaboo — Complete Reference > Peqaboo is an AI-powered pet care platform by Decennium Platforms Limited (Hong Kong). The Boo AI companion helps pet owners with health triage, symptom checks, gait analysis, lab report parsing, stool analysis, care plans, AI recipes, AI portraits, and more. Available as a mobile app (iOS/Android) and web platform at https://peqaboo.com. Supports 20 languages. ## Platform Overview Peqaboo offers AI-powered pet health and care features: - **Gait Analysis**: Upload a pet video to detect lameness, joint issues, and movement abnormalities - **Lab Report Analysis**: AI parsing of veterinary blood work, urinalysis, and other lab reports - **Poop/Stool Analysis**: Photo-based digestive health assessment - **Triage & Symptom Check**: AI health assessment with urgency scoring - **Care Plans**: Personalized AI-generated health management plans - **Pre-Visit Summary**: Vet appointment preparation documents - **Medication Guide**: Drug information lookup for pet prescriptions - **Bill Estimate**: Veterinary cost estimation - **AI Pet Portrait**: Artistic portrait generation in various styles - **AI Pet Recipe**: Tailored pet food recipes based on breed, age, and dietary needs - **BooPetID**: Multi-signal pet identity system (visual, nose print, gait pattern recognition) - **BooMap**: Interactive pet-friendly places discovery - **Pet Community**: Social platform for pet owners - **Breed Encyclopedia**: 500+ breed profiles - **Harmful Items Database**: Toxic foods, plants, and substances reference - **Care Guides**: Categorized pet care articles Website: https://peqaboo.com Download: https://peqaboo.com/p/download --- ## BooApp Developer Platform BooApps are sandboxed mini web apps that run inside the Peqaboo mobile app (iOS & Android), accessing native device features through a JavaScript bridge SDK. --- ## Architecture ``` ┌─────────────────────────────────┐ │ Peqaboo Mobile App (Flutter) │ │ ┌───────────────────────────┐ │ │ │ Native Bridge (v2) │ │ │ │ JS Channel: PeqabooApp │ │ │ └──────────┬────────────────┘ │ │ │ │ │ ┌──────────▼────────────────┐ │ │ │ WebView (BooApp) │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ booapp-sdk.min.js │ │ │ │ │ │ Your HTML/CSS/JS │ │ │ │ │ └─────────────────────┘ │ │ │ └───────────────────────────┘ │ └─────────────────────────────────┘ ``` Each BooApp runs in an isolated WebView with permission-gated access to native APIs. --- ## Manifest Specification (booapp.json) ```json { "name": "Pet Weight Tracker", "slug": "pet-weight-tracker", "version": "1.0.0", "description": "Track your pet's weight over time with charts and reminders", "author": { "name": "Your Name", "email": "you@example.com" }, "main": "index.html", "icon": "assets/icon.png", "category": "health", "permissions": ["auth", "pet_info", "storage", "ui_dialogs", "notifications"], "minBridgeVersion": 1, "display": { "orientation": "portrait", "backgroundColor": "#FFFFFF", "fullscreen": false, "statusBarStyle": "dark" }, "navigation": { "showBackButton": true, "showTitle": true, "title": "Weight Tracker", "titleColor": "#000000", "backgroundColor": "#FFFFFF" }, "privacy": { "dataCollection": ["pet_data"], "dataSharing": [], "dataRetention": "stored locally", "privacyPolicyUrl": "https://example.com/privacy", "termsOfServiceUrl": "https://example.com/terms" } } ``` ### Field Details | Field | Type | Required | Validation | |-------|------|----------|------------| | name | string | yes | 2-30 characters | | slug | string | yes | lowercase, hyphens only, regex: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$` | | version | string | yes | Semantic versioning: `^\d+\.\d+\.\d+$` | | description | string | yes | Max 120 characters | | main | string | yes | Path to entry HTML file | | icon | string | yes | Path to 512x512 PNG | | category | string | yes | One of: health, social, tools, entertainment, shopping, education, lifestyle, fitness, food, insurance | | permissions | string[] | yes | Array of valid permission group IDs | | minBridgeVersion | number | yes | Minimum 1 | | author.name | string | no | Developer name | | author.email | string | no | Contact email | | display.orientation | string | no | "portrait" \| "landscape" \| "any" | | display.backgroundColor | string | no | Hex color for loading background | | display.fullscreen | boolean | no | Hide status bar | | display.statusBarStyle | string | no | "light" \| "dark" \| "auto" | | navigation.showBackButton | boolean | no | Show back arrow | | navigation.showTitle | boolean | no | Show title in nav bar | | navigation.title | string | no | Title text | | navigation.titleColor | string | no | Hex color for title | | navigation.backgroundColor | string | no | Hex color for nav bar | | privacy.dataCollection | string[] | no | Types of data collected | | privacy.dataSharing | string[] | no | Third parties data is shared with | | privacy.dataRetention | string | no | How long data is kept | | privacy.privacyPolicyUrl | string | no | Privacy policy URL | | privacy.termsOfServiceUrl | string | no | Terms of service URL | --- ## Permission Groups (16) | ID | Label | Sensitivity | Actions | |----|-------|-------------|---------| | auth | Authentication | medium | getAuthToken, isLoggedIn, requireLogin | | user_info | User Information | high | getUserInfo | | pet_info | Pet Information | medium | getPetInfo, getAllPets | | camera | Camera | high | openCamera | | gallery | Photo Gallery | medium | pickImage, pickMultipleImages, pickVideo, saveToGallery | | location | Location | high | getLocation | | storage | Local Storage | low | getStorageItem, setStorageItem, removeStorageItem | | notifications | Notifications | medium | getPushToken, requestNotificationPermission | | biometrics | Biometrics | high | authenticateBiometric, isBiometricAvailable | | clipboard | Clipboard | low | copyToClipboard, readClipboard | | share | Sharing | low | shareText, shareFile | | scanner | Scanner | medium | scanBarcode | | device_info | Device Information | low | getDeviceInfo, getNetworkStatus | | vibration | Vibration | low | vibrate | | navigation | Navigation | low | navigate, openUrl, closeWebview | | ui_dialogs | UI Dialogs | low | showToast, showAlert, showConfirmDialog | | file_picker | File Picker | medium | pickFile | ### Common Permission Combinations - **Basic app**: `["auth", "storage", "ui_dialogs"]` - **Pet-focused app**: `["auth", "pet_info", "storage", "ui_dialogs"]` - **Photo app**: `["auth", "pet_info", "camera", "gallery", "storage", "ui_dialogs"]` - **Social app**: `["auth", "user_info", "pet_info", "share", "storage", "ui_dialogs"]` - **Location-based app**: `["auth", "pet_info", "location", "storage", "ui_dialogs", "navigation"]` --- ## Bridge API — Complete Reference (30+ actions) All actions return Promises and are called via `BooAppSDK.()`. ### Detection & Lifecycle ```typescript BooAppSDK.isAvailable(): boolean // Check if running inside Peqaboo app BooAppSDK.isInAppMode(): boolean // Check if in native app mode BooAppSDK.getAppInfo(): PeqabooAppInfo | null // Get app info (platform, bridgeVersion, isLoggedIn, uid, lang, regionCode, actions) BooAppSDK.supportsAction(action: string): boolean // Check if a specific action is supported BooAppSDK.whenReady(): Promise // Wait for bridge to be ready, then resolve with app info ``` ### Auth & User (permission: auth, user_info) ```typescript // Get auth token + UID for backend API calls // Permission: auth BooAppSDK.getAuthToken(): Promise<{ token: string; uid: string }> // Example: const { token, uid } = await BooAppSDK.getAuthToken(); fetch('/api/data', { headers: { Authorization: `Bearer ${token}` } }); ``` ```typescript // Get detailed user information // Permission: user_info BooAppSDK.getUserInfo(): Promise // UserInfo type: interface UserInfo { uid: string; userName: string; userEmail: string; userProfileImgUrl: string; phoneCode: string; areaCode: string; emailVerified: boolean; phoneVerified: boolean; sex: string; dob: string; lang: string; regionCode: string; membership: string; isMembershipActive: boolean; businessId: string; businessType: string; businessStatus: string; userType: string; currentPoint: number; userBadge: boolean; professionalBadge: boolean; } ``` ```typescript // Check if user is logged in // Permission: auth BooAppSDK.isLoggedIn(): Promise // Force user to log in (opens native login screen) // Permission: auth BooAppSDK.requireLogin(): Promise ``` ### Pet (permission: pet_info) ```typescript // Get current (primary) pet info BooAppSDK.getPetInfo(): Promise // Get all registered pets BooAppSDK.getAllPets(): Promise // PetInfo type: interface PetInfo { petId: string; petName: string; petBreed: string; petBreedTranslated: string; petType: string; sex: string; petProfileImgUrl: string; birthDate: string; age: number | null; weight: number | null; isAlive: boolean; petNeuter: string; microchipId: string | null; } // Example: const pet = await BooAppSDK.getPetInfo(); if (pet) { console.log(`${pet.petName} is a ${pet.petBreed}, weight: ${pet.weight}kg`); } ``` ### Media (permissions: camera, gallery, file_picker) ```typescript // Open camera // Permission: camera BooAppSDK.openCamera(opts?: { maxWidth?: number; maxHeight?: number; quality?: number; // 0-100, default 80 returnBase64?: boolean; }): Promise // Pick single image from gallery // Permission: gallery BooAppSDK.pickImage(opts?: { maxWidth?: number; maxHeight?: number; quality?: number; returnBase64?: boolean; }): Promise // Pick multiple images // Permission: gallery BooAppSDK.pickMultipleImages(opts?: { limit?: number; maxWidth?: number; maxHeight?: number; quality?: number; returnBase64?: boolean; }): Promise // Pick video // Permission: gallery BooAppSDK.pickVideo(opts?: { maxDurationSeconds?: number; }): Promise // Pick file // Permission: file_picker BooAppSDK.pickFile(opts?: { type?: 'image' | 'video' | 'any'; allowedExtensions?: string[]; }): Promise // Save image to gallery // Permission: gallery BooAppSDK.saveToGallery(opts: { filePath?: string; base64?: string; name?: string; }): Promise // ImageResult type: interface ImageResult { path?: string; name?: string; mimeType: string; sizeBytes: number; base64?: string; } // FileResult type: interface FileResult { path: string; name: string; extension: string; sizeBytes: number; } ``` ### Location (permission: location) ```typescript BooAppSDK.getLocation(): Promise interface LocationResult { latitude: number; longitude: number; accuracy: number; altitude: number; speed: number; timestamp: number; } ``` ### Device & Haptics (permissions: vibration, device_info) ```typescript // Haptic feedback // Permission: vibration BooAppSDK.vibrate(type?: 'light' | 'medium' | 'heavy' | 'selection'): Promise // Device info // Permission: device_info BooAppSDK.getDeviceInfo(): Promise interface DeviceInfo { platform: 'ios' | 'android'; model: string; systemVersion: string; isPhysicalDevice: boolean; } // Network status // Permission: device_info BooAppSDK.getNetworkStatus(): Promise interface NetworkStatus { status: 'wifi' | 'mobile' | 'none' | 'ethernet' | 'unknown'; isConnected: boolean; } ``` ### UI Dialogs (permission: ui_dialogs) ```typescript // Toast message BooAppSDK.showToast(message: string, duration?: 'short' | 'long'): Promise // Alert dialog BooAppSDK.showAlert(opts: { title?: string; message: string; buttonText?: string; }): Promise // Confirm dialog — returns true if user confirms BooAppSDK.showConfirmDialog(opts: { title?: string; message: string; confirmText?: string; cancelText?: string; destructive?: boolean; }): Promise // Example: const confirmed = await BooAppSDK.showConfirmDialog({ title: 'Delete Entry', message: 'Are you sure?', confirmText: 'Delete', destructive: true }); ``` ### Share & Navigation (permissions: share, navigation) ```typescript // Share text BooAppSDK.shareText(text: string, subject?: string): Promise // Share file BooAppSDK.shareFile(filePath: string, text?: string): Promise // Navigate to native Flutter screen BooAppSDK.navigate(route: string, params?: Record): Promise // Open URL BooAppSDK.openUrl(url: string, external?: boolean): Promise // Close webview BooAppSDK.closeWebview(): Promise ``` ### Utilities (permissions: scanner, clipboard, storage, biometrics, notifications) ```typescript // Barcode/QR scanner // Permission: scanner BooAppSDK.scanBarcode(): Promise interface BarcodeResult { value: string; format: string; } // Clipboard // Permission: clipboard BooAppSDK.copyToClipboard(text: string): Promise BooAppSDK.readClipboard(): Promise // Persistent storage (scoped to BooApp) // Permission: storage BooAppSDK.getStorageItem(key: string): Promise BooAppSDK.setStorageItem(key: string, value: unknown): Promise BooAppSDK.removeStorageItem(key: string): Promise // Biometric auth // Permission: biometrics BooAppSDK.authenticateBiometric(opts?: { reason?: string; biometricOnly?: boolean; }): Promise BooAppSDK.isBiometricAvailable(): Promise interface BiometricInfo { isAvailable: boolean; biometrics: string[]; } // Push notifications // Permission: notifications BooAppSDK.getPushToken(): Promise BooAppSDK.requestNotificationPermission(): Promise interface NotificationPermission { status: string; granted: boolean; } ``` ### Events ```typescript // Listen for events from the native app const unsubscribe = BooAppSDK.onEvent((event) => { console.log(event.type, event.data, event.timestamp); }); // Stop listening unsubscribe(); ``` --- ## Complete Example: Pet Profile Viewer ### booapp.json ```json { "name": "Pet Profile Viewer", "slug": "pet-profile-viewer", "version": "1.0.0", "description": "View your pet's profile with beautiful cards", "main": "index.html", "icon": "assets/icon.png", "category": "tools", "permissions": ["auth", "pet_info", "ui_dialogs", "share"], "minBridgeVersion": 1, "display": { "orientation": "portrait", "backgroundColor": "#F8F9FA" }, "navigation": { "showBackButton": true, "showTitle": true, "title": "Pet Profile" } } ``` ### index.html ```html Pet Profile Viewer
Loading...
``` --- ## Packaging & Submission ```bash # Create zip package zip -r pet-profile-viewer.zip booapp.json index.html assets/ # Requirements: # - Max zip size: 10MB # - booapp.json at root # - Icon: 512x512 PNG minimum # - At least 1 screenshot # - No executable files (.exe, .bat, .sh) ``` Submit via Developer Console: https://peqaboo.com/developers/console/apps/new ## Review Process 1. Submit your zip via Developer Console 2. Automated checks run (manifest validation, file structure, size limits) 3. Manual review by Peqaboo team (2-3 business days) 4. Approved → published to BooApp Store 5. Rejected → feedback provided, resubmit after fixing ## Resources - Developer Hub: https://peqaboo.com/developers - SDK (UMD): https://peqaboo.com/sdk/v1/booapp-sdk.min.js - SDK (ESM): https://peqaboo.com/sdk/v1/booapp-sdk.esm.js - TypeScript types: https://peqaboo.com/sdk/v1/booapp-sdk.d.ts - Developer Console: https://peqaboo.com/developers/console