Research: how famous terminals do profile settings — the canonical four in depth, the no-profile camp as contrast

Date: 2026-10-05 Question: How do the canonical “profile” terminals — Windows Terminal, iTerm2, GNOME Terminal, Konsole — implement profile settings (model, identity, storage, defaults, settings UI, default-profile semantics, live-apply), and what should DropTerm’s pending profile-settings module (SPEC.md:31, spec not yet written) copy or avoid?

Scope note: lean pass — the four canonical profile terminals in depth from their official docs, plus one-paragraph notes on kitty/Alacritty/WezTerm as the “no profiles” contrast. Terminal.app, Warp, Tilix, Tabby were descoped when the original 10-terminal background deep-dive was cancelled for taking too long. All sources fetched 2026-10-05; every claim below cites its primary source. Unverified claims are marked.

TL;DR

All four canonical terminals converge on the same core: a profile is a named bundle whose load-bearing fields are the command line and the starting directory, with appearance riding along in the same object. Konsole’s handbook literally defines profiles as a way to “quickly and easily automate the running of common commands,” exemplified by ssh into another machine, starting an irc session, and tail to watch a file — one-for-one DropTerm’s Profile { name, command, cwd } spawn-preset model. Windows Terminal’s minimal hand-written profile example is { commandline, name, icon, startingDirectory } and nothing else. Identity diverges: Windows Terminal and iTerm2 use GUIDs (both docs explain why — tracking profiles across renames and syncing), GNOME Terminal and Konsole use per-profile storage keys (UUID profile dirs / one file per profile in $XDG_DATA_HOME/konsole). None of the four use the display name as the id, but all four accept names in the places users type them. Two mechanisms recur everywhere: defaults inheritance (WT’s profiles.defaults block above the list; iTerm2 unspecified attributes inherit from the default profile or a named parent) and a guarded default profile (GNOME: the default cannot be deleted, only replaced; WT: defaultProfile is required, takes a GUID or a name, and backs every unqualified new tab — the same “default applies to all plain spawns” ruling DropTerm already made in profile-launch). The settings UI pattern is a flat sidebar list + a single edit pane with a row-arrow or kebab menu for Clone/Rename/Delete/Set-as-default, saved immediately (GNOME is explicit: “Changes to profile are saved immediately”, no Apply/OK). Live-apply is universally new-sessions-only for spawn fields — GNOME’s docs say to “open a new Terminal tab or window to see how the custom command executes.” The no-profile camp (kitty/Alacritty/WezTerm) answers the same need with composable single-config files plus launcher menus — WezTerm’s launch_menu (list of {label, args} shown in a launcher overlay) is the closest structural cousin to DropTerm’s planned newtab-button profile dropdown.

Findings

1. Windows Terminal — profiles as first-class JSON objects with GUID identity, defaults inheritance, and dynamic generators

All claims: learn.microsoft.com Windows Terminal docs.

2. iTerm2 — Preferences > Profiles with eight subsections; GUID identity; file-based “Dynamic Profiles” with parent inheritance

All claims: iterm2.com/documentation.

3. GNOME Terminal — profiles as settings collections in a Preferences sidebar; UUID-keyed storage; strictest default-profile guardrails

All claims: help.gnome.org/users/gnome-terminal/stable (unless marked).

4. Konsole — profiles are spawn presets; one INI-ish file per profile under $XDG_DATA_HOME/konsole

All claims: Konsole Handbook (KDE Gear 24.05), “Profiles” chapter, https://docs.kde.org/stable_kf6/en/konsole/konsole/profiles.html.

5. kitty, Alacritty, WezTerm — the no-profile camp

What DropTerm should take from this (for profile-settings, SPEC.md:31)

Module 4 is already specced in intent as “Settings-window Profiles page: list / add / edit / delete / reorder + the default-profile picker dropdown” (SPEC.md:31, row not yet written — line 98), on top of the shipped profile-model (Profile { name, command, cwd }, name-is-id, default_profile: Option<String>, dangling default resolves to plain shell). The findings above say:

Sources: all URLs above, fetched 2026-10-05. Repo citations: SPEC.md lines 31, 98, 457–460; SPEC-profile-model.md (accepted criteria 1–6, design decisions); docs/settings.md (current settings window).