ExamNovaDocumentation
Offline readyChangelog
Developer guide

Extend Companion without creating a second ExamNova.

The Laravel backend remains authoritative. Companion Core supplies reusable infrastructure; the ExamNova app supplies product screens and calls narrowly scoped API v1 routes.

Mobile maintainerBackend maintainerSecurity reviewerRelease owner
ExamNova Companion boundaryThe app discovers a verified ExamNova installation, authenticates a device session, performs role-scoped mobile work, and synchronizes with the authoritative backend.Companion appDiscoveryMobile API v1Domain servicesTenant dataPush provider
ExamNova Companion boundary. The app discovers a verified ExamNova installation, authenticates a device session, performs role-scoped mobile work, and synchronizes with the authoritative backend.

Responsibility and repository layout

mobile/
  packages/companion-core/   discovery, API client, secure sessions, encrypted sync, compatibility, telemetry
  apps/examnova/             Expo app, role navigation, product screens, native configuration
app/Http/Controllers/Api/Mobile/V1/
app/Services/Mobile/
documentation/mobile-api.openapi.yaml

Authentication and tenant invariants

API contract

The source contract is documentation/mobile-api.openapi.yaml. The base path is /api/mobile/v1. Clients send X-Ovion-App-Version and X-Ovion-API-Version; authenticated requests also send a bearer access token.

Offline synchronization

Push delivery and receipts

Companion registers a native FCM or APNs token. The model encrypts the raw token and stores a separate hash for lookup. Product notifications create delivery rows and queued jobs. Provider payloads use a generic title/body plus message UUID, event, and role-safe deep link; they contain no student, exam, result, or answer details. The app reports received/opened/dismissed receipts.

Configuration

COMPANION_CANONICAL_URL=https://examnova.ovion-tech.xyz
COMPANION_MIN_APP_VERSION=1.0.0
COMPANION_LATEST_APP_VERSION=1.0.0
COMPANION_ANDROID_SHA256_FINGERPRINTS=AA:BB:...
COMPANION_APPLE_TEAM_ID=TEAMID
COMPANION_FCM_PROJECT_ID=project-id
COMPANION_FCM_ACCESS_TOKEN=short-lived-oauth-token
COMPANION_APNS_TOPIC=xyz.oviontech.examnova
COMPANION_APNS_AUTH_TOKEN=short-lived-provider-token

Provider tokens belong in protected environment configuration and must be rotated. Do not commit signing material, APNs keys, service-account JSON, passwords, or production tokens.

Build, signing, and release

  1. Run npm install, npm run typecheck, npm test, and npm run doctor from mobile/.
  2. Generate native projects with npx expo prebuild. Android local preview uses Gradle; production AAB uses organization-owned upload signing.
  3. Configure iOS signing, entitlements, APNs, and Universal Links in the owner team's Apple account; create the archive on macOS or approved EAS infrastructure.
  4. Verify Android and iOS on physical devices, online/offline primary workflow, authentication, tenant isolation, push receipt, deep links, version enforcement, accessibility, and privacy.
  5. Publish checksums, store metadata, privacy declarations, release notes, supported API versions, rollback/revocation steps, and a retained symbol/mapping archive.

Required tests

Release gate: A preview APK signed with the Android debug key is installable for evaluation only. Store distribution requires owner-controlled signing credentials; Apple archive verification requires macOS or an approved hosted build.