net.anisota.chronicle.log.monthly

anisota.net

{
  "$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"
    },
    "inAppCounts": {
      "description": "Per-category counts of activity performed inside anisota, summed across the period and across devices.",
      "properties": {
        "likes": {
          "description": "Likes created in anisota",
          "minimum": 0,
          "type": "integer"
        },
        "posts": {
          "description": "Top-level posts created in anisota",
          "minimum": 0,
          "type": "integer"
        },
        "quotes": {
          "description": "Quote posts created in anisota",
          "minimum": 0,
          "type": "integer"
        },
        "replies": {
          "description": "Replies created in anisota",
          "minimum": 0,
          "type": "integer"
        },
        "reposts": {
          "description": "Reposts created in anisota",
          "minimum": 0,
          "type": "integer"
        }
      },
      "type": "object"
    },
    "main": {
      "description": "Monthly aggregation of weekly records. rkey is YYYY-MM. Updated once per week, finalized when month ends.",
      "key": "any",
      "record": {
        "properties": {
          "aggregates": {
            "ref": "#monthlyAggregates",
            "type": "ref"
          },
          "createdAt": {
            "description": "When the monthly record was first created",
            "format": "datetime",
            "type": "string"
          },
          "expeditionRefs": {
            "description": "AT URIs of expedition records that occurred during this month",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "finalizedAt": {
            "description": "When the monthly record was finalized (end of month)",
            "format": "datetime",
            "type": "string"
          },
          "inApp": {
            "description": "Rolled-up in-anisota activity for the month (summed daily inApp across devices, per field). Optional and additive; the read side may instead compute this from the month's daily logs.",
            "ref": "#inAppCounts",
            "type": "ref"
          },
          "lowerLogRefs": {
            "description": "AT URIs of weekly log records included in this month",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "month": {
            "description": "Month string in YYYY-MM format (e.g. 2026-02)",
            "type": "string"
          },
          "patterns": {
            "ref": "#monthlyPatterns",
            "type": "ref"
          },
          "signature": {
            "ref": "#chronicleSignature",
            "type": "ref"
          },
          "status": {
            "description": "Whether this month is still being updated or has been finalized",
            "enum": [
              "active",
              "finalized"
            ],
            "type": "string"
          },
          "upperLogRefs": {
            "description": "AT URIs of containing logs (yearly) this month belongs to",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "month",
          "aggregates",
          "status",
          "signature",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "monthlyAggregates": {
      "description": "Rolled-up counts from weekly records",
      "properties": {
        "daysActive": {
          "description": "Number of days with activity this month",
          "minimum": 0,
          "type": "integer"
        },
        "likesReceived": {
          "description": "Total likes received this month",
          "minimum": 0,
          "type": "integer"
        },
        "postsCreated": {
          "description": "Total posts created this month",
          "minimum": 0,
          "type": "integer"
        },
        "postsRead": {
          "description": "Total posts read this month",
          "minimum": 0,
          "type": "integer"
        },
        "repliesReceived": {
          "description": "Total replies received this month",
          "minimum": 0,
          "type": "integer"
        },
        "specimensPhotographed": {
          "description": "New specimens photographed this month",
          "minimum": 0,
          "type": "integer"
        },
        "totalXPGained": {
          "description": "Total XP gained this month",
          "minimum": 0,
          "type": "integer"
        },
        "weeksActive": {
          "description": "Number of weeks with activity this month",
          "minimum": 0,
          "type": "integer"
        }
      },
      "type": "object"
    },
    "monthlyPatterns": {
      "description": "Activity pattern aggregation for the month based on half-hour blocks",
      "properties": {
        "avgBlocksPerDay": {
          "description": "Average active blocks per day (totalActiveBlocks / daysActive, rounded)",
          "minimum": 0,
          "type": "integer"
        },
        "peakBlocks": {
          "description": "Highest activeBlockCount for any single day in the month",
          "maximum": 48,
          "minimum": 0,
          "type": "integer"
        },
        "totalActiveBlocks": {
          "description": "Sum of activeBlockCount across all days in the month",
          "minimum": 0,
          "type": "integer"
        }
      },
      "type": "object"
    }
  },
  "id": "net.anisota.chronicle.log.monthly",
  "lexicon": 1
}

Validate Record

Validate a record against net.anisota.chronicle.log.monthly

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:lcieujcfkv4jx7gehsvok3pr
CID
bafyreibpyync5gizyn4y22jgtkjgdhrzya6z42u5mkfrqzuqymbdbe5fjm
Indexed At
2026-07-23 23:28 UTC
AT-URI
at://did:plc:lcieujcfkv4jx7gehsvok3pr/com.atproto.lexicon.schema/net.anisota.chronicle.log.monthly

Version History (2 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • net.anisota.chronicle.log.yearly recordnot from the namespace authority

    Yearly aggregation of monthly records. rkey is YYYY. Updated once per month, finalized when year ends.

  • net.anisota.chronicle.log.weekly recordnot from the namespace authority

    Weekly aggregation of daily records. rkey is YYYY-WNN (ISO week). Updated once per day, finalized when week ends.

  • net.anisota.chronicle.log.daily recordnot from the namespace authority

    Daily activity snapshot. Updated throughout the day via putRecord. rkey is YYYY-MM-DD in user's local timezone.

Lexicon Garden

@