-
Notifications
You must be signed in to change notification settings - Fork 1
Apps
The Apps page holds the four things that write into the chatbox on their own. Each one is a card with a toggle; the 3×3 dots on the left of a card header drag it into another position, and that order is the order the lines appear in.
A rotating line of text you write yourself — a mood, a "BRB", a note about what you are doing. It is the simplest app in the program and the one most people use alone.
You fill in up to 20 text slots. The app shows slot 1, waits, shows slot 2, and so on, then starts over. A slot left empty is skipped entirely, so the rotation never shows a blank line.
| Setting | Default | What it does |
|---|---|---|
| Active | on | Whether the app contributes a line at all |
| Number of texts | 1 | How many of the 20 slots are in the rotation |
| Cycle every | 10 sec | How long each text stays on screen |
| Style per text | normal |
normal, super or sub — see below |
| Template | 1 | Which of the ten text sets is active |
Every slot has its own style. super and sub map the text onto the
Unicode small-letter blocks, so it renders smaller in the chatbox
without any font support:
normal Hello there
super ᴴᵉˡˡᵒ ᵗʰᵉʳᵉ
sub Hₑₗₗₒ ₜₕₑᵣₑ
Not every character exists in those blocks. Anything without a mapping
is passed through unchanged — the line never breaks, it just mixes
sizes. Uppercase in sub is particularly sparse; lowercase gives the
better result.
Ten independent sets of texts, each with its own 20 slots, its own styles and its own "number of texts". Switching template swaps all of it at once.
The intended use is context: a set for streaming, a set for hanging out, a set for events. You are not limited to that — a template you never put on rotation still works as a text library, because other parts of the app can reach into it by number:
{text} the rotating text of the ACTIVE template
{text_3} slot 3 of the active template, no rotation
{text_t2} the rotating text of template 2
{text_t2_5} slot 5 of template 2
So an All-in-one string can pull one fixed sentence out of template 7 without ever switching to it.
Live system values: GPU, CPU, memory, temperatures, power draw and frames per second.
| Platform | Source |
|---|---|
| Linux, AMD |
/sys/class/drm/*/device/hwmon and gpu_busy_percent
|
| Linux, NVIDIA | nvidia-smi |
| Linux, CPU |
/proc/stat, /proc/meminfo, hwmon
|
| Linux, CPU watts | Intel RAPL, or zenergy / k10temp on Zen 4/5 |
| Windows | Performance counters (PDH) and Win32 APIs |
| FPS | MangoHud's log file (Linux), opt-in |
Nothing is polled that is not switched on. A card with only the CPU values enabled never touches the GPU sysfs tree at all.
| Option | Default | What it shows |
|---|---|---|
| GPU name | on | Card name, e.g. RX 9070 XT
|
| GPU custom name | off | Replace the detected name with your own |
| GPU load | on | Usage in percent |
| GPU temp | on | Temperature in °C |
| GPU watts | off | Power draw |
| VRAM used | on | e.g. 9.1/16G
|
| VRAM percent | off | Percentage instead of absolute |
| CPU name | on | Model name |
| CPU custom name | off | Replace the detected name |
| CPU load | on | Usage in percent |
| CPU temp | on | Temperature in °C |
| CPU watts | off | Package power draw |
| RAM used | on | e.g. 18/32G
|
| RAM percent | off | Percentage instead of absolute |
| RAM type | (empty) | Free text, e.g. DDR5 — not detected |
| Flame icon | off | 🔥 above a temperature threshold |
| Poll interval | 2 sec | How often the values are refreshed |
| FPS via MangoHud | off | Reads MangoHud's log directory |
The two watt options are off on purpose. The chatbox is 144 characters; switching them on for everybody would make an existing hardware line longer without being asked.
Name styles (normal / super / sub) work the same way as in
Personal Status, so a long GPU name can be shrunk instead of dropped.
At the bottom of the card, Custom line replaces the automatically assembled hardware lines with a template you write yourself. This is where the card stops being a list of checkboxes and becomes a layout tool.
The default template:
🎮 {gpu_name} {gpu_usage} | {gpu_temp} {temp_icon} \n
⚙️ {cpu_name} {cpu_usage} | {cpu_temp} {temp_icon} \n
VRAM {vram_usage} RAM {ram_usage} {ram_type}
Rules worth knowing:
-
\n(backslash-n) becomes a real line break. - A placeholder with no value disappears together with its
separators.
{gpu_temp} | {cpu_temp}with no GPU sensor renders as55°C, not as| 55°C. This is why templates can be written optimistically. - The checkboxes above still apply. A value you switched off is empty,
so
{gpu_power}in the template shows nothing while "GPU watts" is off — the template asks, the checkbox permits. - The + button next to the field opens the placeholder picker, so nothing has to be typed from memory.
Available hardware placeholders:
{gpu_name} {gpu_usage} {gpu_temp} {gpu_power} {vram_usage}
{cpu_name} {cpu_usage} {cpu_temp} {cpu_power}
{ram_usage} {ram_type} {fps} {temp_icon}
Two style markers can wrap any part of a line:
{sup/"RX 9070 XT"} renders small and raised
{sub/{cpu_usage}} renders small and lowered
What is currently playing, read from the system's own media interface — not from a specific player.
| Platform | Interface |
|---|---|
| Linux | MPRIS over D-Bus |
| Windows | GlobalSystemMediaTransportControls (GSMTC) |
Anything that registers there works: Spotify, Firefox, VLC, YouTube in a browser, a local player. No configuration, no API key, no account.
| Option | Default | What it shows |
|---|---|---|
| Artist | on | Artist name |
| Title | on | Song title |
| Title length | 40 | Cut-off in characters (3–64) |
| Time | on | Position and length |
| Time with seconds | on |
1:27/3:45; off gives the older 0:03 style |
| Time style | normal |
normal / super / sub
|
| Time position | own line | See below |
| Song bar | on | The progress bar |
| Bar style | 3 | 6 presets, plus a custom one |
| Bar size | 100 % | Bar length, 30–100 % |
| Icon | off | A small ♪ in front of the line |
| Lyrics | off | Synced lyrics, see below |
| Idle text | ⏸ | Shown while nothing is playing |
| Poll interval | 1 sec | How often the player is asked |
Where the timer sits relative to the bar:
line 0:27/1:06 on its own line with artist and title
before 0:27/1:06 ▓▓░░░░
after ▓▓░░░░ 0:27/1:06
split 0:27▓▓░░░░1:06
Six presets, from a minimal rule to a solid block bar:
[───●────────] ──■── [█████░░░░░░░]
The custom style lets you set the left cap, the fill character, the head, the empty character and the right cap individually — so a bar built entirely out of hearts or arrows is a matter of five fields.
Synced, line-by-line lyrics matched to the playback position.
- Online: fetched from LRCLIB. Off by default, because on means network requests.
-
Local: your own
.lrcfiles from a folder you choose. Default~/.config/OSC-DreamChatbox/lyrics/. - A small prefix symbol (default
♪) marks the lyric line. It can be changed or switched off.
When nothing is playing, the media line does not simply vanish — a line
that disappears looks like the app stopped working. Instead the idle
text (default ⏸) takes its place. Switch it off if you prefer the line
to go away.
Like Hardware, MediaPlay has a Custom line field that replaces the assembled output:
{artist} : {title} | {time}\n{bar}
Placeholders: {artist} {title} {time} {time_status} {time_end}
{bar} {lyrics} {lyrics_prefix} {icon_sound} {media_idle}
A decorative frame around the message: one line above everything, one line below.
🕐12:45🕐 ───────
Status text here
Artist : Title
───── OSC-DreamChatbox
| Setting | Default | What it does |
|---|---|---|
| Active | off | Whether the frame is drawn |
| Template | Heavy | One of 12 presets, or custom |
| Top line | on | Draw the upper line |
| Bottom line | on | Draw the lower line |
| Top mode | custom |
none, clock or custom text |
| Bottom mode | custom | same |
| Top text | 🕐{box_clock}🕐 |
The middle text of the upper line |
| Bottom text | OSC-DreamChatbox |
The middle text of the lower line |
| Fill width top | 7 | Fill characters either side of the middle text |
| Fill width bottom | 3 | same, for the lower line |
| Align both lines | off | Force both lines to the same width |
| Live clock | on | Update the clock every second |
| Clock format | 24h HH:MM
|
12h / 24h, with or without seconds |
The 12 presets: Light, Heavy, Double, Rounded, Dashed, Blocks, Rule, Corners, Stars, Hearts, Arrows, Sparkles. The custom template exposes the individual characters — left cap, fill, right cap — for each line.
How wide a frame line can get before the VRChat chatbox wraps it depends on the font and on which characters are on the line. No default can know that; it has to be set once, by eye, against the game. Everything is pre-filled, so switching it on gives a working frame to adjust from rather than a blank.
With All in one off, the frame wraps the whole message automatically.
With All in one on, it does not. Instead the frame appears exactly where you place it:
{box_start} the top line
{box_stop} the bottom line
{box_text} just the middle text, without the frame characters
This is deliberate. A wrap can only ever be right for one of your AIO strings, and it would sit outside the plugin lines as well. Placing it yourself means it lands where it belongs — including in the middle of a message, or only on some of your strings.
The placeholders work whether or not the card is Active, so you can use the frame styling without any automatic wrapping at all.
OSC-DreamChatbox · GPL-3.0-or-later · github.com/yakuda-stack/OSC-DreamChatbox