#scripting #dynamic-menu

bin+lib thqm

A simple HTTP server to serve a dynamic menu for your scripts over the network

5 releases

0.1.6 Mar 7, 2023
0.1.4 Feb 16, 2022
0.1.3 Feb 13, 2022
0.1.1 Feb 8, 2022
0.1.0 Feb 4, 2022

#255 in HTTP server

38 downloads per month

MIT license


JavaScript 4K SLoC // 0.0% comments Rust 746 SLoC // 0.0% comments


A simple HTTP server to serve a dynamic menu for your scripts over the network.

thqm takes its name from the arabic تحكم, pronounced tahakoom, meaning control.

thqm is a nifty little HTTP server. It dynamically generates a web page menu based on the provided stdin and outputs any selections to stdout. In a sense, it functions similarly to dmenu/rofi but as a HTTP servers.

This makes it very flexible and script friendly.

See the examples folder for some example scripts.

📦 Installation


To compile and install manually from this repo, you'll need rust installed.

To compile the binary:

$ git clone https://github.com/loiccoyle/thqm-rs
$ cd thqm-rs
$ cargo build --release

The compiled binary will be located at ./target/release/thqm. Just place this binary somewhere in your $PATH.


$ cargo install thqm

Arch linux (AUR)

Using your favourite AUR helper:

$ paru -S thqm

📋 Usage

CLI options

thqm has a few command line options, when in doubt see the --help.

$thqm --help
thqm 0.1.6
Loic Coyle <loic.coyle@hotmail.fr>
Control your scripts over the network.

thqm generates a web page menu from standard input and outputs client selections to standard output.

See https://github.com/loiccoyle/thqm.rs/tree/main/examples for full scripts.

Basic usage:
$ echo 'Option 1\nOption 2' | thqm -U |
    while IFS= read -r sel; do
      case $sel in
      'Option 1') echo 'hello';;
      'Option 2') echo 'world';;
      *) echo "$sel";;

    thqm [OPTIONS]

        --custom-input             Show custom input field.
    -h, --help                     Print help information
        --interface <interface>    Network interface to use to determine ip.
        --list-styles              List available page styles.
        --no-qrcode                Don't show the qrcode on the page.
        --no-shutdown              Don't allow the server to be shutdown from the page.
        --oneshot                  Shutdown server after first selection.
    -p, --port <port>              Set the server's port. [default: 8000]
    -P, --password <password>      Authentication password.
    -q, --show-qrcode              Show the qrcode in terminal.
    -s, --style <style>            Page style. [default: default] [possible values: base, default,
    -S, --separator <separator>    Entry separator. [default: \n]
        --save-qrcode <path>       Save the qrcode image to file.
    -t, --title <title>            Page title. [default: thqm]
    -u, --username <username>      Authentication username. [default: thqm]
    -U, --show-url                 Show the page url.
    -V, --version                  Print version information


thqm will generate a web page based on the provided stdin, the selected entry will be printed to stdout.

For this behaviour to actually be useful, we'll need to do a bit of scripting.

A typical script will look something like this:


# define the handler function, i.e. what each option should do.
handler() {
  while IFS= read -r event; do
    case "$event" in
    "Option 1")
      # handle Option 1
    "Option 2")
      # handle Option 2
      # pass through
      echo "$event"

printf "Option 1\nOption 2" | thqm "$@" | handler
# ^                                 ^      ^ Pass user selections to the handler
# │                                 └ Forward script's options to thqm
# └ Provide the options to thqm through stdin

See the examples folder for some example scripts.

🎨 Styling

thqm comes with a few included menu styles, see the styles folder, they will be extracted to $XDG_DATA_DIR/thqm when thqm is first run.

You can add your own by following the same style structure as those already included.

Note: thqm uses tera templates to generate the menu.


~514K SLoC