net.anisota.chronicle.expedition
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"chronicleSignature": {
"description": "ES256 cryptographic signature proving record authenticity",
"properties": {
"alg": {
"description": "Signing algorithm (ES256)",
"type": "string"
},
"kid": {
"description": "Key identifier for the signing key",
"type": "string"
},
"nonce": {
"description": "Unique random nonce to prevent replay",
"type": "string"
},
"sig": {
"description": "Base64-encoded ES256 signature",
"type": "string"
},
"signedAt": {
"description": "When the record was signed",
"format": "datetime",
"type": "string"
},
"version": {
"description": "Signature schema version",
"type": "integer"
}
},
"required": [
"sig",
"alg",
"kid",
"signedAt",
"nonce",
"version"
],
"type": "object"
},
"expeditionConditions": {
"description": "Environmental conditions during expedition",
"properties": {
"biome": {
"description": "Forest biome type",
"type": "string"
},
"lightLevel": {
"description": "Time-of-day light condition at expedition start",
"enum": [
"dawn",
"morning",
"midday",
"afternoon",
"dusk",
"night",
"deepnight"
],
"type": "string"
},
"moonPhase": {
"description": "Moon phase condition (nighttime only)",
"enum": [
"full_moon",
"new_moon"
],
"type": "string"
},
"userState": {
"description": "User fatigue state at expedition start",
"enum": [
"well_rested",
"tired",
"exhausted",
"first_expedition"
],
"type": "string"
},
"weather": {
"description": "Weather condition during expedition",
"enum": [
"clear",
"overcast",
"rainy",
"stormy",
"foggy"
],
"type": "string"
}
},
"type": "object"
},
"expeditionFindings": {
"description": "What was found/gathered during the expedition",
"properties": {
"itemsCollected": {
"description": "Number of items collected",
"minimum": 0,
"type": "integer"
},
"likesSent": {
"description": "Likes sent during the expedition",
"minimum": 0,
"type": "integer"
},
"mothsSeen": {
"description": "Total moth encounters (caught + escaped)",
"minimum": 0,
"type": "integer"
},
"postsCreated": {
"description": "Posts created during the expedition",
"minimum": 0,
"type": "integer"
},
"postsRead": {
"description": "Posts read during the expedition",
"minimum": 0,
"type": "integer"
},
"specimensFound": {
"description": "Number of specimens successfully caught",
"minimum": 0,
"type": "integer"
},
"xpGained": {
"description": "XP gained from the expedition",
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"expeditionHeartbeat": {
"description": "Periodic snapshot of expedition progress for cross-device sync",
"properties": {
"light": {
"ref": "#heartbeatLight",
"type": "ref"
},
"progress": {
"ref": "#heartbeatProgress",
"type": "ref"
},
"updatedAt": {
"description": "When this heartbeat was written",
"format": "datetime",
"type": "string"
}
},
"type": "object"
},
"expeditionLight": {
"description": "Light resource tracking for the expedition",
"properties": {
"atEnd": {
"description": "Light level when expedition ended (in minutes)",
"minimum": 0,
"type": "integer"
},
"atStart": {
"description": "Light level when expedition started (in minutes)",
"minimum": 0,
"type": "integer"
},
"consumed": {
"description": "Total light consumed during expedition",
"minimum": 0,
"type": "integer"
},
"drainRate": {
"description": "Effective drain rate as a percentage (80 = 0.8x drain). Multiply by 0.01 to get the float multiplier.",
"type": "integer"
},
"regenerated": {
"description": "Light regenerated during camps",
"minimum": 0,
"type": "integer"
},
"status": {
"description": "Light status at start of expedition",
"enum": [
"bright",
"steady",
"dim",
"flickering",
"dying",
"fullCharge",
"charged",
"low",
"critical",
"dead"
],
"type": "string"
}
},
"type": "object"
},
"heartbeatLight": {
"description": "Light state at heartbeat time",
"properties": {
"current": {
"description": "Current light level",
"type": "integer"
},
"drainActive": {
"description": "Whether drain is actively ticking",
"type": "boolean"
},
"drainRate": {
"description": "Current drain rate as percentage",
"type": "integer"
},
"frozen": {
"description": "Whether light is frozen (at hub/trailhead)",
"type": "boolean"
}
},
"type": "object"
},
"heartbeatProgress": {
"description": "Session progress counters at heartbeat time",
"properties": {
"itemsCount": {
"minimum": 0,
"type": "integer"
},
"likesSent": {
"minimum": 0,
"type": "integer"
},
"mothsSeenCount": {
"minimum": 0,
"type": "integer"
},
"postsCreated": {
"minimum": 0,
"type": "integer"
},
"postsRead": {
"minimum": 0,
"type": "integer"
},
"repostsSent": {
"minimum": 0,
"type": "integer"
},
"specimensCount": {
"minimum": 0,
"type": "integer"
},
"xpGained": {
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"main": {
"description": "Expedition record. Created with status 'active' when entering the forest, updated to 'completed'/'abandoned' on extraction/abandon. rkey is a TID. Tracks the full lifecycle of a forest expedition including camps, gathered loot, light consumption, and conditions.",
"key": "tid",
"record": {
"properties": {
"abandonReason": {
"description": "Reason for abandonment (only set if status is 'abandoned')",
"enum": [
"light_depleted",
"user_abandoned",
"app_crash",
"force_close",
"auto_abandoned_stale"
],
"type": "string"
},
"activeDuration": {
"description": "Active exploring time in milliseconds (excludes camp rest time)",
"minimum": 0,
"type": "integer"
},
"campsCount": {
"description": "Number of camps made during the expedition",
"minimum": 0,
"type": "integer"
},
"completedAt": {
"description": "When the expedition ended (extracted or abandoned)",
"format": "datetime",
"type": "string"
},
"conditions": {
"ref": "#expeditionConditions",
"type": "ref"
},
"createdAt": {
"description": "When the record was created",
"format": "datetime",
"type": "string"
},
"duration": {
"description": "Total expedition duration in milliseconds",
"minimum": 0,
"type": "integer"
},
"expeditionNumber": {
"description": "Sequential expedition number for this user (Expedition 1, 2, 3...)",
"minimum": 1,
"type": "integer"
},
"findings": {
"ref": "#expeditionFindings",
"type": "ref"
},
"heartbeat": {
"ref": "#expeditionHeartbeat",
"type": "ref"
},
"light": {
"ref": "#expeditionLight",
"type": "ref"
},
"restDuration": {
"description": "Total camp/rest time in milliseconds",
"minimum": 0,
"type": "integer"
},
"signature": {
"ref": "#chronicleSignature",
"type": "ref"
},
"startedAt": {
"description": "When the expedition started (entered forest)",
"format": "datetime",
"type": "string"
},
"status": {
"description": "Current expedition status",
"enum": [
"active",
"completed",
"abandoned"
],
"type": "string"
},
"updatedAt": {
"description": "When the record was last updated",
"format": "datetime",
"type": "string"
}
},
"required": [
"status",
"signature",
"createdAt"
],
"type": "object"
},
"type": "record"
}
},
"id": "net.anisota.chronicle.expedition",
"lexicon": 1
}
Metadata
- DID
-
did:plc:lcieujcfkv4jx7gehsvok3pr - CID
-
bafyreib6rf6agapqztuek2uwrlgguiuarzmnrkrojwd5idmasx5mcfhf6m - Indexed At
- 2026-06-22 18:49 UTC
- AT-URI
-
at://did:plc:lcieujcfkv4jx7gehsvok3pr/com.atproto.lexicon.schema/net.anisota.chronicle.expedition
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
Walk record. Created with status 'active' at first engagement (first tracked action on the feed), kept current with putRecord, and updated to 'completed' when the walk closes (idle auto-close, light depletion, or a manu…
-
Camp record. Created when a user makes camp during an expedition. Updated when camp is broken. References the parent expedition record via AT URI.
-
Camp record. Created when a user makes camp during a walk. Updated when camp is broken. References the parent walk record via AT URI.
-
Daily activity snapshot. Updated throughout the day via putRecord. rkey is YYYY-MM-DD in user's local timezone.
-
Granular chronicle event log. Each record is a single timestamped event. TID rkey for chronological ordering. Used to capture moments that don't have their own record type (moth sightings, random encounters, item discov…