You bought Vet Vault on Gumroad or CodeCanyon, unzipped it, and want it running on a phone before you change a thing. This Vet Vault setup guide goes from the download to a signed release build, with the edits buyers make first and where they trip. The official Vet Vault Quick Setup guide is the short version; this article adds the reasons behind each step. Features and the current version (1.2.0) are on the Vet Vault Flutter template page.
What you need before you start
- Flutter 3.44 or later on the stable channel, which includes Dart 3.12. The project's
pubspec.yamlsetssdk: ^3.12.0, so an older SDK stops with an SDK constraint error. - For Android: Android SDK 36 and JDK 17.
- For iOS: a Mac with Xcode 16 or later and CocoaPods. The deployment target is iOS 14.0.
- An Android or iOS device or emulator. Not a browser: the app relies on device storage, local notifications and the file system. Desktop targets are not officially supported.
There is no server, Firebase project, API key or .env file to configure. All data lives in a local Hive CE database on the device.
Step 1: Install and run
Unzip the download and open a terminal in the folder that contains
pubspec.yaml.Check your toolchain and fix anything it reports. Unaccepted Android licences are a common item:
flutter doctor flutter doctor --android-licensesInstall packages, then confirm the untouched project is healthy:
flutter pub get flutter analyze flutter testRun these before you edit anything. If they pass now and fail later, the cause is in your changes, not the template.
Run it:
flutter devices flutter run
You should see a three-page onboarding, then an empty dashboard with four tabs: Pets, Insights, Gallery and Settings. The generated Hive adapters ship with the project, so you don't need build_runner for this first run.
Step 2: Rebrand the app
Most branding sits in lib/core/app_config.dart: appName, appTagline, companyName, website, the light and dark colours, fontFamily, defaultCurrency, reminderHour and filePrefix (used in backup and PDF file names).
Three things catch people out here:
- Hot reload won't show the change. These are
static constvalues, so use hot restart. - The name under the icon is separate. Change
android:labelinandroid/app/src/main/AndroidManifest.xmlandCFBundleDisplayNameinios/Runner/Info.plistas well, or the launcher keeps saying Vet Vault. - The PDF has its own font. The Health Passport uses the bundled Noto Sans files, not your app font. If your users write in a script Noto Sans doesn't cover, such as Arabic, Sinhala, Tamil or CJK, replace those two files with a matching Noto font.
For the icon and splash, replace assets/branding/icon.png (1024 by 1024 px) and assets/branding/logo.png (a transparent PNG works best), then regenerate:
dart run flutter_launcher_icons
dart run flutter_native_splash:create
Species, record types and expense categories are lists in lib/core/constants.dart. Finally, review the in-app privacy policy in lib/screens/privacy_policy_screen.dart and update privacyPolicyLastUpdated. Both stores also want the policy at a public URL.
Step 3: Change the package name
The default ID is com.stacklynlabs.vetvault, and you can't publish under it. In android/app/build.gradle.kts, change both namespace and applicationId. Move MainActivity.kt out of android/app/src/main/kotlin/com/stacklynlabs/vetvault/ into the folder matching your new ID and update its package line. On iOS, set the Bundle Identifier in Xcode under Runner, Signing & Capabilities. Then run flutter clean and flutter pub get.
Store IDs are permanent once you publish, so pick yours deliberately. The walkthrough on changing your Flutter app's package name explains each file involved and what to check afterwards.
Step 4: Change the data model safely
Data is stored in four Hive CE boxes: pets, medical_records, expenses and settingsBox. The models are in lib/data/models/. To add a field:
Give it the next unused
@HiveFieldnumber and make it nullable or give it a default, so records already on users' phones still load.Add it to
toJson()andfromJson(). Skip this and backups won't carry the field.Regenerate the adapters:
dart run build_runner build --delete-conflicting-outputs
Never change or reuse an existing typeId or @HiveField number. It corrupts data your users already have, and you won't see it on a fresh emulator install. Route every write through PetProvider rather than calling DatabaseService from a screen, so reminders, stored photos and every screen stay in sync.
Step 5: Build a signed release
Set the version in
pubspec.yaml.1.2.0+2means version name 1.2.0 and build number 2. Raise the number after+for every store upload.Create an upload keystore with
keytool, then copyandroid/key.properties.exampletoandroid/key.propertiesand fill it in. Use an absolute path forstoreFile: the file sits inandroid/, butbuild.gradle.ktsresolvesstoreFilefromandroid/app/, so a relative path points to the wrong folder.Build:
flutter build appbundle --release flutter build ipa --release
The quiet failure is a missing key.properties. It isn't an error: the release build falls back to the debug key, flutter run --release works, and Google Play rejects the bundle later. Also keep android/app/proguard-rules.pro (R8 keep rules for the notification plugin) and the photo and camera permission strings in Info.plist, which App Review requires. The guide to Flutter release build signing shows how to confirm the bundle was signed with your key and covers iOS upload.
Between the rename, the icons, the keystore and two store builds, a first release touches Gradle, Xcode and several config files, and one missed step tends to surface only at upload time. If you'd rather hand that off, our Flutter app reskinning service does the branding, package name and Android signing, then gives you store-ready builds plus the keystore and passwords.
Troubleshooting
Gradle sync or build fails on Android. The project uses AGP 9, Gradle 9.1 and Java 17. Update Android Studio, set the Gradle JDK to 17 or newer, and run flutter clean. If your setup can't use AGP 9, the official guide gives an AGP 8.11.1 and Gradle 8.14 fallback.
"No Android SDK found". Install Android SDK 36 and the command-line tools in Android Studio's SDK Manager, then accept licences.
Missing .g.dart file or registerAdapters error. You changed a model without regenerating. Run the build_runner command from Step 4.
CocoaPods error on iOS. In ios/, delete Pods and Podfile.lock, then run pod repo update and pod install.
Reminders don't appear. Check notification permission for the app. Some Android brands delay alarms through battery optimisation, so set the app to Unrestricted. Reminders use inexact alarms and can arrive a few minutes late, and a due date of today after reminderHour shows in the app without a notification.
A "Could not open its data" screen at launch. The local database couldn't be opened. During development, uninstall and reinstall. Remember that uninstalling deletes local data, so test backup and restore before you switch phones.
Where to get help
The Vet Vault Complete Setup guide covers the project structure, upgrading from 1.1.0 and the store checklist, including the Data safety and privacy label answers. If you're still stuck, email support@stacklynlabs.com with your flutter --version output, your platform and the full error message.