Configuration

DropTerm keeps every setting in RON files under one directory and reloads them live - changes apply without a restart, whether made in the settings drawer or by editing the file directly.

~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/

Each of the 51 keys is its own file in that directory. Edit one directly:

echo '60' > ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/height_percent
echo 'Left' > ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/h_align

Most keys are editable in the settings drawer; the exceptions write themselves (settings_drawer_width) or wait for behavior that does not ship yet (Parked and reserved keys).

The default config directory

What a fresh configuration carries - every key that has a default, with the file’s whole content as its value (a genuine string quoted; an enum, a number, or a bool bare). Pinned to the code by a test, so it cannot drift:

Key file Content
height_percent 40
width_percent 100
h_align Center
edge Top
tab_position Auto
tab_title_mode Shell
layer Overlay
keyboard_mode Exclusive
respect_panel false
show_in_dock false
font_name "Noto Sans Mono"
font_size 14
color_scheme_dark "COSMIC Dark"
color_scheme_light "COSMIC Light"
opacity 100
scrollback_lines 10000
hide_on_focus_loss true
session_persistence_enabled true
slide_animation_enabled true
bell_notification_enabled true
command_finish_notification_enabled true
command_finish_notification_after_secs 5
new_tab_after_current true
close_confirmation_enabled true
settings_drawer_click_close true
theme_preference System
new_tab_cwd Inherit
status_bar_enabled true
status_bar_show_process true
status_bar_show_path true
status_bar_show_branch true
status_bar_show_profile true
status_bar_show_grid true
status_bar_show_tab true
status_bar_show_zoom true
status_bar_show_clock true
status_bar_show_duration true
status_bar_show_exit_status true
status_bar_show_progress true
status_bar_show_program_status true
status_bar_show_scrollback true
tab_bar_border true
status_bar_border true
status_bar_activity_mark true
autosuggestions_enabled true
autosuggestions_paths_enabled true
autosuggestions_commands_enabled true
autosuggestions_completions_extended true
autosuggestions_menu_enabled true
autosuggestions_menu_auto false
autosuggestions_delay_ms 0
images_enabled true

The remaining keys have no default to write, so their files do not exist until you set them: shell (unset falls back to $SHELL, then /bin/sh), args, default_profile, default_cwd, profiles and custom_key_binds (empty lists write nothing), autosuggestions_aliases (empty by default - no alias re-targets anything), output (reserved - nothing reads it yet), and settings_drawer_width (unset until the drawer’s drag handle first writes it).

Geometry

Key Values Default What it does
height_percent 10-100 40 Surface height as a percentage of the output height. Written automatically after a grab-bar drag settles.
width_percent 30-100 100 Surface width as a percentage of the output width. 100 is the original full-width surface.
h_align Left, Center, Right Center Horizontal placement of the surface. Only meaningful below width_percent 100.
edge Top, Bottom Top The screen edge the terminal drops from.

Geometry applies live: a shown surface is reshaped in place, a hidden one picks the new geometry up on its next show.

Appearance

Key Values Default What it does
font_name font family name Noto Sans Mono The terminal’s typeface. The settings drawer’s picker lists the installed monospace families; a name the renderer cannot resolve falls back to its default while keeping your value in the file.
font_size points 14 The terminal’s font size.
opacity 0-100 100 Background opacity.
color_scheme_dark scheme name COSMIC Dark Scheme used while the system is in dark mode.
color_scheme_light scheme name COSMIC Light Scheme used while the system is in light mode.
theme_preference System, Dark, Light System Follow the OS light/dark setting, or pin one.

Scheme names come from the built-in registry - the same names the drawer’s pickers offer (Theming). A name the registry does not know falls back to the COSMIC pair and is never rewritten. All six keys apply live.

Tab bar position

Key Values Default What it does
tab_position Auto, Top, Bottom Auto Which side of the surface the tab strip sits on, independent of edge. Auto keeps it beside the grab bar.

A change never resizes anything - the strip reorders immediately on a shown surface. Pick it in the Geometry section of the settings drawer.

Tab titles

Key Values Default What it does
tab_title_mode see below Shell How a tab’s name is generated.
Mode Tab name
Shell The shell’s own title (OSC 0/2), verbatim - Terminal N until it reports one. An empty report (a program clearing the title it set, e.g. opencode on Ctrl+C) reads as no report, so the tab falls back to Terminal N instead of going blank.
AbbreviatedPath The title’s trailing path, middle segments shortened: ~/src/l1br3/ced renders ~/s/o/l/ced. With no title yet, the cwd itself, abbreviated the same way.
LastSegment The cwd’s final component - ced, or (root) at /.
Numbered Always Terminal N; shell titles never land.
Profile The profile’s name (profiles). A tab with no profile - or a deleted one - falls back to Shell’s behavior.

A manual rename wins in every mode. Changing the mode re-titles every live tab immediately, renamed ones excepted; while in Profile mode, renaming a profile retitles its running tabs at once.

Status bar

status_bar_enabled (default true) shows the 28 px band at the surface’s free edge, beside the grab bar. The band’s segments, click-to-copy, selection, and context menu are covered in their own page: Status bar. Toggle it with Ctrl+Shift+B, on the Behavior tab, or by writing the key.

Key Shows Default
status_bar_activity_mark The missed-activity halo - a thin attention ring around the process disc while output landed on the active tab under a hidden surface, until a touch (input, paste, scroll, pane click) or a tab switch acknowledges it. true
status_bar_show_process Foreground process name - filled disc while one runs, hollow ring over the idle shell. true
status_bar_show_path Working directory, $HOME collapsed to ~. true
status_bar_show_branch Git branch of the cwd (worktrees and submodules resolve). true
status_bar_show_profile The tab’s profile name. true
status_bar_show_grid Cell dimensions (80×24) - only after a resize away from the tab’s spawn size. true
status_bar_show_tab Tab position (2/5). true
status_bar_show_zoom Zoom delta (+200%) while the font is off its base size. true
status_bar_show_clock Wall clock (HH:MM). true
status_bar_show_duration Command time (2:41 while a command runs, cargo 2:41 after it finishes) - derived from the foreground edges the engine already diffs, no shell integration. Hiding it stops its 1 s tick. true
status_bar_show_exit_status Exit status (✗1) of the last finished command, beside its duration, in the scheme’s own red - sourced solely from the shell’s OSC 133;D report (opt-in shell integration; see the status band page). Success renders nothing; without integration the band never guesses. Clicking the chip copies the bare code. true
status_bar_show_progress The running command’s own progress (42%) beside the exit chip - sourced solely from the shell’s OSC 9;4 report (opt-in shell integration; see the status band page): … while indeterminate, the value in the scheme’s own red on error (! if none was ever given), paused plain. State 0, the command’s finish, and ~15 s without a refresh each clear it - a dead reporter never leaves its last number lying. Clicking the chip copies the bare percent. true
status_bar_show_program_status The program’s own report on the process disc and name - sourced solely from the shell’s OSC 7501 report (opt-in shell integration; see the status band page): blocked (the program waits on you) and error tint the disc’s fill in the scheme’s own red, any state’s progress percent rides the name (cargo 40%), and working/done/idle leave the disc alone. The command’s finish drops working/blocked, done/error persist until replaced or cleared, and a full terminal reset clears everything. Only the root report is consumed - child records and the app/title/msg/kind keys are ignored by design. true
status_bar_show_scrollback Lines scrolled back from the bottom (↑12) - shown only while the viewport is off-bottom; clicking the chip jumps to the bottom. true

All live. A hidden segment is never computed - hiding the branch stops the .git reads, hiding the clock stops its tick, hiding the duration stops its 1 s tick while a command runs, hiding the exit status stops its verdict sampling.

Bar borders

Key Default What it does
tab_bar_border true A 1 px hairline on the tab strip’s terminal-facing edge (it moves with tab_position).
status_bar_border true The same hairline on the status band’s side away from the grab bar.

The color follows the active scheme, so a scheme flip recolors both lines. Where the strips adjoin, only one line renders - no doubled seam. Pure display: no bar changes height, and both keys are independent. Toggle them on the Behavior tab.

Close confirmation

close_confirmation_enabled (default true) asks before closing a tab whose terminal runs a foreground process - through an in-surface modal, one prompt at a time, including the tab context menu’s Close Other Tabs and Close Tabs to the Right sweeps (pinned tabs never close). false restores instant, unconfirmed closes.

A shell exiting on its own never confirms. The key is read at request time, so a flip applies to the very next close.

Shell and directories

Key Values Default What it does
shell path to a binary unset The shell plain new tabs run. Unset falls back to $SHELL, then /bin/sh. Must be a path (/usr/bin/fish), not a bare name.
args extra arguments empty Arguments for that shell, split on whitespace with no quoting.
new_tab_cwd Inherit, Default Inherit Where plain new tabs open. Inherit follows the default chain (an explicit --cwd, else the active tab’s directory, else the pty default); Default opens in default_cwd instead.
default_cwd directory unset The directory Default mode opens in. Not existence-checked until the spawn: a dead path logs a warning and the tab opens in the pty default.

shell and args apply to the next spawn only - a running tab is never re-launched. new_tab_cwd covers the plain spawns (Ctrl+Shift+T, the tab bar +, the context menus’ plain New Tab, a bare remote new-tab, the fresh-startup tab); it never applies to Ctrl+Shift+H (home is that bind’s contract), duplicates, profile launches, or session restore. An explicit --cwd wins in both modes.

echo 'Default' > ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/new_tab_cwd
echo '"/srv/work"' > ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/default_cwd

Behavior toggles

Key Default What it does
hide_on_focus_loss true Hide the terminal when it loses keyboard focus. The opposite of Yakuake, Guake, and Ghostty’s quick terminal - for a hotkey-driven drop-down, focus is the whole interaction model. Write false to keep the overlay open; it then shares keyboard focus like a normal window - click away to type elsewhere, click the terminal to take focus back - instead of holding an exclusive grab.
session_persistence_enabled true Save the session on change and restore it on launch (sessions). false stops saves and skips restore; the saved file is never deleted, so re-enabling resumes over it.
slide_animation_enabled true Animate show/hide with the 130 ms slide (animation). false restores instant transitions.
bell_notification_enabled true Post a desktop notification when a bell rings while the terminal is hidden (bell).
command_finish_notification_enabled true Post a desktop notification when a command finishes while the terminal is hidden, carrying its duration and its name when one was sampled (bell). One notification per tab per hide period; false silences them.
command_finish_notification_after_secs 5 Minimum command duration, in seconds, that posts the finished-command notification. A hidden ls never pings; a finish exactly at the threshold counts.
autosuggestions_enabled true Fish-style autosuggestions: dim ghost text after the cursor completing the most recent matching command from this tab’s own history (autosuggestions). Right accepts it, Alt+Right takes one word, anything else dismisses it - nothing executes without an accept. false is the kill switch.
autosuggestions_paths_enabled true Path completion joins the autosuggestions: a typed path token (~/sr, ../co, ./te, /usr/bi) ghosts its first sorted match from the parent directory, directories suffixed /, names the shell would mangle backslash-escaped or not suggested at all (autosuggestions). Local-machine knowledge - silent over ssh. false restores history-only suggestions.
autosuggestions_commands_enabled true Command-name completion joins the autosuggestions: at the command position the typed word ghosts its shortest match among the executables on the tab’s spawn-time $PATH (ties alphabetical; the match must extend the word) - so a fresh tab with an empty history finishes gi → git, and after one real run history takes over invisibly (autosuggestions). A spawn-time snapshot, never rescanned; local-machine knowledge - silent over ssh. false restores history-only suggestions.
autosuggestions_completions_extended true The installed extended completions tier: the packaged completions-extended.toml - every corpus command beyond the embedded floor’s core tranche, found in the XDG data dirs - adds beside the embedded floor while the key is on, so a default install knows ~624 commands’ subcommands, flags, and argument suggestions instead of the core tranche’s ninety-two (autosuggestions). Defaults to true - the file ships inside the package, so generosity costs no download and no network; the toggle is the kill switch, not the opt-in. An absent, unreadable, or invalid file answers the embedded floor whatever the key says, and the user’s own completions.toml overrides both tiers. Flips apply live.
autosuggestions_menu_enabled true The Ctrl+Space completion menu: an explicit-trigger candidate list over the tab’s current input - every history prefix match, path entry, PATH name, and curated subcommand/flag at once, where the ghost must settle for one choice. Up/Down navigate, Tab and Enter accept only while it shows (bare Tab stays the shell’s own completion key whenever no menu shows; at an ineligible prompt the chord forwards to the shell verbatim) (autosuggestions). false removes the menu surface exactly - the ghost is untouched. Flips apply live: a showing menu closes the moment the switch lands.
autosuggestions_menu_auto false The auto-popup opt-in for the completion menu: with the key on, an idle prompt whose typed segment collects two or more candidates pops the menu without the chord, closing again when narrowing leaves one or nothing and on every ineligibility (autosuggestions). Defaults to false - no surveyed peer ships auto-popup on; false is today exactly (the chord is the only opener). Applies live.
autosuggestions_delay_ms 0 The autosuggest idle delay, in milliseconds: a qualifying suggestion is withheld until the typed segment has been stable this long - so no ghost churns while you type fast, it appears once at the pause (200-300 suits that complaint; 0 is fish parity, today’s behavior). Any keystroke restarts the wait and dismisses a showing ghost instantly; Right/Alt+Right are unchanged the moment the ghost shows, and the knob changes when a suggestion is seen, never which one wins (autosuggestions). Applies live.
images_enabled true Inline images (images): OSC 1337 sequences - iTerm2’s imgcat in both its forms, wezterm imgcat, and forced-mode chafa -f iterm/timg/viu - decode in place and ride the grid like text, scrolling away with the output and reflowing with the window. PNG, JPEG, GIF, and WebP decode under strict size ceilings; oversized or malformed payloads render nothing, never half. Defaults to true (kitty and Ghostty ship images on); false makes the whole pipeline inert - the sequence stays parsed but nothing ever decodes or places. Sixel stays deferred, and inline=0 sequences render nothing either way. Applies live.
autosuggestions_aliases {} The user-declared alias map, hand-edited in the config file (the map is author-sized, not toggle-sized): alias → expansion, gc = "git checkout", re-targeting the specs and catalog completions at the expansion’s words - a mapped alias ghosts what its expansion ghosts (gc --dr ghosts git’s --dry-run, gc che ghosts ckout), with history still outranking always and silent over ssh. Authoritative for exactly what you declare: DropTerm never reads or parses your shell rc files and never runs anything in the session to discover aliases, and an accept still writes only the suggestion’s suffix - never the expansion unless you accepted ghost text that spelled it (autosuggestions). Chains resolve recursively (an alias mapping to another alias), depth-capped at 3 and cycle-safe. Applies live at the next typed prefix.
new_tab_after_current true New tabs land directly after the active tab. false appends at the end of the list (Guake’s ordering); duplicate-tab always lands after the active tab.
scrollback_lines 10000 Scrollback capacity per terminal. Applies to the next spawn - capacity is fixed when a terminal is created.

The toggles apply at their next natural trigger - the session toggle at the next save/restore cycle, the slide toggle at the next transition, the bell toggle at the next bell, placement at the next new tab.

The alias map is written by hand, one expansion per declared alias:

// ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/autosuggestions_aliases
{
    "gc": "git checkout",
}

Layer, focus, and panels

Key Values Default What it does
layer Overlay, Top Overlay Overlay sits above fullscreen windows; Top sits below them but behaves better with input methods.
keyboard_mode Exclusive, OnDemand Exclusive How the surface asks for keyboard focus. Exclusive always grabs the keyboard while shown; OnDemand is gentler but not auto-focused by every compositor. While hide_on_focus_loss is false the shown surface always runs OnDemand: an exclusive grab held by a stay-open surface would keep winning the keyboard back from every other input.
respect_panel true/false false true places the drop-down inside the compositor’s usable area instead of covering panels and docks, staying on its configured layer. Applies on the next show.
show_in_dock true/false false Whether the app keeps a presence in the dock and the window switcher. The invisible clipboard anchor that holds your copies across every hide is, on Wayland, always a mapped window — false makes it a layer surface no switcher or dock can list (summon by shortcut, the panel applet, or the CLI); true keeps it a normal window, so DropTerm shows in both. A flip applies immediately; whatever is on the clipboard at that moment is lost once.

The anchor itself never takes input or focus in either mode — it exists to keep a copied selection alive while the drop-down is hidden.

With an autohide panel, the hidden panel still reserves its handle strip, so a respecting drop-down sits a few pixels below the screen edge.

echo true > ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/respect_panel

Settings drawer width

settings_drawer_width (default unset) is the settings pane’s width in pixels, as last dragged. The drawer’s drag handle writes it on release; double-clicking the handle resets it to unset. Stored values are clamped at render into 344 px to half the surface, so a stale or hand-edited value can never outgrow the surface.

Profiles

Profiles are named presets of what a tab runs, managed on the settings drawer’s Profiles tab - or hand-edited in the profiles file, in this shape:

// ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/profiles
(
    {"name": "web-prod", "command": "ssh web-prod", "cwd": Some("/srv/web"), "color_scheme": Some("Dracula"), "font_size": Some(11), "scrollback_lines": Some(50000), "env": Some({"DROPTERM_PROFILE": "prod", "HTTP_PROXY": "http://bastion:3128"})},
    {"name": "top", "command": "htop"},
)
Field Default What it does Takes effect
name required The profile’s id - matched exactly, case-sensitively. -
command required The run line, split on whitespace like args. next spawn
cwd unset Working directory; existence-checked at the spawn, never rewritten. next spawn
color_scheme unset A built-in scheme name for this profile’s tabs - one name, independent of light/dark mode. live
font_size unset Font size in points for this profile’s tabs. live
scrollback_lines unset Scrollback capacity; capacity is fixed when the terminal is created. next spawn
env unset Extra environment variables, merged over the inherited environment at spawn. next spawn

The appearance fields resolve per field, never per profile: a set field wins, an unset field inherits the global value - and each decides on its own. A profile deleted while its tabs run degrades them to the global picks field by field, never rewritten, never an error. The window background follows the active tab’s resolution, so the fallback background moves with a tab switch.

env values are verbatim strings - no expansion or interpolation, ever; keys must be non-empty and free of =. A profile whose command is blank (a hand-edited file) degrades to a plain shell and carries none of the profile’s identity.

default_profile (default unset) names the profile plain new tabs launch: Ctrl+Shift+T, the tab bar +, the context menu’s plain New Tab, a bare remote new-tab, and the fresh-startup tab all run it. A name the list no longer carries quietly falls back to the plain shell. Profiles are also launched six other ways - new-tab --profile NAME, the context menus’ profile submenus and Switch Profile folders, and the tab bar +’s right-click dropdown. A Switch Profile pick respawns that tab in place under the chosen profile: the running command and scrollback are lost, while the slot, the activation, and a pinned rename stay.

Keybindings

Keybindings are customized in the drawer’s Keybindings tab or by hand. custom_key_binds (default empty - all defaults) maps one action id to one binding; the full action-id table lives in keybindings:

// ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/custom_key_binds
{
    "copy": (modifiers: [Ctrl, Alt], key: "C"),
    "activate_tab_3": (modifiers: [], key: "F2"),
}

A binding spells modifier names (Ctrl, Shift, Alt, Super) plus a key name - single letters case-insensitive, named keys spelled out (Tab, PageUp, F1, Space). Rules:

Parked and reserved keys

Two keys load and persist today but change no behavior:

The completions data file

One more file can live in the config directory beside the keys: completions.toml, the autosuggestions’ subcommand and flag table. The curated five commands (git, cargo, docker, systemctl, npm) are built in; this file extends the table with your own commands - a command you declare adds beside the built-ins, and a command you re-declare replaces its built-in entry whole (the one way to give a built-in’s entries descriptions). DropTerm ships a generated core tier to start from: data/completions.toml in the repository - ninety-two commands with menu descriptions, converted from withfig/autocomplete at a pinned version (MIT; the licensing audit in the seed audit, the conversion and provenance in the breadth record) - copy it to the config directory and edit from there.

# ~/.config/cosmic/io.github.l1br3_io.CosmicExtDropterm/v1/completions.toml

# One table per command. `name` is the command word the table
# answers for - through the alias map too, so a mapped alias
# re-targets here exactly as it does the built-ins.
[[commands]]
name = "gh"

# Subcommands complete the first argument seat (`gh pr` ghosts
# and lists them). Every entry is a `name` plus an optional
# `description` - the completions menu shows it beside the row,
# dimmed; the ghost ignores descriptions (it is text only).
[[commands.subcommands]]
name = "pr"
description = "Manage pull requests"

[[commands.subcommands]]
name = "pr-check"

# Long flags complete the flag seat from any argument position
# (`gh --rep` finishes `--repo`). A flag's other forms - short
# ones included - belong in its `aliases`, never as their own
# entries: short forms are recognized, never suggested.
[[commands.flags]]
name = "--repo"
description = "Select another repository"

The shape is recursive: a [[commands.subcommands]] entry is itself a command, taking the same keys and its own subcommands, flags, and positional args, so docker compose and everything under it are described exactly as docker is. A command or subcommand also takes aliases (its other names, co for checkout), hidden (suggested only when typed exactly), priority (a 0-100 ordering hint), and filter_strategy ("prefix", the default, or "fuzzy"). A flag entry takes aliases for its other forms - short forms included, so the table knows a typed -d is --detach, while short forms themselves are never suggested - plus persistent (the flag rides into every subcommand), exclusive_on (flags that hide it once typed), hidden, priority, and the args it consumes. An args entry takes optional, variadic (consumes every following token), command (the argument is itself a command word - the sudo shape), template ("filepaths" or "folders", a path-shaped argument), and literal suggestions (a list of name + description entries). Every key at every depth is optional with a default - an entry carrying none of them is the plain name-plus-description shape above - and the same rejection rule holds at every depth: an unknown key anywhere fails the whole file. The top level’s subcommands and flags complete as they always have; the nested tiers ride the table for the completion walker that reads them.

Rules the loader holds: