A fast, lightweight and minimalistic Wayland terminal emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Daniel Eklöf 0e2219daa9 This is it! 1.0.0 2 years ago
completions completions: zsh: footclient: add -s,--server-socket 2 years ago
doc doc: footclient.1: add -s,--server-socket 2 years ago
scripts generate-alt-random-writes: reduce output size 2 years ago
subprojects fcft: update to 0.4.0 2 years ago
.gitignore gitignore: makepkg generated directories (pkg + src) 2 years ago
.gitlab-ci.yml ci: run unit tests 2 years ago
.gitmodules fcft: use fcft instead of local copy of font.c/font.h 2 years ago
LICENSE add license 2 years ago
PKGBUILD PKGBUILD/meson: bump version to 1.0.0 2 years ago
README.md search: map ctrl+shift+w to match to end of word, spaces only 2 years ago
async.c async: add async_write(), a write primitive to write to a NONBLOCK:ing FD 2 years ago
async.h async: add async_write(), a write primitive to write to a NONBLOCK:ing FD 2 years ago
base64.c base64: implement encode() 2 years ago
base64.h base64: implement encode() 2 years ago
client.c client: strncpy() size limit must be less than destination size 2 years ago
commands.c commands: scrollback: don't scrollback if mouse tracking is enabled 2 years ago
commands.h scrollback: initial support for mouse scrolling 2 years ago
config.c config: add 'server_socket_path' and set a default value 2 years ago
config.h config: add 'server_socket_path' and set a default value 2 years ago
csi.c csi: describe format of reply to tertiary DA 2 years ago
csi.h performance improvements 2 years ago
fdm.c tllist: is now an external "library", so use <> includes 2 years ago
fdm.h fdm: add fdm_event_add() and fdm_event_del() 2 years ago
foot.desktop desktop: clean up, remove unsupported entries 2 years ago
foot.info terminfo: add tab stop related entries, hts and tbc 2 years ago
footrc config: change default bright5 and bright 6 colors 2 years ago
generate-version.sh generate-version: redirect *both* stdout and stderr to /dev/null 2 years ago
grid.c grid: remove commented out code 2 years ago
grid.h search: wip: initial search matching 2 years ago
input.c input: discard canceled compose sequences 2 years ago
input.h input: input_repeat() takes a 'struct wayland' pointer 2 years ago
keymap.h keymap: add meta modifier mappings for keypad keys 2 years ago
log.c log: set syslog facility to LOG_DAEMON when run in server mode 2 years ago
log.h log: set syslog facility to LOG_DAEMON when run in server mode 2 years ago
main.c main: allow server socket path to be set on the command line 2 years ago
meson.build PKGBUILD/meson: bump version to 1.0.0 2 years ago
misc.c selection: break out isword() to a new file 2 years ago
misc.h selection: break out isword() to a new file 2 years ago
osc.c csi/ocs/vt: log unhandled/unrecognized sequences as debug messages 2 years ago
osc.h ocs: renamed parameter size -> required_size in osc_ensure_size() 2 years ago
render.c fcft: update to 0.3.0 2 years ago
render.h wayland: move reload_cursor_theme() and update_cursor_surface() to wayland 2 years ago
search.c search: match_to_end_of_word: reset end_col when done with a row 2 years ago
search.h search: wip: re-direct input while searching, and build a search buffer 2 years ago
selection.c selection: optimize \r\n -> \n when receiving clipboard data 2 years ago
selection.h selection: document the asynchronous behavior of text_from_{primary,clipboard} 2 years ago
server.c server: use socket-path from config 2 years ago
server.h server: implement a --server mode 2 years ago
shm.c fcft: include <fcft/fcft.h>, and use fcft/stride.h instead of local copy 2 years ago
shm.h shm: automatic buffer purging is now delayed one cycle 2 years ago
slave.c slave: restore signals before calling exec() 2 years ago
slave.h slave: set TERM environment variable in slave process 2 years ago
terminal.c term: determine cell width from the width of the space character 2 years ago
terminal.h fcft: include <fcft/fcft.h>, and use fcft/stride.h instead of local copy 2 years ago
tokenize.c slave: break out command line tokenizer 2 years ago
tokenize.h slave: break out command line tokenizer 2 years ago
vt.c vt: add commented out cases for 8-bit C1 control characters 2 years ago
vt.h Rename: vt_to_slave() -> term_to_slave() 2 years ago
wayland.c wayland: include more output (monitor) details in the log output 2 years ago
wayland.h wayland: include more output (monitor) details in the log output 2 years ago



foot is a fast Wayland terminal emulator.


  1. Features
  2. Non-features
  3. What does not work?
  4. Fonts
  5. Shortcuts
    1. Keyboard
    2. Mouse
  6. Server mode
  7. Requirements
    1. Running
    2. Building
  8. Installing
    1. Arch Linux
    2. Other


  • Fast (TODO insert benchmark results here)
  • Wayland native
  • DE agnostic
  • User configurable font fallback
  • Scrollback search
  • Color emoji support
  • "Server" mode (one master process, many windows)


This is a non-exhaustive list of things some people might consider being important features (i.e. "must-haves"), that are unlikely to ever be supported by foot.

  • Tabs
  • Graphical elements (menu, buttons etc)

What does not work?

This is a list of known, but probably not all, issues:

  • Unicode combining characters

    Examples: á, 👪🏼 (may not be displayed correctly in your browser/editor)

  • Reflow text on window resize

  • GNOME; might work, but without window decorations.

    Strictly speaking, foot is at fault here; all Wayland applications must be able to draw their own window decorations (but foot is not).

    However, most people want a uniform look and feel on their desktop, including the window decorations. For this reason, a Wayland application can request Server Side Decorations (SSD). GNOME will reply with a "I hear you, but sorry, I wont do that".


foot supports all fonts that can be loaded by freetype, including bitmap fonts and color emoji fonts.

Foot uses fontconfig to locate and configure the font(s) to use. Since fontconfig's fallback mechanism is imperfect, especially for monospace fonts (it doesn't prefer monospace fonts even though the requested font is one), foot allows you, the user, to configure the fallback fonts to use.

This also means you can configure each fallback font individually; you want that fallback font to use this size, and you want that other fallback font to be italic? No problem!

If a glyph cannot be found in any of the user configured fallback fonts, then fontconfig's list is used.


At the moment, all shortcuts are hard coded and cannot be changed. It is not possible to define new key bindings.


  • shift+page up/page down

    Scroll up/down in history

  • ctrl+shift+c

    Copy selected text to the clipboard

  • ctrl+shift+v

    Paste from clipboard

  • ctrl+shift+r

    Start a scrollback search

While doing a scrollback search, the following shortcuts are available:

  • ctrl+r

    Search backward for next match

  • ctrl+s

    Search forward for next match

  • ctrl+w

    Extend current selection (and thus the search criteria) to the end of the word, or the next word if currently at a word separating character.

  • ctrl+shiftw

    Same as ctrl+w, except that the only word separating characters are whitespace characters.

  • escape, ctrl+g

    Cancel the search

  • return

    Finish the search and copy the current match to the primary selection


  • left - single-click

    Drag to select; when released, the selected text is copied to the primary selection. Note that this feature is normally disabled whenever the client has enabled mouse tracking, but can be forced by holding shift.

  • left - double-click

    Selects the word (separated by spaces, period, comma, parenthesis etc) under the pointer. Hold ctrl to select everything under the pointer up to, and until, the next space characters.

  • left - triple-click

    Selects the entire row

  • middle

    Paste from primary selection

  • wheel

    Scroll up/down in history

Server mode

When run normally, foot is a single-window application; if you want another window, start another foot process.

However, foot can also be run in a server mode. In this mode, one process hosts multiple windows. Note that this is nothing like tabs. When first started in server mode, no windows are available.

You open new windows by running footclient. This is a small process that instructs the foot server to open a new terminal window. The client process remains running until the terminal window is closed. The exit value of the client process is that of the shell that was running in the terminal window.

The point of this mode is a) reduced memory footprint - all terminal windows will share fonts and glyph cache, and b) reduced startup time - loading fonts and populating the glyph cache takes time, but in server mode it only happens once.

The downside is a performance penalty; all windows' input and output are multiplexed in the same thread (but each window will have its own set of rendering threads). This means that if one window is very busy with, for example, producing output, then other windows will suffer.

And of course, should the server process crash, all windows will be gone.

Typical usage would be to start the server process (foot --server) when starting your Wayland compositor (i.e. logging in to your desktop), and then run footclient instead of foot whenever you want to launch a new terminal.



  • fontconfig
  • freetype
  • pixman
  • wayland (client and cursor libraries)
  • xkbcommon
  • tllist, unless built as a subproject
  • fcft, unless built as a subproject


In addition to the dev variant of the packages above, you need:

  • meson
  • ninja
  • wayland protocols
  • ncurses
  • scdoc


Arch Linux

Use makepkg to build the bundled PKGBUILD (run makepkg in the source root directory).

Note that it will do a profiling-guided build, and that this requires a running wayland session since it needs to run an intermediate build of foot.


Foot uses meson. If you are unfamiliar with it, the official tutorial might be a good starting point.

I also recommend taking a look at the bundled Arch PKGBUILD file, to see how it builds foot.