You bought Zenith on Gumroad or CodeCanyon, unzipped the download, and want to see it working before you change anything. This Zenith setup guide follows the order that holds up: run it untouched, swap the content, rebrand, then build a signed release with your own AdMob IDs. The official Zenith Quick Setup guide is the short checklist. This article adds the spots where buyers get stuck, and why. Specs and the v1.1.0 changelog are on the Zenith Flutter app template page.
Before you start
- Flutter 3.44 or newer on the stable channel, which includes Dart 3.12.
pubspec.yamlrequires Dart^3.12.0, so an older SDK fails atflutter pub get. - Android Studio for the Android SDK.
- macOS with Xcode and CocoaPods if you build for iOS.
- An AdMob account if you will ship with ads. Zenith shows interstitial ads, so a release needs your own App ID and ad unit IDs.
- Audio hosting, if you want your own. The included cloud links work out of the box, so this can wait.
Run flutter doctor and fix anything marked with a red cross.
Step 1: Run the project unchanged
Open the zenith_app folder in your editor and run:
flutter pub get
cd ios && pod install && cd ..
flutter run
The middle line is for iOS on a Mac only. Skip it on Windows or Linux.
Run it before you edit anything. Debug builds use Google's sample AdMob IDs and the bundled audio links, so test ads load and sounds play with no setup. If it fails now, the problem is your toolchain, not your changes. Tracks stream from URLs, so test on a device with a connection.
Step 2: Change the sounds, moods and radio tracks
All content lives in three JSON files in assets/data/. No Dart changes are needed.
| File | Feeds | Fields per entry |
|---|---|---|
atmosphere.json |
Sound mixer | id, name, icon, url, category |
moods.json |
Mood tiles | id, name, icon, url, category |
radio.json |
Lofi radio | id, title, artist, url, image |
Three things the official guide mentions only briefly:
- Use direct HTTPS links that end in the file (
.mp3,.jpg), not a share page that wraps the file in HTML. - Keep the
categoryvalues. The code shows mixer sounds whose category isnatureoratmosphere, and mood tiles whose category ismood. An entry with any other category loads but appears on neither screen. - One typo empties two screens.
atmosphere.jsonandmoods.jsonare parsed together inside one error handler. A missing or trailing comma in either file leaves both the mixer and the moods empty, and the only sign is anError fetching soundsline in the debug console. Run a JSON validator over the file before you rebuild.
The files ship inside the app, so users see a new catalog only in a new build.
Step 3: Rebrand
- App name:
android:labelinandroid/app/src/main/AndroidManifest.xmlandCFBundleDisplayNameinios/Runner/Info.plist. Both sayZenithtoday. - Colours:
AppColorsinlib/config/theme.dart.primaryis0xFF6C63FFandbackgroundis0xFF0F0F1E. - Logo and splash: replace
assets/images/logo.png, then rundart run flutter_native_splash:create. The splash background (#0F172A) is set in theflutter_native_splashblock ofpubspec.yaml. - Launcher icon: the official guide skips this one.
pubspec.yamlalso pointsflutter_launcher_iconsatlogo.png, so rundart run flutter_launcher_iconstoo, or the home-screen icon stays Zenith's.
Step 4: Change the package name
Zenith ships as com.stacklyn.zenith: namespace and applicationId in android/app/build.gradle.kts, the package line of MainActivity.kt, and PRODUCT_BUNDLE_IDENTIFIER in ios/Runner.xcodeproj/project.pbxproj. The official guide says to use Replace in Files. That changes the strings, but MainActivity.kt stays in the kotlin/com/stacklyn/zenith/ folder, which you have to move yourself. The full process is in how to change your Flutter app's package name. Do it before your first upload, because the stores tie the app to that ID for good.
Step 5: Add your AdMob IDs
Nothing in Dart needs editing. You pass the IDs at build time:
| ID | Android | iOS |
|---|---|---|
| App ID | -PadmobAppId=... on the build command, or admobAppId=... in ~/.gradle/gradle.properties |
ADMOB_APP_ID in ios/Flutter/Release.xcconfig |
| Interstitial unit | --dart-define=ADMOB_ANDROID_INTERSTITIAL=... |
--dart-define=ADMOB_IOS_INTERSTITIAL=... |
The trap is that forgetting them doesn't fail the build. Every value falls back to Google's sample ID, so a plain flutter build appbundle ships test ads. The official guide warns that Google can suspend accounts that show test ad units in a live app. Also create a GDPR message under Privacy & messaging in AdMob. Without it, no consent form is shown.
Step 6: Sign and build the release
Copy android/key.properties.example to android/key.properties. Watch two defaults in the example:
- It sets
keyAlias=zenith, but the guide'skeytoolcommand creates the aliasupload.keyAliasmust match the alias you actually created. - It sets
storeFile=../keystore/zenith-release.jks. That path is resolved fromandroid/app/, so it points atandroid/keystore/. An absolute path avoids the guesswork.
If key.properties is missing, the release still builds, signed with debug keys, and Gradle only prints a warning. Play Console rejects those builds. Raise the number after + in pubspec.yaml (version: 1.1.0+2 today) before every upload, then build:
flutter build appbundle -PadmobAppId=YOUR_APP_ID --dart-define=ADMOB_ANDROID_INTERSTITIAL=YOUR_UNIT_ID
flutter build ipa --dart-define=ADMOB_IOS_INTERSTITIAL=YOUR_UNIT_ID
The Android bundle lands in build/app/outputs/bundle/release/app-release.aab. Creating the keystore, checking the signature and Xcode signing are covered step by step in your first Flutter release build and signing. The Zenith Complete Setup guide has the full AdMob and Play Store commands.
Between the package rename, the AdMob flags, the keystore and Xcode signing, several of the mistakes in a first Zenith release still produce a build with no error, and you find out from a store rejection or a test ad in production. If you'd rather hand that part off, our app reskinning service covers the branding, package name and signed store-ready builds.
Troubleshooting
The mixer and moods are empty, but the radio works. A JSON syntax error in atmosphere.json or moods.json, or a category other than nature, atmosphere or mood. See Step 2.
A tile shows but never plays. The url isn't a direct HTTPS link to the audio file. Open it in a browser: it should play or download the file, not show a web page.
Your release shows test ads. The --dart-define flags or the App ID were left off the build command, or Release.xcconfig still has the sample ID. Rebuild with your IDs from Step 5.
Play Console says the bundle is debug-signed. android/key.properties wasn't found when you built. Check it sits in android/, not android/app/.
Gradle can't find the key alias. keyAlias still says zenith while your keystore uses upload, or the other way round.
flutter pub get fails on the Dart SDK version. Your Flutter is older than 3.44. Run flutter upgrade.
The home-screen icon is still Zenith's. You ran the splash command but not dart run flutter_launcher_icons.
Getting help
Email support@stacklynlabs.com with your Flutter version (flutter --version), the exact command you ran and the full error text.