Settings¶
Settings are your saved preferences: brightness, colors, clock and date format, transitions, volume, and the look of the built-in apps. This page lists every settings key.
| Read | GET /api/v1/settings – returns all settings keys |
| Write | PATCH /api/v1/settings – any subset; either all keys are applied or none; returns all settings keys |
| Reset | POST /api/v1/settings/reset – deletes the stored settings and restarts |
Settings survive a restart. Durations are whole milliseconds. Colors come back as "#RRGGBB" and
can be sent in several forms. If you send a Content-Type, it must be application/json. These
rules apply to the whole API and are described once under Conventions.
Restoring a backup skips settings that this clock does not have.
Reading the settings¶
{
"autoBrightness": false,
"brightness": 120,
"autoTransition": true,
"textColor": "#FFFFFF",
"transitionEffect": "Rain",
"transitionDurationMs": 1000,
"appDurationMs": 7000,
"timeMode": 1,
"timeColor": null,
"volume": 60,
"gamma": 1.9,
"colorCorrection": null
}
(shortened – the real response contains all settings keys)
You can send back exactly what GET returns: every value GET returns is accepted by PATCH.
Updating settings¶
Send any subset of the keys with PATCH. Keys you leave out stay as they are.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"brightness": 200, "transitionEffect": "Fade", "timeSeparatorMode": "pulse"}'
AWTRIX checks the whole request before it changes anything. If one key is not valid, it answers
422, nothing changes, and the answer names the first wrong key:
So a PATCH is applied completely or not at all. AWTRIX reports only the first problem, in the
order of the keys in your request. Fix it and send again to find the next one.
The tables below list every settings key. Any other key is rejected with 422 and
"message": "unknown field".
A successful PATCH answers 200 with all settings, already updated – you do not need a
second GET. Every change takes effect at once; no setting needs a restart.
Resetting to defaults¶
This deletes the stored settings and restarts AWTRIX with the defaults listed on this page.
Wi-Fi and your scripts stay. To reset everything, use
POST /api/v1/device/factory-reset – see HTTP API.
Brightness¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
autoBrightness |
boolean | - | false |
- | No effect: the clock has no light sensor. You can still set and read it. |
brightness |
integer | 0–255 | 120 |
raw level | Display brightness. Not a percentage. The knob sets it too. |
Color¶
These four keys change how the whole display looks – apps, icons, notifications and the mood light alike. They do not change the picture that
GET /api/v1/display/screen returns.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
saturation |
integer | 0-100 | 100 |
% | How colourful the display is. 100 keeps colors as they are, 0 shows everything in gray. |
gamma |
number | > 0 | 1.9 |
- | Gamma correction for the display. Must be greater than 0 – 0 is rejected. No upper limit. |
colorCorrection |
color or null |
- | null |
- | A color that every pixel is multiplied with. null = off. |
colorTint |
color or null |
- | null |
- | A second color that every pixel is multiplied with, on top of colorCorrection. null = off. |
colorTint is an RGB color, not a Kelvin value. To make the display warmer, send for example
"#FFD6AA", not 2700. null switches the tint off.
What each of these looks like on the display is described under Display colors.
Global text¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
textColor |
color | - | "#FFFFFF" |
- | The default text color. Cannot be null. Every per-app color that is null uses this one. |
uppercase |
boolean | - | true |
- | Show the text of pushed apps and notifications in capitals. A payload's own textCase overrides it. The clock face ignores it and always writes weekday and month names in capitals. |
scroll |
object | see below | - | - | How text moves in pushed apps and notifications. A payload's own scroll overrides it field by field. |
enlargeApps |
boolean | - | true |
- | true: pushed apps and notifications are drawn at double size, as if the display were 26×8. An app or a notification with an icon bigger than 26×8 keeps its size. Apps and notifications with a layout, scripts and the built-in apps keep their size too. |
scroll¶
These are the values a payload uses when it leaves out the matching field.
| Field | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
mode |
string | static · wrap · loop · bounce |
"wrap" |
- | static never moves and cuts off what does not fit · wrap scrolls the text off the edge and starts again · loop scrolls continuously without a gap at the end · bounce moves back and forth and pauses at both ends. |
direction |
string | left · right |
"left" |
- | Scroll direction. right mirrors the whole movement. |
entry |
string | inline · offscreen |
"inline" |
- | offscreen starts the text outside the display and skips the first pause. |
whenFits |
string | static · scroll |
"static" |
- | Whether text that fits on the display still moves. |
speed |
integer | ≥ 0 | 100 |
percent | Percentage of the base speed of 21 px/s. 0 stops the text, higher is faster, no upper limit. In an app drawn at double size (enlargeApps), a pixel is a 2×2 square, so the text crosses 42 display pixels per second in steps of two. |
gap |
integer | ≥ 0 | 8 |
pixels | loop only – the space between one repetition and the next. At double size each of these pixels is two display pixels wide. |
holdMs |
integer | ≥ 0 | 1000 |
ms | How long the text pauses before it starts moving, and at each end in bounce. 0 = no pause. |
PATCH changes only the fields you send: {"scroll":{"mode":"loop"}} changes the mode and keeps
the speed. A plain string sets only the mode: {"scroll":"loop"} means the same. An unknown field,
an unknown value or a negative number is rejected with 422 validationFailed, and field names
the key, for example scroll.speed.
A change here also affects apps you have already pushed, unless their payload set that field.
# Continuous scrolling everywhere, a little slower than normal
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"scroll": {"mode": "loop", "speed": 80}}'
App rotation¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
autoTransition |
boolean | - | true |
- | Switch to the next app automatically. With false the app changes only on a button press or an API call. |
appDurationMs |
integer | ≥ 0 | 7000 |
ms | How long each app is shown. Also the default duration of a notification. No upper limit. |
transitionEffect |
string | see below | "Rain" |
- | The animation between two apps. |
transitionDirection |
string | normal · reverse |
"normal" |
- | Reverses the movement of transitions that have a direction. The app order stays the same. |
transitionDurationMs |
integer | 0–2147483647 | 1000 |
ms | Length of the animation. 0 = instant. |
The apps rotate only when there are at least two in the list. With one app, AWTRIX stays on it
whatever autoTransition says.
transitionEffect values¶
A name, not a number. Upper and lower case do not matter – "Ripple", "ripple" and
"RIPPLE" are the same. There are 22 transitions; their names and what they look like are in
Visual reference → Transitions. GET /api/v1/capabilities returns the
same list.
Any other value is rejected with a message that starts with must be one of: and then lists the
valid names.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"transitionEffect": "Ripple", "transitionDirection": "reverse", "transitionDurationMs": 800}'
With normal, automatic and Next transitions move in their usual direction. reverse flips
that movement; Previous always moves the other way. Transitions without a direction, such as
Fade, look the same either way.
Which apps rotate¶
No setting decides that. The rotation is one list, set with PUT /api/v1/apps/order. Built-in apps
(Time and Status) are treated exactly like pushed apps and scripts: order sets the order, and disabled
switches an app off. Enabled apps missing from order are added at the end. Until you change it,
all available apps rotate. See
Pushed apps – Reordering, switching off and duplicating.
The keys below change how these apps look. They never add or remove an app.
Clock app¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
clockFace |
string | sheet | ring | flap | month | big |
"sheet" |
- | The clock face. See Clock faces. |
timeMode |
integer | 0–6 | 1 |
- | No effect. clockFace picks the face. |
timeColor |
color or null |
- | null |
- | Clock text color. null = use textColor. |
calendarHeaderColor |
color | - | "#FF0000" |
- | The top of the sheet, the weekends in the month grid and the weekday on the big face. |
calendarTextColor |
color | - | "#000000" |
- | The day on the sheet and the workdays in the month grid. |
calendarBodyColor |
color | - | "#FFFFFF" |
- | The paper of the sheet. |
calendarAnimation |
boolean | - | true |
- | true: the calendar sheet is torn off when the clock appears and at midnight. false: the sheet shows today right away. |
Clock faces¶
The clock is made for its 52×16 display. clockFace picks one of five faces:
| Value | Face |
|---|---|
sheet |
A tear-off calendar sheet with month and day, the time next to it and the weekday bar below the time. With the weekday bar off, the sheet shows the weekday instead of the month. |
ring |
The same sheet on two rings, with the day but without the month. |
flap |
The sheet with weekday and day; hours and minutes on two split-flap cards that flip at each full minute. |
month |
The whole month as a grid of dots on the sheet: weekends in the header color, past days dimmed, today in blue. |
big |
The time across the whole display, with weekday and date below. |
timeShowSeconds shows seconds on the big face only; next to a sheet there is no room.
timeShowAmPm and dateShowWeekday have no effect on the clock faces. The calendar colors paint
every sheet. The big face shows the weekday in calendarHeaderColor and the date in dateColor,
formatted with dateOrder, dateSeparator, dateYearMode and dateMonthNames. If the date is too
wide, it drops the century first, then the year. Weekday and month names are always in capitals,
whatever uppercase says.
When the clock appears, the sheet slides in showing yesterday and then falls off to show today.
This also happens when the clock comes back after a notification, the mood light or a dark
display, and at midnight. Switch off Calendar animation (calendarAnimation) and the sheet
shows today right away.
Clock text¶
These keys format the time on the clock faces, where there is room.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
time24h |
boolean | - | true |
- | 24-hour clock. false = 12-hour clock (midnight and noon show as 12). |
timeLeadingZero |
boolean | - | true |
- | Show the hour with two digits. Minutes and seconds always have two digits. |
timeShowSeconds |
boolean | - | false |
- | Add :SS. |
timeShowAmPm |
boolean | - | false |
- | Add AM / PM. Needs time24h: false, and is not shown while seconds are shown. |
timeSeparatorMode |
string | steady | blink | pulse |
"pulse" |
- | How the : between hours and minutes behaves. |
If AM/PM is not shown for one of these reasons, that is not an error: the key keeps its value.
timeSeparatorMode values¶
Upper and lower case do not matter. One of:
| Value | Behavior |
|---|---|
steady |
Always fully on. |
blink |
On and off, once per second. |
pulse |
Fades smoothly down and up again, once every two seconds. |
The colon keeps its space while it is dark, so the digits do not move.
Date text¶
These keys format the date on the big clock face.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
dateOrder |
string | dayMonthYear | monthDayYear | yearMonthDay |
"dayMonthYear" |
- | Order of day, month and year. |
dateSeparator |
string | dot | slash | dash |
"dot" |
- | The character between the parts: . / -. Ignored when dateMonthNames is true. |
dateYearMode |
string | none | twoDigit | fourDigit |
"twoDigit" |
- | none hides the year, twoDigit shows 26, fourDigit shows 2026. |
dateShowWeekday |
boolean | - | false |
- | Put a three-letter English weekday (Sun…Sat) and a space in front. |
dateMonthNames |
boolean | - | false |
- | Use three-letter English month names (Jan…Dec) with spaces instead of a number: 31 Dec instead of 31.12. |
dateColor |
color or null |
- | null |
- | Date text color. null = use textColor. |
Upper and lower case do not matter for the three name values. Day and month always have two digits.
With dateOrder: "dayMonthYear", dateSeparator: "dot" and dateYearMode: "none", the date ends
with a dot – 31.12. – the usual German short form. No other combination adds one.
# Sat 31/12/2026
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"dateShowWeekday": true, "dateSeparator": "slash",
"dateYearMode": "fourDigit"}'
Weekday bar¶
The row of seven small segments below the time, one per weekday.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
weekdayBar |
object | see below | - | - | The clock's weekday bar. |
dateWeekdayBar |
object | see below | - | - | No effect: the clock has no Date app. |
weekdayBar and dateWeekdayBar¶
Each segment is either a workday or a weekend day, and either today or not. The four colors cover these four cases.
| Field | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
show |
boolean | - | true |
- | Show the bar. The clock shows it below the time on the sheet and ring faces. |
startOnMonday |
boolean | - | true |
- | Monday is the first segment. false starts the week on Sunday. This changes only the order shown, not which day a segment stands for. |
weekendDays |
array of strings | sunday · monday · tuesday · wednesday · thursday · friday · saturday |
["sunday","saturday"] |
- | Which days are weekend. Any selection, in any order; [] means no weekend. Lowercase names only. |
activeColor |
color | - | "#FFFFFF" |
- | Today, when today is a workday. Cannot be null. |
inactiveColor |
color | - | "#666666" |
- | Other workdays. Cannot be null. |
weekendActiveColor |
color | - | "#FFFFFF" |
- | Today, when today is a weekend day. Cannot be null. |
weekendInactiveColor |
color | - | "#666666" |
- | Other weekend days. Cannot be null. |
PATCH changes only the fields you send: {"weekdayBar":{"weekendDays":["friday","saturday"]}}
moves the weekend and keeps the other six fields. An unknown field, a wrong type or a day name that
is not one of the seven is rejected with 422 validationFailed, and field names the key, for
example weekdayBar.weekendDays or weekdayBar.startOnMonday. Nothing in the request is applied.
startOnMonday never changes which days are weekend. weekendDays is always returned in calendar
order, Sunday first.
The weekend colors start with the same values as the workday colors, so the bar looks the same for all days until you change them.
# A Friday/Saturday weekend, shown in amber
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"weekdayBar": {"weekendDays": ["friday", "saturday"],
"weekendActiveColor": "#FFAA00",
"weekendInactiveColor": "#664400"}}'
Sensor apps¶
useCelsius, temperatureColor, humidityColor and batteryColor are in the settings, but
have no effect: the clock has no temperature, humidity or battery app.
Sound¶
The clock has one master volume and three groups. Who plays a sound decides its group:
- radio: every internet radio station.
- app: everything a script plays.
- alert: notification sounds,
POST /api/v1/audio/playandcmd/audio/play,POST /api/v1/audio/clip, the boot sound and the answer of Home Assistant Voice.
What you hear is volume × group volume / 100. With
volume at 50 and alertVolume at 60, an alert plays at 30. A change applies at once, also to
sounds that are playing. 0 is silence, and volume: 0 silences every sound.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
volume |
integer | 0–100 | 90 |
% | The master volume. Every group is a share of it. The knob sets it. |
radioVolume |
integer | 0–100 | 80 |
% | The radio group: internet radio. |
appVolume |
integer | 0–100 | 100 |
% | The app group: everything a script plays. |
alertVolume |
integer | 0–100 | 100 |
% | The alert group: notification sounds and the other alerts listed above. |
bootSound |
boolean | - | true |
- | The sound when the clock starts. It plays at the alert volume. |
musicSource |
string | auto, playback, microphone |
auto |
— | What music visualizers and pitch react to. playback = what the speaker plays, microphone = what the microphone hears, auto = the speaker while something plays, otherwise the microphone. |
The web UI shows the four volumes as the Mixer on the Audio tab.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H 'Content-Type: application/json' \
-d '{"volume":50,"alertVolume":40}'
See Sound.
Buttons¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
blockNavigation |
boolean | - | false |
- | With true, the left and right buttons do not change apps, a double press on select does not switch the display, and holding select does not open the menu. The knob sets neither brightness nor volume and does not start Home Assistant Voice. Presses still reach scripts, buttonCallback and MQTT, and knob turns still reach buttonCallback and MQTT. |
Value types¶
Colors¶
Colors come back as uppercase "#RRGGBB". When you send a color, you can use any form listed
under Conventions → Colors: "RRGGBB", "#RGB", [r, g, b],
["HSV", h, s, v], or a number.
There are two kinds of color keys:
- Required colors –
textColor,calendarHeaderColor,calendarTextColor,calendarBodyColorand the four colors inweekdayBar.nullis rejected with422. - Optional colors –
timeColor,dateColor,temperatureColor,humidityColor,batteryColor(nullmeans usetextColor) andcolorCorrection,colorTint(nullmeans off). All seven default tonull.
Black and white are real colors, not "unset". "#000000" on an optional text color is stored as
black and read back as "#000000", not null. "#FFFFFF" on colorCorrection or colorTint is
stored as white and looks the same as off, because white changes nothing. Only JSON null means
use textColor or off.
# Give the clock its own colour, and let the date use textColor again
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"timeColor": "#00AAFF", "dateColor": null}'
Name strings¶
transitionEffect, transitionDirection, timeSeparatorMode, dateOrder, dateSeparator and
dateYearMode take names, never numbers. Upper and lower case do not matter – "pulse",
"Pulse" and "PULSE" are the same. GET /api/v1/capabilities lists the names for
transitionEffect; the others are in the tables on this page. GET /api/v1/settings always returns
that spelling. A number gets the same error as a wrong name:
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"timeSeparatorMode": 1}'
{ "error": { "code": "validationFailed",
"message": "must be one of: steady blink pulse",
"field": "timeSeparatorMode" } }
The day names in weekdayBar.weekendDays are different: they must be lowercase, exactly as listed.
Numbers¶
Integer keys reject decimals and booleans – {"brightness": 120.5} and {"brightness": true} both
fail with "must be an integer". gamma is the only key that takes a decimal number. It also
accepts a whole number, so 2 is a valid gamma.
An upper limit of 2147483647 just means "no real limit".
Validation errors¶
Every problem is answered with 422, the standard error body and the wrong key in field. Unknown
keys are rejected too, so a typo fails instead of being silently ignored – and nothing in the
request is applied. A request that is not valid JSON gets 400 invalidJson.
All messages this route can return: Errors – PATCH /api/v1/settings.
Related¶
- Conventions – color formats and rules for the whole API
- Visual reference – transitions, effects and how the display colors look
- System configuration – Wi-Fi, MQTT, time zone, display wiring and other device keys
- Brightness & sensors
- Sound