Overview
Job Board Recruiter is the iPhone 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.
What is in the package
| App | Folder | Bundle id | For |
|---|---|---|---|
| Job Board Recruiter | recruiter_app/iphone_app/ | com.smartweb.jobboard.job_board_recruiter | Owner, managers, HR, recruiters, hiring managers |
Inside the folder:
| Folder / file | What it is |
|---|---|
lib/ | The app's source code (Flutter / Dart): api/, state/, util/, screens/, widgets/. |
ios/ | The iPhone project, already set up (permissions, icons and notification settings). |
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
- Sign in with the same email and password as on the website; accounts with two-factor sign-in are asked for the 6-digit code. The app is built for your platform, so nobody types a server address. The first time, a person enters a company code (or scans the company QR code or opens an invite link) and sees their company's logo, name and colour.
- Home: key numbers, Needs your attention (waiting candidates, flagged candidates, interviews without a scorecard), summary, coming interviews, latest applicants and the pipeline. Hiring managers see their own jobs and candidates instead.
- Candidates: search names, skills and resume text; filter by stage, flagged or talent pool; long-press to select several and compare (2 to 4) or reject, add to the talent pool or archive in bulk. Add a candidate by hand with the Add button.
- Candidate: profile, AI fit and summary, knock-out flag, screening answers, timeline, comments, call / email / send a template, move stage, rate, talent pool, archive, resume and documents. From here you can also schedule an interview (the candidate is emailed with a calendar file and a video link), write and send an offer and, when AI is connected, score the candidate with AI.
- Interviews: upcoming by day with an Everyone / Mine switch, join the video link, reschedule or cancel, and fill in the scorecard. Past interviews that still need your scorecard are listed on top.
- Jobs with insights, activate / switch off and share links tagged by source; talent-pool matches for a job with one-tap invitations; requisitions (approve / reject); offers (send drafts); all ten reports with a date range.
- AI Assistant: ask about your candidates, jobs and interviews in plain words (when AI is connected). It only reads your data.
- Onboarding checklists of new hires and the Activity log (who did what), for the people with access.
- Notifications: an in-app list with an unread badge, and push messages for new applicants, knock-out flags, offers answered, hiring-manager feedback and interviews.
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.
| Login | In the app |
|---|---|
| Owner | Everything: 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 / HR | The 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. |
| Recruiter | Jobs, candidates (search, add, move, comment, email), interviews and scorecards, talent pool. Reports and offers only if the role allows them. |
| Interviewer | Their own interviews (Mine), the video link, the candidate profile and the scorecard, plus a reminder list of scorecards still owed. |
| Hiring manager | Their 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
- Every screen follows the user's permissions, exactly as on the website.
- The last good answer of each list is kept, so screens still open without a signal (a banner says so).
- The login token is kept in the phone's secure storage. Signing out removes it and the saved data.
- Branding: the super admin sets the platform name, logo and colour, the store links, the lowest allowed app version and a maintenance message on the Mobile Apps page. Each owner sets their company's app name, description, logo, icon and colour under Integrations → Mobile App, so they change without a new build. The careers website then shows a Get the app section with a QR code. The name and icon under the app on the phone itself are set when you build (see Your own app id).
- Not in version 1.0: creating or editing jobs, a fingerprint / face lock and offline changes (everything you do needs a connection). The app is in English.
Requirements
Your computer (to build the app)
- A Mac with a recent macOS, Xcode (from the Mac App Store) and about 20 GB free disk space. iPhone apps can only be built and signed on a Mac.
- Flutter SDK 3.13 or newer, and CocoaPods (
sudo gem install cocoapods).
Phones that can run the app
- iPhone with iOS 13 or newer.
Accounts
- Apple Developer Program (yearly fee) to run on real phones and publish.
- Firebase (free) if you want push notifications; it uses Apple's push service (APNs).
Website
- Job Board SaaS 1.9 or newer on an https address.
Install Xcode & Flutter
- Install Xcode from the Mac App Store, open it once, accept the licence, then run:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch
- Install Flutter: docs.flutter.dev/get-started/install/macos and CocoaPods.
- Check everything:
flutter doctor -v
The Xcode and CocoaPods lines should have a green tick.
Prepare the website
The app talks to your Job Board website through its API. Check these once:
- 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. - https. Phones refuse plain
http://addresses. Install an SSL certificate and setAPP_URL=https://your-domain.comin the website's.env. - 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).
- Make sure the cron line of the website is set, so interview reminders (and their push messages) are sent.
- Create the users: Users in the admin panel. Give hiring managers the Hiring Manager role and tick them on their jobs.
Open the project
- Unzip the package and open the folder
recruiter_app/iphone_appin Android Studio or VS Code, or in a terminal. - Download the packages:
cd recruiter_app/iphone_app flutter pub get
- 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 an iPhone or simulator
- Open
ios/Runner.xcworkspacein Xcode once. Under Runner → Signing & Capabilities choose your Team and set a unique Bundle Identifier. - Simulator:
open -a Simulator, thenflutter run
- Real iPhone: connect it, trust the computer, switch on Developer Mode (Settings → Privacy & Security) and run
flutter run.
lib/config.dart. Use an https address the simulator can reach.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:
- Open
lib/config.dartand replace the address indefaultServerwith your platform address (the same asAPP_URLin the website's.env, https, no slash at the end):static const defaultServer = 'https://jobs.yourcompany.com';
- 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 ipa --release --dart-define=SERVER_URL=https://jobs.yourcompany.com
- 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).
Push notifications (Firebase + APNs)
Optional. Without it the app has its notification list, but no messages on the lock screen.
- Create a project at console.firebase.google.com and add an iOS app with your bundle id.
- Download
GoogleService-Info.plistand add it to the Runner target in Xcode (drag it into Runner, tick Copy items). - In Xcode Signing & Capabilities add Push Notifications and Background Modes → Remote notifications.
- In the Apple Developer account create an APNs Auth Key (Keys) and upload it in Firebase: Project settings → Cloud Messaging → Apple app configuration.
- In Firebase open Project settings → Service accounts → Generate new private key and, as super admin, paste the file on the Mobile Apps page under Push notifications (one Firebase project serves every company). An owner can press Send me a test message on Integrations → Mobile App to check.
When people are notified
- A new applicant, and a candidate flagged by a knock-out question.
- An offer accepted or declined.
- An interview scheduled or moved, and a reminder before it starts.
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. App Store Connect rejects a build number it has already seen. Raise both for every update you upload.
Your own bundle id
Set your own Bundle Identifier (for example com.yourcompany.hiring) in Xcode under Runner → General, and use the same id in Firebase and App Store Connect. The name under the icon is CFBundleDisplayName in ios/Runner/Info.plist (currently Job Board). To change the icon, replace assets/icon.png (1024 × 1024) and run dart run flutter_launcher_icons.
Create the app in App Store Connect
- In App Store Connect choose Apps → + → New App. Pick your Bundle ID (create it first under Certificates, Identifiers & Profiles if needed), a name and a language.
- Fill in App Information (category, privacy policy URL) and App Privacy (see Privacy & data safety).
- Prepare screenshots: use the pictures in
docs/screenshots/or capture your own on a simulator.
Build & upload
cd recruiter_app/iphone_app flutter build ipa --release
The archive is created in build/ios/archive/. Upload it with the Transporter app (drag the .ipa from build/ios/ipa/) or from Xcode: Product → Archive → Distribute App. It appears in App Store Connect under TestFlight after a few minutes.
Publish on the App Store
- Test the build with TestFlight on a real iPhone.
- On the app's version page choose the build, add screenshots, description and a test account plus the address of a demo server for the reviewers (the app needs a Job Board to connect to).
- Press Submit for Review. Apple usually answers in one to two days.
Updates
Raise the version in pubspec.yaml, build and upload again, and attach the new build to a new version.
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:
| Data | Collected by the app? | Notes |
|---|---|---|
| Name, email, phone | Shown, not collected | Account details of your staff and candidate details held on your website. They stay on your server. |
| Photos and files | No | The app only opens resumes and documents that are already on your website. |
| Location | No | |
| Device identifiers | Push token (optional) | Sent to your website only if push is switched on, so it can send notifications. Removed on sign out. |
| Saved on the phone | Yes | Login 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.
iPhone permissions used
| Permission | Why |
|---|---|
| Notifications | Show push messages (the person is asked once). |
| Background mode: remote notifications | Receive push messages. |
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
- Keep a copy of your changes, your signing key and
GoogleService-Info.plist. - Unzip the new package, copy your changes over, run
flutter pub get,flutter analyzeandflutter test. - Raise the version in
pubspec.yamland 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
| Problem | Try 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 page | Check 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 wrong | Check the phone's clock is set automatically (authenticator codes depend on the time). |
| A menu or tab is missing | The app follows the website's permissions. Check the user's role under Roles & Permissions. |
| A hiring manager sees no jobs | Tick the person under Hiring managers on the job in the admin panel. |
| No push messages | Check 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. Check the APNs key is uploaded in Firebase and the Push Notifications capability is added in Xcode. |
| The list shows old data and a banner | There is no connection. Pull down to refresh when it returns. |
flutter doctor shows a problem | Fix 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 bundle 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
| Version | Date | Changes |
|---|---|---|
| 1.0.0 | October 2026 | First 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. |