{
	"$id": "https://leptoskit.dev/schemas/leptoskit.v0.schema.json",
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"title": "leptoskit.toml",
	"description": "Everything leptoskit needs to build, serve, and ship a project.",
	"type": "object",
	"properties": {
		"app": {
			"description": "The application identity and platform defaults.",
			"$ref": "#/$defs/AppConfig",
			"default": {
				"default_platform": "web",
				"name": "",
				"platforms": [
					"web",
					"ios",
					"android",
					"macos",
					"windows",
					"linux"
				],
				"render": "csr",
				"version": "0.1.0"
			}
		},
		"auth": {
			"description": "Sign-in. Present when the app uses `leptoskit::auth`.",
			"anyOf": [
				{
					"$ref": "#/$defs/AuthConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"build": {
			"description": "Build pipeline settings.",
			"$ref": "#/$defs/BuildConfig",
			"default": {
				"client_package": null,
				"features": [],
				"rustflags": []
			}
		},
		"bundle": {
			"description": "What release builds ship: optimization, compression, and the size\nbudget.",
			"$ref": "#/$defs/BundleConfig",
			"default": {
				"budget_kib": null,
				"cargo_profile": null,
				"optimize": "fast",
				"precompress": true,
				"split": true,
				"wasm_opt": true
			}
		},
		"codepush": {
			"description": "Over-the-air update settings.",
			"$ref": "#/$defs/CodePushConfig",
			"default": {
				"allow_http": false,
				"channel": "production",
				"enabled": false,
				"mandatory": false,
				"public_keys": [],
				"server": "",
				"staging_dir": "codepush"
			}
		},
		"db": {
			"description": "The database. `leptoskit db` is on when the table is present, even\nempty.",
			"anyOf": [
				{
					"$ref": "#/$defs/DbConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"extension": {
			"description": "The browser extension. Present when `extension` is one of the app's\nplatforms.",
			"anyOf": [
				{
					"$ref": "#/$defs/ExtensionConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"format": {
			"description": "How `leptoskit format` lays out markup. Omitted from serialized\nconfiguration while it holds the defaults.",
			"$ref": "#/$defs/FormatConfig"
		},
		"infra": {
			"description": "Managed infrastructure and container release settings.",
			"anyOf": [
				{
					"$ref": "#/$defs/InfraConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"l10n": {
			"description": "Translations. Message generation is on when the table is present,\neven empty.",
			"anyOf": [
				{
					"$ref": "#/$defs/L10nConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"lint": {
			"description": "What `leptoskit lint` checks. Omitted from serialized configuration\nwhile it holds the defaults.",
			"$ref": "#/$defs/LintConfig"
		},
		"native": {
			"description": "Native app settings.",
			"$ref": "#/$defs/NativeConfig",
			"default": {
				"package_id": "",
				"update_contract": "mobile-v1",
				"viewport_height": 844.0,
				"viewport_width": 390.0
			}
		},
		"plugins": {
			"description": "The leptos and leptoskit plugins activated for this project.",
			"type": "array",
			"default": [],
			"items": {
				"$ref": "#/$defs/PluginSpec"
			}
		},
		"publish": {
			"description": "The stores `leptoskit publish` uploads to. Credentials never go\nhere.",
			"$ref": "#/$defs/PublishConfig"
		},
		"router": {
			"description": "File routes. The router is on when the table is present, even empty.",
			"anyOf": [
				{
					"$ref": "#/$defs/RouterConfig"
				},
				{
					"type": "null"
				}
			]
		},
		"rpc": {
			"description": "The published RPC: what `leptoskit rpc` describes and generates\nclients for.",
			"$ref": "#/$defs/RpcConfig",
			"default": {
				"description": null,
				"exclude": [],
				"include_internal": false,
				"jobs": {
					"poll_seconds": 5,
					"queues": {},
					"retention_days": 7,
					"workers": 4
				},
				"servers": [],
				"targets": [],
				"title": null
			}
		},
		"schema_version": {
			"description": "Configuration contract version. Version 0 is unstable; breaking changes\nare expected until version 1. Omitted versions are accepted for existing\nprojects; `leptoskit migrate` writes the current version.",
			"type": "integer",
			"const": 0,
			"default": 0
		},
		"serve": {
			"description": "Development and production server settings.",
			"$ref": "#/$defs/ServeConfig",
			"default": {
				"address": "127.0.0.1",
				"port": 3000
			}
		},
		"theme": {
			"description": "Design tokens for Tailwind `var(--name)` utilities. Present when the\napp sets `[theme]`; install at startup with\n`Theme::install_maps`.",
			"anyOf": [
				{
					"$ref": "#/$defs/ThemeConfig"
				},
				{
					"type": "null"
				}
			]
		}
	},
	"additionalProperties": false,
	"$defs": {
		"AppConfig": {
			"description": "The application identity.",
			"type": "object",
			"properties": {
				"default_platform": {
					"description": "The platform `leptoskit build` targets by default. `leptoskit dev` runs\nevery enabled platform this machine can run.",
					"$ref": "#/$defs/Platform",
					"default": "web"
				},
				"icon": {
					"description": "The app's icon: one square PNG or SVG, 1024×1024 or larger, relative\nto this file. Every platform's icon sizes are made from it: the iOS\napp icon, Android's launcher icons, the macOS `.icns`, and the\nextension's 16 to 128 pixel icons.",
					"type": [
						"string",
						"null"
					]
				},
				"name": {
					"description": "The package name; defaults to the directory name.",
					"type": "string",
					"default": ""
				},
				"platforms": {
					"description": "Enabled application destinations. Each build selects one platform;\n`leptoskit dev` runs all of them that this machine can run.",
					"type": "array",
					"default": [
						"web",
						"ios",
						"android",
						"macos",
						"windows",
						"linux"
					],
					"items": {
						"$ref": "#/$defs/Platform"
					}
				},
				"render": {
					"description": "How the web build renders: in the browser only, on the server with\nfull hydration, or on the server with interactive islands.",
					"$ref": "#/$defs/RenderMode",
					"default": "csr"
				},
				"version": {
					"description": "The semantic version of the app.",
					"$ref": "#/$defs/SemVer",
					"default": "0.1.0"
				}
			},
			"additionalProperties": false
		},
		"AppStore": {
			"description": "An app in App Store Connect, created once there.",
			"type": "object",
			"properties": {
				"app_id": {
					"description": "The app's Apple ID: the number in its App Store Connect address,\nunder App Information.",
					"type": "string",
					"pattern": "^[0-9]+$"
				},
				"team_id": {
					"description": "The Apple Developer team that signs the app, such as `ABCDE12345`.\nDefaults to `native.apple_team_id`.",
					"type": [
						"string",
						"null"
					],
					"pattern": "^[A-Z0-9]{10}$"
				},
				"testflight_groups": {
					"description": "The TestFlight groups each uploaded build is added to, by name.",
					"type": "array",
					"items": {
						"type": "string"
					}
				}
			},
			"additionalProperties": false,
			"required": [
				"app_id"
			]
		},
		"AttributeBraces": {
			"description": "Whether the formatter keeps the braces around attribute values.",
			"oneOf": [
				{
					"description": "Remove braces the parser does not need: `class={name}` becomes\n`class=name`, while `value={a > b}` keeps them.",
					"type": "string",
					"const": "when_required"
				},
				{
					"description": "Brace every value: `class=name` becomes `class={name}`.",
					"type": "string",
					"const": "always"
				},
				{
					"description": "Brace every value except literals: `id=\"a\"` stays unbraced.",
					"type": "string",
					"const": "always_unless_literal"
				},
				{
					"description": "Keep each value as written.",
					"type": "string",
					"const": "preserve"
				}
			]
		},
		"AuthConfig": {
			"description": "Sign-in, through `leptoskit::auth`. Secrets are never written here:\neach one is named by the environment variable that holds it.",
			"type": "object",
			"properties": {
				"absolute_days": {
					"description": "Days a session lasts however often it's used.",
					"type": "integer",
					"format": "uint32",
					"default": 90,
					"minimum": 0
				},
				"access_minutes": {
					"description": "Minutes a native app's access token works before it refreshes.",
					"type": "integer",
					"format": "uint32",
					"default": 15,
					"minimum": 0
				},
				"app_name": {
					"description": "The app's name, as emails say it. Defaults to `app.name`.",
					"type": [
						"string",
						"null"
					]
				},
				"client_ip_header": {
					"description": "The header a proxy in front of the server puts the client's IP\naddress in, such as `fly-client-ip`.",
					"type": [
						"string",
						"null"
					]
				},
				"idle_days": {
					"description": "Days a session lasts unused.",
					"type": "integer",
					"format": "uint32",
					"default": 14,
					"minimum": 0
				},
				"idp": {
					"description": "\"Sign in with your app\": other apps signing people in through this\none, with `leptoskit::idp`.",
					"anyOf": [
						{
							"$ref": "#/$defs/AuthIdpConfig"
						},
						{
							"type": "null"
						}
					]
				},
				"keys_env": {
					"description": "The environment variable holding the server's keys.",
					"type": "string",
					"default": "AUTH_ENCRYPTION_KEYS"
				},
				"mail": {
					"description": "How email is sent.",
					"$ref": "#/$defs/AuthMailConfig"
				},
				"mfa": {
					"description": "Who must use two-step verification: `optional` lets people choose,\nand `required` asks everyone.",
					"$ref": "#/$defs/AuthMfa"
				},
				"origin": {
					"description": "The site's origin, such as `https://myapp.com`. State-changing\nrequests from anywhere else are refused. Only `localhost` may use\nplain `http`.",
					"type": [
						"string",
						"null"
					]
				},
				"passwords": {
					"description": "Passwords: off unless turned on here. Needs `leptoskit_auth`'s\n`password` feature.",
					"$ref": "#/$defs/AuthPasswordsConfig"
				},
				"providers": {
					"description": "Third-party sign-in providers, by ID: one of\n[`AUTH_PROVIDER_KINDS`], such as `google` or `github`, or your own\nname for any OpenID Connect issuer.",
					"type": "object",
					"additionalProperties": {
						"$ref": "#/$defs/AuthProviderConfig"
					}
				},
				"required_for": {
					"description": "Roles that must use two-step verification even when `mfa` is\n`optional`, such as `[\"Admin\"]`. The app says who has which role.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"solana": {
					"description": "Solana wallets, which people link to their account with a signed\nmessage. Needs `leptoskit_auth`'s `solana` feature and an `origin`.",
					"$ref": "#/$defs/AuthSolanaConfig"
				}
			},
			"additionalProperties": false
		},
		"AuthIdpConfig": {
			"description": "\"Sign in with your app\", through `leptoskit::idp`: an OAuth 2.1 and\nOpenID Connect provider, so other apps sign people in with yours. The\nscopes and claims it offers come from the app's code; this table holds\nwhere its pages are and how long its tokens last.",
			"type": "object",
			"properties": {
				"access_minutes": {
					"description": "Minutes an access token lasts: revoking one reaches servers that only\ncheck its signature after this long.",
					"type": "integer",
					"format": "uint32",
					"default": 10,
					"minimum": 0
				},
				"apps_per_person": {
					"description": "The most apps one person may register in the developer portal.",
					"type": "integer",
					"format": "uint32",
					"default": 10,
					"minimum": 0
				},
				"audience": {
					"description": "What access tokens name as their audience: your API. Defaults to the\nissuer.",
					"type": [
						"string",
						"null"
					]
				},
				"consent_page": {
					"description": "The page that asks people whether an app may sign them in.",
					"type": "string",
					"default": "/consent"
				},
				"developer_portal": {
					"description": "Lets signed-in people register apps of their own, for third-party\ndevelopers.",
					"type": "boolean",
					"default": false
				},
				"device_page": {
					"description": "The page where people enter the code a CLI or a TV shows them.",
					"type": "string",
					"default": "/device"
				},
				"dpop": {
					"description": "Takes DPoP proofs (RFC 9449), so apps can bind their tokens to a key\nthey hold, and a stolen token is useless without it.",
					"type": "boolean",
					"default": false
				},
				"dynamic_registration": {
					"description": "Lets apps register themselves at `/oauth/register` (RFC 7591), and\nmanage their registration with the token they get (RFC 7592).",
					"type": "boolean",
					"default": false
				},
				"id_token_minutes": {
					"description": "Minutes an ID token lasts.",
					"type": "integer",
					"format": "uint32",
					"default": 10,
					"minimum": 0
				},
				"issuer": {
					"description": "The issuer other apps discover the provider at, such as\n`https://myapp.com`. Defaults to `auth.origin`.",
					"type": [
						"string",
						"null"
					]
				},
				"refresh_days": {
					"description": "Days an app stays signed in, however often it refreshes.",
					"type": "integer",
					"format": "uint32",
					"default": 90,
					"minimum": 0
				},
				"registration_token_env": {
					"description": "The environment variable holding the initial access token apps must\nsend to register, at least 32 characters. Without it, anyone may\nregister, at most 10 apps an hour from one address.",
					"type": [
						"string",
						"null"
					]
				},
				"rsa_key_env": {
					"description": "The environment variable holding an RSA private key, as PEM, for apps\nthat need RS256 ID tokens. Without it every token is ES256.",
					"type": [
						"string",
						"null"
					]
				},
				"sign_in_page": {
					"description": "The page signed-out people sign in on before an app may sign them in.",
					"type": "string",
					"default": "/sign-in"
				},
				"signed_out_page": {
					"description": "Where people go after an app signs them out, when it names nowhere.",
					"type": "string",
					"default": "/"
				},
				"signing_key_days": {
					"description": "Days a signing key signs before the next one takes over.",
					"type": "integer",
					"format": "uint32",
					"default": 30,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"AuthMailConfig": {
			"description": "How sign-in email is sent: over SMTP, or as a signed webhook to a URL\nyou control. With neither, development keeps email in a mailbox at\n`/_leptoskit/mail`, and a release build refuses to start.",
			"type": "object",
			"properties": {
				"from": {
					"description": "Who email comes from, such as `My App <hello@myapp.com>`.",
					"type": [
						"string",
						"null"
					]
				},
				"smtp_url_env": {
					"description": "The environment variable holding an SMTP URL, such as\n`smtps://user:password@smtp.example.com`.",
					"type": [
						"string",
						"null"
					]
				},
				"webhook_secret_env": {
					"description": "The environment variable holding the webhook's signing secret.",
					"type": [
						"string",
						"null"
					]
				},
				"webhook_url_env": {
					"description": "The environment variable holding the URL that receives each email as\na signed JSON webhook.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false
		},
		"AuthMfa": {
			"description": "Who must use two-step verification.",
			"oneOf": [
				{
					"description": "People choose, and sensitive actions ask for step-up.",
					"type": "string",
					"const": "optional"
				},
				{
					"description": "Everyone: until they set it up, a session may only do that.",
					"type": "string",
					"const": "required"
				}
			]
		},
		"AuthPasswordsConfig": {
			"description": "Passwords, as a way to sign in with the account's email address. Off by\ndefault: passkeys and emailed codes do the same with less to steal.",
			"type": "object",
			"properties": {
				"breach_check": {
					"description": "Whether new passwords are checked against Have I Been Pwned's list\nof breached passwords. Off by default, since it's a request to\nanother service; only the first 5 characters of the password's\nSHA-1 hash are sent, never the password.",
					"type": "boolean"
				},
				"enabled": {
					"description": "Whether people may set a password and sign in with it.",
					"type": "boolean"
				},
				"min_length": {
					"description": "The fewest characters a password may have: at least 8, at most 64.\nThe default, 15, is NIST SP 800-63B's for a password that's the only\nfactor; 8 is enough only where everyone has two-step verification.",
					"type": "integer",
					"format": "uint32",
					"default": 15,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"AuthProviderConfig": {
			"description": "A third-party sign-in provider. Its secrets are named by the\nenvironment variables that hold them.",
			"type": "object",
			"properties": {
				"api_version": {
					"description": "For `facebook`: the Graph API version, such as `v26.0`. Defaults to\nthe version leptoskit's definition was last checked against.",
					"type": [
						"string",
						"null"
					]
				},
				"client_id_env": {
					"description": "The environment variable holding the OAuth client ID, or Apple's\nServices ID.",
					"type": [
						"string",
						"null"
					]
				},
				"client_secret_env": {
					"description": "The environment variable holding the client secret. An OpenID Connect\nprovider without one is a public client.",
					"type": [
						"string",
						"null"
					]
				},
				"issuer": {
					"description": "For `oidc`: the issuer, whose discovery document names the\nendpoints, such as `https://sso.example.com`. For `gitlab`: a\nself-managed GitLab's address; defaults to `https://gitlab.com`.",
					"type": [
						"string",
						"null"
					]
				},
				"key_id_env": {
					"description": "For `apple`: the environment variable holding the Sign in with Apple\nkey's ID.",
					"type": [
						"string",
						"null"
					]
				},
				"kind": {
					"description": "What it is: one of [`AUTH_PROVIDER_KINDS`], such as `google`, or\n`oidc`. Defaults to the provider's ID when that's a built-in one, and\nto `oidc` otherwise.",
					"type": [
						"string",
						"null"
					]
				},
				"name": {
					"description": "What people see on its button, such as \"Company SSO\".",
					"type": [
						"string",
						"null"
					]
				},
				"private_key_env": {
					"description": "For `apple`: the environment variable holding the key's `.p8`\ncontents.",
					"type": [
						"string",
						"null"
					]
				},
				"scopes": {
					"description": "The scopes to ask for, instead of the provider's defaults.",
					"type": [
						"array",
						"null"
					],
					"items": {
						"type": "string"
					}
				},
				"store_tokens": {
					"description": "Keeps the provider's access and refresh tokens, encrypted with the\nserver's keys, so the app can call its API on the person's behalf.\nOff by default: signing in doesn't need them.",
					"type": "boolean"
				},
				"team_id_env": {
					"description": "For `apple`: the environment variable holding the team ID.",
					"type": [
						"string",
						"null"
					]
				},
				"tenant": {
					"description": "For `microsoft`: `common`, `organizations`, `consumers`, or a tenant\nID. Defaults to `common`.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false
		},
		"AuthSolanaConfig": {
			"description": "Solana wallets. Linking a wallet is always on with the `solana`\nfeature; signing in with one is opt-in, here and for each wallet.",
			"type": "object",
			"properties": {
				"chain_id": {
					"description": "The cluster messages name, such as `mainnet` (the default),\n`devnet`, or `testnet`.",
					"type": [
						"string",
						"null"
					]
				},
				"sign_in": {
					"description": "Whether a wallet may sign in, once its owner turns that on for it.\nA wallet signature is one factor, so two-step verification still\napplies.",
					"type": "boolean"
				}
			},
			"additionalProperties": false
		},
		"Browser": {
			"description": "A family of browsers that share one extension package.",
			"oneOf": [
				{
					"description": "Chrome, Edge, Brave, Opera, Arc, Vivaldi, and the other browsers built\non Chromium: one package for every Chromium store.",
					"type": "string",
					"const": "chromium"
				},
				{
					"description": "Firefox, signed by addons.mozilla.org.",
					"type": "string",
					"const": "firefox"
				},
				{
					"description": "Safari on macOS and iOS, shipped inside the app's own native build.",
					"type": "string",
					"const": "safari"
				}
			]
		},
		"BuildConfig": {
			"description": "Build pipeline settings.",
			"type": "object",
			"properties": {
				"client_package": {
					"description": "The wasm client crate's package name. When unset, leptoskit detects\nthe workspace member producing a `cdylib` target.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"features": {
					"description": "Cargo features activated for app builds.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"rustflags": {
					"description": "Extra rustc flags for the wasm client build. They merge with any\n`target.wasm32-unknown-unknown.rustflags` in `.cargo/config.toml`. When\nset, cargo ignores a `[build] rustflags` table for the wasm build, and\nit ignores all of them when the `RUSTFLAGS` environment variable is set.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				}
			},
			"additionalProperties": false
		},
		"BundleConfig": {
			"description": "What a release build ships to the browser: how hard the client is\noptimized, how its files are compressed, and how much it may weigh.",
			"type": "object",
			"properties": {
				"budget_kib": {
					"description": "The most the initial load may weigh, in KiB, brotli-compressed: every\nscript and wasm module the page fetches before any lazy chunk. Release\nbuilds over it fail.",
					"type": [
						"integer",
						"null"
					],
					"format": "uint32",
					"default": null,
					"minimum": 0
				},
				"cargo_profile": {
					"description": "The cargo profile release builds compile the wasm client with, in\nplace of the one [`optimize`](Self::optimize) picks: the escape hatch\nfor full control from your `Cargo.toml`.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"optimize": {
					"description": "How hard release builds optimize the wasm client for size.",
					"$ref": "#/$defs/Optimize",
					"default": "fast"
				},
				"precompress": {
					"description": "Whether release builds write brotli (`.br`) and gzip (`.gz`) copies\nnext to every compressible file in the output, for servers to send\nas-is.",
					"type": "boolean",
					"default": true
				},
				"split": {
					"description": "Whether the client is split with wasm-split: every `#[lazy]` function,\nlazy route, and `#[island(lazy)]` moves into its own wasm chunk that\nloads the first time it is needed, instead of with the page. Enabled\nby default; clients without lazy code skip the splitting phase.",
					"type": "boolean",
					"default": true
				},
				"wasm_opt": {
					"description": "Whether release builds run `wasm-opt -Oz` over the wasm bundle.\nRelease builds fail with an install hint when this is on and\n`wasm-opt` is not on the `PATH`.",
					"type": "boolean",
					"default": true
				}
			},
			"additionalProperties": false
		},
		"ChromeStore": {
			"description": "An item in the Chrome Web Store, created once in its developer\ndashboard.",
			"type": "object",
			"properties": {
				"item_id": {
					"description": "The item's 32-letter ID.",
					"type": "string"
				},
				"publisher_id": {
					"description": "The publisher's ID, from the developer dashboard's account page.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"publisher_id",
				"item_id"
			]
		},
		"ClosingTags": {
			"description": "How the formatter closes elements that have no children.",
			"oneOf": [
				{
					"description": "`<div></div>` becomes `<div />`. Void elements such as `<br />` are\nalways self-closing.",
					"type": "string",
					"const": "self_closing"
				},
				{
					"description": "`<div />` becomes `<div></div>`, except for void elements.",
					"type": "string",
					"const": "explicit"
				},
				{
					"description": "Keep each element as written.",
					"type": "string",
					"const": "preserve"
				}
			]
		},
		"CodePushConfig": {
			"description": "Over-the-air update settings.",
			"type": "object",
			"properties": {
				"allow_http": {
					"description": "Allows plaintext HTTP for an explicitly configured local development\nregistry. Native release builds always require HTTPS.",
					"type": "boolean",
					"default": false
				},
				"channel": {
					"description": "The release channel to track.",
					"type": "string",
					"default": "production"
				},
				"enabled": {
					"description": "Whether code push is enabled for this project.",
					"type": "boolean",
					"default": false
				},
				"mandatory": {
					"description": "Whether updates install without asking.",
					"type": "boolean",
					"default": false
				},
				"provenance": {
					"description": "Independent source approvals every code push release must carry\nbefore the native app installs it. Without this table, the publisher\nsignature is enough.",
					"anyOf": [
						{
							"$ref": "#/$defs/CodePushProvenance"
						},
						{
							"type": "null"
						}
					]
				},
				"public_keys": {
					"description": "The ed25519 public keys, hex encoded, whose signed releases the app\ninstalls. List the next key alongside the current one to rotate.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string",
						"pattern": "^[0-9a-fA-F]{64}$"
					}
				},
				"server": {
					"description": "The release registry base URL.",
					"type": "string",
					"default": ""
				},
				"staging_dir": {
					"description": "The local staging directory, relative to the app data directory.",
					"type": "string",
					"default": "codepush"
				}
			},
			"additionalProperties": false,
			"allOf": [
				{
					"if": {
						"properties": {
							"enabled": {
								"const": true
							}
						},
						"required": [
							"enabled"
						]
					},
					"then": {
						"properties": {
							"public_keys": {
								"minItems": 1
							},
							"server": {
								"pattern": "\\S"
							}
						},
						"required": [
							"server",
							"public_keys"
						]
					}
				}
			]
		},
		"CodePushProvenance": {
			"description": "Who must approve a code push release as rebuilt from public source before\nthe native app installs it.\n\nAn approver checks out a commit of `repository`, rebuilds the release,\nchecks that every file is byte-identical, and signs an approval naming\nthat commit. The app ships this policy, so a download cannot change it.",
			"type": "object",
			"properties": {
				"approvers": {
					"description": "The approvers' ed25519 public keys, hex encoded, as `leptoskit\ncodepush keygen --approver` prints them. None may also be in\n`public_keys`.",
					"type": "array",
					"items": {
						"type": "string",
						"pattern": "^[0-9a-fA-F]{64}$"
					},
					"minItems": 1,
					"uniqueItems": true
				},
				"repository": {
					"description": "The public GitHub repository releases are built from, written as\n`https://github.com/<owner>/<repo>`.",
					"type": "string",
					"pattern": "^https://github\\.com/[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$"
				},
				"threshold": {
					"description": "How many different approvers must approve each release: at least 1,\nand at most the number of approvers.",
					"type": "integer",
					"format": "uint32",
					"minimum": 1
				}
			},
			"additionalProperties": false,
			"required": [
				"repository",
				"approvers",
				"threshold"
			]
		},
		"ComputeProvider": {
			"description": "Supported virtual-machine APIs.",
			"oneOf": [
				{
					"description": "Hetzner Cloud, using `HCLOUD_TOKEN`.",
					"type": "string",
					"const": "hetzner"
				},
				{
					"description": "`DigitalOcean`, using `DIGITALOCEAN_TOKEN`.",
					"type": "string",
					"const": "digitalocean"
				}
			]
		},
		"ContentScript": {
			"description": "An interface shown on other sites' pages.",
			"type": "object",
			"properties": {
				"browsers": {
					"description": "The families that get this script; every configured family when\nomitted.",
					"type": [
						"array",
						"null"
					],
					"items": {
						"$ref": "#/$defs/Browser"
					}
				},
				"inject": {
					"description": "How it reaches a page.",
					"$ref": "#/$defs/Inject",
					"default": "manifest"
				},
				"matches": {
					"description": "The pages it runs on. Required for `manifest` scripts.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"name": {
					"description": "The script's name, which the app injects or registers it by:\nlowercase letters, digits, and dashes.",
					"type": "string"
				},
				"route": {
					"description": "The app route the script's interface opens.",
					"type": "string"
				},
				"run_at": {
					"description": "When it runs.",
					"$ref": "#/$defs/RunAt",
					"default": "document_idle"
				}
			},
			"additionalProperties": false,
			"required": [
				"name",
				"route"
			]
		},
		"DbConfig": {
			"description": "The database: `leptoskit db` exports the tables declared in `crate`,\ndiffs them with the latest migration's snapshot, and writes new\nmigrations to `migrations`.",
			"type": "object",
			"properties": {
				"branch_databases": {
					"description": "Whether each git branch gets its own database on the development\nPostgres, copied from the main branch's the first time it's used, so\nswitching branches never mixes their tables or rows. Off, every branch\nshares the app's database.",
					"type": "boolean"
				},
				"crate": {
					"description": "The package whose `#[db::table]` structs are the schema. Defaults to\nthe app's name followed by `_db`, such as `my_app_db`.",
					"type": [
						"string",
						"null"
					]
				},
				"dev_server": {
					"description": "Where `leptoskit dev` and `leptoskit db` find a Postgres database\nwhen `url_env` isn't set.",
					"$ref": "#/$defs/DbDevServer"
				},
				"dialect": {
					"description": "The SQL dialect every migration is written for.",
					"$ref": "#/$defs/DbDialect",
					"default": "postgres"
				},
				"draft": {
					"description": "How `leptoskit db migration create` treats the drafts since the\nlatest release marker.",
					"$ref": "#/$defs/DbDraft"
				},
				"features": {
					"description": "The package features that compile its server side, so that its tables\nexport.",
					"type": "array",
					"default": [
						"server"
					],
					"items": {
						"type": "string"
					}
				},
				"geo": {
					"description": "Geospatial columns' options.",
					"$ref": "#/$defs/DbGeoConfig"
				},
				"live_capture": {
					"description": "How writes to live tables reach the change log that live queries\nfollow.",
					"$ref": "#/$defs/DbLiveCapture"
				},
				"live_retention_minutes": {
					"description": "How many minutes of the change log the servers keep, so a client that\nreconnects within them catches up rather than refetching everything;\n0 keeps all of it. Pruning runs with the job workers, or wherever the\nserver starts `Db::live_maintenance`.",
					"type": "integer",
					"format": "uint32",
					"minimum": 0
				},
				"migrations": {
					"description": "The migrations directory, relative to the project root.",
					"type": "string",
					"default": "migrations"
				},
				"policies": {
					"description": "Who enforces the tables' access policies.",
					"$ref": "#/$defs/DbPolicies"
				},
				"replica_url_envs": {
					"description": "Environment variables holding the URLs of Postgres read replicas,\nsuch as `[\"DATABASE_REPLICA_URL\"]`. Live queries re-run on a replica\nonce it has replayed the commit that caused the re-run, and on the\nprimary until then; other reads stay on the primary unless the app\nasks. A variable that isn't set is skipped.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"url_env": {
					"description": "The environment variable holding the database URL for `leptoskit db\nmigrate` and `leptoskit db status`.",
					"type": "string",
					"default": "DATABASE_URL"
				},
				"vector": {
					"description": "Vector columns' options.",
					"$ref": "#/$defs/DbVectorConfig"
				},
				"watch": {
					"description": "What `leptoskit dev` does when the tables change.",
					"$ref": "#/$defs/DbWatch"
				}
			},
			"additionalProperties": false
		},
		"DbDevServer": {
			"description": "The Postgres database development uses when `db.url_env` isn't set.",
			"oneOf": [
				{
					"description": "devenv's `services.postgres` when `devenv.nix` enables it, and the\nembedded server otherwise.",
					"type": "string",
					"const": "auto"
				},
				{
					"description": "devenv's `services.postgres`: run `leptoskit dev` inside `devenv\nshell` while `devenv up` runs.",
					"type": "string",
					"const": "devenv"
				},
				{
					"description": "A Postgres that `leptoskit dev` runs itself, with its data in\n`.leptoskit/db/postgres`. The first run downloads it once into\n`~/.cache/leptoskit/postgresql`.",
					"type": "string",
					"const": "embedded"
				},
				{
					"description": "None: set `db.url_env` yourself.",
					"type": "string",
					"const": "off"
				}
			]
		},
		"DbDialect": {
			"description": "The SQL dialect a project's migrations are written for.",
			"oneOf": [
				{
					"description": "PostgreSQL, the default.",
					"type": "string",
					"const": "postgres"
				},
				{
					"description": "SQLite.",
					"type": "string",
					"const": "sqlite"
				}
			]
		},
		"DbDraft": {
			"description": "How `leptoskit db migration create` treats the migrations since the\nlatest release marker: one per change, or one draft that keeps up with\nthe tables until the next release consolidates it.",
			"oneOf": [
				{
					"description": "Writes a new migration for every change.",
					"type": "string",
					"const": "stack"
				},
				{
					"description": "Rewrites the newest unreleased migration from the snapshot before it,\nso between releases there is one draft rather than a stack. A\ndevelopment database that applied the earlier draft needs `db reset\n--yes`, or push mode, to come back in line.",
					"type": "string",
					"const": "amend"
				}
			]
		},
		"DbGeoConfig": {
			"description": "Geospatial columns' options: `[db.geo]`.",
			"type": "object",
			"properties": {
				"geopackage": {
					"description": "SQLite only: also keep GeoPackage's metadata tables, registering\neach table's geometry column, so GIS tools such as QGIS open the\ndatabase file as layers. GeoPackage allows one geometry column per\ntable.",
					"type": "boolean"
				}
			},
			"additionalProperties": false
		},
		"DbLiveCapture": {
			"description": "How writes to live tables reach the change log.",
			"oneOf": [
				{
					"description": "Triggers that migrations add to every live table record each write\nin the writing transaction. Works on both databases, and suits most\napps.",
					"type": "string",
					"const": "triggers"
				},
				{
					"description": "Postgres's logical replication: migrations publish the live tables\ninstead, and one server reads each commit from the write-ahead log\nafter it commits, so writers pay nothing extra. Needs `wal_level =\nlogical` and a role allowed to replicate. Postgres only.",
					"type": "string",
					"const": "replication"
				}
			]
		},
		"DbPolicies": {
			"description": "Who enforces the tables' access policies.",
			"oneOf": [
				{
					"description": "The database layer adds each policy to every query it writes. Raw\nSQL isn't filtered.",
					"type": "string",
					"const": "orm"
				},
				{
					"description": "Postgres enforces them too, as row-level security that migrations\ncreate from the same rules, so raw SQL is filtered as well. Rules read\nthe request through settings (`cx.setting::<G>()`), and the server\nconnects with `Db::with_row_security`. Postgres only.",
					"type": "string",
					"const": "rls"
				}
			]
		},
		"DbVectorConfig": {
			"description": "Vector columns' options: `[db.vector]`.",
			"type": "object",
			"properties": {
				"exact_search_rows": {
					"description": "SQLite only: how many rows a table with a searched vector column may\nhave before `leptoskit db check` warns that its searches, which\nmeasure every row, are getting slow, and that Postgres's indexes\nwould suit it better.",
					"type": "integer",
					"format": "uint64",
					"default": 100000,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"DbWatch": {
			"description": "What `leptoskit dev` does when the tables change.",
			"oneOf": [
				{
					"description": "Writes a migration for changes that keep every row and applies it to\nthe development database. Changes that would delete data write\nnothing and say which command to run.",
					"type": "string",
					"const": "migrate"
				},
				{
					"description": "Applies changes straight to the development database, without\nwriting migrations, so the tables can change many times while an\nidea takes shape. `leptoskit db migration create` then writes one\nmigration for all of them. Changes that would delete data are applied\nonly by `leptoskit db push --allow-destructive`.",
					"type": "string",
					"const": "push"
				},
				{
					"description": "Only prints what changed since the latest migration.",
					"type": "string",
					"const": "report"
				},
				{
					"description": "Ignores the tables.",
					"type": "string",
					"const": "off"
				}
			]
		},
		"DevtoolsPage": {
			"description": "A panel in the browser's developer tools. The developer tools open\n`route` out of sight each time they open for a tab, and that page adds the\npanel, which shows `panel`.",
			"type": "object",
			"properties": {
				"browsers": {
					"description": "The families that get the panel; every configured family but Safari,\nwhich has no developer tools API, when omitted.",
					"type": [
						"array",
						"null"
					],
					"items": {
						"$ref": "#/$defs/Browser"
					}
				},
				"panel": {
					"description": "The app route the panel shows, such as `/devtools/panel`.",
					"type": "string"
				},
				"route": {
					"description": "The app route the developer tools open out of sight, such as\n`/devtools`. It adds the panel with\n`leptoskit::extension::devtools::create_panel` and shows nothing.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"route",
				"panel"
			]
		},
		"EdgeStore": {
			"description": "A product in Microsoft Partner Center, created once there.",
			"type": "object",
			"properties": {
				"product_id": {
					"description": "The product ID, from the product's Extension identity section. It\nisn't the public Store ID.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"product_id"
			]
		},
		"ExtensionBackground": {
			"description": "The background worker.",
			"type": "object",
			"properties": {
				"events": {
					"description": "The events that wake it, such as `runtime.message` and `alarms`.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				}
			},
			"additionalProperties": false
		},
		"ExtensionCommand": {
			"description": "A keyboard shortcut.",
			"type": "object",
			"properties": {
				"description": {
					"description": "What the shortcut does, as the browser's shortcut settings list it.",
					"type": "string"
				},
				"suggested_key": {
					"description": "The keys suggested to the user, such as `Alt+Shift+C`.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false,
			"required": [
				"description"
			]
		},
		"ExtensionConfig": {
			"description": "The extension: its surfaces, permissions, and per-browser settings.",
			"type": "object",
			"properties": {
				"background": {
					"description": "The background worker: the events it wakes for.",
					"anyOf": [
						{
							"$ref": "#/$defs/ExtensionBackground"
						},
						{
							"type": "null"
						}
					]
				},
				"browsers": {
					"description": "The browser families to package for.",
					"type": "array",
					"default": [
						"chromium",
						"firefox"
					],
					"items": {
						"$ref": "#/$defs/Browser"
					}
				},
				"commands": {
					"description": "Keyboard shortcuts, by name.",
					"type": "object",
					"additionalProperties": {
						"$ref": "#/$defs/ExtensionCommand"
					}
				},
				"content_scripts": {
					"description": "Interfaces shown on other sites' pages.",
					"type": "array",
					"items": {
						"$ref": "#/$defs/ContentScript"
					}
				},
				"description": {
					"description": "One sentence about what the extension does, up to 132 characters,\nwhich the Chrome Web Store allows.",
					"type": [
						"string",
						"null"
					]
				},
				"devtools_page": {
					"description": "A panel in the browser's developer tools. Safari has no developer\ntools API, so its package leaves it out.",
					"anyOf": [
						{
							"$ref": "#/$defs/DevtoolsPage"
						},
						{
							"type": "null"
						}
					]
				},
				"firefox": {
					"description": "Firefox's settings.",
					"anyOf": [
						{
							"$ref": "#/$defs/FirefoxSettings"
						},
						{
							"type": "null"
						}
					]
				},
				"host_permissions": {
					"description": "Match patterns granted at install.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"name": {
					"description": "The name stores and the browser show; defaults to `app.name`.",
					"type": [
						"string",
						"null"
					]
				},
				"new_tab": {
					"description": "A page that replaces the browser's new tab.",
					"anyOf": [
						{
							"$ref": "#/$defs/ExtensionPage"
						},
						{
							"type": "null"
						}
					]
				},
				"optional_host_permissions": {
					"description": "Match patterns the extension asks for at run time.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"options": {
					"description": "The extension's settings page.",
					"anyOf": [
						{
							"$ref": "#/$defs/ExtensionPage"
						},
						{
							"type": "null"
						}
					]
				},
				"permissions": {
					"description": "Extension permissions, added to those the app's plugins need.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"popup": {
					"description": "The toolbar button's popup.",
					"anyOf": [
						{
							"$ref": "#/$defs/ExtensionPage"
						},
						{
							"type": "null"
						}
					]
				},
				"safari": {
					"description": "Safari's settings.",
					"$ref": "#/$defs/SafariSettings"
				},
				"server": {
					"description": "The server the extension's API calls reach, such as\n`https://api.example.com`. Its origin becomes a host permission.",
					"type": [
						"string",
						"null"
					]
				},
				"side_panel": {
					"description": "The side panel (Chromium) or sidebar (Firefox). Safari has none, so\nits package leaves it out.",
					"anyOf": [
						{
							"$ref": "#/$defs/ExtensionPage"
						},
						{
							"type": "null"
						}
					]
				}
			},
			"additionalProperties": false
		},
		"ExtensionPage": {
			"description": "A page surface: the route it opens.",
			"type": "object",
			"properties": {
				"browsers": {
					"description": "The families that get this page; every configured family when\nomitted.",
					"type": [
						"array",
						"null"
					],
					"items": {
						"$ref": "#/$defs/Browser"
					}
				},
				"route": {
					"description": "The app route the page opens, such as `/clip`.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"route"
			]
		},
		"FirefoxChannel": {
			"description": "Where a Firefox add-on is distributed.",
			"oneOf": [
				{
					"description": "Listed on addons.mozilla.org, after review.",
					"type": "string",
					"const": "listed"
				},
				{
					"description": "Signed for you to distribute yourself.",
					"type": "string",
					"const": "unlisted"
				}
			]
		},
		"FirefoxSettings": {
			"description": "Firefox's settings.",
			"type": "object",
			"properties": {
				"data_collection": {
					"description": "The data the extension sends anywhere, in Firefox's categories, such\nas `websiteContent` and `personallyIdentifyingInfo`; `[\"none\"]` when\nit sends nothing. addons.mozilla.org requires the declaration and\nFirefox shows it at install.",
					"type": "array",
					"default": [
						"none"
					],
					"items": {
						"type": "string"
					}
				},
				"id": {
					"description": "The add-on's ID, such as `commonplace@example.com`, which\naddons.mozilla.org requires and keeps for good.",
					"type": "string"
				},
				"strict_min_version": {
					"description": "The oldest Firefox that may install it; 121 by default.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false,
			"required": [
				"id"
			]
		},
		"FirefoxStore": {
			"description": "An add-on on addons.mozilla.org. Its ID is `[extension.firefox].id`.",
			"type": "object",
			"properties": {
				"channel": {
					"description": "`listed` or `unlisted`.",
					"$ref": "#/$defs/FirefoxChannel",
					"default": "listed"
				}
			},
			"additionalProperties": false
		},
		"FormatConfig": {
			"description": "How `leptoskit format` lays out the markup inside `view!` macros.\n\nWidth and indentation are not set here: they come from the project's\n`rustfmt.toml`, so markup and the Rust around it always agree.",
			"type": "object",
			"properties": {
				"attribute_braces": {
					"description": "Whether braces around attribute values are kept or removed.",
					"$ref": "#/$defs/AttributeBraces",
					"default": "when_required"
				},
				"closing_tags": {
					"description": "How elements without children are closed.",
					"$ref": "#/$defs/ClosingTags",
					"default": "self_closing"
				},
				"macros": {
					"description": "The macros whose markup is formatted, matched against the path written\nat the call site: `view` matches `view! {}` but not `leptos::view! {}`.",
					"type": "array",
					"default": [
						"view",
						"leptos::view",
						"leptos::prelude::view",
						"leptoskit::view",
						"leptoskit::prelude::view",
						"leptoskit_macros::view"
					],
					"items": {
						"type": "string"
					}
				},
				"rustfmt_toolchain": {
					"description": "The rustfmt toolchain that formats the Rust around and inside markup:\n`nightly` by default, so unstable `rustfmt.toml` options apply,\n`stable`, or any installed rustup toolchain name.",
					"type": "string",
					"default": "nightly"
				}
			},
			"additionalProperties": false
		},
		"InfraAnalytics": {
			"description": "Bounded, in-process analytics. Requires the application's `analytics`\nfeature and the `LeptosKit` server entrypoint (or an explicit Axum mount).",
			"type": "object",
			"properties": {
				"browser_routes": {
					"description": "Explicit app route templates accepted from the browser SDK. Empty\ndisables browser ingestion without disabling backend analytics.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					},
					"maxItems": 32
				},
				"environment": {
					"type": "string",
					"default": "production"
				},
				"max_series": {
					"description": "Maximum aggregate series across all sources; some capacity is reserved\nfor backend measurements.",
					"type": "integer",
					"format": "uint",
					"default": 128,
					"maximum": 512,
					"minimum": 1
				},
				"otlp_endpoint": {
					"description": "Optional OTLP/HTTP metrics endpoint. Omitted: use the connected\ndeployment service, when present. No separate collector is required.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"retained_windows": {
					"description": "Completed and current minute windows retained in memory.",
					"type": "integer",
					"format": "uint",
					"default": 15,
					"maximum": 60,
					"minimum": 1
				},
				"version": {
					"description": "Plugin configuration contract, independent of the CLI release.",
					"type": "integer",
					"format": "uint32",
					"default": 1,
					"maximum": 1,
					"minimum": 1
				}
			},
			"additionalProperties": false
		},
		"InfraB2": {
			"description": "B2's region determines its S3-compatible endpoint.",
			"type": "object",
			"properties": {
				"region": {
					"description": "For example `us-west-004`. Bucket provisioning uses B2 credentials;\nthe backup agent receives a separate bucket-scoped S3 key.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"region"
			]
		},
		"InfraBackups": {
			"description": "Restic encrypts database archives and release metadata before upload.",
			"type": "object",
			"properties": {
				"daily": {
					"description": "Daily snapshots to retain, after a successful verified backup.",
					"type": "integer",
					"format": "uint16",
					"default": 7,
					"maximum": 65535,
					"minimum": 0
				},
				"enabled": {
					"description": "Install and enable the backup timer on the primary host.",
					"type": "boolean",
					"default": true
				},
				"max_age_hours": {
					"description": "Status reports older successful backups as unhealthy.",
					"type": "integer",
					"format": "uint16",
					"default": 36,
					"maximum": 65535,
					"minimum": 0
				},
				"monthly": {
					"description": "Monthly snapshots to retain.",
					"type": "integer",
					"format": "uint16",
					"default": 3,
					"maximum": 65535,
					"minimum": 0
				},
				"schedule": {
					"description": "A systemd calendar expression, validated on the host before activation.",
					"type": "string",
					"default": "daily"
				},
				"weekly": {
					"description": "Weekly snapshots to retain.",
					"type": "integer",
					"format": "uint16",
					"default": 4,
					"maximum": 65535,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"InfraBudget": {
			"description": "Refuse plan/apply when the selected servers exceed this base-price budget.",
			"type": "object",
			"properties": {
				"currency": {
					"description": "Currency returned by the provider, for example EUR or USD; no FX\nconversion.",
					"type": "string"
				},
				"monthly_compute": {
					"description": "Maximum monthly compute plus primary IPv4 price for all app hosts.",
					"type": "number",
					"format": "double"
				}
			},
			"additionalProperties": false,
			"required": [
				"currency",
				"monthly_compute"
			]
		},
		"InfraConfig": {
			"description": "Infrastructure intent. Credentials are supplied by the operator's\nenvironment.",
			"type": "object",
			"properties": {
				"account_id": {
					"description": "Cloudflare account ID, not a credential.",
					"type": "string"
				},
				"b2": {
					"description": "When present, provision the private backup bucket in Backblaze B2.\nSigned update delivery remains on R2 behind Cloudflare.",
					"anyOf": [
						{
							"$ref": "#/$defs/InfraB2"
						},
						{
							"type": "null"
						}
					],
					"default": null
				},
				"backup_bucket": {
					"description": "Private R2 or B2 bucket for encrypted database backups.",
					"type": "string"
				},
				"backups": {
					"description": "Encrypted backup scheduling, verification, and retention.",
					"$ref": "#/$defs/InfraBackups",
					"default": {
						"daily": 7,
						"enabled": true,
						"max_age_hours": 36,
						"monthly": 3,
						"schedule": "daily",
						"weekly": 4
					}
				},
				"budget": {
					"description": "Optional live-price guard on compute and primary IPv4, excluding usage,\ntax, storage, domains, and other services. This is not a billing cap.",
					"anyOf": [
						{
							"$ref": "#/$defs/InfraBudget"
						},
						{
							"type": "null"
						}
					],
					"default": null
				},
				"compute": {
					"description": "Compute provider. Hetzner is the default; sizes and locations use the\nselected provider's own names.",
					"$ref": "#/$defs/ComputeProvider",
					"default": "hetzner"
				},
				"control_url": {
					"description": "Optional self-hosted deployment service. Credentials are kept outside\nthe repository; ordinary `lk deploy` uses its durable operation queue.",
					"type": [
						"string",
						"null"
					]
				},
				"domain": {
					"description": "Public application hostname on the selected Cloudflare zone.",
					"type": "string"
				},
				"external": {
					"description": "Provision hosts and edge routing for an independently supervised\nservice. Omitting this keeps the managed Postgres/Kamal release preset.",
					"anyOf": [
						{
							"$ref": "#/$defs/InfraExternal"
						},
						{
							"type": "null"
						}
					]
				},
				"hosted_state": {
					"description": "Use the hosted service's locking HTTP state backend. Credentials stay on\nthe worker.",
					"type": "boolean"
				},
				"image": {
					"description": "Image repository without a tag, for example `ghcr.io/team/app`.",
					"type": "string"
				},
				"instances": {
					"description": "Application hosts. The first owns persistent services; the others are\nstateless application replicas.",
					"type": "integer",
					"format": "uint8",
					"default": 1,
					"maximum": 255,
					"minimum": 0
				},
				"location": {
					"description": "Provider location, for example Hetzner `hel1` or `DigitalOcean` `ams3`.",
					"type": "string"
				},
				"name": {
					"description": "Resource-name prefix; use a distinct prefix for each environment.",
					"type": "string"
				},
				"plugins": {
					"description": "Versioned optional infrastructure capabilities. No plugin executes\narbitrary downloaded code or gets provider credentials at runtime.",
					"$ref": "#/$defs/InfraPlugins",
					"default": {
						"analytics": null
					}
				},
				"registry": {
					"description": "Registry hostname, for example `ghcr.io`.",
					"type": "string"
				},
				"registry_username": {
					"description": "Registry login name; password is `KAMAL_REGISTRY_PASSWORD`.",
					"type": "string"
				},
				"secrets": {
					"description": "Additional application secret environment names.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"server_type": {
					"description": "Provider size, for example `cx23`. No automatic paid fallback.",
					"type": "string"
				},
				"services": {
					"description": "Optional shared cache and live relay.",
					"$ref": "#/$defs/InfraServices",
					"default": {
						"cache": false,
						"relay": false
					}
				},
				"ssh_cidrs": {
					"description": "Administrator source CIDRs permitted to SSH; no world-open rule.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"ssh_key_ids": {
					"description": "Existing provider SSH key IDs to authorize on the host.",
					"type": "array",
					"items": {
						"type": "integer",
						"format": "uint64",
						"minimum": 0
					}
				},
				"state": {
					"description": "Optional S3 remote-state backend. Local state is private and gitignored.",
					"anyOf": [
						{
							"$ref": "#/$defs/InfraState"
						},
						{
							"type": "null"
						}
					],
					"default": null
				},
				"updates_bucket": {
					"description": "R2 bucket exposed only for signed release artifacts.",
					"type": "string"
				},
				"updates_domain": {
					"description": "Public hostname for signed code-push artifacts in R2.",
					"type": "string"
				},
				"zone_id": {
					"description": "Cloudflare DNS zone ID, not a credential.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"name",
				"domain",
				"location",
				"server_type",
				"ssh_key_ids",
				"ssh_cidrs",
				"account_id",
				"zone_id"
			]
		},
		"InfraExternal": {
			"description": "A single host whose application lifecycle is managed outside Kamal.",
			"type": "object",
			"properties": {
				"origin_port": {
					"description": "Cloudflare Tunnel connects to this port on the host's loopback address.",
					"type": "integer",
					"format": "uint16",
					"maximum": 65535,
					"minimum": 1
				}
			},
			"additionalProperties": false,
			"required": [
				"origin_port"
			]
		},
		"InfraPlugins": {
			"description": "Built-in infrastructure plugins. Unknown plugin names fail parsing;\nenabling a capability must be an intentional configuration change.",
			"type": "object",
			"properties": {
				"analytics": {
					"anyOf": [
						{
							"$ref": "#/$defs/InfraAnalytics"
						},
						{
							"type": "null"
						}
					],
					"default": null
				}
			},
			"additionalProperties": false
		},
		"InfraServices": {
			"description": "Services run on the primary host and are reachable only on its private\nnetwork.",
			"type": "object",
			"properties": {
				"cache": {
					"description": "Provision a bounded Valkey cache. Binds `VALKEY_URL` in the app.",
					"type": "boolean",
					"default": false
				},
				"relay": {
					"description": "Provision NATS `JetStream` and bind the app's configured relay variable.\nRequired for several application hosts to share live channels/presence.",
					"type": "boolean",
					"default": false
				}
			},
			"additionalProperties": false
		},
		"InfraState": {
			"description": "A separately bootstrapped, locking-capable S3 state backend.",
			"type": "object",
			"properties": {
				"bucket": {
					"description": "Existing state bucket. Do not use the application backups bucket.",
					"type": "string"
				},
				"key": {
					"description": "Unique object key for this environment.",
					"type": "string"
				},
				"region": {
					"description": "State bucket's AWS region.",
					"type": "string"
				}
			},
			"additionalProperties": false,
			"required": [
				"bucket",
				"key",
				"region"
			]
		},
		"Inject": {
			"description": "When a content script reaches a page.",
			"oneOf": [
				{
					"description": "Declared in the manifest, so it runs on every page its `matches`\ncover, which needs host permission for each.",
					"type": "string",
					"const": "manifest"
				},
				{
					"description": "Packaged, but injected only when the app asks, for the tab the user\nacted on. With `activeTab` it needs no host permission.",
					"type": "string",
					"const": "on_request"
				},
				{
					"description": "Packaged, and registered at run time for the sites the user allows.",
					"type": "string",
					"const": "registered"
				}
			]
		},
		"L10nConfig": {
			"description": "Translations: `leptoskit l10n`, `dev` and `build` read the ARB files in\nthe locales directory and write the typed translations module.",
			"type": "object",
			"properties": {
				"dir": {
					"description": "The directory of ARB files, relative to the project root: one per\nlocale, named after its language tag, such as `en.arb` and\n`pt-BR.arb`.",
					"type": "string",
					"default": "locales"
				},
				"output": {
					"description": "The generated module, relative to the project root. Declare it where\nit sits, such as `mod l10n;` in `src/lib.rs`.",
					"type": "string",
					"default": "src/l10n.rs"
				},
				"template": {
					"description": "The locale whose file defines every message and the types of its\nplaceholders; the other files translate it.",
					"type": "string",
					"default": "en"
				}
			},
			"additionalProperties": false
		},
		"LintConfig": {
			"description": "What `leptoskit lint` checks, from the `[lint]` table.\n\n```toml\n[lint]\nmarkup = \"view\"\nexclude = [\"tests/fixtures/**\"]\n\n[lint.rules]\ncomponent_attribute = \"deny\"\n```",
			"type": "object",
			"properties": {
				"clippy": {
					"description": "Whether `leptoskit lint` runs `cargo clippy` beside its own rules.",
					"type": "boolean",
					"default": true
				},
				"exclude": {
					"description": "Paths the leptoskit rules skip, as globs relative to the directory of\nthis `leptoskit.toml`, such as `tests/fixtures/**`.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"markup": {
					"description": "How the project writes component trees.",
					"$ref": "#/$defs/MarkupStyle",
					"default": "view"
				},
				"rules": {
					"description": "The level each rule reports at.",
					"$ref": "#/$defs/LintRules",
					"default": {
						"children_last": "warn",
						"color_literal": "allow",
						"component_attribute": "warn",
						"image_label": "warn",
						"markup_style": "warn",
						"redundant_view": "warn",
						"spacer_view": "warn"
					}
				}
			},
			"additionalProperties": false
		},
		"LintLevel": {
			"description": "How a lint rule reports what it finds.",
			"oneOf": [
				{
					"description": "Not checked.",
					"type": "string",
					"const": "allow"
				},
				{
					"description": "Reported without failing the run, unless warnings are denied.",
					"type": "string",
					"const": "warn"
				},
				{
					"description": "Reported, and fails the run.",
					"type": "string",
					"const": "deny"
				}
			]
		},
		"LintRules": {
			"description": "The level of each leptoskit lint rule.",
			"type": "object",
			"properties": {
				"children_last": {
					"description": "Builder trees set their properties before their children.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				},
				"color_literal": {
					"description": "Colors come from the theme rather than hand-written values. Off by\ndefault.",
					"$ref": "#/$defs/LintLevel",
					"default": "allow"
				},
				"component_attribute": {
					"description": "A capitalized function that returns a view is a component, so it\ncarries `#[component]`.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				},
				"image_label": {
					"description": "Every `Image` has an accessible name or is marked decorative.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				},
				"markup_style": {
					"description": "Component trees are written the way `markup` says.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				},
				"redundant_view": {
					"description": "A `View` with no classes, props, or handlers does not wrap a single\nchild.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				},
				"spacer_view": {
					"description": "Space between siblings comes from `gap-*` or `Spacer()`, not an empty\nsized `View`.",
					"$ref": "#/$defs/LintLevel",
					"default": "warn"
				}
			},
			"additionalProperties": false
		},
		"MacosDistribution": {
			"description": "How the macOS app is distributed.",
			"oneOf": [
				{
					"description": "Signed with a Developer ID certificate and notarized by Apple, so\nGatekeeper opens it on any Mac.",
					"type": "string",
					"const": "developer_id"
				}
			]
		},
		"MacosStore": {
			"description": "The notarized macOS download.",
			"type": "object",
			"properties": {
				"distribution": {
					"description": "`developer_id`.",
					"$ref": "#/$defs/MacosDistribution",
					"default": "developer_id"
				},
				"github_release": {
					"description": "A GitHub repository, `owner/name`, whose release `v<app.version>`\ngets the `.dmg` and `.zip` with `--submit`.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false
		},
		"MarkupStyle": {
			"description": "How a project writes its component trees.",
			"oneOf": [
				{
					"description": "Markup in `view!`: `view! { <Text class=\"p-4\">\"Hi\"</Text> }`.",
					"type": "string",
					"const": "view"
				},
				{
					"description": "Builder calls: `Text(\"Hi\").class(\"p-4\")`.",
					"type": "string",
					"const": "builder"
				},
				{
					"description": "Either, mixed freely.",
					"type": "string",
					"const": "any"
				}
			]
		},
		"MissingPlugins": {
			"description": "What a native build does with a selected plugin that has no\nimplementation on the platform being built.",
			"oneOf": [
				{
					"description": "Leave the plugin out and print a warning. Its calls fail with\n`Unavailable`.",
					"type": "string",
					"const": "warn"
				},
				{
					"description": "Stop the build.",
					"type": "string",
					"const": "error"
				}
			]
		},
		"NativeConfig": {
			"description": "Native app settings.",
			"type": "object",
			"properties": {
				"android_certificates": {
					"description": "The SHA-256 fingerprints of the certificates that sign the Android\napp, as `keytool -list` prints them (`AB:CD:…`, 32 bytes). With them,\n`leptoskit::server` publishes `/.well-known/assetlinks.json`, and the\napp's passkeys are accepted. List the upload key and the Play app\nsigning key when Google signs the release.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"apple_team_id": {
					"description": "The Apple Developer team that signs the iOS and macOS apps, such as\n`ABCDE12345`. With it, `leptoskit::server` publishes\n`/.well-known/apple-app-site-association`, which lets the apps use\nthe site's passkeys and its sign-in return address.",
					"type": [
						"string",
						"null"
					],
					"pattern": "^[A-Z0-9]{10}$"
				},
				"experimental-rust-plugins": {
					"description": "Enables experimental pure-Rust native plugin backends (`objc2` on\niOS/macOS and `jni` on Android) for plugins that declare an\nexperimental Rust implementation. Off by default.",
					"type": "boolean"
				},
				"missing-plugins": {
					"description": "What a build does when a selected plugin has no implementation the\nplatform's host can run. `warn` (the default) leaves it out with a\nwarning, so its calls fail with `Unavailable`; `error` stops the build.",
					"$ref": "#/$defs/MissingPlugins"
				},
				"package_id": {
					"description": "The reverse-domain application id used by platform shells, such as\n`com.example.counter`.\n\nIt must have at least two dot-separated segments, each an ASCII letter\nfollowed by ASCII letters or digits: the only form both iOS bundle ids\n(no `_`) and Android package names (no `-`) accept. When unset it\ndefaults to [`default_package_id`] of the app name.",
					"type": "string",
					"default": "",
					"pattern": "^(?:$|[A-Za-z][A-Za-z0-9]*(?:\\.[A-Za-z][A-Za-z0-9]*)+)$"
				},
				"plugin-options": {
					"description": "Host-owned options for explicitly selected runtime plugins. These values\nare embedded in native registration, never read from guest requests.",
					"type": "object",
					"additionalProperties": {
						"type": "object"
					}
				},
				"plugins": {
					"description": "Runtime plugins explicitly granted to the generated native app.\nEach name must match metadata on a direct Cargo dependency.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"targets": {
					"description": "Legacy native target selection. New projects use `app.platforms`.",
					"type": "array",
					"items": {
						"$ref": "#/$defs/NativeTarget"
					}
				},
				"update_contract": {
					"description": "The app-owned native capability contract. Change this when a store\nrelease changes plugin grants or native behavior incompatibly.",
					"type": "string",
					"default": "mobile-v1"
				},
				"viewport_height": {
					"description": "The initial viewport height for the headless layout pass.",
					"type": "number",
					"format": "float",
					"default": 844.0
				},
				"viewport_width": {
					"description": "The initial viewport width for the headless layout pass.",
					"type": "number",
					"format": "float",
					"default": 390.0
				}
			},
			"additionalProperties": false
		},
		"NativeTarget": {
			"description": "A native platform shell.",
			"oneOf": [
				{
					"description": "macOS.",
					"type": "string",
					"const": "macos"
				},
				{
					"description": "iOS.",
					"type": "string",
					"const": "ios"
				},
				{
					"description": "Android.",
					"type": "string",
					"const": "android"
				},
				{
					"description": "HarmonyOS (ArkUI, packaged as a HAP).",
					"type": "string",
					"const": "harmonyos"
				},
				{
					"description": "Windows.",
					"type": "string",
					"const": "windows"
				},
				{
					"description": "Linux.",
					"type": "string",
					"const": "linux"
				}
			]
		},
		"Optimize": {
			"description": "How hard a release build optimizes the wasm client for size.",
			"oneOf": [
				{
					"description": "Your `release` profile, then `wasm-opt -Oz`: small, and quick to\nrebuild.",
					"type": "string",
					"const": "fast"
				},
				{
					"description": "Also fat LTO, one codegen unit, `opt-level = \"z\"`, and\n`panic = \"abort\"`, so the optimizer sees and prunes the whole program.\nOn leptoskit's benchmark app: 14% less wasm, brotli-compressed, for\nrelease rebuilds about three times slower.",
					"type": "string",
					"const": "smallest"
				}
			]
		},
		"Platform": {
			"description": "The platforms leptoskit builds for.",
			"oneOf": [
				{
					"description": "The browser build: wasm + SSR server.",
					"type": "string",
					"const": "web"
				},
				{
					"description": "An iOS application.",
					"type": "string",
					"const": "ios"
				},
				{
					"description": "An Android application.",
					"type": "string",
					"const": "android"
				},
				{
					"description": "A macOS application.",
					"type": "string",
					"const": "macos"
				},
				{
					"description": "A Windows application.",
					"type": "string",
					"const": "windows"
				},
				{
					"description": "A Linux application.",
					"type": "string",
					"const": "linux"
				},
				{
					"description": "A HarmonyOS application.",
					"type": "string",
					"const": "harmonyos"
				},
				{
					"description": "A terminal application: the shared tree in an interactive cell grid.",
					"type": "string",
					"const": "tui"
				},
				{
					"description": "A browser extension for Chromium, Firefox, and Safari, built from the\nweb client and configured in `[extension]`.",
					"type": "string",
					"const": "extension"
				},
				{
					"description": "Native apps: wasm UI bundle on platform shells.",
					"type": "string",
					"const": "native"
				},
				{
					"description": "The server binary only.",
					"type": "string",
					"const": "server"
				}
			]
		},
		"PlayStore": {
			"description": "An app in Google Play Console, created once there. Its package name is\n`native.package_id`.",
			"type": "object",
			"properties": {
				"rollout": {
					"description": "With `--submit` on `production`, the fraction of users who get the\nrelease first, such as `0.1`; the rest get it when the rollout is\nraised in Play Console. Without it, everyone gets it.",
					"type": [
						"number",
						"null"
					],
					"format": "double"
				},
				"track": {
					"description": "The track each upload goes to: `internal`, `alpha`, `beta`,\n`production`, or a closed testing track's name.",
					"type": "string",
					"default": "internal"
				}
			},
			"additionalProperties": false
		},
		"PluginSpec": {
			"description": "One activated plugin.\n\nNames without a `path` resolve against the built-in registry; a `path`\npoints at a plugin crate compiled into the tooling. Leptos plugins —\nactivated as cargo features on the app — are declared with `leptos = true`\nand forwarded to the app build.",
			"type": "object",
			"properties": {
				"command": {
					"description": "The executable answering this plugin's hooks, for plugins that are\nseparate programs. Without it, `leptoskit-plugin-<name>` is looked up\non PATH.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"leptos": {
					"description": "Whether this is a leptos plugin, activated as an app cargo feature.",
					"type": "boolean",
					"default": false
				},
				"name": {
					"description": "The plugin name.",
					"type": "string",
					"default": ""
				},
				"options": {
					"description": "Options passed to the plugin.",
					"type": "object",
					"additionalProperties": true,
					"default": {}
				},
				"path": {
					"description": "The path to a local plugin crate, when it is not a built-in.",
					"type": [
						"string",
						"null"
					],
					"default": null
				}
			},
			"additionalProperties": false
		},
		"PublishConfig": {
			"description": "The stores an app is published to.",
			"type": "object",
			"properties": {
				"app_store": {
					"description": "App Store Connect, for the iOS app and the Safari extension inside\nit: TestFlight, then App Store review.",
					"anyOf": [
						{
							"$ref": "#/$defs/AppStore"
						},
						{
							"type": "null"
						}
					]
				},
				"chrome": {
					"description": "The Chrome Web Store, for the Chromium package.",
					"anyOf": [
						{
							"$ref": "#/$defs/ChromeStore"
						},
						{
							"type": "null"
						}
					]
				},
				"edge": {
					"description": "Microsoft Edge Add-ons, for the Chromium package.",
					"anyOf": [
						{
							"$ref": "#/$defs/EdgeStore"
						},
						{
							"type": "null"
						}
					]
				},
				"firefox": {
					"description": "addons.mozilla.org, for the Firefox package.",
					"anyOf": [
						{
							"$ref": "#/$defs/FirefoxStore"
						},
						{
							"type": "null"
						}
					]
				},
				"macos": {
					"description": "The macOS app, signed with a Developer ID and notarized, for download\noutside the Mac App Store.",
					"anyOf": [
						{
							"$ref": "#/$defs/MacosStore"
						},
						{
							"type": "null"
						}
					]
				},
				"play": {
					"description": "Google Play, for the Android App Bundle.",
					"anyOf": [
						{
							"$ref": "#/$defs/PlayStore"
						},
						{
							"type": "null"
						}
					]
				}
			},
			"additionalProperties": false
		},
		"RenderMode": {
			"description": "How a web build renders its interface.\n\nThe mode decides which cargo features each side of the build gets, which\nfollows the leptos convention: the server package is built with its `ssr`\nfeature and the wasm client with its `hydrate` feature.",
			"oneOf": [
				{
					"description": "Client-side rendering: the server only serves files, and the wasm\nclient renders the whole page. Neither side gets a mode feature. The\ndefault, so a project opts into server rendering explicitly.",
					"type": "string",
					"const": "csr"
				},
				{
					"description": "Server-side rendering with full hydration: the server renders every\npage, and the client hydrates all of it.",
					"type": "string",
					"const": "ssr"
				},
				{
					"description": "Server-side rendering with islands: the server renders every page,\nand the client hydrates only the `#[island]` components. Both sides\nalso get `leptos/islands`, so the wasm bundle carries nothing but the\nislands.",
					"type": "string",
					"const": "islands"
				}
			]
		},
		"RouterConfig": {
			"description": "File routes (legacy table; the router plugin is preferred): `leptoskit\nplugin:router routes`, `dev` and `build` read the routes\ndirectory and write the typed `Route` module beside it.",
			"type": "object",
			"properties": {
				"dir": {
					"description": "The routes directory, relative to the project root. The generated\nmodule sits beside it with the same name, so `src/routes/` gets\n`src/routes.rs`, which `mod routes;` finds.",
					"type": "string",
					"default": "src/routes"
				}
			},
			"additionalProperties": false
		},
		"RpcConfig": {
			"description": "The published RPC, as `leptoskit rpc` describes it and generates clients\nfor it.\n\nWhich functions are published is decided in code, with\n`#[leptoskit_rpc::api]`; this section names the RPC, excludes functions by\npattern, and says where generated clients go.",
			"type": "object",
			"properties": {
				"description": {
					"description": "A longer description for the OpenAPI document.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"exclude": {
					"description": "Function-name globs (`*` and `?`) to leave out of everything generated,\nin addition to `#[api(internal)]`.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"include_internal": {
					"description": "Whether `#[api(internal)]` functions are generated too. Off for a\npublic package; on for an internal one.",
					"type": "boolean",
					"default": false
				},
				"jobs": {
					"description": "The background job workers.",
					"$ref": "#/$defs/RpcJobsConfig",
					"default": {
						"poll_seconds": 5,
						"queues": {},
						"retention_days": 7,
						"workers": 4
					}
				},
				"live": {
					"description": "Live queries across several servers.",
					"$ref": "#/$defs/RpcLiveConfig"
				},
				"servers": {
					"description": "The origins the RPC is served from. The first one is the default the\ngenerated clients point at; none means the page's own origin.",
					"type": "array",
					"default": [],
					"items": {
						"type": "string"
					}
				},
				"targets": {
					"description": "What `leptoskit rpc generate` writes when no `--target` is given. Empty\nmeans every target, into its default directory.",
					"type": "array",
					"default": [],
					"items": {
						"$ref": "#/$defs/RpcTarget"
					}
				},
				"title": {
					"description": "The RPC title; defaults to `<app.name> RPC`.",
					"type": [
						"string",
						"null"
					],
					"default": null
				}
			},
			"additionalProperties": false
		},
		"RpcJobsConfig": {
			"description": "The background job workers: `[rpc.jobs]`.",
			"type": "object",
			"properties": {
				"poll_seconds": {
					"description": "How often idle workers look for jobs that are due, in seconds, besides\nbeing woken whenever a job is enqueued.",
					"type": "integer",
					"format": "uint32",
					"default": 5,
					"minimum": 0
				},
				"queues": {
					"description": "Queues with their own concurrency, by name, such as\n`[rpc.jobs.queues.mail]`.",
					"type": "object",
					"additionalProperties": {
						"$ref": "#/$defs/RpcQueueConfig"
					},
					"default": {}
				},
				"retention_days": {
					"description": "How many days finished and cancelled jobs are kept; 0 keeps them.\nFailed jobs stay until someone retries them.",
					"type": "integer",
					"format": "uint32",
					"default": 7,
					"minimum": 0
				},
				"workers": {
					"description": "How many jobs each instance runs at once.",
					"type": "integer",
					"format": "uint32",
					"default": 4,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"RpcLiveConfig": {
			"description": "Live queries across several servers: `[rpc.live]`.",
			"type": "object",
			"properties": {
				"relay_url_env": {
					"description": "The environment variable holding the NATS URL of the live relay,\nsuch as `NATS_URL`. When it's set, one server publishes the change\nlog to NATS `JetStream` and every server reads it from there, rather\nthan each reading the database, and channel signals and presence\ncross between servers. Unset, or empty, every server reads the\ndatabase itself.",
					"type": [
						"string",
						"null"
					]
				}
			},
			"additionalProperties": false
		},
		"RpcQueueConfig": {
			"description": "One job queue: `[rpc.jobs.queues.<name>]`.",
			"type": "object",
			"properties": {
				"concurrency": {
					"description": "How many of its jobs run at once, across every instance, so a\nrate-limited service never sees more.",
					"type": "integer",
					"format": "uint32",
					"default": 1,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"RpcTarget": {
			"description": "One client `leptoskit rpc generate` writes.",
			"type": "object",
			"properties": {
				"language": {
					"description": "The target: `typescript`, `python`, `go`, `rust`, `dart`, `cli`, or\n`openapi`.",
					"type": "string",
					"enum": [
						"typescript",
						"python",
						"go",
						"rust",
						"dart",
						"cli",
						"openapi"
					]
				},
				"out": {
					"description": "The output directory, relative to the project root; each target has a\ndefault under `clients/`.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"package": {
					"description": "The package name: the npm package, the PyPI distribution, the Go\nmodule, the cargo crate, or the Dart package.",
					"type": [
						"string",
						"null"
					],
					"default": null
				},
				"scaffold": {
					"description": "How much regeneration writes: `create` (code always, scaffolding such\nas manifests and READMEs only when missing — the default), `full`\n(everything, overwriting), or `files` (code only; the package is the\nuser's to define).",
					"type": [
						"string",
						"null"
					],
					"default": null,
					"enum": [
						"create",
						"full",
						"files",
						null
					]
				},
				"server_url": {
					"description": "The origin this client points at by default; overrides `rpc.servers`.",
					"type": [
						"string",
						"null"
					],
					"default": null
				}
			},
			"additionalProperties": false,
			"required": [
				"language"
			]
		},
		"RunAt": {
			"description": "When a declared content script runs, relative to the page loading.",
			"oneOf": [
				{
					"description": "Before the page's own scripts.",
					"type": "string",
					"const": "document_start"
				},
				{
					"description": "After the document is parsed.",
					"type": "string",
					"const": "document_end"
				},
				{
					"description": "Once the page is idle: the browsers' default.",
					"type": "string",
					"const": "document_idle"
				}
			]
		},
		"SafariSettings": {
			"description": "Safari's settings.",
			"type": "object",
			"properties": {
				"bundle_id_suffix": {
					"description": "Appended to `native.package_id` to make the Safari extension's bundle\nidentifier, which Apple requires to start with the app's.",
					"type": "string",
					"default": "SafariExtension"
				}
			},
			"additionalProperties": false
		},
		"SemVer": {
			"type": "string",
			"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"
		},
		"ServeConfig": {
			"description": "Server settings.",
			"type": "object",
			"properties": {
				"address": {
					"description": "The bind address.",
					"type": "string",
					"default": "127.0.0.1"
				},
				"port": {
					"description": "The bind port.",
					"type": "integer",
					"format": "uint16",
					"default": 3000,
					"maximum": 65535,
					"minimum": 0
				}
			},
			"additionalProperties": false
		},
		"ThemeConfig": {
			"description": "Design tokens from the `[theme]` table, matching CSS custom properties\nthat Tailwind `var(--name)` utilities and the process-wide `Theme` map\nresolve.\n\n```toml\n[theme.colors]\nbrand = \"#3b82f6\"\nink = \"black\"\n\n[theme.lengths]\ngap = \"1rem\"\npad = \"16px\"\n```\n\nCall `Theme::install_maps(&theme.colors, &theme.lengths)` once at app\nstartup so native paint and the web `:root` sheet see the same names.",
			"type": "object",
			"properties": {
				"colors": {
					"description": "Color tokens as hex (`#rgb`, `#rrggbb`, `#rrggbbaa`), `black`,\n`white`, or `transparent`. Keys may omit the leading `--`.",
					"type": "object",
					"additionalProperties": {
						"type": "string"
					}
				},
				"lengths": {
					"description": "Length tokens as `px`, `rem`, `%`, `vw`, or `vh`. Keys may omit the\nleading `--`.",
					"type": "object",
					"additionalProperties": {
						"type": "string"
					}
				}
			},
			"additionalProperties": false
		}
	}
}
