Practical format guide
.focusflow, explained without the manual.
A human-readable guide for people and developer/AI agents who need to understand or generate a FocusFlow backup file. It covers the parts that matter; the full schema does not need to be memorized.
1. What is a .focusflow file?
It is a plain UTF-8 JSON document with the .focusflow extension. It carries portable FocusFlow data such as tasks, schedules, blocking configuration, presets and user profile information.
2. The shape of the file
A normal file has one top-level object. The important parts are settings and tasks. The other fields are metadata/inventory.
{
"kind": "FocusFlowBackupV1",
"version": 1,
"exportedAt": "2026-10-04T04:30:00.000Z",
"appVersion": "1.0.6",
"platform": { "os": "android" },
"settings": { /* portable settings */ },
"tasks": [ /* task objects */ ],
"presetSections": [ /* descriptive inventory */ ],
"summary": {
"taskCount": 1,
"blockedWordCount": 0,
"greyoutWindowCount": 0,
"dailyAllowanceCount": 0
}
}
Helpful counts only. It is never the source of truth; FocusFlow recalculates real counts from the payload.
Describes what the backup contains. It does not activate blocking, timers or other live behavior.
3. Tasks
Each task is an object inside tasks. The safest approach is to emit all core fields explicitly.
| Field | What it means |
|---|---|
| id | Stable task identifier. Non-empty, unique inside the file. |
| title | Task name. Non-blank. Max 1,000 characters. |
| description | Task details. Empty string is valid. |
| startTime | ISO-8601 instant. Canonical generated files use UTC Z. |
| endTime | ISO-8601 instant; must not be earlier than startTime. |
| durationMinutes | Whole-minute duration. Keep it consistent with start/end. |
| status | scheduled, active, completed, skipped, or overdue. |
| priority | low, medium, high, or critical. |
| tags | Array of strings. Empty array is fine. |
| reminders | Array of reminder objects. It is not an array of plain integers. |
| color | Visual task color. A normal default is #6366f1. |
| focusMode | Whether this task uses Focus Mode behavior. |
| focusAllowedPackages | Optional task-specific Android package allow-list. |
| createdAt / updatedAt | ISO-8601 instants. |
4. Reminders
A reminder is attached to a task and uses a stable reminder identity.
"reminders": [{
"id": "reminder-001",
"taskId": "task-001",
"offsetMinutes": -5,
"type": "pre-start"
}]
pre-start, at-start, or post-start.
Integer offset relative to the task schedule. Preserve it exactly.
Must point to the parent task. If a task ID is remapped during import, this relationship is remapped too.
The persistent Reminder object is not automatically identical to an Android notification/alarm registration.
5. Portable settings
You do not need every setting. The canonical V1 profile includes these important portable groups.
darkMode, defaultDuration, defaultReminderOffsets, pomodoroDuration, pomodoroBreak, keepFocusActiveUntilTaskEnd, autoRescheduleEnabled.
allowedInFocus, alwaysOnPackages, alwaysOnVpnPackages, focusToolPackages, launcherHiddenPackages.
blockedWords, greyoutSchedule, recurringBlockSchedules, dailyAllowanceEntries.
allowedAppPresets and blockPresets are separate collections.
launcherTheme, launcherHiddenPackages, launcherBlockUninstall, launcherLockDuringStandalone, userProfile.
protectionMode, focusMirrorVpnEnabled and related persistent preferences that are explicitly portable.
What should stay on the device?
Do not manufacture or expect a portable file to turn live runtime/device state back on. Examples include active focus state, current blocking state, onboarding/privacy flags, PIN state, notification master state, live enforcement switches and raw local wallpaper URIs.
6. The rules that matter most
7. Import in plain English
Existing tasks remain. A task ID that is absent locally can be imported as-is. A same-ID equivalent task is a duplicate. A same-ID different task is a conflict; it is not silently overwritten.
The existing task-owned persistent graph is replaced by the imported task graph. Runtime state is still not restored.
Portable fields use field-specific policies. Omitted device-local/runtime fields stay local.
Opening a .focusflow file from a file manager is just another import entry point: validate → review → confirm → restore.
8. Small valid example
This is enough to understand the format. A real export will usually contain more settings and metadata.
{
"kind": "FocusFlowBackupV1",
"version": 1,
"exportedAt": "2026-10-04T04:30:00.000Z",
"platform": { "os": "android" },
"settings": {
"darkMode": true,
"defaultDuration": 25,
"allowedInFocus": ["com.example.music"],
"blockedWords": ["social"],
"protectionMode": "standard"
},
"tasks": [{
"id": "task-001",
"title": "Write project outline",
"description": "Draft the first version.",
"startTime": "2026-10-04T05:00:00.000Z",
"endTime": "2026-10-04T05:25:00.000Z",
"durationMinutes": 25,
"status": "scheduled",
"priority": "high",
"tags": ["writing"],
"reminders": [{
"id": "rem-001",
"taskId": "task-001",
"offsetMinutes": -5,
"type": "pre-start"
}],
"color": "#6366f1",
"focusMode": true,
"createdAt": "2026-10-04T04:40:00.000Z",
"updatedAt": "2026-10-04T04:40:00.000Z"
}]
}
9. When you need the full technical reference
Use the full `.focusflow` reference when you are implementing a generator/parser, compatibility layer, validator, migration tool, or automated test suite. This page is intentionally the easier entry point; it is not a replacement for the exhaustive schema contract.
.focusflow = portable persistent FocusFlow data + task/reminder data + enough information to rebuild derived scheduling NOT = active session dump = live device enforcement state = raw AlarmManager state