Mobile Biometric Telemetry Tunnel
Sandboxed HealthKit Background Synchronization Service
Published: 2026-06-20 | Project: Glassmetric | Discipline: Sovereign Architecture & Systems Design
Author: Nicholas Alexander MacAskill — Founder & CTO, Flocano Labs | Canonical: https://www.nicholasmacaskill.com/dossier/health-sync-mule
Sandboxed Telemetry Bypass
Web browsers are fundamentally isolated from reading local hardware and operating system database frameworks like Apple HealthKit. To route this offline health data without requiring persistent manual entry, the system implements a hybrid mobile wrapper application (mobile-app) built in React Native. This app hosts a WebView pointing to the main Next.js dashboard while initiating a background daemon to sync biometric signals to the cloud.
Task Registration and Execution
The background sync operates via Expo's TaskManager and BackgroundFetch. It is registered under the identifier HEALTH_SYNC_TASK. The task executes periodically, querying the native react-native-health wrapper and writing payloads into the shared Supabase Postgres instance:
const SYNC_TASK_NAME = 'HEALTH_SYNC_TASK';
TaskManager.defineTask(SYNC_TASK_NAME, async () => {
try {
console.log('Syncing health metrics in background...');
const metrics = await getLatestMetrics();
const uploads = Object.entries(metrics).map(([name, value]) => ({
domain: 'health',
name,
value: parseFloat(value),
metadata: { source: 'mobile-background' }
}));
if (uploads.length > 0) {
const { error } = await supabase.from('metrics').insert(uploads);
if (error) throw error;
}
return BackgroundFetch.BackgroundFetchResult.NewData;
} catch (err) {
console.error('Background sync failed:', err);
return BackgroundFetch.BackgroundFetchResult.Failed;
}
});Apple HealthKit Integration Layer
The native access utility reads Heart Rate Variability (HRV), Resting Heart Rate (RHR), and daily Steps. The query logic reads the last values recorded by the OS using async promise wrappers:
export const getLatestMetrics = () => {
return new Promise((resolve) => {
const results = {};
AppleHealthKit.getHeartRateVariabilitySamples(
{ limit: 1 },
(err, samples) => {
if (!err && samples.length > 0) {
results.hrv = samples[0].value;
}
AppleHealthKit.getRestingHeartRateSamples(
{ limit: 1 },
(err, samples) => {
if (!err && samples.length > 0) {
results.rhr = samples[0].value;
}
const options = {
startDate: new Date(new Date().setHours(0, 0, 0, 0)).toISOString(),
};
AppleHealthKit.getStepCount(options, (err, count) => {
if (!err) {
results.steps = count.value;
}
resolve(results);
});
}
);
}
);
});
};