User schema
Generated from the canonical schema
schemas/user.schema.jsonbyscripts/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"
]
}
}
}