{"openapi":"3.1.0","info":{"title":"Wren & Quill Project API","version":"1.2.0","description":"Access every world workspace, images, saved versions and language tools with an owner-issued project key. Publishing, collaborators and key management require separately granted permissions; agents cannot issue keys with broader permissions or a later expiry. GET /capabilities discovers allowed operations. Legacy read/write keys keep draft access and cannot publish or manage access. 120 requests per key per minute across all endpoints. Requests are limited to 4 MB in transit, and after gzip decoding to 20 MB for dictionary drafts and 12 MB for the atlas or Encyclopedia; use Content-Encoding: gzip for large documents. Large responses use Content-Encoding: gzip. Each document has its own revision, and writes require that document's latest revision."},"servers":[{"url":"https://wrenquill.app"}],"security":[{"projectKey":[]}],"paths":{"/api/v1/projects/{id}/atlas/places":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAtlasPlaces","summary":"List map places without geometry","x-permissions":["atlas:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List map places without geometry","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postAtlasPlaces","summary":"Link or unlink a map feature and an Encyclopedia article","x-permissions":["atlas:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Link or unlink a map feature and an Encyclopedia article","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"feature":{"type":"string","format":"uuid"},"article":{"type":["string","null"]}},"required":["feature","article"]}}}}}},"/api/v1/projects/{id}/index/entries":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getIndexEntries","summary":"List article choices without article bodies","x-permissions":["index:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List article choices without article bodies","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postIndexEntries","summary":"Create an article, city or event","x-permissions":["index:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Create an article, city or event","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":180},"template":{"enum":["article","city","event"]},"timeline":{"$ref":"#/components/schemas/EventDate"}},"required":["title","template"]}}}}}},"/api/v1/projects/{id}/index/timeline":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getIndexTimeline","summary":"Read shared event dates and year settings","x-permissions":["index:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read shared event dates and year settings","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"patch":{"operationId":"patchIndexTimeline","summary":"Update one event date with revision protection","x-permissions":["index:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Update one event date with revision protection","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"entry":{"type":"string"},"revision":{"type":"integer","minimum":0},"date":{"$ref":"#/components/schemas/EventDate"}},"required":["entry","revision","date"]}}}}}},"/api/v1/projects/{id}/tools":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getTools","summary":"Transcribe, generate words, preview sound changes or translate using saved language settings","x-permissions":["dictionary:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Transcribe, generate words, preview sound changes or translate using saved language settings","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"parameters":[{"name":"tool","in":"query","required":true,"schema":{"enum":["transcribe","generate","sound-change","translate"]}},{"name":"languageId","in":"query","required":true,"schema":{"type":"string"}},{"name":"dialectId","in":"query","required":false,"schema":{"type":"string"}},{"name":"text","in":"query","required":false,"schema":{"type":"string","maxLength":1000}},{"name":"reverse","in":"query","required":false,"schema":{"enum":["0","1"],"default":"0"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":20}},{"name":"min","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":5,"default":1}},{"name":"max","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":5,"default":3}}]}},"/api/v1/projects/{id}/media":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getMedia","summary":"List this world’s images and storage availability","x-permissions":["media:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List this world’s images and storage availability","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postMedia","summary":"Upload an optimized WebP image","x-permissions":["media:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"201":{"description":"Upload an optimized WebP image","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","maxLength":180}},{"name":"kind","in":"query","required":false,"schema":{"enum":["image","map"],"default":"image"}}]},"patch":{"operationId":"patchMedia","summary":"Select an image already available to this world","x-permissions":["media:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Select an image already available to this world","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mediaId":{"type":"string","format":"uuid"}},"required":["mediaId"]}}}}},"delete":{"operationId":"deleteMedia","summary":"Delete an unused image exclusive to this world","x-permissions":["media:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Delete an unused image exclusive to this world","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mediaId":{"type":"string","format":"uuid"}},"required":["mediaId"]}}}}}},"/api/v1/projects/{id}/media/{mediaId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"mediaId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getMediaMediaId","summary":"Fetch private world image bytes","x-permissions":["media:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Fetch private world image bytes","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}}},"/api/v1/projects/{id}/versions":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getVersions","summary":"List saved Dictionary revisions","x-permissions":["history:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List saved Dictionary revisions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postVersions","summary":"Save a named revision of the current Dictionary draft","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Save a named revision of the current Dictionary draft","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1},"label":{"type":"string","minLength":1,"maxLength":150}},"required":["revision","label"]}}}}}},"/api/v1/projects/{id}/versions/{versionId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getVersionsVersionId","summary":"Read a saved Dictionary revision","x-permissions":["history:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read a saved Dictionary revision","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"put":{"operationId":"putVersionsVersionId","summary":"Overwrite an unpublished saved Dictionary revision","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Overwrite an unpublished saved Dictionary revision","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1},"generation":{"type":"integer","minimum":1}},"required":["revision","generation"]}}}}},"delete":{"operationId":"deleteVersionsVersionId","summary":"Delete an unpublished saved Dictionary revision","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Delete an unpublished saved Dictionary revision","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"generation":{"type":"integer","minimum":1}},"required":["generation"]}}}}}},"/api/v1/projects/{id}/versions/{versionId}/restore":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"post":{"operationId":"postVersionsVersionIdRestore","summary":"Restore a Dictionary revision to the private draft","x-permissions":["history:write","dictionary:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Restore a Dictionary revision to the private draft","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1},"generation":{"type":"integer","minimum":1}},"required":["revision","generation"]}}}}}},"/api/v1/projects/{id}/atlas/versions":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAtlasVersions","summary":"List saved Atlas versions","x-permissions":["history:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List saved Atlas versions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postAtlasVersions","summary":"Save a named or automatic Atlas version","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Save a named or automatic Atlas version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"reason":{"enum":["named","reset","delete-planet","import"]},"label":{"type":"string","maxLength":120},"detail":{"type":"string","maxLength":200},"data":{"$ref":"#/components/schemas/Atlas"}},"required":["reason","data"]}}}}}},"/api/v1/projects/{id}/atlas/versions/{versionId}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAtlasVersionsVersionId","summary":"Read a saved Atlas version","x-permissions":["history:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read a saved Atlas version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"delete":{"operationId":"deleteAtlasVersionsVersionId","summary":"Delete an Atlas version","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Delete an Atlas version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}}},"/api/v1/projects/{id}/atlas/versions/{versionId}/restore":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"post":{"operationId":"postAtlasVersionsVersionIdRestore","summary":"Keep the current Atlas before restoration; apply the restored data with PUT /atlas","x-permissions":["history:write"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Keep the current Atlas before restoration; apply the restored data with PUT /atlas","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Atlas"}},"required":["data"]}}}}}},"/api/v1/projects/{id}/publication":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getPublication","summary":"Read Dictionary publication status","x-permissions":["dictionary:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read Dictionary publication status","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postPublication","summary":"Publish a saved Dictionary revision or unpublish it","x-permissions":["publish"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Publish a saved Dictionary revision or unpublish it","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"versionId":{"type":["string","null"]},"generation":{"type":"integer","minimum":1}},"required":["versionId"]}}}}}},"/api/v1/projects/{id}/atlas/publication":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAtlasPublication","summary":"Read Atlas publication status","x-permissions":["atlas:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read Atlas publication status","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postAtlasPublication","summary":"Publish or unpublish the saved Atlas","x-permissions":["publish"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Publish or unpublish the saved Atlas","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"action":{"const":"publish"},"revision":{"type":"integer","minimum":1}},"required":["action","revision"]},{"type":"object","additionalProperties":false,"properties":{"action":{"const":"unpublish"},"publishedAt":{"type":"string"}},"required":["action","publishedAt"]}]}}}}}},"/api/v1/projects/{id}/index/publication":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getIndexPublication","summary":"Read Encyclopedia publication status","x-permissions":["index:read"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read Encyclopedia publication status","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postIndexPublication","summary":"Publish or unpublish Encyclopedia, Ecology and Timeline; secret entries are excluded","x-permissions":["publish"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Publish or unpublish Encyclopedia, Ecology and Timeline; secret entries are excluded","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"action":{"const":"publish"},"revision":{"type":"integer","minimum":1}},"required":["action","revision"]},{"type":"object","additionalProperties":false,"properties":{"action":{"const":"unpublish"},"publishedAt":{"type":"string"}},"required":["action","publishedAt"]}]}}}}}},"/api/v1/projects/{id}/world/publication":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getWorldPublication","summary":"Read the current Dictionary, Atlas and Encyclopedia revisions for publishing the full world","x-permissions":["publish"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Read the current Dictionary, Atlas and Encyclopedia revisions for publishing the full world","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postWorldPublication","summary":"Publish Dictionary, Atlas and Encyclopedia together as one release","x-permissions":["publish"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Publish Dictionary, Atlas and Encyclopedia together as one release","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revisions":{"type":"object","additionalProperties":false,"properties":{"dictionary":{"type":"integer","minimum":1},"atlas":{"type":"integer","minimum":0},"index":{"type":"integer","minimum":0}},"required":["dictionary","atlas","index"]},"dictionaryVersion":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"generation":{"type":"integer","minimum":1}},"required":["id","generation"]}},"required":["revisions"]}}}}}},"/api/v1/projects/{id}/members":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getMembers","summary":"List collaborators","x-permissions":["members"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List collaborators","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postMembers","summary":"Add a collaborator by email","x-permissions":["members"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Add a collaborator by email","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}}},"delete":{"operationId":"deleteMembers","summary":"Remove a collaborator by email","x-permissions":["members"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Remove a collaborator by email","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}}}},"/api/v1/projects/{id}/integrations":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getIntegrations","summary":"List integration metadata and permissions; secrets are never returned","x-permissions":["integrations"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"List integration metadata and permissions; secrets are never returned","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}}},"post":{"operationId":"postIntegrations","summary":"Create a key with a subset of this key’s permissions and no later expiry","x-permissions":["integrations"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"201":{"description":"Create a key with a subset of this key’s permissions and no later expiry","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"enum":["api","agent"]},"scope":{"enum":["read","write"]},"expiresInDays":{"enum":[30,90,365]},"permissions":{"type":"array","minItems":1,"maxItems":13,"items":{"enum":["dictionary:read","dictionary:write","atlas:read","atlas:write","index:read","index:write","media:read","media:write","history:read","history:write","publish","members","integrations"]}}},"required":["name","kind","scope","expiresInDays"]}}}}},"delete":{"operationId":"deleteIntegrations","summary":"Revoke a project key","x-permissions":["integrations"],"description":"Requires all permissions listed in x-permissions. Uses the same saved world data, schema validation and conflict checks as the studio.","responses":{"200":{"description":"Revoke a project key","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid, expired, revoked or wrong-project key"},"403":{"description":"Required permission was not granted"},"404":{"description":"Resource not found in this world"},"409":{"description":"Revision/generation conflict, protected publication, or image still in use/shared"},"413":{"description":"Request or storage limit exceeded"},"429":{"description":"Rate or cloud budget limit; use Retry-After"},"503":{"description":"Storage unavailable or saving paused"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"keyId":{"type":"string","format":"uuid"}},"required":["keyId"]}}}}}},"/api/v1/projects/{id}/mcp":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"operationId":"mcp","summary":"Model Context Protocol server for this world (revision 2026-07-28)","description":"One JSON-RPC message per POST, following the MCP Streamable HTTP transport. Tools cover every operation here, and each one requires the same permissions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"JSON-RPC response","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Notification accepted"},"400":{"description":"Invalid message, headers or protocol version"},"401":{"description":"Invalid key"},"403":{"description":"Foreign Origin"},"404":{"description":"Unknown JSON-RPC method"},"429":{"description":"Rate limit; use Retry-After"}}}},"/api/v1/projects/{id}/capabilities":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"readCapabilities","summary":"Discover this key’s permissions and every world operation","responses":{"200":{"description":"Permissions, expiry, operations and allowed flags","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Invalid key"},"429":{"description":"Rate limited"}}}},"/api/v1/projects/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"x-permissions":["dictionary:read"],"operationId":"readProject","summary":"Read the current project draft and revision","responses":{"200":{"description":"Current draft","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer"},"updatedAt":{"type":"string"},"data":{"$ref":"#/components/schemas/Project"}},"required":["id","revision","updatedAt","data"]}}}},"401":{"description":"Invalid, expired, revoked, or wrong-project key"},"403":{"description":"Key lacks the dictionary:read permission"},"429":{"description":"Rate limited; use Retry-After"}}},"put":{"x-permissions":["dictionary:write"],"operationId":"saveProject","summary":"Replace the private draft with revision conflict protection","description":"Requires a read/write key. GET first; preserve unchanged data. A 409 requires fetching and merging with the latest draft, never blindly incrementing the revision.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["revision","data"],"properties":{"revision":{"type":"integer","minimum":1},"data":{"$ref":"#/components/schemas/Project"}}}}}},"responses":{"200":{"description":"Saved draft with new revision","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer"},"updatedAt":{"type":"string"},"data":{"$ref":"#/components/schemas/Project"}},"required":["id","revision","updatedAt","data"]}}}},"400":{"description":"Invalid project data"},"401":{"description":"Invalid key"},"403":{"description":"Read-only key"},"409":{"description":"Revision conflict"},"413":{"description":"Request exceeds 4 MB in transit or 20 MB after gzip decoding"},"429":{"description":"Rate limited; use Retry-After"}}}},"/api/v1/projects/{id}/atlas":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"x-permissions":["atlas:read"],"operationId":"readAtlas","summary":"Read the atlas and its revision","description":"The world map: land, elevation, region, forest, lake, river, road, label, location, and event features. Revision 0 with null data means the world has no atlas yet.","responses":{"200":{"description":"Current atlas","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer","minimum":0},"updatedAt":{"type":["string","null"]},"data":{"oneOf":[{"$ref":"#/components/schemas/Atlas"},{"type":"null"}]}},"required":["id","revision","updatedAt","data"]}}}},"401":{"description":"Invalid, expired, revoked, or wrong-project key"},"403":{"description":"Key lacks the required read permission"},"429":{"description":"Rate limited; use Retry-After"}}},"put":{"x-permissions":["atlas:write"],"operationId":"saveAtlas","summary":"Replace the atlas with revision conflict protection","description":"Requires a read/write key. GET first; preserve unchanged data. Send revision 0 only to create the first atlas. A 409 requires fetching and merging with the latest atlas, never blindly incrementing the revision.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["revision","data"],"properties":{"revision":{"type":"integer","minimum":0},"data":{"$ref":"#/components/schemas/Atlas"}}}}}},"responses":{"200":{"description":"New revision of the saved atlas; GET to read the stored document","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer","minimum":1},"updatedAt":{"type":"string"}},"required":["id","revision","updatedAt"]}}}},"400":{"description":"Invalid atlas data"},"401":{"description":"Invalid key"},"403":{"description":"Read-only key"},"409":{"description":"Revision conflict"},"413":{"description":"Request exceeds 4 MB in transit or 12 MB after gzip decoding"},"429":{"description":"Rate limited; use Retry-After"}}}},"/api/v1/projects/{id}/index":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"x-permissions":["index:read"],"operationId":"readEncyclopedia","summary":"Read the Encyclopedia and its revision","description":"Articles and categories, plus the Ecology graph (species and biomes are entries with `ecology` metadata; relationships are in `ecology.links`) and Timeline (events are entries with `timeline` dates; eras and year systems are in `timeline`). `languageScripts` is maintained by the server from the languages that species names use. Revision 0 with null data means the world has no Encyclopedia yet.","responses":{"200":{"description":"Current Encyclopedia","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer","minimum":0},"updatedAt":{"type":["string","null"]},"data":{"oneOf":[{"$ref":"#/components/schemas/Encyclopedia"},{"type":"null"}]}},"required":["id","revision","updatedAt","data"]}}}},"401":{"description":"Invalid, expired, revoked, or wrong-project key"},"403":{"description":"Key lacks the required read permission"},"429":{"description":"Rate limited; use Retry-After"}}},"put":{"x-permissions":["index:write"],"operationId":"saveEncyclopedia","summary":"Replace the Encyclopedia with revision conflict protection","description":"Requires a read/write key. GET first; preserve unchanged data. Send revision 0 only to create the first Encyclopedia. A 409 requires fetching and merging with the latest Encyclopedia, never blindly incrementing the revision.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["revision","data"],"properties":{"revision":{"type":"integer","minimum":0},"data":{"$ref":"#/components/schemas/Encyclopedia"}}}}}},"responses":{"200":{"description":"New revision of the saved Encyclopedia; GET to read the stored document","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"revision":{"type":"integer","minimum":1},"updatedAt":{"type":"string"}},"required":["id","revision","updatedAt"]}}}},"400":{"description":"Invalid Encyclopedia data"},"401":{"description":"Invalid key"},"403":{"description":"Read-only key"},"409":{"description":"Revision conflict"},"413":{"description":"Request exceeds 4 MB in transit or 12 MB after gzip decoding"},"429":{"description":"Rate limited; use Retry-After"}}}}},"components":{"securitySchemes":{"projectKey":{"type":"http","scheme":"bearer","description":"Project API key created by its owner in Project settings → API & agents."}},"schemas":{"Project":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"format":{"type":"string","const":"wren-quill/1"},"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":20000},"languages":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":20000},"documentation":{"type":"string","maxLength":20000},"font":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"format":{"type":"string","enum":["ttf","otf","woff","woff2"]},"data":{"type":"string","minLength":44,"maxLength":2796204,"pattern":"^[A-Za-z0-9+/]+={0,2}$"}},"required":["id","name","format","data"]},"fontDisplay":{"type":"object","properties":{"scale":{"default":1,"type":"number","minimum":0.5,"maximum":3},"showRomanized":{"default":false,"type":"boolean"},"romanizedOpacity":{"default":0.6,"type":"number","minimum":0.35,"maximum":0.85}}},"words":{"maxItems":20000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"word":{"type":"string","minLength":1,"maxLength":100},"pronunciation":{"type":"string","maxLength":20000},"ipa":{"type":"string","maxLength":20000},"dialectId":{"type":["string","null"]},"translations":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"senses":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"pos":{"type":"string","enum":["noun","verb","adjective","adverb","pronoun","determiner / article","numeral","conjunction","preposition","particle","interjection",""]},"meaning":{"type":"string","maxLength":20000}},"required":["pos","meaning"]}},"examples":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":20000},"translation":{"type":"string","maxLength":20000}},"required":["text","translation"]}},"synonyms":{"type":"string","maxLength":20000},"etymology":{"type":"string","maxLength":20000},"tags":{"maxItems":30,"type":"array","items":{"type":"string","maxLength":80}},"generated":{"type":"boolean"},"origin":{"type":"object","properties":{"languageId":{"type":"string","minLength":1,"maxLength":100},"dialectId":{"type":["string","null"]},"wordId":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","maxLength":210},"word":{"type":"string","maxLength":100},"ipa":{"type":"string","maxLength":20000}},"required":["languageId","dialectId","wordId","name","word","ipa"]}},"required":["id","word","pronunciation","ipa","dialectId","senses","examples","synonyms","etymology","tags","generated"]}},"phonology":{"type":"object","properties":{"inventory":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string","minLength":1,"maxLength":20},"roman":{"type":"string","minLength":1,"maxLength":20},"kind":{"type":"string","enum":["consonant","vowel"]},"place":{"default":"Custom","type":"string","maxLength":20000},"manner":{"default":"Custom","type":"string","maxLength":20000},"voiced":{"default":true,"type":"boolean"},"rounded":{"type":"boolean"}},"required":["symbol","roman","kind"]}},"patterns":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","pattern":"^[CV]{1,8}$"}},"clusters":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":30}},"sequences":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":30}},"rules":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"from":{"type":"string","minLength":1,"maxLength":30},"to":{"type":"string","maxLength":30},"before":{"type":"string","maxLength":30},"after":{"type":"string","maxLength":30},"description":{"type":"string","maxLength":20000},"enabled":{"type":"boolean"}},"required":["id","title","from","to","before","after","description","enabled"]}},"examples":{"type":"object","propertyNames":{"type":"string","maxLength":60},"additionalProperties":{"type":"string","maxLength":1000}}},"required":["inventory","patterns","clusters","sequences","rules"]},"grammar":{"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"category":{"type":"string","enum":["Syntax","Morphology"]},"subtype":{"type":"string","maxLength":20000},"description":{"type":"string","maxLength":20000},"examples":{"type":"string","maxLength":20000},"affix":{"type":"string","maxLength":20000},"group":{"type":"string","maxLength":20000},"table":{"maxItems":40,"type":"array","items":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":200}}}},"required":["id","title","category","subtype","description","examples","affix","group","table"]}},"dialects":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":20000},"parentId":{"type":["string","null"]},"inheritedWords":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":100},"additionalProperties":{"type":"string","minLength":1,"maxLength":100}},"phonology":{"type":"object","properties":{"inventory":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string","minLength":1,"maxLength":20},"roman":{"type":"string","minLength":1,"maxLength":20},"kind":{"type":"string","enum":["consonant","vowel"]},"place":{"default":"Custom","type":"string","maxLength":20000},"manner":{"default":"Custom","type":"string","maxLength":20000},"voiced":{"default":true,"type":"boolean"},"rounded":{"type":"boolean"}},"required":["symbol","roman","kind"]}},"patterns":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","pattern":"^[CV]{1,8}$"}},"clusters":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":30}},"sequences":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":30}},"rules":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"from":{"type":"string","minLength":1,"maxLength":30},"to":{"type":"string","maxLength":30},"before":{"type":"string","maxLength":30},"after":{"type":"string","maxLength":30},"description":{"type":"string","maxLength":20000},"enabled":{"type":"boolean"}},"required":["id","title","from","to","before","after","description","enabled"]}},"examples":{"type":"object","propertyNames":{"type":"string","maxLength":60},"additionalProperties":{"type":"string","maxLength":1000}}},"required":["inventory","patterns","clusters","sequences","rules"]},"grammar":{"maxItems":300,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"category":{"type":"string","enum":["Syntax","Morphology"]},"subtype":{"type":"string","maxLength":20000},"description":{"type":"string","maxLength":20000},"examples":{"type":"string","maxLength":20000},"affix":{"type":"string","maxLength":20000},"group":{"type":"string","maxLength":20000},"table":{"maxItems":40,"type":"array","items":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":200}}}},"required":["id","title","category","subtype","description","examples","affix","group","table"]}},"processes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","maxLength":20000}},"history":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","minLength":1,"maxLength":100},"mode":{"type":"string","enum":["parallel","sequential"]},"rules":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"from":{"type":"string","minLength":1,"maxLength":30},"to":{"type":"string","maxLength":30},"before":{"type":"string","maxLength":30},"after":{"type":"string","maxLength":30},"description":{"type":"string","maxLength":20000},"enabled":{"type":"boolean"}},"required":["id","title","from","to","before","after","description","enabled"]}},"appliedAt":{"type":"string","maxLength":40},"affected":{"type":"integer","minimum":0,"maximum":20000}},"required":["id","title","mode","rules","appliedAt","affected"]}}},"required":["id","name","description","parentId","phonology","grammar","processes"]}},"history":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","minLength":1,"maxLength":100},"mode":{"type":"string","enum":["parallel","sequential"]},"rules":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"title":{"type":"string","maxLength":20000},"from":{"type":"string","minLength":1,"maxLength":30},"to":{"type":"string","maxLength":30},"before":{"type":"string","maxLength":30},"after":{"type":"string","maxLength":30},"description":{"type":"string","maxLength":20000},"enabled":{"type":"boolean"}},"required":["id","title","from","to","before","after","description","enabled"]}},"appliedAt":{"type":"string","maxLength":40},"affected":{"type":"integer","minimum":0,"maximum":20000}},"required":["id","title","mode","rules","appliedAt","affected"]}}},"required":["id","name","description","documentation","words","phonology","grammar","dialects"]}},"families":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":20000},"nodes":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"languageId":{"type":"string","minLength":1,"maxLength":100},"parentId":{"type":["string","null"]},"x":{"type":"number","minimum":0,"maximum":5000},"y":{"type":"number","minimum":0,"maximum":5000}},"required":["languageId","parentId","x","y"]}}},"required":["id","name","description","nodes"]}}},"required":["format","name","languages","families"]},"Atlas":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"format":{"type":"string","const":"wren-quill-atlas/1"},"name":{"type":"string","minLength":1,"maxLength":120},"cartography":{"type":"object","properties":{"preset":{"type":"string","maxLength":72},"hidePrimeMeridianName":{"type":"boolean"},"relief":{"type":"string","enum":["subtle","strong"]},"presets":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":60},"theme":{"type":"string","enum":["light","dark"]},"finish":{"type":"string","enum":["standard","vintage"]},"colors":{"type":"object","properties":{"ocean":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"land":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"coast":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"forest":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"river":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"road":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"roadEdge":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"ink":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"halo":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"region":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"elevations":{"minItems":7,"maxItems":7,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}},"required":["ocean","land","coast","forest","river","road","roadEdge","ink","halo","region","elevations"],"additionalProperties":false}},"required":["id","name","theme","finish","colors"],"additionalProperties":false}}},"required":["preset"],"additionalProperties":false},"kilometersPerUnit":{"default":0.6,"type":"number","minimum":0.0001,"maximum":100},"elevationColors":{"type":"object","properties":{"light":{"minItems":7,"maxItems":7,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"dark":{"minItems":7,"maxItems":7,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}}},"biomeOpacity":{"type":"number","minimum":0,"maximum":1},"atmosphere":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"density":{"type":"number","minimum":0,"maximum":1},"clouds":{"type":"number","minimum":0,"maximum":1},"cloudColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"cloudScale":{"type":"number","minimum":0,"maximum":1},"cloudSpeed":{"type":"number","minimum":0,"maximum":1},"seed":{"type":"integer","minimum":0,"maximum":9999}},"required":["color","density","clouds","cloudColor","cloudScale","cloudSpeed","seed"]},"physics":{"type":"object","properties":{"shape":{"oneOf":[{"type":"object","properties":{"model":{"type":"string","const":"sphere"}},"required":["model"]},{"type":"object","properties":{"model":{"type":"string","const":"oblate"},"flattening":{"type":"number","minimum":0,"exclusiveMaximum":1}},"required":["model"]}]},"bulk":{"oneOf":[{"type":"object","properties":{"from":{"type":"string","const":"mass"},"massKg":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"density"},"densityKgM3":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"gravity"},"gravityMs2":{"type":"number","exclusiveMinimum":0}},"required":["from"]}]},"rotation":{"type":"object","properties":{"siderealSeconds":{"type":"number","exclusiveMinimum":0},"direction":{"type":"string","enum":["prograde","retrograde"]}},"required":["direction"]},"orbit":{"oneOf":[{"type":"object","properties":{"from":{"type":"string","const":"axis"},"semiMajorAxisM":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"period"},"periodSeconds":{"type":"number","exclusiveMinimum":0}},"required":["from"]}]},"parentBodyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parentName":{"type":"string","maxLength":120},"parentMassKg":{"type":"number","exclusiveMinimum":0},"eccentricity":{"type":"number","minimum":0,"exclusiveMaximum":1},"axialTiltDegrees":{"type":"number","minimum":0,"maximum":180}}},"features":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"featureType":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"locationType":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"regionLayer":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"regionStyle":{"type":"object","properties":{"fillOpacity":{"type":"number","minimum":0,"maximum":1},"borderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"borderOpacity":{"type":"number","minimum":0,"maximum":1},"borderWidth":{"type":"number","minimum":0.5,"maximum":8},"borderStyle":{"type":"string","enum":["solid","dashed","dotted","none"]}}},"regionParent":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","maxLength":120},"description":{"default":"","type":"string","maxLength":20000},"article":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"points":{"minItems":1,"maxItems":12000,"type":"array","items":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2}},"wrap":{"type":"boolean"},"pathNodes":{"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"riverWidth":{"type":"number","minimum":0.05,"maximum":1000},"riverWidths":{"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"number","minimum":0.05,"maximum":1000},{"type":"null"}]}},"smooth":{"default":false,"type":"boolean"},"vector":{"minItems":1,"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"array","prefixItems":[{"type":"string","const":"M"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":3,"maxItems":3},{"type":"array","prefixItems":[{"type":"string","const":"L"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":3,"maxItems":3},{"type":"array","prefixItems":[{"type":"string","const":"Q"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":5,"maxItems":5},{"type":"array","prefixItems":[{"type":"string","const":"C"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":7,"maxItems":7},{"type":"array","prefixItems":[{"type":"string","const":"Z"}],"items":false,"minItems":1,"maxItems":1}]}},"fillRule":{"type":"string","enum":["evenodd","nonzero"]},"brush":{"type":"object","properties":{"radius":{"type":"number","minimum":0.001,"maximum":10000},"radiusY":{"type":"number","minimum":0.001,"maximum":6000},"delta":{"type":"number","minimum":-8000,"maximum":8000},"profile":{"type":"string","enum":["soft","natural"]},"detail":{"type":"number","minimum":0,"maximum":1},"hardness":{"type":"number","minimum":0,"maximum":1},"mode":{"type":"string","enum":["add","level"]},"height":{"type":"number","minimum":0,"maximum":9000},"variation":{"type":"number","minimum":0,"maximum":2000},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"erosion":{"type":"number","minimum":0,"maximum":1}},"required":["radius","delta"]},"uplift":{"type":"object","properties":{"amount":{"type":"number","minimum":0,"maximum":6000},"variation":{"type":"number","minimum":0,"maximum":2000},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"origin":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"center":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"scale":{"type":"array","prefixItems":[{"type":"number","minimum":0.001,"maximum":1000000},{"type":"number","minimum":0.001,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2}},"required":["amount","variation","seed","batch","origin","scale"]},"coastProtection":{"type":"boolean"},"hydrology":{"type":"string","const":"terrain"},"biome":{"type":"string","enum":["ice","tundra","taiga","temperate-forest","grassland","desert","savanna","rainforest","wetland","alpine"]},"climate":{"type":"string","enum":["generated","kept"]},"terrain":{"type":"string","enum":["plain","hills","mountain","ridge","ridgeline","plateau","valley"]},"terrainFrame":{"type":"object","properties":{"origin":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"center":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"radius":{"type":"number","minimum":0.001,"maximum":20000}},"required":["origin","radius"]},"generation":{"type":"object","properties":{"seed":{"type":"integer","minimum":0,"maximum":2147483647},"center":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"origin":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"radius":{"type":"array","prefixItems":[{"type":"number","minimum":0.001,"maximum":20000},{"type":"number","minimum":0.001,"maximum":12000}],"items":false,"minItems":2,"maxItems":2},"roughness":{"type":"number","minimum":0,"maximum":1},"peak":{"type":"number","minimum":0,"maximum":8000}},"required":["seed","center","radius","roughness","peak"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"elevation":{"default":0,"type":"number","minimum":-500,"maximum":9000},"minZoom":{"default":0.5,"type":"number","minimum":0.5,"maximum":8192},"maxZoom":{"default":8192,"type":"number","minimum":0.5,"maximum":8192},"labelSize":{"default":13,"type":"number","minimum":10,"maximum":28},"labelImportance":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"labelStyle":{"type":"object","properties":{"font":{"type":"string","maxLength":150},"italic":{"type":"boolean"},"caps":{"type":"boolean"},"tracking":{"type":"number","minimum":0,"maximum":1},"weight":{"type":"integer","minimum":300,"maximum":800},"align":{"type":"string","enum":["start","middle"]}}},"showName":{"type":"boolean"},"nameColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"namePosition":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"category":{"default":"other","type":"string","enum":["continent","country","region","city","town","village","landmark","capital","port","fortress","temple","ruins","mine","battle","discovery","disaster","other"]},"startYear":{"default":null,"anyOf":[{"type":"integer","minimum":-1000000000,"maximum":1000000000},{"type":"null"}]},"endYear":{"default":null,"anyOf":[{"type":"integer","minimum":-1000000000,"maximum":1000000000},{"type":"null"}]},"population":{"default":"","type":"string","maxLength":100},"polar":{"type":"string","enum":["north","south"]}},"required":["id","kind","name"]}},"regionLayers":{"minItems":1,"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"parentId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"}},"required":["id","name"]}},"mapLayers":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"regionLayers":{"maxItems":32,"type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"}}},"required":["id","name","regionLayers"]}},"featureTypes":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"kind":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"settings":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"nameColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"labelStyle":{"type":"object","properties":{"font":{"type":"string","maxLength":150},"italic":{"type":"boolean"},"caps":{"type":"boolean"},"tracking":{"type":"number","minimum":0,"maximum":1},"weight":{"type":"integer","minimum":300,"maximum":800},"align":{"type":"string","enum":["start","middle"]}}},"labelSize":{"type":"number","minimum":10,"maximum":28},"labelImportance":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"showName":{"type":"boolean"},"regionStyle":{"type":"object","properties":{"fillOpacity":{"type":"number","minimum":0,"maximum":1},"borderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"borderOpacity":{"type":"number","minimum":0,"maximum":1},"borderWidth":{"type":"number","minimum":0.5,"maximum":8},"borderStyle":{"type":"string","enum":["solid","dashed","dotted","none"]}}},"minZoom":{"type":"number","minimum":0.5,"maximum":8192},"maxZoom":{"type":"number","minimum":0.5,"maximum":8192}},"required":["labelSize","minZoom","maxZoom"]}},"required":["id","name","kind","settings"]}},"layerSettings":{"type":"object","propertyNames":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"additionalProperties":{"type":"object","properties":{"visible":{"type":"boolean"},"locked":{"type":"boolean"}}}},"locationTypes":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"marker":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"shape"},"shape":{"type":"string","enum":["dot","circle","square","diamond","triangle","star","cross","none"]}},"required":["kind","shape"]},{"type":"object","properties":{"kind":{"type":"string","const":"lucide"},"icon":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"paths":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":12000,"pattern":"^[MmLlHhVvCcSsQqTtAaZz\\d\\s.,eE+\\-]+$"}}},"required":["kind","icon","paths"]},{"type":"object","properties":{"kind":{"type":"string","const":"legacy"},"category":{"type":"string","enum":["capital","city","town","village","port","fortress","temple","ruins","mine","landmark","continent","country","region","battle","discovery","disaster","other"]}},"required":["kind","category"]}]}},"required":["id","name","marker"]}},"labelImportanceTypes":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"minZoom":{"type":"number","minimum":0.5,"maximum":8192}},"required":["id","name","minZoom"]}},"travel":{"type":"object","properties":{"walking":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000}}},"riding":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000}}},"wagon":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000},"maxGrade":{"type":"number","minimum":0.01,"maximum":1}}},"boat":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"water":{"type":"number","minimum":0.1,"maximum":1000},"river":{"type":"number","minimum":0.1,"maximum":1000}}},"flying":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"air":{"type":"number","minimum":0.1,"maximum":1000}}}}},"planetName":{"type":"string","minLength":1,"maxLength":120},"parentBodies":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":120},"kind":{"type":"string","enum":["star","planet","barycenter","other"]},"massKg":{"type":"number","exclusiveMinimum":0}},"required":["id","name","kind"]}},"planets":{"maxItems":11,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":120},"kilometersPerUnit":{"default":0.6,"type":"number","minimum":0.0001,"maximum":100},"elevationColors":{"type":"object","properties":{"light":{"minItems":7,"maxItems":7,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"dark":{"minItems":7,"maxItems":7,"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}}}},"biomeOpacity":{"type":"number","minimum":0,"maximum":1},"atmosphere":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"density":{"type":"number","minimum":0,"maximum":1},"clouds":{"type":"number","minimum":0,"maximum":1},"cloudColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"cloudScale":{"type":"number","minimum":0,"maximum":1},"cloudSpeed":{"type":"number","minimum":0,"maximum":1},"seed":{"type":"integer","minimum":0,"maximum":9999}},"required":["color","density","clouds","cloudColor","cloudScale","cloudSpeed","seed"]},"physics":{"type":"object","properties":{"shape":{"oneOf":[{"type":"object","properties":{"model":{"type":"string","const":"sphere"}},"required":["model"]},{"type":"object","properties":{"model":{"type":"string","const":"oblate"},"flattening":{"type":"number","minimum":0,"exclusiveMaximum":1}},"required":["model"]}]},"bulk":{"oneOf":[{"type":"object","properties":{"from":{"type":"string","const":"mass"},"massKg":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"density"},"densityKgM3":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"gravity"},"gravityMs2":{"type":"number","exclusiveMinimum":0}},"required":["from"]}]},"rotation":{"type":"object","properties":{"siderealSeconds":{"type":"number","exclusiveMinimum":0},"direction":{"type":"string","enum":["prograde","retrograde"]}},"required":["direction"]},"orbit":{"oneOf":[{"type":"object","properties":{"from":{"type":"string","const":"axis"},"semiMajorAxisM":{"type":"number","exclusiveMinimum":0}},"required":["from"]},{"type":"object","properties":{"from":{"type":"string","const":"period"},"periodSeconds":{"type":"number","exclusiveMinimum":0}},"required":["from"]}]},"parentBodyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parentName":{"type":"string","maxLength":120},"parentMassKg":{"type":"number","exclusiveMinimum":0},"eccentricity":{"type":"number","minimum":0,"exclusiveMaximum":1},"axialTiltDegrees":{"type":"number","minimum":0,"maximum":180}}},"features":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"featureType":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"locationType":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"regionLayer":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"regionStyle":{"type":"object","properties":{"fillOpacity":{"type":"number","minimum":0,"maximum":1},"borderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"borderOpacity":{"type":"number","minimum":0,"maximum":1},"borderWidth":{"type":"number","minimum":0.5,"maximum":8},"borderStyle":{"type":"string","enum":["solid","dashed","dotted","none"]}}},"regionParent":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","maxLength":120},"description":{"default":"","type":"string","maxLength":20000},"article":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"points":{"minItems":1,"maxItems":12000,"type":"array","items":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2}},"wrap":{"type":"boolean"},"pathNodes":{"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"riverWidth":{"type":"number","minimum":0.05,"maximum":1000},"riverWidths":{"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"number","minimum":0.05,"maximum":1000},{"type":"null"}]}},"smooth":{"default":false,"type":"boolean"},"vector":{"minItems":1,"maxItems":12000,"type":"array","items":{"anyOf":[{"type":"array","prefixItems":[{"type":"string","const":"M"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":3,"maxItems":3},{"type":"array","prefixItems":[{"type":"string","const":"L"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":3,"maxItems":3},{"type":"array","prefixItems":[{"type":"string","const":"Q"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":5,"maxItems":5},{"type":"array","prefixItems":[{"type":"string","const":"C"},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000},{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":7,"maxItems":7},{"type":"array","prefixItems":[{"type":"string","const":"Z"}],"items":false,"minItems":1,"maxItems":1}]}},"fillRule":{"type":"string","enum":["evenodd","nonzero"]},"brush":{"type":"object","properties":{"radius":{"type":"number","minimum":0.001,"maximum":10000},"radiusY":{"type":"number","minimum":0.001,"maximum":6000},"delta":{"type":"number","minimum":-8000,"maximum":8000},"profile":{"type":"string","enum":["soft","natural"]},"detail":{"type":"number","minimum":0,"maximum":1},"hardness":{"type":"number","minimum":0,"maximum":1},"mode":{"type":"string","enum":["add","level"]},"height":{"type":"number","minimum":0,"maximum":9000},"variation":{"type":"number","minimum":0,"maximum":2000},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"erosion":{"type":"number","minimum":0,"maximum":1}},"required":["radius","delta"]},"uplift":{"type":"object","properties":{"amount":{"type":"number","minimum":0,"maximum":6000},"variation":{"type":"number","minimum":0,"maximum":2000},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"batch":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"origin":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"center":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"scale":{"type":"array","prefixItems":[{"type":"number","minimum":0.001,"maximum":1000000},{"type":"number","minimum":0.001,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2}},"required":["amount","variation","seed","batch","origin","scale"]},"coastProtection":{"type":"boolean"},"hydrology":{"type":"string","const":"terrain"},"biome":{"type":"string","enum":["ice","tundra","taiga","temperate-forest","grassland","desert","savanna","rainforest","wetland","alpine"]},"climate":{"type":"string","enum":["generated","kept"]},"terrain":{"type":"string","enum":["plain","hills","mountain","ridge","ridgeline","plateau","valley"]},"terrainFrame":{"type":"object","properties":{"origin":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"center":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}],"items":false,"minItems":2,"maxItems":2},"radius":{"type":"number","minimum":0.001,"maximum":20000}},"required":["origin","radius"]},"generation":{"type":"object","properties":{"seed":{"type":"integer","minimum":0,"maximum":2147483647},"center":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"origin":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"radius":{"type":"array","prefixItems":[{"type":"number","minimum":0.001,"maximum":20000},{"type":"number","minimum":0.001,"maximum":12000}],"items":false,"minItems":2,"maxItems":2},"roughness":{"type":"number","minimum":0,"maximum":1},"peak":{"type":"number","minimum":0,"maximum":8000}},"required":["seed","center","radius","roughness","peak"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"elevation":{"default":0,"type":"number","minimum":-500,"maximum":9000},"minZoom":{"default":0.5,"type":"number","minimum":0.5,"maximum":8192},"maxZoom":{"default":8192,"type":"number","minimum":0.5,"maximum":8192},"labelSize":{"default":13,"type":"number","minimum":10,"maximum":28},"labelImportance":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"labelStyle":{"type":"object","properties":{"font":{"type":"string","maxLength":150},"italic":{"type":"boolean"},"caps":{"type":"boolean"},"tracking":{"type":"number","minimum":0,"maximum":1},"weight":{"type":"integer","minimum":300,"maximum":800},"align":{"type":"string","enum":["start","middle"]}}},"showName":{"type":"boolean"},"nameColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"namePosition":{"type":"array","prefixItems":[{"type":"number","minimum":0,"maximum":10000},{"type":"number","minimum":0,"maximum":6000}],"items":false,"minItems":2,"maxItems":2},"category":{"default":"other","type":"string","enum":["continent","country","region","city","town","village","landmark","capital","port","fortress","temple","ruins","mine","battle","discovery","disaster","other"]},"startYear":{"default":null,"anyOf":[{"type":"integer","minimum":-1000000000,"maximum":1000000000},{"type":"null"}]},"endYear":{"default":null,"anyOf":[{"type":"integer","minimum":-1000000000,"maximum":1000000000},{"type":"null"}]},"population":{"default":"","type":"string","maxLength":100},"polar":{"type":"string","enum":["north","south"]}},"required":["id","kind","name"]}},"regionLayers":{"minItems":1,"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"visible":{"type":"boolean"},"locked":{"type":"boolean"},"parentId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"}},"required":["id","name"]}},"mapLayers":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"regionLayers":{"maxItems":32,"type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"}}},"required":["id","name","regionLayers"]}},"featureTypes":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"kind":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"settings":{"type":"object","properties":{"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"nameColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"labelStyle":{"type":"object","properties":{"font":{"type":"string","maxLength":150},"italic":{"type":"boolean"},"caps":{"type":"boolean"},"tracking":{"type":"number","minimum":0,"maximum":1},"weight":{"type":"integer","minimum":300,"maximum":800},"align":{"type":"string","enum":["start","middle"]}}},"labelSize":{"type":"number","minimum":10,"maximum":28},"labelImportance":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"showName":{"type":"boolean"},"regionStyle":{"type":"object","properties":{"fillOpacity":{"type":"number","minimum":0,"maximum":1},"borderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"borderOpacity":{"type":"number","minimum":0,"maximum":1},"borderWidth":{"type":"number","minimum":0.5,"maximum":8},"borderStyle":{"type":"string","enum":["solid","dashed","dotted","none"]}}},"minZoom":{"type":"number","minimum":0.5,"maximum":8192},"maxZoom":{"type":"number","minimum":0.5,"maximum":8192}},"required":["labelSize","minZoom","maxZoom"]}},"required":["id","name","kind","settings"]}},"layerSettings":{"type":"object","propertyNames":{"type":"string","enum":["land","elevation","biome","region","forest","lake","river","road","label","location","event"]},"additionalProperties":{"type":"object","properties":{"visible":{"type":"boolean"},"locked":{"type":"boolean"}}}},"locationTypes":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"marker":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"shape"},"shape":{"type":"string","enum":["dot","circle","square","diamond","triangle","star","cross","none"]}},"required":["kind","shape"]},{"type":"object","properties":{"kind":{"type":"string","const":"lucide"},"icon":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"paths":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":12000,"pattern":"^[MmLlHhVvCcSsQqTtAaZz\\d\\s.,eE+\\-]+$"}}},"required":["kind","icon","paths"]},{"type":"object","properties":{"kind":{"type":"string","const":"legacy"},"category":{"type":"string","enum":["capital","city","town","village","port","fortress","temple","ruins","mine","landmark","continent","country","region","battle","discovery","disaster","other"]}},"required":["kind","category"]}]}},"required":["id","name","marker"]}},"labelImportanceTypes":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":60},"minZoom":{"type":"number","minimum":0.5,"maximum":8192}},"required":["id","name","minZoom"]}},"travel":{"type":"object","properties":{"walking":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000}}},"riding":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000}}},"wagon":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"road":{"type":"number","minimum":0.1,"maximum":1000},"land":{"type":"number","minimum":0.1,"maximum":1000},"maxGrade":{"type":"number","minimum":0.01,"maximum":1}}},"boat":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"water":{"type":"number","minimum":0.1,"maximum":1000},"river":{"type":"number","minimum":0.1,"maximum":1000}}},"flying":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"hidden":{"type":"boolean"},"hoursPerDay":{"type":"number","minimum":0.5,"maximum":24},"air":{"type":"number","minimum":0.1,"maximum":1000}}}}},"heightmap":{"type":"object","properties":{"format":{"type":"string","const":"wren-quill-heightmap/1"},"width":{"type":"number","const":1920},"height":{"type":"number","const":1152},"tile":{"type":"number","const":64},"tiles":{"minItems":540,"maxItems":540,"type":"array","items":{"type":"string","maxLength":10924,"pattern":"^[A-Za-z0-9+/]*={0,2}$"}}},"required":["format","width","height","tile","tiles"],"description":"Raster elevation in whole meters (sea level 0, −11,000 to 9,000) on 1920 × 1152 square cells, row-major tiles of 64 × 64 cells, west to east then north to south. Cell (i, j) is centred at ((i + 0.5) × 10000 / 1920, (j + 0.5) × 6000 / 1152). An empty string is a tile of 0 m. Otherwise base64 bytes: mode 1 = int16 LE constant; mode 2 = raw int16 LE cells; mode 3 = residuals from the west + north − north-west prediction, adaptively Rice-coded (see docs/atlas.md). Heights add to any vector elevation features."}},"required":["id","name","features"]}},"heightmap":{"type":"object","properties":{"format":{"type":"string","const":"wren-quill-heightmap/1"},"width":{"type":"number","const":1920},"height":{"type":"number","const":1152},"tile":{"type":"number","const":64},"tiles":{"minItems":540,"maxItems":540,"type":"array","items":{"type":"string","maxLength":10924,"pattern":"^[A-Za-z0-9+/]*={0,2}$"}}},"required":["format","width","height","tile","tiles"],"description":"Raster elevation in whole meters (sea level 0, −11,000 to 9,000) on 1920 × 1152 square cells, row-major tiles of 64 × 64 cells, west to east then north to south. Cell (i, j) is centred at ((i + 0.5) × 10000 / 1920, (j + 0.5) × 6000 / 1152). An empty string is a tile of 0 m. Otherwise base64 bytes: mode 1 = int16 LE constant; mode 2 = raw int16 LE cells; mode 3 = residuals from the west + north − north-west prediction, adaptively Rice-coded (see docs/atlas.md). Heights add to any vector elevation features."}},"required":["format","name","features"]},"Encyclopedia":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"format":{"type":"string","const":"wren-quill-index/1"},"explorerSort":{"type":"string","enum":["custom","alphabetical","reverse","oldest","newest","updated"]},"explorerOrder":{"maxItems":3500,"type":"array","items":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"}},"homeLayout":{"type":"object","properties":{"view":{"type":"string","enum":["list","grid"]},"imageSide":{"type":"string","enum":["left","right"]}}},"folders":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":100},"parentId":{"anyOf":[{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},{"type":"null"}]},"icon":{"type":"string","maxLength":80}},"required":["id","name","parentId"]}},"entries":{"maxItems":3000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"kind":{"type":"string","enum":["article","category"]},"title":{"type":"string","minLength":1,"maxLength":180},"folderId":{"anyOf":[{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},{"type":"null"}]},"icon":{"type":"string","maxLength":80},"cover":{"type":"object","properties":{"src":{"type":"string","pattern":"^\\/api\\/media\\/[a-f0-9-]{36}$"},"alt":{"type":"string","maxLength":300}},"required":["src","alt"]},"summary":{"type":"string","maxLength":1500},"showSummary":{"type":"boolean"},"showInfobox":{"type":"boolean"},"infoboxTitle":{"type":"string","maxLength":100},"body":{"type":"string","maxLength":100000},"tags":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":50}},"facts":{"maxItems":30,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["fact","heading"]},"label":{"type":"string","maxLength":80},"value":{"type":"string","maxLength":500},"article":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"}},"required":["label","value"]}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"secret":{"type":"boolean"},"ecology":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"species"},"role":{"type":"string","enum":["producer","herbivore","omnivore","carnivore","decomposer"]},"scientificName":{"type":"string","maxLength":180},"showScientificName":{"type":"boolean"},"languageId":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"icon":{"type":"string","enum":["fish","fish-symbol","cat","dog","bird","rabbit","rat","squirrel","turtle","snail","bug","worm","shell","shrimp","paw-print","feather","egg","leaf","sprout","tree-pine","tree-deciduous","flower","wheat","apple"]},"biomeIds":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"}},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-20000,"maximum":20000},"y":{"type":"number","minimum":-20000,"maximum":20000}},"required":["x","y"]}},"required":["kind","role","scientificName","biomeIds"]},{"type":"object","properties":{"kind":{"type":"string","const":"biome"},"climate":{"type":"string","maxLength":300},"terrain":{"type":"string","maxLength":300},"position":{"type":"object","properties":{"x":{"type":"number","minimum":-20000,"maximum":20000},"y":{"type":"number","minimum":-20000,"maximum":20000}},"required":["x","y"]}},"required":["kind","climate","terrain"]}]},"timeline":{"type":"object","properties":{"start":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"end":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"locations":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["start"]}},"required":["id","title","folderId","summary","body","tags","facts","updatedAt"]}},"ecology":{"type":"object","properties":{"links":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"source":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"target":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"kind":{"type":"string","enum":["feeding","pollination","competition","mutualism","parasitism","corridor","water","ecotone"]},"notes":{"type":"string","maxLength":1500}},"required":["id","source","target","kind","notes"]}}},"required":["links"]},"timeline":{"type":"object","properties":{"calendars":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":100},"before":{"type":"string","maxLength":30},"after":{"type":"string","maxLength":30},"epoch":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"yearZero":{"type":"boolean"}},"required":["id","name","before","after","epoch","yearZero"]}},"defaultCalendarId":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"eras":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":100},"start":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"end":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"description":{"type":"string","maxLength":1500}},"required":["id","name","start","end","color","description"]}}},"required":["calendars","defaultCalendarId","eras"]},"languageScripts":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":100},"font":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":200},"format":{"type":"string","enum":["ttf","otf","woff","woff2"]},"data":{"type":"string","minLength":44,"maxLength":2796204,"pattern":"^[A-Za-z0-9+/]+={0,2}$"}},"required":["id","name","format","data"]},"fontDisplay":{"type":"object","properties":{"scale":{"default":1,"type":"number","minimum":0.5,"maximum":3},"showRomanized":{"default":false,"type":"boolean"},"romanizedOpacity":{"default":0.6,"type":"number","minimum":0.35,"maximum":0.85}}}},"required":["id","name"]}}},"required":["format","folders","entries"]},"EventDate":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"start":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"end":{"type":"integer","minimum":-1000000000,"maximum":1000000000},"locations":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["start"]},"ProjectPermission":{"type":"string","enum":["dictionary:read","dictionary:write","atlas:read","atlas:write","index:read","index:write","media:read","media:write","history:read","history:write","publish","members","integrations"]}}}}