Documentation Index
Fetch the complete documentation index at: https://docs.canthus.org/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Canthus uses an append-only event log stored in the encrypted local SQLite database. All events are local-only by default. No event data is transmitted to any server unless the user explicitly enables research export (see Research Export Mode).
This document classifies every event type and field by sensitivity level, and defines which fields are eligible for anonymised export.
Sensitivity levels
| Level | Definition | Default sharing |
|---|
internal | System identifiers and timestamps used for log integrity | Never shared |
private | Direct health or personal data (ratings, task titles) | Never shared |
derived | Aggregated or calculated values that carry no personal content | Eligible for export (requires consent) |
Event types and field classifications
taskCreated
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | Opaque identifier |
title | string | private | User-entered task name |
taskEdited
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | |
changes | map | private | May contain task title or other personal fields |
action | string | internal | Edit action type |
taskRemoved
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | |
taskOccurrenceCreated
| Field | Type | Sensitivity | Notes |
|---|
occurrenceId | int | internal | |
taskId | string (UUID) | internal | |
dueDatetime | datetime | private | Specific scheduled time |
state | string | internal | |
taskOccurrenceCompleted
| Field | Type | Sensitivity | Notes |
|---|
occurrenceId | int | internal | |
taskId | string (UUID) | internal | |
dueDatetime | datetime | private | |
completedAt | datetime | private | Precise completion timestamp |
completedLocalDay | date | derived | Day-level granularity only |
manaCostAtCompletion | double | derived | Aggregate energy cost |
axisFactorAtCompletion | double | derived | Capacity adjustment applied |
baselineCostAtCompletion | double | derived | Pre-adjustment cost |
taskOccurrenceUncompleted
| Field | Type | Sensitivity | Notes |
|---|
occurrenceId | int | internal | |
taskOccurrenceDeferred
| Field | Type | Sensitivity | Notes |
|---|
occurrenceId | int | internal | |
taskId | string (UUID) | internal | |
dueDatetime | datetime | private | |
deferredUntil | datetime | private | |
taskOccurrenceRemoved
| Field | Type | Sensitivity | Notes |
|---|
occurrenceId | int | internal | |
taskId | string (UUID) | internal | |
dueDatetime | datetime | private | |
taskCostCalibrated
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | |
calibratedForLocalDay | date | derived | |
policyVersion | int | internal | |
previousRelativeCost | double | derived | |
newRelativeCost | double | derived | |
delta | double | derived | |
recentCompletions28d | int | derived | |
lifetimeCompletions | int | derived | |
strength | double | derived | Calibration confidence |
taskCostOverridden
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | |
occurrenceId | int | internal | |
statedManaCost | double | derived | User-stated cost, no personal content |
previousRelativeCost | double | derived | |
newRelativeCost | double | derived | |
overriddenAt | datetime | private | Precise timestamp |
taskRecoveryWeightUpdated
| Field | Type | Sensitivity | Notes |
|---|
taskId | string (UUID) | internal | |
previousRecoveryWeight | double | derived | |
newRecoveryWeight | double | derived | |
observationCount | int | derived | |
updatedLocalDay | date | derived | |
policyVersion | int | internal | |
checkInRecorded
| Field | Type | Sensitivity | Notes |
|---|
checkInId | string (UUID) | internal | |
checkInDate | date | derived | Day-level granularity |
body | int (1-5) | private | Direct health self-report |
mind | int (1-5) | private | Direct health self-report |
mood | int (1-5) | private | Direct health self-report |
dayType | string | private | User-labelled day context |
checkInTier | string | derived | Completion level (full/quick/etc.) |
action | string | internal | Create or update |
dayTypeSet
| Field | Type | Sensitivity | Notes |
|---|
dayType | string | private | |
checkInDate | date | derived | |
opportunityWeight | double | derived | |
normalizedCompletionRatio | double | derived | |
underperformanceDays | int | derived | |
action | string | internal | |
pemDetected
| Field | Type | Sensitivity | Notes |
|---|
triggerEventIds | list(string) | internal | References to other events |
attributionConfidence | double | derived | |
detectedAt | datetime | private | |
detectedLocalDay | date | derived | |
pemResolved
| Field | Type | Sensitivity | Notes |
|---|
resolvedAt | datetime | private | |
resolvedLocalDay | date | derived | |
resolutionSource | string | internal | |
Default behaviour
- All events are written to the local encrypted SQLite database only
- No event data is sent to any external system
- Sentry crash reporting does not include event payloads
- The “Delete all data” flow in Settings permanently removes all events
Export eligibility
Only fields classified as derived are eligible for inclusion in anonymised research export. private and internal fields are never exported. See Research Export Mode for full anonymisation rules.