# Working Directory, the Old Konsole Way (OSC 31)

> Tell Konsole the shell's working directory, as Konsole once read it.

- **Sequence:** `OSC 31 ; Pt ST`
- **ECMA-48:** [§8.3.89 OSC – Operating System Command, p. 51](https://archive.org/details/ecma-48-5th-edition-june-1991/page/n64/mode/1up)
- **Specification:** [Session::SessionAttributes, Konsole's source](https://invent.kde.org/utilities/konsole/-/blob/a24c3d71be3684f24d030aa2dbe9bd723d985233/src/session/Session.h#L466-479)

`OSC 31 ; dir ST` once told Konsole the shell's working directory, so that
it could bookmark it and remember it when the session was saved, on systems
where it could not read the directory from the process itself. Konsole's
tips suggested putting `\e]31;\w\a` in bash's prompt. The tip is gone, and
so is the number: today's Konsole takes the working directory from
[OSC 7](https://control-codes.page/osc/cwd/index.html.md), which its source credits to VTE
([`Session.h`](https://invent.kde.org/utilities/konsole/-/blob/a24c3d71be3684f24d030aa2dbe9bd723d985233/src/session/Session.h#L470)). The old tip survives in
Konsole's translation files, among the obsolete strings.

Konsole, KDE's terminal, has a few OSC numbers of its own. It documents
none of them, so the definition is its source: the numbers are listed in
[`Session::SessionAttributes`](https://invent.kde.org/utilities/konsole/-/blob/a24c3d71be3684f24d030aa2dbe9bd723d985233/src/session/Session.h#L466-479), and acted on in `Session::setSessionAttribute`. They are
[OSC 30](https://control-codes.page/osc/konsole-tab-title/index.html.md), [OSC 32](https://control-codes.page/osc/konsole-tab-icon/index.html.md) and [OSC 34](https://control-codes.page/osc/konsole-tab-color/index.html.md), with a profile change under
[OSC 50](https://control-codes.page/osc/font/index.html.md), and once [OSC 31](https://control-codes.page/osc/konsole-cwd/index.html.md).

xterm sets 30 and 31 aside for Konsole and does nothing with either
([`misc.c`](https://github.com/ThomasDickey/xterm-snapshots/blob/xterm-411a/misc.c#L3489-L3490)). libghostty-vt has no Konsole code, and ignores it too.

## Support

| Terminal | Version | Support | Notes |
| --- | --- | --- | --- |
| VT220 | [manual](https://vt100.net/docs/vt220-rm/), 2nd ed., 1984 | No | OSC is not among the controls it recognizes ([§4.2](https://vt100.net/docs/vt220-rm/chapter4.html#S4.2)) |
| VT510 | [manual](https://vt100.net/docs/vt510-rm/), 1st ed., 1993 | No | ignores an OSC string ([chapter 4](https://vt100.net/docs/vt510-rm/chapter4.html)) |
| xterm | patch 412, [xterm-411a](https://github.com/ThomasDickey/xterm-snapshots/tree/xterm-411a) | No | the number is set aside for Konsole, unused |
| libghostty-vt | [83edd49](https://github.com/ghostty-org/ghostty/tree/83edd491e3024ae5e50393d62877b8897da1cccd) | No | ignored |
| Konsole | 26.11.70, [a24c3d71](https://invent.kde.org/utilities/konsole/-/tree/a24c3d71be3684f24d030aa2dbe9bd723d985233) | No | gone from `SessionAttributes`; it uses OSC 7 instead |
| ConEmu | build 230724, its [documentation](https://conemu.github.io/en/AnsiEscapeCodes.html) | No | not in its [ANSI escape codes](https://conemu.github.io/en/AnsiEscapeCodes.html) |

## Validation

### OSC31-1: Not a working directory

Input, one step per line:

```text
\e]31;/tmp\a
```

Expected screen:

```text
|___|
pwd ""
```

### OSC31-2: Nothing on screen

Input, one step per line:

```text
A
\e]31;/tmp\a
B
```

Expected screen:

```text
|AB_|
cursor 1,3
reply none
```

---

This is the Markdown version of <https://control-codes.page/osc/konsole-cwd/>. On that page every validation case runs live in libghostty-vt, the terminal emulation core of Ghostty, compiled to WebAssembly.

The validation cases are written in the notation described in <https://control-codes.page/notation/index.html.md>.
