
Integrate Health Forge
- 1 installs
- 1 repo stars
- Updated July 2, 2026
- mandarnilange/health_forge
Integrates the health_forge Flutter client to aggregate health data from multiple providers with auth, query builder, sync, and local cache.
About
Integrates the health_forge Flutter client that ties together a provider registry, auth orchestrator, fluent query API, sync manager, and cache. A developer uses it as the foundation when aggregating health data from multiple providers in a Flutter app.
- Provider registry, auth orchestration, query builder, and sync manager
- InMemory or Drift/SQLite local cache; pairs with per-provider adapter skills
Integrate Health Forge by the numbers
- 1 all-time installs (skills.sh)
- Ranked #959 of 1,039 Mobile Development skills by installs in the Skillselion catalog
- Data as of Jul 8, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mandarnilange/health_forge --skill integrate-health-forgeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 1 |
| Last updated | July 2, 2026 |
| Repository | mandarnilange/health_forge ↗ |
What it does
Integrates the health_forge Flutter client to aggregate health data from multiple providers with auth, query builder, sync, and local cache.
Files
Integrate health_forge
health_forge is the Flutter client that ties everything together: a provider registry, auth orchestrator, fluent query API, sync manager, and cache. It depends on `health_forge_core` transitively.
This skill is the foundation — invoke alongside one or more adapter skills for the user's target providers.
Integration steps
1. Add dependencies
dependencies:
health_forge: ^0.1.1
# Add each adapter the user needs — see related skills:
health_forge_apple: ^0.1.1 # iOS HealthKit
health_forge_ghc: ^0.1.1 # Android Health Connect
health_forge_oura: ^0.1.1 # Oura Ring
health_forge_strava: ^0.1.1 # StravaRun flutter pub get.
2. Create the client
import 'package:health_forge/health_forge.dart';
final forge = HealthForgeClient();With persistent SQLite cache (recommended for production):
import 'dart:io';
import 'package:drift/native.dart';
import 'package:health_forge/health_forge.dart';
import 'package:path_provider/path_provider.dart';
Future<HealthForgeClient> createClient() async {
final dir = await getApplicationSupportDirectory();
final db = HealthCacheDatabase(
NativeDatabase.createInBackground(File('${dir.path}/health_cache.db')),
);
return HealthForgeClient(cache: DriftCacheManager(database: db));
}Without a cache argument, an InMemoryCacheManager is used (data lost on restart).
With custom merge config:
final forge = HealthForgeClient(
mergeConfig: const MergeConfig(
defaultStrategy: ConflictStrategy.priorityBased,
providerPriority: [DataProvider.apple, DataProvider.oura],
perMetricStrategy: {
MetricType.heartRate: ConflictStrategy.keepAll, // high-frequency data
},
),
);3. Register providers
Use platform detection for native adapters:
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:health_forge_apple/health_forge_apple.dart';
import 'package:health_forge_ghc/health_forge_ghc.dart';
if (!kIsWeb && Platform.isIOS) {
forge.use(AppleHealthProvider());
} else if (!kIsWeb && Platform.isAndroid) {
forge.use(GhcHealthProvider());
}
// REST providers work on all platforms — see adapter skills for OAuth setup.
forge.use(ouraProvider);
forge.use(stravaProvider);4. Authorize
final results = await forge.auth.authorizeAll();
for (final entry in results.entries) {
if (!entry.value.isSuccess) {
print('${entry.key} not authorized: ${entry.value.status}');
}
}Individual: await forge.auth.authorize(DataProvider.apple). Check status: await forge.auth.isAuthorized(DataProvider.oura).
5. Query (live fetch)
final builder = forge.query()
..forMetrics([MetricType.heartRate, MetricType.sleepSession])
..inRange(TimeRange(
start: DateTime.now().subtract(const Duration(days: 7)),
end: DateTime.now(),
));
final executor = QueryExecutor(
registry: forge.registry,
mergeEngine: MergeEngine(config: const MergeConfig()),
);
final result = await executor.execute(builder.build());
for (final record in result.records) {
if (record is HeartRateSample) {
print('${record.provider}: ${record.beatsPerMinute} bpm');
}
}
if (result.errors.isNotEmpty) {
// Provider failures do NOT block others — inspect per-provider errors here.
result.errors.forEach((p, e) => print('$p: $e'));
}Filter providers: ..from(DataProvider.oura) or ..fromProviders([…]). Per-query merge override: ..withMerge(MergeConfig(...)).
6. Sync (fetch + cache + dedup)
final syncResult = await forge.sync(
provider: DataProvider.apple,
metric: MetricType.heartRate,
range: TimeRange(
start: DateTime.now().subtract(const Duration(days: 1)),
end: DateTime.now(),
),
);
print('Fetched ${syncResult.recordsFetched}, cached ${syncResult.recordsCached}');
// Later — read from cache
final cached = await forge.cache.get(
metric: MetricType.heartRate,
range: lastDay,
);7. Persist OAuth tokens (REST providers)
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final tokenStore = TokenStore(const FlutterSecureStorage());
// Wire into the auth manager — see adapter skills for provider specifics.
final ouraAuth = OuraAuthManager(
clientId: '...',
redirectUri: '...',
urlLauncher: launchAndWaitForRedirect,
initialToken: await _restoreToken(tokenStore, DataProvider.oura),
onTokenChanged: (t) => _saveToken(tokenStore, DataProvider.oura, t),
);Key APIs
| API | Use for |
|---|---|
HealthForgeClient | Main entry point |
forge.use(provider) / forge.registry | Register and discover providers |
forge.auth.* | authorize, authorizeAll, isAuthorized, checkAll |
forge.query() → QueryBuilder → QueryExecutor | On-demand fetch (optionally merged) |
forge.sync(...) | Fetch + merge-with-cache + store |
forge.cache.get / put / invalidate / clear | Direct cache access |
DriftCacheManager | Persistent SQLite cache (dedup by provider+metric+time+device) |
TokenStore | Secure OAuth token persistence |
MergeConfig | Configure strategies + provider priority + overlap threshold |
Query vs sync — pick one
query() | sync() | |
|---|---|---|
| Fetches from | All or filtered providers | One provider |
| Caches | No | Yes |
| Merges | Only if withMerge() set | Always (new + cache) |
| Use for | Real-time UI | Background pulls, offline |
Typical app: periodic sync() to keep cache fresh; UI reads from cache. Use query() for one-off multi-provider fetches.
Gotchas
- Provider failures don't block queries — always check
result.errorsas well asresult.records. - iOS HealthKit `hasPermissions` is unreliable — track auth state locally after a successful
authorize(); don't rely on repeatedly callingisAuthorized()as ground truth on iOS. - High-frequency metrics (steps, HR from Apple Watch) are recorded in small ~5-minute increments. Default
ConflictStrategy.priorityBasedwith a 5-minute overlap threshold will collapse them. UseConflictStrategy.keepAllper-metric if you want every sample preserved. - `DriftCacheManager` dedups on natural key (provider + metric + time + device). If you
put()the same record twice, the second call is a no-op.
Related skills
Pair this skill with one or more adapter skills:
- `integrate-health-forge-apple` — iOS HealthKit
- `integrate-health-forge-ghc` — Android Health Connect
- `integrate-health-forge-oura` — Oura Ring OAuth
- `integrate-health-forge-strava` — Strava OAuth
- `integrate-health-forge-core` — pure Dart core (advanced: custom providers)
{
"version": "0.1.1",
"organization": "Health Forge",
"date": "May 2026",
"abstract": "Integration recipe for `health_forge` — the Flutter client that ties Health Forge together: provider registry, auth orchestrator, fluent query builder, sync manager, and cache (InMemory or Drift/SQLite). Pair with one or more adapter skills (apple, ghc, oura, strava) for actual data sources.",
"references": [
"https://pub.dev/packages/health_forge",
"https://github.com/mandarnilange/health_forge",
"https://github.com/mandarnilange/health_forge/blob/main/docs/getting_started.md",
"https://github.com/mandarnilange/health_forge/blob/main/design/adr/0001-federated-plugin-model.md",
"https://github.com/mandarnilange/health_forge/blob/main/design/adr/0006-cache-schema-design.md"
]
}