Permissions, the right way
Vibely always requests permissions at the moment the user takes the action that needs it, never on app launch. iOS and Play Store reviewers reject apps that ask for everything up front, and users decline. The agent codes this correctly by default — you don’t need to ask. If you’ve reviewed code from other AI tools that scatter permission requests across app startup, the difference is visible immediately: Vibely’s are scoped to the screen and action.Camera
Use cases: photo capture, barcode scanning, ID upload, profile pictures. Prompt: “Add a camera screen for capturing the user’s profile picture.” Web preview limitation: camera does not work in the browser preview. Test on Expo Go.Push notifications
Two flavours, both wired automatically:- Local notifications — “remind me at 8 AM tomorrow.” Triggered from inside the app, no server, no backend cost.
- Remote push — “notify everyone when a new episode drops.” Triggered from a backend (Supabase Edge Function, your own server), sent to all subscribed devices.
Biometrics
Face ID, Touch ID, or device fingerprint — for unlocking the app, confirming sensitive actions, or gating private screens. Prompt: “Add Face ID / Touch ID to unlock the journal screen.” Vibely pairs biometrics with a stored session token, so biometrics gate access to an already-signed-in session — never replace the actual sign-in. That’s the pattern Apple and Google expect.Secure storage
Backed by Keychain on iOS and EncryptedSharedPreferences on Android — the OS-native secure stores. Used automatically for session tokens, refresh tokens, anything sensitive. You don’t ask for this directly. The moment you mention auth, Vibely sets up secure storage as the session store. Non-sensitive app state (settings, UI preferences) lands in regular AsyncStorage, which is faster and supports larger payloads.Geolocation
Two permission tiers, picked based on your prompt:- When in use — works while the app is foregrounded. Used for everything that doesn’t strictly need background tracking. This is the default.
- Always — required for background tracking. Triggers an OS-level “always allow” prompt that’s notoriously hard for users to accept on iOS. Vibely uses this only if you specifically ask for background features.
Deep links
Two kinds, both supported:- Custom scheme —
habits://habit/123opens straight to that habit. Works inside messages, emails, marketing pages. Set up automatically when you ask for deep links. - Universal links —
https://habits.example.com/habit/123opens the app if it’s installed, falls back to your website otherwise. Requires a couple of files published on your domain; the agent will tell you exactly which.
In-app purchases
iOS and Play Store policy require their own payment system for digital goods. Web checkout (Stripe, Razorpay) is not allowed for unlocking app features. Vibely offers two routes:- Direct StoreKit / Play Billing — free, no third-party service. You handle receipt validation yourself.
- RevenueCat (via Connectors) — managed validation, entitlements, analytics. Free up to $10K monthly tracked revenue.
What doesn’t work in Expo Go
A small set of features require a custom development build:- Custom native modules (anything outside the standard Expo SDK)
- Some payment SDKs (RevenueCat works in Expo Go; raw native ones don’t)
- Push providers other than Expo’s own
- App Clips, App Extensions, widgets
