Unofficial EVE Online companion app for iOS and Android. Built with Flutter against the current ESI.
Multi-character read-only dashboard: skills, wallet, assets, contracts, fittings, industry jobs, planetary colonies, mail and more — all behind EVE SSO.
| Characters | Character sheet |
|---|---|
![]() |
![]() |
Screenshots taken in
DEMO_MODEagainst seeded fixtures — see Demo / screenshot mode.
- Multi-account support — sign in with as many EVE characters as you like, switch between them with one tap
- Live character sheet: portrait, corp/alliance, security status, wallet balance, total SP, jump clones, implants, attributes
- Alpha / Omega badge inferred from the skill queue (no ESI endpoint exposes account state directly)
- Server status tile: TQ player count and current ESI compatibility window
- Full skill queue with live countdowns and per-skill progress
- Local notifications fire the moment each queued skill finishes — works while the app is closed
- Browse the entire skill tree with trained / untrained filters and search
- Wallet journal with full transaction history, filterable by category
- Market transactions with running totals
- Active market orders (buy / sell) with sparkline price history from regional market data
- Recursive container hierarchy — drill into ships, cans and citadel hangars
- Player-assigned ship/container names take precedence over type names
- Search across types and custom names; locations resolved through stations, structures and systems
- PLEX-in-station tracking (the account-wide PLEX Vault is not exposed by ESI)
- Character industry jobs (manufacturing, research, invention, reactions) with end-time countdowns
- Planetary colonies overview, per-planet pin layout and extractor / factory schedules
- ESI-stored fits plus a local fitting editor with live capacitor, defense and DPS calculations
- Slot picker constrained by ship CPU / power-grid / rig size and module restrictions
- EFT import / export
- Character contracts with item lists and reward / collateral details
- EVEMail inbox with HTML body rendering
- Loyalty points across every NPC corp the character is enlisted with
- Full local copy of CCP's Static Data Export normalized into SQLite
- Browse by market group, search by name, view dogma attributes, traits and required skills
- Updates run as a one-tap download when CCP publishes a new SDE build
- EVE SSO with PKCE via flutter_appauth, JWT validation against the live JWKS
- Concurrent refresh-token requests are coalesced so EVE's rotation can't invalidate parallel calls
- ESI cache layer: ETag / If-None-Match for every GET, full respect for
X-ESI-Error-Limit-Remainwith exponential backoff on 420 - Refresh tokens stored in iOS Keychain / Android EncryptedSharedPreferences via flutter_secure_storage
- Cloud backup and device-to-device transfer of secure storage explicitly disabled
- Global uncaught-error sink ready to plug into Sentry / Crashlytics
- Release builds run R8 minify + shrinkResources with proguard rules; offline mode covered by a top-level connectivity banner
Two entry points share a single bootstrap:
lib/main_dev.dart— development flavorlib/main_prod.dart— production flavor
Configuration is injected at build time via --dart-define-from-file. The real config/dev.json and config/prod.json files are gitignored; commit only the *.example templates.
| Variable | Required | Notes |
|---|---|---|
EVE_CLIENT_ID_DEV |
dev only | Client ID from developers.eveonline.com |
EVE_CLIENT_ID_PROD |
prod only | Client ID from developers.eveonline.com |
EVE_CALLBACK_SCHEME |
optional | Defaults to eveauth-neocompanion |
ESI_COMPATIBILITY_DATE |
optional | Pinned ESI compatibility date |
SENTRY_DSN |
optional | Crash reporting (sink not yet attached) |
cp config/dev.json.example config/dev.json
# fill in EVE_CLIENT_ID_DEV with your developer client idRegister your application at https://developers.eveonline.com/ with redirect URI eveauth-neocompanion://callback and the scopes listed in lib/core/auth/sso_scopes.dart.
# Dev
flutter run -t lib/main_dev.dart --dart-define-from-file=config/dev.json
# Prod (debug-signed locally; release signing kicks in once android/key.properties exists)
flutter run -t lib/main_prod.dart --release \
--dart-define-from-file=config/prod.jsonGenerate an upload keystore once and copy the template:
keytool -genkey -v -keystore ~/keystores/neocompanion-upload.jks \
-keyalg RSA -keysize 2048 -validity 10000 -alias upload
cp android/key.properties.example android/key.properties
# fill in storeFile, storePassword, keyAlias, keyPasswordThen build the obfuscated app bundle with split debug symbols (don't lose the symbols folder — Play Console needs it to de-obfuscate stack traces):
flutter build appbundle -t lib/main_prod.dart \
--dart-define-from-file=config/prod.json \
--obfuscate --split-debug-info=build/symbols/androidflutter build ipa -t lib/main_prod.dart \
--dart-define-from-file=config/prod.json \
--obfuscate --split-debug-info=build/symbols/iosRun the app against seeded fixtures instead of real ESI — useful for App Store / Play Store screenshots without exposing real characters, and for App Review which has to exercise the app without an EVE account.
flutter run -t lib/main_dev.dart \
--dart-define-from-file=config/dev.json \
--dart-define=DEMO_MODE=trueIn demo mode:
- A fictional
Capsuleer Democharacter is auto-loaded (no SSO flow) - Character sheet, skill queue, wallet journal/transactions, market orders, assets and server status are populated from
lib/core/demo/demo_data.dart - The "Add Character" FAB and "Logout" action are hidden so taps can't reach real SSO
- Type icons and portraits still load from images.evetech.net (real CCP artwork, no account data)
To extend coverage to more screens, add overrides to demoOverrides() in lib/core/demo/demo_overrides.dart.
flutter test
flutter analyzeSource-available under the PolyForm Noncommercial 1.0.0 license. Personal use, research, hobby projects and forks are welcome. Commercial use — including paid distribution, ad-supported builds, or use inside a for-profit product — is not permitted without prior written agreement.
EVE Online and the EVE logo are trademarks of CCP hf. This is an unofficial third-party application; it is not endorsed by or affiliated with CCP hf.
- Riverpod for dependency injection and state. Providers live next to the feature they serve (
lib/features/<feature>/); cross-cutting concerns (network, auth, types DB, notifications) live inlib/core/. - Dio for HTTP, with a stack of interceptors handling auth, refresh, ETag caching and the ESI per-IP error window.
- sqflite for the local SDE and app database. The SDE is bulk-imported from a prebuilt bundle and updated through an explicit user action; on-demand
/universe/names/is reserved for non-bulk lookups. - flutter_local_notifications for skill-completion alarms, scheduled at exact
finish_dateper queue entry.

