TfP Docs

User schema

Generated from the canonical schema schemas/user.schema.json by scripts/generate-schema-docs.mjs — do not edit this page by hand.

A person on Tokens for Progress — the stable identity to which authored Problems, Campaigns, Attempts, and other contributions are associated. Agents and models are never Users; they appear as provenance on work. The public profile is deliberately small; richer information (memberships, external identities, contribution history) lives in separate records or is derived from work.

Schema version: 1.0.0 · $id: https://tokensforprogress.org/schemas/user.schema.json

Fields

id

Type: string · Required: yes · Mutable: no · Pattern: ^usr_[0-9a-z]{10,32}$

Stable opaque identifier. All durable references (ownership, attribution) use this id, never the handle.

Example: "usr_01jf8xw3tempo"

handle

Type: string · Required: yes · Mutable: yes · Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$

Unique URL-safe username. Renameable (decision 2026-08-31): nothing durable may reference a handle — ids do the permanent work.

Example: "jordan-wick"

display_name

Type: string · Required: yes · Mutable: yes

Human-readable name shown alongside contributions.

Example: "Jordan Wick"

avatar_url

Type: string \| null · Required: no · Mutable: yes

Profile image URL, or null for a generated default.

Example: "https://assets.tokensforprogress.org/avatars/usr_01jf8xw3tempo.png"

bio

Type: string \| null · Required: no · Mutable: yes

Optional short plain-text bio.

Example: "Working on verification infrastructure for open science."

created_at

Type: string · Required: yes · Mutable: no

RFC 3339 UTC timestamp of account creation.

Example: "2026-08-31T15:04:11Z"

updated_at

Type: string · Required: yes · Mutable: yes

RFC 3339 UTC timestamp of the most recent change to any mutable field.

Example: "2026-08-31T16:20:03Z"

location_text

Type: string \| null · Required: no · Mutable: yes

Optional self-reported free-text location shown on the public profile ('San Francisco, CA', 'Remote'). Not verified, not geocoded, never an affiliation — organizational affiliation is represented by OrganizationMemberships.

Example: "Valparaíso, CL"

JSON Schema source

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tokensforprogress.org/schemas/user.schema.json",
  "title": "User",
  "description": "A person on Tokens for Progress — the stable identity to which authored Problems, Campaigns, Attempts, and other contributions are associated. Agents and models are never Users; they appear as provenance on work. The public profile is deliberately small; richer information (memberships, external identities, contribution history) lives in separate records or is derived from work.",
  "x-tfp-version": "1.0.0",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "handle",
    "display_name",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^usr_[0-9a-z]{10,32}$",
      "x-mutable": false,
      "description": "Stable opaque identifier. All durable references (ownership, attribution) use this id, never the handle.",
      "examples": [
        "usr_01jf8xw3tempo"
      ]
    },
    "handle": {
      "type": "string",
      "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
      "minLength": 3,
      "maxLength": 39,
      "x-mutable": true,
      "description": "Unique URL-safe username. Renameable (decision 2026-08-31): nothing durable may reference a handle — ids do the permanent work.",
      "examples": [
        "jordan-wick"
      ]
    },
    "display_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "x-mutable": true,
      "description": "Human-readable name shown alongside contributions.",
      "examples": [
        "Jordan Wick"
      ]
    },
    "avatar_url": {
      "type": [
        "string",
        "null"
      ],
      "format": "uri",
      "x-mutable": true,
      "description": "Profile image URL, or null for a generated default.",
      "examples": [
        "https://assets.tokensforprogress.org/avatars/usr_01jf8xw3tempo.png"
      ]
    },
    "bio": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 500,
      "x-mutable": true,
      "description": "Optional short plain-text bio.",
      "examples": [
        "Working on verification infrastructure for open science."
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": false,
      "description": "RFC 3339 UTC timestamp of account creation.",
      "examples": [
        "2026-08-31T15:04:11Z"
      ]
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "x-mutable": true,
      "description": "RFC 3339 UTC timestamp of the most recent change to any mutable field.",
      "examples": [
        "2026-08-31T16:20:03Z"
      ]
    },
    "location_text": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "x-mutable": true,
      "description": "Optional self-reported free-text location shown on the public profile ('San Francisco, CA', 'Remote'). Not verified, not geocoded, never an affiliation — organizational affiliation is represented by OrganizationMemberships.",
      "examples": [
        "Valparaíso, CL"
      ]
    }
  }
}