Overview
Smart Tenant is the iPhone app for the Smart Tenant property management website. It gives tenants and maintainers (repair staff) everything they need on their phone, while property owners, managers and the owner keep using the website. The app talks only to your website, so all data stays on your server.
What is in the package
| Folder / file | What it is |
|---|---|
lib/ | The app's source code (Flutter / Dart). |
assets/ | logo.png (login screen) and icon.png (app icon). |
setup.sh | One command that creates the iPhone project folder with every setting already applied. |
pubspec.yaml | App version and the list of libraries. |
docs/API.md | Reference of the website API the app uses (for developers who want to extend it). |
documentation/ | This guide. |
Features
Tenant features
| Area | What the tenant can do |
|---|---|
| Home | Next payment and amount due (red when overdue) with Pay now; total paid this year; lease dates and rent (and any scheduled rent change); property, address, unit, rooms, household; security deposit; autopay status; open repairs; polls to answer; documents that expire soon; inspection report waiting for a signature; parking; upcoming events. Quick buttons: Report a problem, Ask the assistant, Visitor pass, Book a facility. |
| Invoices | Open / paid / all invoices; invoice details with items, payments, credit notes; online payment (Stripe / Razorpay — opens the website's secure payment page); PDF receipts downloaded and opened on the phone. The invoice refreshes by itself after paying. |
| Repairs | Report a problem with type, description, photo (camera or gallery) and preferred visit day and time slot; follow the status; see the assigned maintainer and "on the way" notice; message the maintainer and office; rate the job when it is completed. |
| Assistant | Chat assistant (AI when enabled on the website) that answers questions, can raise a repair request from the conversation, and shows replies from office staff. |
| Payment history | All payments grouped by year with totals per year and receipt downloads. |
| Security deposit | Amount held, received, deducted, refunded, the unit's required deposit and every entry. |
| My documents | Documents on file (ID, insurance, …) with type, expiry date and "expired" / "expires soon" labels; open the file. |
| Inspections | Move-in, move-out and routine inspection reports room by room with condition, notes and photos; sign the report in the app. |
| Utility readings | Meter readings for the unit: previous / current reading, usage, rate and amount. |
| Notice board | Notices from the property manager. |
| Facility bookings | Book shared facilities (hall, gym, …) by free time slot, see bookings and their approval, cancel. |
| Visitor passes | Create a pass with visitor name, date, phone, purpose and vehicle; share the pass code; cancel. |
| Polls | Vote in property polls and see results when the manager allows it. |
| Agreements | Read the lease agreement PDF and sign with a finger. |
| Profile | Name, phone, change password, phone notifications on/off, test notification, sign out. |
Maintainer features
| Area | What the maintainer can do |
|---|---|
| Home | Counts (urgent, pending, in progress, completed this month, hours, new today); today's visits; earnings this month; work queue (most urgent first); preventive maintenance tasks; recent ratings and feedback. |
| Schedule | The next 14 days by day (Today, Tomorrow, …): repair visits on the tenant's preferred day and time slot plus preventive tasks; jobs without a set day at the end. |
| Jobs | Open / pending / in progress / completed jobs. Job details: problem, AI summary and priority, photos, address with Directions (maps app), tenant name and Call, earlier repairs at the same unit, messages. |
| Updates | "I'm on my way" (the tenant gets a notification and SMS); change status; enter cost, hours worked and fixed date; add an after photo and an invoice file. Completing the job notifies the tenant. |
| Account | Trade, properties covered, jobs completed, total hours, total billed, rating, member since; profile, phone notifications, sign out. |
Common to both
- Login with email and password, "Remember me", forgot password, and the 6-digit code when the user has 2-factor login on the website.
- Notifications inbox: bell with unread count on the home screen; tap a notification to open the right screen; "Mark all read".
- Push notifications — see the Push notifications section for the full list of events.
- Dynamic branding: login screen shows the website's logo, name and colours; after sign-in the user's company branding.
- Money and dates are shown in the company's currency and date format (set on the website).
- Server messages (errors, confirmations) follow the user's language on the website. The app's own labels are English; translate them in
lib/if needed. - Works with large phone font sizes and dark mode.
- Offline-friendly start: remembers the session and branding; shows "No connection" with Retry when the server cannot be reached.
Requirements
Your computer (to build the app)
| What | Version / notes |
|---|---|
| Mac | Apple Silicon (M1 or newer) recommended; macOS version required by the current Xcode |
| Xcode | Latest version from the Mac App Store (App Store uploads require a recent Xcode / iOS SDK) |
| Flutter SDK | Latest stable release (3.27 or newer; tested with 3.47) |
| CocoaPods | Latest (brew install cocoapods) |
| Disk | About 30 GB free (Xcode is large) |
Phones that can run the app
iPhone with iOS 15 or newer.
Accounts
| Account | Cost | Needed for |
|---|---|---|
| Apple ID | Free | Running on your own iPhone during development |
| Apple Developer Program | $99 per year | Push notifications, TestFlight, App Store |
| Firebase (Google) | Free (Spark plan is enough) | Push notifications |
Enrol as an Organization (needs a D-U-N-S number, the seller name shows your company) or as an Individual (shows your personal name).
Website
Smart Tenant v3.6 or newer on HTTPS — see Prepare the website.
Install Xcode & Flutter
- Xcode: install from the Mac App Store, open it once, accept the licence and let it install components. Then in Terminal:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch xcodebuild -downloadPlatform iOS - Homebrew and CocoaPods (Homebrew from brew.sh):
brew install cocoapods - Flutter: follow docs.flutter.dev/get-started/install/macos
(iOS). Add Flutter's
binfolder to your PATH (e.g. in~/.zshrc). - Check:
It must show ticks for Flutter and Xcode. (Android Studio is not needed for iPhone.)flutter doctor
Prepare the website
Do this once on the website before building the app.
- Website on HTTPS. Install Smart Tenant v3.6+ on your domain with an SSL certificate
(Let's Encrypt is free). Release builds of the app refuse plain
http://. - Run the update. If you upgraded an existing website, make sure the database update ran
(
php artisan migrate --force, or the website's update screen). It creates the tables for phones and notifications. - Find your API address. Sign in as the owner → Settings → Mobile App. The page shows the address the app
needs, which is your website address followed by
/api/v1, for examplehttps://app.yourdomain.com/api/v1. Openhttps://app.yourdomain.com/api/v1/app-configin a browser: you should see JSON with your logo and colours. - Branding. Settings → General (Application Name, logo, favicon) and the theme colour are used by the app's login screen. Each owner's own General settings and theme are used after their tenants sign in.
- Accounts to test with. Create (or use) one tenant account and one maintainer account on the website.
- Cron job. The website's cron (
php artisan schedule:runevery minute) sends the reminder notifications (rent due, lease and document expiry). - Upload size. Photos are sent from the iPhone; set PHP
upload_max_filesizeandpost_max_sizeto at least10M.
Set up the project
- Unzip the package. It contains the
iphone_appfolder; put it in a path without spaces, for example~/projects/iphone_app. - Choose your bundle identifier prefix: your company's reversed domain, e.g.
com.acmehomes. The app's bundle ID becomescom.acmehomes.smartTenant(you can change it in Xcode in the next steps).The bundle ID cannot change after the app is created in App Store Connect. - Run the setup script in Terminal:
It creates thecd ~/projects/iphone_app chmod +x setup.sh ./setup.sh com.acmehomes "Acme Homes" cd ios && pod install && cd ..ios/folder and applies everything the app needs:- Camera and photo library permission texts
- Background notifications
- App name under the icon (
CFBundleDisplayName) - App icon from
assets/icon.png - Downloads the Flutter libraries
- Set your website address in
lib/config/app_config.dart:static const String appName = 'Acme Homes'; static const String apiBaseUrl = String.fromEnvironment('API_BASE_URL', defaultValue: 'https://app.yourdomain.com/api/v1'); static const String websiteUrl = 'https://app.yourdomain.com'; - Open the Xcode project — always the workspace:
open ios/Runner.xcworkspace
How the setup script works
The ios/ folder is not included in the package on purpose: every app needs its own permanent bundle ID, so the folder is created on your computer with yours. setup.sh does this in two steps.
Step 1 — Flutter creates the folder
The script runs Flutter's own command:
flutter create . --org com.acmehomes --project-name smart_tenant --platforms ios
This builds a standard ios/ folder from Flutter's official template with your ID (com.acmehomes.smartTenant). The app's code in lib/ is not touched.
Step 2 — the script adds this app's settings
Flutter's template is generic, so the script then edits the new files:
| File | What is added |
|---|---|
ios/Runner/Info.plist | Camera and photo permission messages, background notifications, app name under the icon |
| All icon sizes | Generated from assets/icon.png (dart run flutter_launcher_icons) |
| Libraries | Downloaded with flutter pub get |
Result
iphone_app/
ios/ <- created, with com.acmehomes.smartTenant
lib/ (unchanged)
assets/
...
- Safe to run again: settings are never added twice. Run it again to change the app name.
- Different ID before publishing: delete the
ios/folder and run the script again with the new ID. After publishing the ID cannot change. - Next: run
cd ios && pod install(shown above). It downloads the iOS libraries the app uses.
Every change is also listed in Manual iOS settings, for reference or to make them by hand.
Xcode signing & capabilities
In Xcode select Runner (blue icon, left) → target Runner:
- Signing & Capabilities tab → tick Automatically manage signing → Team: your Apple Developer team (add your Apple ID in Xcode → Settings → Accounts if the list is empty).
- Bundle Identifier: check it, e.g.
com.acmehomes.smartTenant. It must be unique in the App Store. - Click + Capability → Push Notifications.
- Click + Capability → Background Modes → tick Remote notifications.
- General tab → Minimum Deployments: iOS 15.0. Display Name: your app name.
- Optional (saves a question at every upload): in
ios/Runner/Info.plistadd<key>ITSAppUsesNonExemptEncryption</key><false/>— the app only uses standard HTTPS encryption.
Run on an iPhone or simulator
Simulator
open -a Simulator
flutter run
Your iPhone
- Connect the iPhone with a cable, unlock it and tap Trust.
- On the iPhone: Settings → Privacy & Security → Developer Mode → on (restart when asked).
- Run
flutter run(or press ▶ in Xcode with your iPhone selected). The first time, on the iPhone go to Settings → General → VPN & Device Management and trust your developer certificate.
Testing against a local website (http)
For quick tests against a website on your Mac (simulator only): flutter run --dart-define=API_BASE_URL=http://localhost/smart-tenant/main_file/api/v1.
iOS blocks plain http:// on real devices unless you add an App Transport Security exception — for real devices, test against an https website.
Sign in with the tenant or maintainer account you created on the website.
Branding & customisation
Changes that need no new build (from the website)
| What | Where on the website |
|---|---|
| Logo and name on the login screen | Owner → Settings → General (Application Name, Logo) |
| Colours | Owner → Settings → theme colour |
| Company logo, name, colours after sign-in | Each owner → Settings → General / theme |
| Push notification setup | Owner → Settings → Mobile App |
The app checks for changes every time it opens. The look is remembered, so it opens correctly even offline.
Changes in the code (then build again)
| What | How |
|---|---|
| App name under the icon | Second argument of setup.sh (run it again), e.g. ./setup.sh com.acmehomes "Acme Homes". Also set appName in lib/config/app_config.dart. |
| Website address | apiBaseUrl in lib/config/app_config.dart (or --dart-define=API_BASE_URL=… when building). |
| App icon | Replace assets/icon.png (1024×1024 px, your mark on a solid background, no transparency).
Then run dart run flutter_launcher_icons. For iPhone the icon must have no transparency (remove_alpha_ios: true is already set). |
| Fallback logo | Replace assets/logo.png (used only before the website has answered once). |
| Fallback colours | brandColor and brandDarkColor in lib/config/app_config.dart. |
| "Use the website" link on login | websiteUrl in lib/config/app_config.dart. |
| Texts / translation | Screen texts are in lib/screens/. Search for the English text and replace it. |
The settings file:
class AppConfig {
static const String appName = 'Acme Homes';
static const String apiBaseUrl = String.fromEnvironment('API_BASE_URL',
defaultValue: 'https://app.yourdomain.com/api/v1');
static const Color brandColor = Color(0xFF2CA58D); // buttons, links
static const Color brandDarkColor = Color(0xFF0A2342); // headings, accents
static const String logoAsset = 'assets/logo.png';
static const String websiteUrl = 'https://app.yourdomain.com';
}Push notifications (Firebase + APNs)
Without this step the app works and shows updates in the bell inbox, but iPhones do not get notifications. Apple delivers iPhone notifications through APNs; Firebase connects your website to APNs. The Firebase app settings are pasted on the website: no Firebase file inside the app.
A. Apple: APNs key
- developer.apple.com → Certificates, IDs & Profiles → Keys → +.
- Name it (e.g. "Push"), tick Apple Push Notifications service (APNs) → Continue → Register.
- Download the
.p8file (you can download it only once) and note the Key ID and your Team ID (top right of the page). - Check Identifiers → your bundle ID has Push Notifications enabled (Xcode does this when you add the capability).
B. Firebase
- console.firebase.google.com → create a project, or use the one for your Android app.
- Add app → iOS: Apple bundle ID exactly as in Xcode (e.g.
com.acmehomes.smartTenant) → Register. - Download GoogleService-Info.plist. Do not add it to Xcode; skip the remaining SDK steps.
- Project settings → Cloud Messaging → Apple app configuration → APNs Authentication Key → Upload: the
.p8file, Key ID and Team ID. - Project settings → Service accounts → Generate new private key (only once per project; skip if you did it for Android).
C. Website
- As the owner: Settings → Mobile App. Open each file in a text editor and paste:
- the service account key JSON → Firebase service account
- the
GoogleService-Info.plistcontent → iPhone app (GoogleService-Info.plist)
- On a real iPhone (the simulator has limited push support): close and reopen the app, sign in and tap Allow for notifications.
- Test: tenant More → Send a test notification (maintainer: Account).
When users are notified
| Who | Event | Opens |
|---|---|---|
| Tenant | New invoice, rent reminder | Invoices |
| Tenant | Payment received, rent paid automatically (autopay), automatic payment failed, refund or credit issued | Invoices |
| Tenant | Repair status changed, maintainer "on the way" | Repairs |
| Tenant | Reply from the office in the assistant chat | Assistant |
| Tenant | Visitor has arrived | Visitor passes |
| Tenant | Facility booking approved / not approved | Facility bookings |
| Tenant | New notice, new poll | Notice board / Polls |
| Tenant | Rental agreement ready to sign | Agreements |
| Tenant | Inspection report ready to sign | Inspections |
| Tenant | Document expiring soon, lease ending soon, rent change notice | My documents / Home |
| Maintainer | New job assigned | Jobs |
Every notification is also saved in the in-app inbox (the bell), even when phone notifications are off. Each user can switch phone notifications off under More (tenant) or Account (maintainer).
Version numbers
The version is in pubspec.yaml:
version: 1.0.0+1
1.0.0→ CFBundleShortVersionString (the version users see).+1→ CFBundleVersion (build number). Every upload to App Store Connect needs a higher build number (for the same version) or a new version.
Create the app in App Store Connect
- appstoreconnect.apple.com → Apps → + → New App.
- Platform iOS, name (max 30 characters, must be unique in the App Store), primary language, bundle ID (the one from Xcode), SKU (any
internal code, e.g.
acme-tenant-ios), access: Full.
Build & upload
Make sure apiBaseUrl points to your https website, then:
flutter clean
flutter pub get
cd ios && pod install && cd ..
flutter build ipa --release
# file: build/ios/ipa/*.ipa (archive: build/ios/archive/Runner.xcarchive)
Upload it with one of:
- Transporter app (free on the Mac App Store): drag the
.ipain → Deliver. - Xcode: open
build/ios/archive/Runner.xcarchive→ Organizer → Distribute App → App Store Connect → Upload. - Command line:
xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa --apiKey <key> --apiIssuer <issuer>
After 5–30 minutes the build appears in App Store Connect → your app → TestFlight.
Alternative: in Xcode choose Any iOS Device (arm64) → Product → Archive → Distribute App.
TestFlight (beta testing)
- App Store Connect → TestFlight → the build → answer Export compliance ("uses only standard encryption / exempt") if asked.
- Internal testing: add up to 100 people from your App Store Connect team — available at once.
- External testing: up to 10,000 testers by email or public link; the first build gets a short beta review (about a day). Add the demo login in "Test information".
- Testers install TestFlight from the App Store and open your invitation.
Publish on the App Store
1. App information & pricing
- Category: Lifestyle or Business (secondary optional)
- Content rights: no third-party content
- Age rating: answer the questionnaire (all "None") → 4+
- Price: Free; choose countries
2. App Privacy
Privacy policy URL and the data types — see Privacy & data safety. Data is "linked to the user", "not used for tracking".
3. Version page
| Item | Requirement | Suggestion |
|---|---|---|
| Screenshots | iPhone 6.9" (1320×2868 or 1290×2796) required; 6.5" (1242×2688) if asked. 1–10 each. | Take them in the iPhone 16/17 Pro Max simulator (⌘+S) |
| Promotional text | Max 170 characters | Can change any time without review |
| Description | Max 4000 characters | Tenant and maintainer features from this guide |
| Keywords | Max 100 characters, comma separated | rent,tenant,landlord,repairs,maintenance,property,lease |
| Support URL | Required | Your website's contact page |
| Build | Select the uploaded build |
4. App Review information
- Sign-in required: give a demo tenant email and password (and mention a maintainer login in the notes). The demo account must have data (an invoice, a repair, a notice) so the reviewer can see the app working.
- Notes (example): "Smart Tenant is used by tenants and maintenance staff of property management companies. Accounts are created by the property manager on the company's website; there is no in-app sign-up. Rent is paid on the property manager's website (a real-world service). Users can request account deletion by emailing support@yourdomain.com."
- Contact name, phone and email.
5. Submit
Add for Review → Submit. Review usually takes 1–3 days. Choose automatic or manual release after approval.
Common rejection reasons and how to avoid them
| Guideline | What to do |
|---|---|
| 2.1 App completeness | Demo account works, website online, data present, no placeholder texts. |
| 5.1.1(v) Account deletion | Explain how users request deletion (see notes above) and put it in the privacy policy. |
| 4.2 Minimum functionality | Describe the many tenant and maintainer features in the notes and screenshots. |
| 3.1.1 Payments | Rent is a physical service: paying on the website is allowed. Do not sell digital content. |
| 5.1.2 Data use | Privacy labels must match the app (no tracking). |
| 4.0 Design | Your own icon and name (not the default), screenshots from the real app. |
Updates
Raise the version/build in pubspec.yaml, build, upload, create a new version in App Store Connect, select the build, submit.
Building without a Mac
- Codemagic (codemagic.io): connect your Git repository, choose the Flutter workflow, add your App Store Connect API key, and it builds and uploads to TestFlight. Has a free monthly build allowance.
- Cloud Mac rental (MacinCloud, AWS EC2 Mac, …): use it like a normal Mac through remote desktop and follow this guide.
- Signing and capabilities can be set up on developer.apple.com in the browser.
Privacy & data safety
Both stores require a privacy policy URL and a description of the data the app handles. Publish a privacy policy page on your website and use these answers in App Store Connect → App Privacy:
| Data | Collected | Purpose | Notes |
|---|---|---|---|
| Name, email, phone number | Yes | Account management, app functionality | Entered by the property manager or the user |
| Photos | Yes (optional) | App functionality | Repair photos, after photos |
| Signature image | Yes (optional) | App functionality | Agreement signing |
| Messages | Yes | App functionality, customer support | Repair messages, assistant chat |
| Payment info | No (in the app) | — | Payment happens on the website's payment page |
| Device / push token | Yes | App functionality | To send notifications |
| Location | No | — | Directions open the phone's maps app |
| Analytics, ads, tracking | No | — | No analytics or advertising libraries |
- Data is encrypted in transit (HTTPS).
- Data is not sold or shared with third parties for advertising.
- Users can ask the property manager to delete their account; mention this (with a contact email) in the privacy policy.
iPhone permissions used
| Permission | Text shown (Info.plist) |
|---|---|
| Camera | Take photos of problems and finished repairs. |
| Photo library | Attach photos of problems and finished repairs. |
| Notifications | Asked after sign-in |
Change the texts in ios/Runner/Info.plist (e.g. to translate them).
Manual iOS settings
What setup.sh adds to ios/Runner/Info.plist:
<key>CFBundleDisplayName</key>
<string>Acme Homes</string>
<key>NSCameraUsageDescription</key>
<string>Take photos of problems and finished repairs.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Attach photos of problems and finished repairs.</string>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>Plus in Xcode: Push Notifications capability (creates Runner.entitlements with aps-environment) and the app icon
(dart run flutter_launcher_icons).
Code structure
| Path | Contents |
|---|---|
lib/main.dart | Start-up, theme, chooses login / tenant / maintainer screens |
lib/config/app_config.dart | White-label settings |
lib/core/api_client.dart | HTTP client: token, JSON, errors, downloads |
lib/core/auth_store.dart | Sign-in state, restores the saved session |
lib/core/branding.dart | Logo, name and colours from the website |
lib/core/push_service.dart | Firebase notifications, unread badge, opening the right screen |
lib/screens/tenant/, maintainer/, common/, auth/ | All screens |
lib/widgets/ | Shared widgets |
ios/ | Xcode project (created by setup.sh) |
docs/API.md | Every API endpoint with parameters and responses |
Libraries used: dio, provider, flutter_secure_storage (Keychain), firebase_core, firebase_messaging, flutter_local_notifications, url_launcher, image_picker, path_provider, open_filex, signature, cached_network_image, flutter_launcher_icons.
Updating to a new version
When a new version of the app is released:
- Back up your project folder (especially
ios/,lib/config/app_config.dartandassets/). - Update the website first if the release notes say the app needs a newer website version.
- Replace
lib/,pubspec.yaml,setup.sh,docs/anddocumentation/with the new files. Keep your ownios/folder, yourassets/images and put your values back intolib/config/app_config.dart. - Run
./setup.sh com.yourcompany "Your App Name"again (same values as before). It only adds missing settings and never changes your package name or signing. - Raise the version in
pubspec.yaml(see "Version numbers"), build and upload as usual.
After replacing files run cd ios && pod install.
Troubleshooting
| Problem | Solution |
|---|---|
pod install fails / "CocoaPods not installed" | brew install cocoapods; then cd ios && pod repo update && pod install. |
| "…requires a higher minimum iOS deployment version" | In ios/Podfile set platform :ios, '15.0' (uncomment the line), then pod install. |
| "No profiles for … were found" / signing errors | Xcode → Signing & Capabilities: choose your Team, Automatically manage signing on; the bundle ID must be unique. |
| "Untrusted Developer" on the iPhone | Settings → General → VPN & Device Management → trust your certificate. |
| Build fails after Xcode update | flutter clean, delete ios/Pods and ios/Podfile.lock, flutter pub get, cd ios && pod install. |
| "No connection" on every screen | Wrong apiBaseUrl or the website is not on HTTPS (iOS blocks http). Open …/api/v1/app-config in Safari on the iPhone. |
| "The app is for tenants and maintainers" | The account is an owner/manager/admin; use the website or a tenant/maintainer account. |
| No notifications | Real iPhone (not simulator)? Push Notifications + Background Modes capabilities added? APNs key uploaded to Firebase with correct Key ID/Team ID? Bundle ID in Firebase matches Xcode? Website Settings → Mobile App shows ticks? Notifications allowed in iPhone Settings? Use "Send a test notification". |
| Upload rejected: "Invalid Bundle / missing icon" | Run dart run flutter_launcher_icons; icon must be 1024×1024 without transparency. |
| Upload: "The bundle version must be higher" | Raise the +number in pubspec.yaml. |
| Missing compliance on every build | Add ITSAppUsesNonExemptEncryption = NO to Info.plist (see Xcode section). |
| Photos fail to upload | Raise PHP upload_max_filesize / post_max_size to 10M+ on the server. |
FAQ
Do I need one app per property owner?
No. One app serves all companies on your website; after sign-in it shows the tenant's company branding.
Can owners or managers use the app?
Not in this version. They are directed to the website, which is fully mobile friendly.
Where is the data stored?
Only on your website/server. The phone keeps the login token (in secure storage) and the last branding.
Does the app work without the website?
No, every screen loads from your website's API.
Can I change the API without a new build?
The website address is built into the app. Branding and push settings are not — they come from the website.
How do payments work?
Pay now opens the website's secure payment page (Stripe/Razorpay) in the browser; card data never passes through the app. This is allowed by both stores because rent is a real-world service.
Can I build the iPhone app on Windows?
Not directly. Use a cloud Mac or Codemagic (see Building without a Mac).
Can I publish under my own company?
Yes — your bundle ID, app name, icon and Apple Developer account (enrol as Organization to show your company name).
Do I need the Android version too?
No. This product covers the iPhone app; both use the same website.
Support & changelog
Before contacting support, please check the Troubleshooting section and run flutter doctor.
When you contact support, include:
- Your purchase code
- App version (
pubspec.yaml) and website version - Output of
flutter doctor -v - The exact error message or a screenshot
- What you did just before the problem
Support covers installation questions, bugs and help with the steps in this guide. Customisations (new features, design changes) are not included in support but can be ordered separately.
Changelog
| Version | Date | Changes |
|---|---|---|
| 1.0.0 | October 2026 | First release: tenant and maintainer apps, online payments, repairs with photos, assistant, agreements and inspections signing, deposit, documents, utility readings, notices, polls, bookings, visitor passes, schedule, push notifications and inbox, dynamic branding. |