{#
Settings.
This screen is one request away from being a credential dump, so everything
on it has been through redact_secrets first. A hidden value keeps its
placeholder and is styled as hidden: a blank field would read as "nothing is
set here" and invite someone to overwrite a working credential with an empty
string.
Configuration is edited in sections, each an htmx swap over the config API's
own endpoints, loaded below from /settings/config so the page handler in the
aggregate router stays untouched by editor work. Stored credentials remain
CLI-only; the editor says so on itself. The stored-file dump at the bottom
excludes the keys the editable sections own, so a value never appears twice
on this screen with one copy stale after a swap.
The controls this screen also carries - two-factor authentication, API
tokens and session management - belong to the panel itself and nowhere else.
#}
{% extends "base.html" %}
{% import "_macros.html" as m %}
{% block title %}Settings{% endblock %}
{% block content %}
{{ m.page_head("Settings", "Configuration is edited by section. Secrets are redacted before they leave the server and are changed from the CLI.") }}
Two-factor authentication
{% include "fragments/totp.html" %}
API tokens
{% include "fragments/api_tokens.html" %}
Sessions
{% include "fragments/sessions.html" %}
| {{ entry.key }} | {%- if entry.redacted %}{{ m.secret(entry.value) }} {%- else %}{{ entry.value }}{% endif -%} |
|---|