Android

Job Board SaaS – Android App Documentation

App v1.0.0 · needs Job Board SaaS 1.9+

Overview

Job Board Recruiter is the Android app for the people who run hiring with the Job Board website: owner, HR, recruiters and hiring managers. Candidates keep using your careers website. The app talks only to your website, so all data stays on your server.

One app for every companyThe platform address is set once when you build the app. People find their company with its code, a QR code or an invite link, then sign in with their normal account.
Same rules as the websitePermissions, hiring-manager limits and stage automations are the website's own, because every action runs through its API.
Works with a weak signalThe last answer of each list is kept, so screens still open without internet.
Push notificationsOne Firebase project for the whole platform, saved by the super admin. An in-app list works without it.
SecureLogin token in the phone's secure storage; https only; two-factor sign-in supported.
Ready for Google PlayStep-by-step build, signing and store submission in this guide.

What is in the package

AppFolderPackage nameFor
Job Board Recruiterrecruiter_app/android_app/com.smartweb.jobboard.job_board_recruiterOwner, managers, HR, recruiters, hiring managers

Inside the folder:

Folder / fileWhat it is
lib/The app's source code (Flutter / Dart): api/, state/, util/, screens/, widgets/.
android/The Android project, already set up (permissions, icons, Firebase and signing hooks).
assets/icon.png, the app icon.
test/, tool/Automated tests (they run against a pretend server, no internet needed) and the script that makes the store screenshots.
docs/openapi.yaml (the API the app uses) and screenshots/.

Features

For the hiring team

What each login can do

The app shows only what the signed-in person may use on the website. These are the usual roles; you can change them under Roles & Permissions.

LoginIn the app
OwnerEverything: dashboard, candidates (add, compare, bulk, move, rate, email), schedule interviews, offers, jobs and requisitions (approve), talent pool invitations, reports, AI score and assistant, onboarding, activity, and the notifications of the whole company.
Manager / HRThe same as the owner except what the role does not include: typically no approvals, activity log or settings. Candidates, interviews, offers, reports and the talent pool are available.
RecruiterJobs, candidates (search, add, move, comment, email), interviews and scorecards, talent pool. Reports and offers only if the role allows them.
InterviewerTheir own interviews (Mine), the video link, the candidate profile and the scorecard, plus a reminder list of scorecards still owed.
Hiring managerTheir own dashboard with their jobs and candidates, only for the jobs they are assigned to. They read profiles and timelines, join interviews, fill in scorecards, compare candidates and send feedback (shortlist / keep on hold / not a fit with a reason) that reaches the recruiters as a comment and a notification. They cannot edit, schedule, send offers or email candidates.

Common

Requirements

Your computer (to build the app)

Phones that can run the app

Accounts

Website

Install Flutter & Android Studio

  1. Install Flutter: docs.flutter.dev/get-started/install. Add flutter/bin to your PATH.
  2. Install Android Studio, open it once and let it install the Android SDK. In SDK Manager → SDK Tools tick Android SDK Command-line Tools.
  3. Accept the licences and check everything:
    flutter doctor --android-licenses
    flutter doctor -v
    Every line should have a green tick (Chrome and Xcode lines do not matter for Android).

Prepare the website

The app talks to your Job Board website through its API. Check these once:

  1. Job Board SaaS 1.9 or newer is installed (the API, the super admin's Mobile Apps page and the owners' Mobile App page come with it). After updating run php artisan migrate.
  2. https. Phones refuse plain http:// addresses. Install an SSL certificate and set APP_URL=https://your-domain.com in the website's .env.
  3. As super admin open Mobile Apps and save the Google Play and App Store links once your app is published, plus the shared push key. Each owner then opens Integrations → Mobile App to set the company's app name, logo, icon and colour. The address the app connects to is set in the app itself (see Set your platform address).
  4. Make sure the cron line of the website is set, so interview reminders (and their push messages) are sent.
  5. Create the users: Users in the admin panel. Give hiring managers the Hiring Manager role and tick them on their jobs.
The app shows only what the signed-in person may see on the website. A hiring manager sees only their assigned jobs and those jobs' candidates, interviews and scorecards.

Open the project

  1. Unzip the package and open the folder recruiter_app/android_app in Android Studio, or in a terminal.
  2. Download the packages:
    cd recruiter_app/android_app
    flutter pub get
  3. Optional check:
    flutter analyze
    flutter test
    Both should finish without errors. The tests use a pretend server, so they need no internet and no website.

Run on a phone or emulator

On a real phone

  1. On the phone open Settings → About phone and tap Build number seven times. Then in Developer options switch on USB debugging.
  2. Connect it by USB and allow the computer. Check: flutter devices.
  3. Start the app:
    flutter run

On the emulator

  1. In Android Studio open Device Manager and create a phone (Pixel, recent Android).
  2. Start it and run flutter run.
The emulator cannot reach a website on your computer through localhost. Use the website's real https address, or http://10.0.2.2/... only for local tests (plain http is blocked in release builds).

Set your platform address

One app is published for the whole platform and serves every company. The first time, a person enters their company code, scans the company's QR code or opens its invite link (jobboard://join/<code> or https://your-platform/join/<code>). The app then shows that company's logo, name and colour before sign-in, and sign-in is refused for accounts of other companies. The platform may also refuse the app: app disabled (the super admin switched the company off), plan ended, maintenance or update needed (below the lowest version set on Mobile Apps); the app shows the message. Make sure scanning works by keeping the camera permission that is already declared in the project.

Job Board is installed on your own server, so the app is built for it and does not ask people for an address or a company code. You set the address once, before you build:

  1. Open lib/config.dart and replace the address in defaultServer with your platform address (the same as APP_URL in the website's .env, https, no slash at the end):
    static const defaultServer = 'https://jobs.yourcompany.com';
  2. Or leave the file as it is and give the address when you run or build:
    flutter run --dart-define=SERVER_URL=https://jobs.yourcompany.com
    flutter build appbundle --release --dart-define=SERVER_URL=https://jobs.yourcompany.com
  3. Run the app. It opens straight on the sign-in page with your company name. Sign in with your email and password (plus the 6-digit code if two-factor is on).
A build that still has the placeholder address shows This app is not set up yet with these same instructions.

Push notifications (Firebase)

Optional. Without it the app has its notification list, but no messages on the lock screen.

  1. Create a project at console.firebase.google.com and add an Android app with your package name (see Your own app id).
  2. Download google-services.json and put it in android/app/. The build picks it up automatically.
  3. In Firebase open Project settings → Service accounts → Generate new private key. As super admin open Mobile Apps and paste the file under Push notifications. It is stored encrypted and serves every company (a company may add its own key, but it must belong to the same Firebase project the app was built with).
  4. Rebuild and install the app, sign in, then press Send me a test message on the Mobile App page.

When people are notified

Only people with the matching permission who use the app are told; a hiring manager only hears about their own jobs.

Version numbers

In pubspec.yaml the line version: 1.0.0+1 has two parts: 1.0.0 is what people see, +1 is the build number. Google Play rejects a build number it has already seen. Raise both for every update you upload.

Your own app id

The package name com.smartweb.jobboard.job_board_recruiter is ours. Choose your own (for example com.yourcompany.hiring) before you publish. Change it in two places: applicationId and namespace in android/app/build.gradle.kts, and the folder / package line of MainActivity under android/app/src/main/kotlin/. Use the same name in Firebase.

The app name people see is android:label in android/app/src/main/AndroidManifest.xml (currently Job Board). To change the icon, replace assets/icon.png (1024 × 1024) and run dart run flutter_launcher_icons.

Signing key (keystore)

Google Play only accepts apps signed with your own key. Keep the key and its passwords safe: if you lose them you cannot update the app.

  1. Create the key:
    keytool -genkey -v -keystore ~/jobboard-upload.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
  2. Create android/key.properties (it is excluded from git; never share it):
    storePassword=YOUR_STORE_PASSWORD
    keyPassword=YOUR_KEY_PASSWORD
    keyAlias=upload
    storeFile=/home/you/jobboard-upload.jks
  3. The build reads that file automatically. Without it, release builds are signed with the debug key and cannot be published.

Build the release

cd recruiter_app/android_app
flutter build appbundle --release   # file for Google Play
flutter build apk --release         # a file to install directly on phones

The files are in build/app/outputs/bundle/release/app-release.aab and build/app/outputs/flutter-apk/app-release.apk.

Publish on Google Play

  1. Create the app in the Play Console (name, language, app, free).
  2. Fill in App content: privacy policy link, app access (give reviewers a test account and the address of a demo server), ads (none), data safety (see Privacy & data safety), target audience.
  3. Store listing: short and full description, icon (512 px) and phone screenshots (use the pictures in docs/screenshots/).
  4. Upload the .aab under Production (or Internal testing first), review and roll out.

Updates

Raise the version in pubspec.yaml, build a new .aab, upload it as a new release.

Privacy & data safety

The app has no analytics or advertising and talks only to your Job Board website (and to Firebase if you switch on push). Use this for the store forms:

DataCollected by the app?Notes
Name, email, phoneShown, not collectedAccount details of your staff and candidate details held on your website. They stay on your server.
Photos and filesNoThe app only opens resumes and documents that are already on your website.
LocationNo
Device identifiersPush token (optional)Sent to your website only if push is switched on, so it can send notifications. Removed on sign out.
Saved on the phoneYesLogin token (secure storage) and the last answers of lists (so they open offline). Both are deleted on sign out.

You are responsible for your own privacy policy (candidate data is personal data) and for stating where it is stored.

Android permissions used

PermissionWhy
INTERNETTalk to your Job Board website.
POST_NOTIFICATIONSShow push messages (Android 13 and newer asks the person).

Code structure

lib/
  main.dart                       start-up
  config.dart                     the address of your website (set before building)
  screens/                        every screen (app_root.dart switches between sign in and the app)
  api/                            API client (token, errors, remembered answers)
  state/                          sign-in, secure session storage, cache, push, app scope
  util/                           theme, date and text helpers
  widgets/common.dart             cards, pills, loader with pull-to-refresh, messages
test/                             unit and screen tests against a pretend server
tool/screenshots.sh               makes docs/screenshots/*.png from sample data
docs/openapi.yaml                 the API the app uses

The website address is in lib/config.dart. Colours and the theme are in lib/util/theme.dart (the teal is Brand.teal). The code in lib/ is the same in the Android and iPhone projects; change both, then run mobile_app/check-sync.sh.

Updating to a new version

  1. Keep a copy of your changes, your signing key and google-services.json.
  2. Unzip the new package, copy your changes over, run flutter pub get, flutter analyze and flutter test.
  3. Raise the version in pubspec.yaml and build again.

The app and the website are updated separately. Keep the platform at Job Board SaaS 1.9 or newer; the app uses its API.

Troubleshooting

ProblemTry this
“This app is not set up yet”The platform address was never set. See Set your platform address.
“Cannot reach the server” on the sign-in pageCheck the address in lib/config.dart and open it in the phone's browser. Check the SSL certificate (an expired or self-signed certificate is refused) and that the phone has internet.
Sign-in says the code is wrongCheck the phone's clock is set automatically (authenticator codes depend on the time).
A menu or tab is missingThe app follows the website's permissions. Check the user's role under Roles & Permissions.
A hiring manager sees no jobsTick the person under Hiring managers on the job in the admin panel.
No push messagesCheck that the super admin saved the Firebase key under Mobile Apps (push shows as On) and that the owner's Integrations → Mobile App page lists the phone and Send me a test message works. Make sure google-services.json is in android/app/ and the package name matches Firebase.
The list shows old data and a bannerThere is no connection. Pull down to refresh when it returns.
flutter doctor shows a problemFix the red line it shows, then run it again.

FAQ

Can one app serve several websites? No. The app is built for one website (yours). To serve another Job Board installation, build a second copy with that address.

Do candidates use this app? No. Candidates use your careers website. This app is for your hiring team.

Is the app free to use once built? Yes. There is no fee for the app itself; you pay the store developer fee and your own hosting.

Can I change the colours and name? Yes, see Your own app id and lib/util/theme.dart.

Is the AI assistant in the app? AI fit scores and summaries are shown when AI is connected on the website. The AI assistant chat itself is on the website for now.

Support & changelog

Open a ticket at support.smartwebinfotech.com. Please include your purchase code, the app version (pubspec.yaml) and website version, the output of flutter doctor -v, the exact error or a screenshot, and what you did just before.

Support covers installation questions, bugs and help with the steps in this guide. Customisations (new features, design changes) are not included.

Changelog

VersionDateChanges
1.0.0October 2026First release: Job Board Recruiter. Find your company with its company code, QR code or invite link, then sign in with your account (two-factor supported), dashboard, candidates with search, compare, bulk actions and add-by-hand, candidate profile with timeline and comments, schedule and reschedule interviews, scorecards, offers (write and send), AI score and assistant, talent-pool matches and invitations, hiring-manager feedback, jobs, requisitions, reports, onboarding, activity, notifications and push, saved lists.