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.

V1UTF-8 JSON.focusflowNot a ZIP

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.

Important: a backup is not a dump of the live device. Active focus sessions, current blocking state, PIN/device security state, active notifications and other runtime-only state are intentionally not restored.
extension
.focusflow
kind
FocusFlowBackupV1
version
1 for canonical generated files
encoding
UTF-8 JSON
MIME
application/octet-stream

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
  }
}
summary

Helpful counts only. It is never the source of truth; FocusFlow recalculates real counts from the payload.

presetSections

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.

FieldWhat it means
idStable task identifier. Non-empty, unique inside the file.
titleTask name. Non-blank. Max 1,000 characters.
descriptionTask details. Empty string is valid.
startTimeISO-8601 instant. Canonical generated files use UTC Z.
endTimeISO-8601 instant; must not be earlier than startTime.
durationMinutesWhole-minute duration. Keep it consistent with start/end.
statusscheduled, active, completed, skipped, or overdue.
prioritylow, medium, high, or critical.
tagsArray of strings. Empty array is fine.
remindersArray of reminder objects. It is not an array of plain integers.
colorVisual task color. A normal default is #6366f1.
focusModeWhether this task uses Focus Mode behavior.
focusAllowedPackagesOptional task-specific Android package allow-list.
createdAt / updatedAtISO-8601 instants.
Past scheduled tasks: if a task arrives as scheduled but its endTime is already past when import is evaluated, FocusFlow normalizes it to skipped and does not create a future alarm for it.

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"
}]
type

pre-start, at-start, or post-start.

offsetMinutes

Integer offset relative to the task schedule. Preserve it exactly.

taskId

Must point to the parent task. If a task ID is remapped during import, this relationship is remapped too.

Android notifications

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.

Focus preferences

darkMode, defaultDuration, defaultReminderOffsets, pomodoroDuration, pomodoroBreak, keepFocusActiveUntilTaskEnd, autoRescheduleEnabled.

App lists

allowedInFocus, alwaysOnPackages, alwaysOnVpnPackages, focusToolPackages, launcherHiddenPackages.

Blocking & schedules

blockedWords, greyoutSchedule, recurringBlockSchedules, dailyAllowanceEntries.

Presets

allowedAppPresets and blockPresets are separate collections.

Launcher/profile

launcherTheme, launcherHiddenPackages, launcherBlockUninstall, launcherLockDuringStandalone, userProfile.

Protection

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

time
Use real ISO-8601 instants. Generated files should use UTC Z.
package names
Use exact Android package IDs such as com.example.app. Never substitute by app label/name.
focusAllowedPackages
Absent/null means “use the global setting”. An explicit empty array is meaningful and can map to FocusFlow's block-all behavior.
greyoutSchedule
Keep actual greyout windows here. Do not replace this field with recurring schedule inventory.
recurringBlockSchedules
Separate recurring rules. Do not collapse them into greyout windows.
presetSections
Description/inventory only. Never treat these objects as commands.
protected apps
FocusFlow's system-protected package list cannot be overridden by a backup file.

7. Import in plain English

Merge

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.

Replace

The existing task-owned persistent graph is replaced by the imported task graph. Runtime state is still not restored.

Settings

Portable fields use field-specific policies. Omitted device-local/runtime fields stay local.

External file

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"
  }]
}
Best practice: generate the file from application data whenever possible. Hand-writing is useful for integrations, fixtures and testing, but the safest file is one produced from the canonical V1 model and then validated.

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.

The short mental model
.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