Your next chapter / Start building
Less wiring.
More play.
One app-facing API. The providers you need. Bring game services to your Dart CLI, Flutter game or custom engine.
Read the documentationThen add a provider package for each store you use.
Run it after dart pub get, in a project that depends on the packages.
A small API. A wide world.
Connect once.
Keep creating.
Initialize your providers once, sign in and check capabilities before calling them. Writes fan out and report a result per provider; reads default to your primary provider.
The core is pure Dart, with no Flutter dependency. Native providers have their own SDK and platform requirements.
Explore the API referenceQuickstart requires the Steam provider and its native SDK setup. App ID 480 is for Steam testing.
A place for every player.
Choose a provider. Check its supported capabilities and setup guide.
SteamSteamworks · Desktop FFI · Lobbies & invites
unified_game_services_steamEpic GamesEpic Online Services · Desktop FFI · Identity tokens
unified_game_services_epicGame CenterApple GameKit · macOS & iOS
unified_game_services_game_centerGameJoltREST · Cross-platform
unified_game_services_gamejoltPlayFabREST · Cross-platform · Lobbies
unified_game_services_playfabGoogle PlayNative Android (overlays) & REST fallback
unified_game_services_google_playGoogle Play for FlutterFlutter adapter · Activity resolution
unified_game_services_google_play_flutterYour own backendShared contracts · Custom providers
unified_game_services_platform_interface
Where we go next.
No dates, only direction. Priorities can change as providers and players ask for different things.
- Up nextDiscordParties and invitations, through the same lobby API you already use for Steam and PlayFab.
- PlannedMatchmakingstartMatchmaking() and cancelMatchmaking() are reserved on the facade. They throw CapabilityNotSupportedException until a provider implements them.
- LaterXbox on PCResearch stage (GDK). The package is a placeholder that advertises no capabilities and is not published yet.
Why unified_game_services?
games_services is more mature and proven in production — it’s been in published games for years and covers the Game Center + Google Play Games case well in Flutter. If your game lives only there, it’s the most solid option today.
unified_game_services competes in what comes after: the day you want to add Huawei AppGallery, Steam, Epic, or centralize player progress to your own database so it travels between Game Center and Google Play, you don’t rewrite anything in the game — you add a provider.
| Feature | unified_game_services | games_services |
|---|---|---|
| Architecture | ||
| Language | Pure Dart | Dart / Flutter plugin |
| Flutter dependency | None in core | Flutter plugin |
| Works outside Flutter | Yes | No |
| Platforms | Per provider (desktop FFI, REST, native) | Android, iOS, macOS |
| Flutter adapters | Optional, per provider (e.g. Google Play Activity glue) | Flutter is the host |
| Providers | ||
| Google Play Games | Yes | Yes |
| Game Center | Yes | Yes |
| Steam, Epic, GameJolt, PlayFab | Yes | No |
| Custom providers | Via platform_interface | No |
| REST providers | Yes | No |
| Native FFI providers | Yes | No |
| JNI / native Android | Via provider packages | Flutter plugin |
| Multi-provider | ||
| Provider abstraction | Yes | No |
| Several providers at once | Yes | No |
| Fan-out writes | Yes | No |
| Partial failures | Per provider, via MultiProviderOperationResult | No |
| Capability discovery | GameServices.supports(...) | No |
| Cross-store achievement sync | syncAchievements() | No |
| Platform-specific IDs | One unified id, mapped per store | Part of each call |
| Features | ||
| Auth, achievements, leaderboards | Yes | Yes |
| Cloud save | Provider-dependent | Yes |
| Lobbies, parties, invitations | Steam, PlayFab | No |
| Identity tokens for your backend | Steam ticket, Epic JWT | No |
| Native achievements / leaderboard UI | Google Play Android today | Yes |
| Status | ||
| Maturity | Active development | Production-proven for years |
Frequently asked questions
What is unified_game_services?
unified_game_services is an open-source, pure Dart package that gives your game one API for achievements, leaderboards, stats, cloud save, rich presence, lobbies and identity tokens across Steam, Epic Games, PlayFab, GameJolt, Apple Game Center, Google Play Games and your own backend. You add one provider package per store, and a single call such as GameServices.unlockAchievement(...) reaches all of them.
Does unified_game_services require Flutter?
No. The core package is pure Dart with no Flutter dependency, so it works in Flutter games, Dart CLI tools and custom engines. Only some provider adapters, such as unified_game_services_google_play_flutter, need Flutter for Android Activity and lifecycle glue.
Which game services and platforms are supported?
Steam and Epic Online Services (desktop, through native FFI), Apple Game Center (macOS and iOS), Google Play Games (native Android with a REST fallback), GameJolt and PlayFab (REST, cross-platform), plus any custom backend you implement. Each store is a separate provider package, and supported features vary per provider: check them at runtime with GameServices.supports(...).
How do I install unified_game_services?
Run dart pub add unified_game_services, then add one provider package per store, for example dart pub add unified_game_services_steam. Call GameServices.initialize(providers: [...]) once at startup and GameServices.signIn() before using any feature.
How does unified_game_services compare to games_services?
games_services is the more mature choice if your game only targets Game Center and Google Play Games in Flutter. unified_game_services is built for multiple stores at once: it adds Steam, Epic, GameJolt, PlayFab and custom backends, fans writes out to every provider, and maps one unified achievement or leaderboard id to each store’s native id.
Do native providers need extra setup?
Yes. For Steam, run dart run unified_game_services_steam:setup and keep the Steam client running while testing. Native SDKs have their own licensing and distribution requirements, so follow each provider’s package guide.
What if a provider does not support a feature?
Use GameServices.supports(...) before making a call. A capability unsupported by all providers throws CapabilityNotSupportedException. Fan-out writes never throw because one provider failed: they return a MultiProviderOperationResult with each provider’s success or failure, so check result.failed or call throwIfAnyFailed().
Are lobbies shared across stores?
No. A lobby belongs to one provider and is never fanned out: a Steam lobby holds Steam players. For lobbies across stores, use a backend provider such as PlayFab or your own. Steam and PlayFab support lobbies today; matchmaking is reserved and has no provider yet.
Can I use my own backend?
Yes. Extend UnifiedGameServicesPlatform from the shared platform interface, return a stable providerId and declare its supported capabilities. Your game keeps using the same app-facing API, alone or next to store providers.
Can my AI coding agent learn unified_game_services?
Yes. The packages ship agent skills for game integration, cross-store progression, provider behaviors, per-store builds, Steam, Epic and Game Center setup, and writing custom providers. After dart pub get in your project, run dart run skills@ get to install the skills from the packages you depend on.
How do I upgrade from 0.1 to 0.2?
0.2.0 has breaking changes: GameServices.initialize(providers: [...]) replaces registerWith, writes return results instead of throwing, and AggregateGameServiceException is gone. Read the migration guide.
Is unified_game_services free?
Yes. It is open source under the MIT license and published on pub.dev. Store SDKs such as Steamworks or Epic Online Services keep their own terms.