{"id":13496061,"url":"https://github.com/orhun/gpg-tui","last_synced_at":"2025-05-13T22:01:59.340Z","repository":{"id":39748028,"uuid":"324593513","full_name":"orhun/gpg-tui","owner":"orhun","description":"Manage your GnuPG keys with ease! 🔐","archived":false,"fork":false,"pushed_at":"2025-05-12T12:19:24.000Z","size":12598,"stargazers_count":1460,"open_issues_count":12,"forks_count":38,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-05-12T13:31:09.635Z","etag":null,"topics":["cli","gnupg","gpg","gpg-configuration","gpg-key","gpg-keys","gpg-signatures","gpg-tui","hacktoberfest","key-management","linux","openpgp","rust","terminal","tui","tui-app","tui-rs"],"latest_commit_sha":null,"homepage":"https://blog.orhun.dev/introducing-gpg-tui/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orhun.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"orhun","patreon":"orhunp","custom":["https://www.buymeacoffee.com/orhun"]}},"created_at":"2020-12-26T16:28:59.000Z","updated_at":"2025-05-12T12:19:22.000Z","dependencies_parsed_at":"2024-01-13T22:20:55.998Z","dependency_job_id":"38502781-ff8b-456d-bffb-746fa78907ab","html_url":"https://github.com/orhun/gpg-tui","commit_stats":{"total_commits":632,"total_committers":15,"mean_commits":42.13333333333333,"dds":0.3924050632911392,"last_synced_commit":"d05db1afbf72b72ed29fe20ae0ae5b1a1148a23c"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orhun%2Fgpg-tui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orhun%2Fgpg-tui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orhun%2Fgpg-tui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orhun%2Fgpg-tui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orhun","download_url":"https://codeload.github.com/orhun/gpg-tui/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253752656,"owners_count":21958752,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","gnupg","gpg","gpg-configuration","gpg-key","gpg-keys","gpg-signatures","gpg-tui","hacktoberfest","key-management","linux","openpgp","rust","terminal","tui","tui-app","tui-rs"],"created_at":"2024-07-31T19:01:41.661Z","updated_at":"2025-05-13T22:01:57.045Z","avatar_url":"https://github.com/orhun.png","language":"Rust","readme":"[![Logo](assets/logo.jpg)](https://github.com/orhun/gpg-tui)\n\n[![GitHub Release](https://img.shields.io/github/v/release/orhun/gpg-tui?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=GitHub\u0026logoColor=white)](https://github.com/orhun/gpg-tui/releases)\n[![Crate Release](https://img.shields.io/crates/v/gpg-tui?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=Rust\u0026logoColor=white)](https://crates.io/crates/gpg-tui/)\n[![Coverage](https://img.shields.io/codecov/c/gh/orhun/gpg-tui?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=Codecov\u0026logoColor=white)](https://codecov.io/gh/orhun/gpg-tui)\n[![Continuous Integration](https://img.shields.io/github/actions/workflow/status/orhun/gpg-tui/ci.yml?branch=master\u0026style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=GitHub%20Actions\u0026logoColor=white)](https://github.com/orhun/gpg-tui/actions?query=workflow%3A%22Continuous+Integration%22)\n[![Continuous Deployment](https://img.shields.io/github/actions/workflow/status/orhun/gpg-tui/cd.yml?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=GitHub%20Actions\u0026logoColor=white\u0026label=deploy)](https://github.com/orhun/gpg-tui/actions?query=workflow%3A%22Continuous+Deployment%22)\n[![Docker Builds](https://img.shields.io/github/actions/workflow/status/orhun/gpg-tui/docker.yml?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026label=docker\u0026logo=Docker\u0026logoColor=white)](https://hub.docker.com/r/orhunp/gpg-tui)\n[![Documentation](https://img.shields.io/docsrs/gpg-tui?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=Rust\u0026logoColor=white)](https://docs.rs/gpg-tui/)\n\n## About\n\n**gpg-tui** is a [Terminal User Interface](https://en.wikipedia.org/wiki/Text-based_user_interface) for [GnuPG](https://gnupg.org/).\n\nIt aims to ease the key management operations such as listing/exporting/signing by providing an interface along with the command-line fallback for more complex operations. It is not trying to be a full-fledged interface for _all_ the features that [gpg](https://linux.die.net/man/1/gpg) provides but it tries to bring a more interactive approach to key management.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDemo\u003c/b\u003e\u003c/summary\u003e\n\n![](demo/gpg-tui-showcase.gif)\n\n\u003cpre\u003e\n\u003cb\u003egpg-tui\u003c/b\u003e --style \u003cspan style=\"color: #036A9BFF\"\u003e\u003ci\u003ecolored\u003c/i\u003e\u003c/span\u003e --splash --homedir \u003cspan style=\"color: #036A9BFF\"\u003e\u003ci\u003e/etc/pacman.d/gnupg\u003c/i\u003e\u003c/span\u003e\n\u003c/pre\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n\n\u003c!-- vim-markdown-toc GFM --\u003e\n\n* [Requirements](#requirements)\n* [Installation](#installation)\n\t* [Cargo](#cargo)\n\t* [Arch Linux](#arch-linux)\n\t\t* [Community](#community)\n\t\t* [AUR](#aur)\n\t* [Alpine Linux](#alpine-linux)\n\t* [Gentoo](#gentoo)\n\t* [Homebrew](#homebrew)\n\t* [Docker](#docker)\n\t\t* [Docker Hub](#docker-hub)\n\t\t* [Using the Dockerfile](#using-the-dockerfile)\n\t* [FreeBSD](#freebsd)\n\t\t* [Building from source](#building-from-source)\n\t\t* [Binary releases](#binary-releases)\n\t* [NetBSD](#netbsd)\n\t\t* [Install using the package manager](#install-using-the-package-manager)\n\t\t* [Building from source](#building-from-source-1)\n\t* [Manually](#manually)\n\t\t* [Building from source](#building-from-source-2)\n\t\t* [Binary releases](#binary-releases-1)\n* [Usage](#usage)\n* [Configuration](#configuration)\n* [Key Bindings](#key-bindings)\n\t* [User Interface](#user-interface)\n\t* [Key Management](#key-management)\n\t* [Customization](#customization)\n* [Approach](#approach)\n\t* [Detail Levels](#detail-levels)\n\t* [Key Information](#key-information)\n\t* [User Information](#user-information)\n* [Features](#features)\n\t* [User Interface](#user-interface-1)\n\t\t* [Scrolling](#scrolling)\n\t\t* [Options Menu](#options-menu)\n\t\t* [Copy / Paste](#copy--paste)\n\t\t* [Selection Mode](#selection-mode)\n\t\t* [Detailed View](#detailed-view)\n\t\t* [Search](#search)\n\t\t* [File explorer](#file-explorer)\n\t\t* [Show logs](#show-logs)\n\t\t* [Running commands](#running-commands)\n\t* [Key Management](#key-management-1)\n\t\t* [List](#list)\n\t\t* [Export](#export)\n\t\t* [Sign](#sign)\n\t\t* [Edit](#edit)\n\t\t* [Import/Receive](#importreceive)\n\t\t* [Send](#send)\n\t\t* [Generate](#generate)\n\t\t* [Delete](#delete)\n\t\t* [Refresh](#refresh)\n\t* [Styling](#styling)\n\t\t* [Colors](#colors)\n\t\t* [Splash screen](#splash-screen)\n* [Roadmap](#roadmap)\n\t* [Platforms](#platforms)\n\t* [Packaging](#packaging)\n\t* [Command-Line Fallback](#command-line-fallback)\n\t* [Key Management Only](#key-management-only)\n* [Resources](#resources)\n\t* [About the project](#about-the-project)\n\t* [External links](#external-links)\n\t* [In the media](#in-the-media)\n* [Contact](#contact)\n* [Funding](#funding)\n* [License](#license)\n* [Copyright](#copyright)\n\n\u003c!-- vim-markdown-toc --\u003e\n\n\u003c/details\u003e\n\n## Requirements\n\n- [Rust](https://www.rust-lang.org/): `\u003e=1.70.0`\n- Core dependencies: `gnupg`, `gpgme\u003e=1.12.0`, `libgpg-error`\n- Other dependencies: `libxcb`\n\nPleases note that the name of these dependencies (packages) might change depending on the distribution/platform.([*](https://github.com/orhun/gpg-tui/issues/10))\n\nFor installing these dependencies:\n\n- on Arch Linux, run `pacman -S gpgme libx11`\n- on Debian/Ubuntu, run `apt-get install libgpgme-dev libx11-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev`\n- on Fedora, run `dnf install gpgme-devel libX11-devel`\n- on Void Linux, run `xbps-install -S gpgme-devel libxcb-devel libgpg-error-devel gnupg`\n\n## Installation\n\n\u003cdetails\u003e\n  \u003csummary\u003ePackaging status\u003c/summary\u003e\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/gpg-tui.svg)](https://repology.org/project/gpg-tui/versions)\n\n\u003c/details\u003e\n\n### Cargo\n\n**gpg-tui** is available on [crates.io](https://crates.io/crates/gpg-tui/):\n\n```sh\ncargo install gpg-tui\n```\n\n### Arch Linux\n\n#### Community\n\n**gpg-tui** can be installed from the [community repository](https://archlinux.org/packages/community/x86_64/gpg-tui/) using [Pacman](https://wiki.archlinux.org/title/Pacman):\n\n```sh\npacman -S gpg-tui\n```\n\n#### AUR\n\n**gpg-tui** is also available on [AUR](https://aur.archlinux.org/packages/?O=0\u0026SeB=b\u0026K=gpg-tui\u0026outdated=\u0026SB=n\u0026SO=a\u0026PP=50\u0026do_Search=Go) and it can be installed with an [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers):\n\n```sh\nparu -S gpg-tui-git\n```\n\nOr if you prefer, you can clone the [AUR packages](https://aur.archlinux.org/packages/?O=0\u0026SeB=b\u0026K=gpg-tui\u0026outdated=\u0026SB=n\u0026SO=a\u0026PP=50\u0026do_Search=Go) and compile them with [makepkg](https://wiki.archlinux.org/index.php/Makepkg):\n\n```sh\n# clone the AUR repository\ngit clone https://aur.archlinux.org/gpg-tui-git.git \u0026\u0026 cd gpg-tui-git/\n\n# build the package\nmakepkg -si\n```\n\n### Alpine Linux\n\n`gpg-tui` is available for [Alpine Edge](https://pkgs.alpinelinux.org/packages?name=gpg-tui\u0026branch=edge). It can be installed via [apk](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper) after enabling the [community repository](https://wiki.alpinelinux.org/wiki/Repositories).\n\n```sh\napk add gpg-tui\n```\n\n### Gentoo\n\nAvailable in [dm9pZCAq overlay](https://github.com/gentoo-mirror/dm9pZCAq)\n\n```sh\neselect repository enable dm9pZCAq\nemerge --sync dm9pZCAq\nemerge app-crypt/gpg-tui::dm9pZCAq\n```\n\n### Homebrew\n\nTo install the [Homebrew package](https://formulae.brew.sh/formula/gpg-tui), run:\n\n```sh\nbrew install gpg-tui\n```\n\nTo update, run:\n\n```sh\nbrew upgrade gpg-tui\n```\n\n### Docker\n\n#### Docker Hub\n\nSee available [tags](https://hub.docker.com/r/orhunp/gpg-tui/tags).\n\n```sh\ndocker pull orhunp/gpg-tui:[tag]\n```\n\nYou can also use the following command for a quick launch:\n\n```sh\ndocker run --rm -it -v \"$HOME/.gnupg\":/app/.gnupg --user 1000:1000 orhunp/gpg-tui --homedir /app/.gnupg\n```\n\n#### Using the Dockerfile\n\n```sh\n# clone the repository\ngit clone https://github.com/orhun/gpg-tui.git \u0026\u0026 cd gpg-tui/\n\n# build the image\ndocker build -t gpg-tui .\n\n# run the container\ndocker run -it gpg-tui\n```\n\n### FreeBSD\n\nAll required dependencies are automatically fetched and installed independently of the installation method chosen.\n\n#### Building from source\n\n```sh\n# using a port\ncd /usr/ports/security/gpg-tui\nmake install\n```\n\n```sh\n# alternative method using portmaster\nportmaster security/gpg-tui\n```\n\n#### Binary releases\n\n```sh\n# update repository catalogue (if outdated)\npkg update\n\n# fetch and install the package\npkg install gpg-tui\n```\n\n### NetBSD\n\n**gpg-tui** is available from the main [pkgsrc branch](https://pkgsrc.se/security/gpg-tui).\n\n#### Install using the package manager\n\n```sh\npkgin install gpg-tui\n```\n\n#### Building from source\n\n```sh\ncd /usr/pkgsrc/security/gpg-tui\nmake install\n```\n\n### Manually\n\n#### Building from source\n\n```sh\n# clone the repository\ngit clone https://github.com/orhun/gpg-tui.git \u0026\u0026 cd gpg-tui/\n\n# build and install\ncargo install --root \"$HOME/.cargo\" --path .\n```\n\n#### Binary releases\n\nSee available [releases](https://github.com/orhun/gpg-tui/releases) that are automated by [Continuous Deployment](.github/workflows/cd.yml) workflow.\n\n## Usage\n\n```\ngpg-tui [OPTIONS]\n```\n\n```\nOptions:\n  -a, --armor                 Enables ASCII armored output\n      --splash                Shows the splash screen on startup\n      --config \u003cpath\u003e         Sets the configuration file [env: GPG_TUI_CONFIG=]\n      --homedir \u003cdir\u003e         Sets the GnuPG home directory [env: GNUPGHOME=]\n  -o, --outdir \u003cdir\u003e          Sets the output directory [env: OUTDIR=]\n      --outfile \u003cpath\u003e        Sets the template for the output file name [env: OUTFILE=] [default: {type}_{query}.{ext}]\n  -d, --default-key \u003ckey\u003e     Sets the default key to sign with [env: DEFAULT_KEY=]\n  -t, --tick-rate \u003cms\u003e        Sets the tick rate of the terminal [env: TICK_RATE=] [default: 250]\n  -c, --color \u003ccolor\u003e         Sets the accent color of the terminal [env: COLOR=] [default: gray]\n  -s, --style \u003cstyle\u003e         Sets the style of the terminal [env: STYLE=] [default: colored] [possible values: plain, colored]\n  -f, --file-explorer \u003capp\u003e   Sets the utility for file selection [env: FILE_EXPLORER=] [default: xplr]\n      --detail-level \u003clevel\u003e  Sets the detail level for the keys [env: DETAIL_LEVEL=] [default: minimum] [possible values: minimum, standard, full]\n      --log-file \u003cpath\u003e       Sets the file to save the logs [env: LOG_FILE=]\n      --select \u003coption\u003e       Enables the selection mode [env: SELECT=] [possible values: row1, row2, key, key-id, key-fingerprint, user-id]\n  -h, --help                  Print help (see more with '--help')\n  -V, --version               Print version\n```\n\n## Configuration\n\nIt is possible to override the command line arguments with a configuration file.\n\nSee [gpg-tui.toml](config/gpg-tui.toml) for the default configuration values.\n\nThe configuration file can be specified via `--config` argument or `GPG_TUI_CONFIG` environment variable. Also, it can be placed to a location where **gpg-tui** looks for:\n\n* `\u003cconfig_dir\u003e` `/` `gpg-tui.toml`\n* `\u003cconfig_dir\u003e` `/` `gpg-tui/gpg-tui.toml`\n* `\u003cconfig_dir\u003e` `/` `gpg-tui/config`\n\n`\u003cconfig_dir\u003e` depends on the platform as shown in the following table:\n\n|Platform | Value                                 | Example                          |\n| ------- | ------------------------------------- | -------------------------------- |\n| Linux   | `$XDG_CONFIG_HOME` or `$HOME`/.config | /home/alice/.config              |\n| macOS   | `$HOME`/Library/Application Support   | /Users/Alice/Library/Application Support |\n| Windows | `{FOLDERID_RoamingAppData}`           | C:\\Users\\Alice\\AppData\\Roaming   |\n\n## Key Bindings\n\n### User Interface\n\n| Key Binding          | Action                       |\n| -------------------- | ---------------------------- |\n| `?`                  | show help                    |\n| `o,space,enter`      | show options                 |\n| `hjkl,arrows,pgkeys` | navigate                     |\n| `n`                  | switch to normal mode        |\n| `v`                  | switch to visual mode        |\n| `c`                  | switch to copy mode          |\n| `p,C-v`              | paste from clipboard         |\n| `a`                  | toggle armored output        |\n| `1,2,3`              | set detail level             |\n| `t,tab`              | toggle detail (all/selected) |\n| `` ` ``              | toggle table margin          |\n| `m`                  | toggle table size            |\n| `C-s`                | toggle style                 |\n| `/`                  | search                       |\n| `:`                  | run command                  |\n| `C-l,f2`             | show logs                    |\n| `r,f5`               | refresh application          |\n| `q,C-c/d,escape`     | quit application             |\n\n### Key Management\n\n| Key Binding   | Action        |\n| ------------- | ------------- |\n| `x`           | export key    |\n| `s`           | sign key      |\n| `e`           | edit key      |\n| `i`           | import key(s) |\n| `f`           | receive key   |\n| `u`           | send key      |\n| `g`           | generate key  |\n| `d,backspace` | delete key    |\n| `C-r`         | refresh keys  |\n\n\n### Customization\n\nKey bindings can be overridden/customized via using `general.key_bindings` setting in the [configuration file](#configuration). For example,\n\n```toml\nkey_bindings = [\n  { keys = [ \"?\", \"h\", \"f1\" ], command = \":help\" },\n  { keys = [ \"C-s\", \"s\" ], command = \":style colored\" },\n  { keys = [ \"C-d\", \"C-c\", \"q\" ], command = \":quit\" },\n]\n```\n\n`keys` array contains the keycodes which is either a single key (e.g. `a`), a key combination (e.g. Control-C: `C-c`, Alt-C: `A-c`), or a special key (e.g. `Backspace`, `Enter`). Available key codes can be found in the [`crossterm` documentation](https://docs.rs/crossterm/latest/crossterm/event/enum.KeyCode.html).\n\nAlso, see the [list of commands](./COMMANDS.md).\n\n## Approach\n\nAvailable keys in the keyring (which can be specified via `--homedir` argument) are showed on a table. This table consists of 2 columns which are [key information](#key-information) and [user information](#user-information).\n\nThe level of detail that an individual table row shows is determined by [detail levels](#detail-levels).\n\n### Detail Levels\n\n1. **Minimum**: shows only the primary key and user ID.\n\n```\n[sc--] rsa3072/B14085A20355B74DE0CE0FA1E19F76D037BD65B6  │  [u] Example Key \u003cexample@key\u003e\n```\n\n2. **Standard**: shows all the subkeys and user IDs.\n\n```\n[sc--] rsa3072/B14085A20355B74DE0CE0FA1E19F76D037BD65B6  │  [u] Example Key \u003cexample@key\u003e\n|      └─(2021-05-14)                                    │   └─[u] Other User ID \u003cexample@key\u003e\n[--e-] rsa3072/E56CAC142AE5A979BEECB00FB4F68595CAD4E7E5  │\n       └─(2021-05-14)\n```\n\n3. **Full**: shows signatures and notations.\n\n```\n[sc--] rsa3072/B14085A20355B74DE0CE0FA1E19F76D037BD65B6  │  [u] Example Key \u003cexample@key\u003e\n|      └─(2021-05-14)                                    │   │  └─[13] selfsig (2021-05-16)\n[--e-] rsa3072/E56CAC142AE5A979BEECB00FB4F68595CAD4E7E5  │   │     └─[h] test@notation=xyz\n       └─(2021-05-14)                                    |   └─[u] Other User ID \u003cexample@key\u003e\n                                                                   ├─[13] selfsig (2021-05-16)\n                                                                   └─[10] 84C39331F6F85326 Other Signer Key \u003cexample@signer\u003e (2021-05-16)\n```\n\nDetail level can be set using `--detail-level` argument or `detail_level` entry in the [configuration file](#configuration).\n\n### Key Information\n\nAn example table entry for the detail level `full` (which includes subkeys) is explained via reference numbers below.\n\n\u003cpre\u003e\n[sc--]\u003cb\u003e⁰\u003c/b\u003e  rsa3072\u003cb\u003e¹\u003c/b\u003e/B14085A20355B74DE0CE0FA1E19F76D037BD65B6\u003cb\u003e²\u003c/b\u003e\n|\u003cb\u003e³\u003c/b\u003e       └─(2021-05-14)\u003cb\u003e⁴\u003c/b\u003e\n[--e-]\u003cb\u003e⁰\u003c/b\u003e*\u003cb\u003e⁶\u003c/b\u003ersa3072\u003cb\u003e¹\u003c/b\u003e/E56CAC142AE5A979BEECB00FB4F68595CAD4E7E5\u003cb\u003e²\u003c/b\u003e\n         └─(2021-05-14) -\u003e (2021-05-16)\u003cb\u003e⁴\u003c/b\u003e [exp]\u003cb\u003e⁵\u003c/b\u003e\n\u003c/pre\u003e\n\n**0**: Key flags. Determines what the key can do.\n\n* `s`: sign\n* `c`: certify\n* `e`: encrypt\n* `a`: authenticate\n\n**1**: Algorithm of the key.\n\n**2**: Fingerprint of the key.\n\n**3**: Indicates that the next key is a subkey.\n\n**4**: Time information of the key:\n\n* creation time (`Y-m-d`)\n* expiration time (`Y-m-d`)\n\n**5**: Is the key one of the following?\n\n* `[exp]`: expired\n* `[rev]`: revoked\n* `[d]`: disabled\n* `[i]`: invalid\n* `[q]`: qualified\n\n**6**: Star symbol (`*`) is shown after key flags if the key is selected as the default signing key.\n\n### User Information\n\nAn example table entry for the detail level `full` (which includes other user IDs, signatures and notations) is explained via reference numbers below.\n\n\u003cpre\u003e\n[u]\u003cb\u003e⁰\u003c/b\u003e Test Key \u0026lt;test@test\u0026gt;\u003cb\u003e¹\u003c/b\u003e\n │\u003cb\u003e²\u003c/b\u003e  └─[13]\u003cb\u003e³\u003c/b\u003e selfsig\u003cb\u003e⁴\u003c/b\u003e (2021-05-16)\u003cb\u003e⁶\u003c/b\u003e\n │             └─[h]\u003cb\u003e⁹\u003c/b\u003e test@notation=xyz\u003cb\u003e⁸\u003c/b\u003e\n └─[u]\u003cb\u003e⁰\u003c/b\u003e Test Key2 \u0026lt;test2@test2\u0026gt;\u003cb\u003e¹\u003c/b\u003e\n        ├─[13]\u003cb\u003e³\u003c/b\u003e selfsig\u003cb\u003e⁴\u003c/b\u003e (2021-05-16)\u003cb\u003e⁶\u003c/b\u003e\n        └─[10]\u003cb\u003e³\u003c/b\u003e 84C39331F6F85326 Test Key 2 \u0026lt;test2@example.com\u0026gt;\u003cb\u003e⁵\u003c/b\u003e (2021-05-16)\u003cb\u003e⁶\u003c/b\u003e [!x]\u003cb\u003e⁷\u003c/b\u003e\n\u003c/pre\u003e\n\n**0**: Validity of the user.\n\n* `[q]`: undefined\n* `[n]`: never\n* `[m]`: marginal\n* `[f]`: full\n* `[u]`: ultimate\n* `[?]`: unknown\n\n**1**: User ID. (`name` + `email`)\n\n**2**: Indicates the next user ID.\n\n**3**: Certification level of the signature.\n\n* `[10]`: no indication\n* `[11]`: personal belief but no verification\n* `[12]`: casual verification\n* `[13]`: extensive verification\n\n**4**: Indicates that this is a self signature, whereby the users' own private key was used to sign their public key.\n\n**5**: Key and user ID of the signer. (`key` + `name` + `email`)\n\n**6**: Time information of the signature.\n\n* creation time (`Y-m-d`)\n* expiration time (`Y-m-d`)\n\n**7**: Is the signature one of the following?\n\n* `[exp]`: expired\n* `[rev]`: revoked\n* `[i]`: invalid\n* `[!x]`: non-exportable\n\n**8**: Notation data.\n\n**9**: Flags associated with the notation data.\n\n* `[h]`: the notation data is in human readable form\n* `[!]`: the notation data is critical\n\n## Features\n\nPress `?` while running the terminal interface to see information about key bindings and GnuPG configuration.\n\n![](demo/gpg-tui-help_menu.gif)\n\n### User Interface\n\n#### Scrolling\n\nUse arrow or `hjkl` keys to scroll and navigate through lists/menus/tabs. Additionally, you can use `Ctrl-Up/Down` combinations or `PageUp`/`PageDown` keys to scroll to the top/bottom.\n\n![](demo/gpg-tui-scrolling.gif)\n\nIf rows are not fitting on the terminal interface, use `Alt` + arrow/`hjkl` keys to individually scroll them.\n\n![](demo/gpg-tui-scrolling_rows.gif)\n\n![](demo/gpg-tui-scrolling_rows2.gif)\n\n#### Options Menu\n\nMost of the actions can be performed using the options menu. Simply press `Enter` and select what you want to do.\n\n![](demo/gpg-tui-options_menu.gif)\n\n#### Copy / Paste\n\nThere's a `copy` mode for making it easier to copy particular values to the clipboard. To use this mode, press `c` followed by one of the key bindings:\n\n* `x`: Copy the exported key\n* `i`: Copy the key id\n* `f`: Copy the key fingerprint\n* `u`: Copy the user id\n* `1,2`: Copy the content of the row\n\nThen the value will be copied to the clipboard and the application mode will be reverted to `normal`.\n\nPress `ESC` or `n` to cancel and switch to `normal` mode during this operation.\n\n![](demo/gpg-tui-copy_mode.gif)\n\nInstead of copying values with `copy` mode, you can use the `visual` mode which disables the mouse capture. It means that you can select/highlight the text on the interface and copy as you do normally.\n\n`visual` mode can be used for other purposes such as scrolling via mouse.\n\n![](demo/gpg-tui-visual_mode.gif)\n\n#### Selection Mode\n\nIn the selection mode, key bindings that are responsible for showing the options menu (e.g. `enter`) are used for exiting the user interface and printing out the selection to the standard output. This is useful when you want to use **gpg-tui** in conjunction with shell commands/other tools.\n\nFor switching to the selection mode, use the `--select` argument as follows:\n\n```sh\ngpg-tui --select \u003coption\u003e\n```\n\n`\u003coption\u003e` might be one of the following:\n\n- `key`: Exported key\n- `key-id`: Key ID\n- `key-fingerprint`: Key fingerprint\n- `user-id`: User ID\n- `row\u003cn\u003e`: Contents of the nth row\n\n![](demo/gpg-tui-selection_mode.gif)\n\nFor example, you can use the following shell function to encrypt a file for the selected recipient (key ID):\n\n```sh\nfunction encrypt() { gpg -e -r $(gpg-tui --select key-id) \"$@\"; }\n```\n\n#### Detailed View\n\nPress `Tab` to toggle the [detail level](#detail-levels) for the selected entry in the list. Number keys (e.g. `1`, `2`, `3`) can be also used to set a specific level.\n\n![](demo/gpg-tui-detailed_view.gif)\n\nPress `t` to toggle the detail level for all entries in the list.\n\n![](demo/gpg-tui-detailed_view2.gif)\n\nThere are couple a of different modes for the size of the tables which changes the details that each entry shows. You can use the `m` key for switching to different modes.\n\n![](demo/gpg-tui-detailed_view3.gif)\n\n#### Search\n\nPress `/` to search for a value from the currently shown table.\n\n![](demo/gpg-tui-search.gif)\n\n#### File explorer\n\nSome of the key management operations such as [importing keys](#importreceive) _optionally_ use a file explorer utility. As default, **gpg-tui** uses [xplr](https://github.com/sayanarijit/xplr) if the `xplr` binary is [installed](https://github.com/sayanarijit/xplr/wiki/Quickstart) on the system. To change which utility is going to be used, `--file-explorer` argument can be used or it can be specified in the [configuration file](#configuration).\n\n```sh\ngpg-tui --file-explorer \"fzf --color dark\"\n```\n\n#### Show logs\n\nTo view the log messages, press `ctrl-l`. It will bring up a pane in the TUI for analyzing the logs:\n\n![](demo/gpg-tui-show_logs.gif)\n\nThis pane consists of two parts. Left is the target selector and on the right side the logging messages view scrolling up.\n\nThe target selector controls:\n\n- Capturing of log messages by the logger.\n- Selection of levels for display in the logging message view.\n\nThe two columns have the following meaning:\n\n- Code `EWIDT`: `E` stands for Error, `W` for Warn, and similarly Info, Debug and Trace.\n  - Inverted characters (EWIDT) are enabled log levels in the view.\n  - Normal characters show enabled capturing of a log level per target.\n  - If any of EWIDT are not shown, then the respective log level is not captured.\n\nThis logger pane has the following key bindings and they are only activated while the logs are being shown:\n\n| Key        | Action                                                         |\n| ---------- | -------------------------------------------------------------- |\n| `h`        | toggles target selector widget hidden/visible                  |\n| `f`        | toggle focus on the selected target only                       |\n| `up`       | select previous target in target selector widget               |\n| `down`     | select next target in target selector widget                   |\n| `left`     | reduce SHOWN (!) log messages by one level                     |\n| `right`    | increase SHOWN (!) log messages by one level                   |\n| `-`        | reduce CAPTURED (!) log messages by one level                  |\n| `+`        | increase CAPTURED (!) log messages by one level                |\n| `pageup`   | enter Page Mode and scroll approx. half page up in log history |\n| `pagedown` | only in page mode: scroll 10 events down in log history        |\n| `escape`   | exit page mode and go back to scrolling mode                   |\n| `space`    | toggles hiding of targets, which have logfilter set to off     |\n\nFor saving the logs to a file, you can use the `--log-file` argument:\n\n```sh\ngpg-tui --log-file gpg-tui.log\n```\n\n`RUST_LOG` environment variable can be used to set the log level accordingly.\n\n```sh\nRUST_LOG=debug gpg-tui\n```\n\n#### Running commands\n\nEvery operation on the terminal interface is handled implicitly by the application-specific commands. So it's possible to do certain things by switching to command mode with pressing `:` and running commands. (similar to Vim)\n\nFor example,\n\n* `:list pub` -\u003e list public keys\n* `:set armor true` -\u003e enable armored output\n\nA full list of commands can be found [here.](COMMANDS.md)\n\n![](demo/gpg-tui-running_commands.gif)\n\nAlso you can switch between command mode and search by pressing `Tab`.\n\n![](demo/gpg-tui-switch_search.gif)\n\n### Key Management\n\n#### List\n\nAvailable keys in the keyring are listed on a table as default. They can be [scrolled](#scrolling) or the listing type (public/secret keys) can be changed by changing the tab via arrow keys.\n\nSee the [approach](#approach) section for more information about the meaning of the table rows.\n\n![](demo/gpg-tui-list_keys.gif)\n\n#### Export\n\nPress `x` to export the selected key to a file. The default output directory is `$GNUPGHOME/out` and can be changed by either using `--homedir` or `--outdir` argument.\n\nAdditionally, you can enable/disable armored output by pressing `a`.\n\n![](demo/gpg-tui-export_key.gif)\n\nAlso, you can export the secret subkeys by using the options menu:\n\n![](demo/gpg-tui-export_subkeys.gif)\n\n#### Sign\n\nPress `s` to sign the selected key with the default secret key. This key can be specified with `--default-key` argument or using the options menu.\n\nThis feature uses `gpg` fallback and runs `gpg --sign-key` command.\n\n![](demo/gpg-tui-sign_key.gif)\n\n#### Edit\n\nPress `e` to edit the selected key.\n\nThis feature uses `gpg` fallback and runs `gpg --edit-key` command. It presents a menu that provides a list of options to change the key details. See the [edit-key](https://www.gnupg.org/gph/en/manual/r899.html) documentation for more information.\n\n![](demo/gpg-tui-edit_key.gif)\n\n#### Import/Receive\n\nImport operation uses a [file explorer](#file-explorer) for selecting the key(s) to import. Press `i` to launch the file explorer (defaults to `xplr`), and select the key file(s) to import:\n\n![](demo/gpg-tui-import_key_xplr.gif)\n\nIf a file explorer is not specified or installed, import operation is done by using the `:import` command. So press `i` to switch to command mode (which will automatically add the import command) and then give it your file(s) to import.\n\n![](demo/gpg-tui-import_key.gif)\n\nYou can also import keys from clipboard using `:import-clipboard` command or the options menu.\n\n![](demo/gpg-tui-import_key_clipboard.gif)\n\nSimilar to import, receive operation is also done by using a command which is `:receive`. So press `f` (for **f**etching keys from a keyserver) and give it your key ID(s).\n\nThis feature uses `gpg` fallback and runs `gpg --receive-keys` command.\n\n![](demo/gpg-tui-receive_key.gif)\n\n#### Send\n\nPress `u` (for **u**ploading to the keyserver) followed by `y` (for confirmation) to send the selected key to the default keyserver.\n\n![](demo/gpg-tui-send_key.gif)\n\n#### Generate\n\nPress `g` to generate a new key pair.\n\nThis feature uses `gpg` fallback and runs `gpg --full-generate-key` command. It presents dialogs for all of the generation options.\n\n![](demo/gpg-tui-generate_key.gif)\n\n#### Delete\n\nPress `Backspace` followed by `y` (for confirmation) to delete the selected key from the keyring.\n\n![](demo/gpg-tui-delete_key.gif)\n\n#### Refresh\n\nPress `Ctrl-y` for refreshing the keyring.\n\nThis feature uses `gpg` fallback and runs `gpg --refresh-keys` command.\n\n![](demo/gpg-tui-refresh_keys.gif)\n\n### Styling\n\nYou can customize the look of **gpg-tui** to get rid of its _boring_ and _minimalistic_ vibe. (!)\n\n#### Colors\n\nTo enable colors, you can specify a style with `--style` argument or press `Ctrl-S` while running for toggling the style. Currently, only one style is supported which is `colored`.\n\n```sh\ngpg-tui --style colored\n```\n\n![](demo/gpg-tui-colored_style.gif)\n\nIf the default _accent_ color of the interface causes problems with your theme or if you just want to change it to something more vivid, you can use `--color` argument to specify another color in HEX format.\n\n```sh\ngpg-tui --style colored --color 507030\n```\n\n![](demo/gpg-tui-custom_colors.gif)\n\nTo disable colors:\n\n```sh\ngpg-tui --style plain\n```\n\nAlternatively, you can set the [`NO_COLOR`](https://no-color.org) environment variable.\n\n#### Splash screen\n\nThere is a splash screen that shows the project's logo for a couple of seconds if `--splash` flag is present. It's purely cosmetical.\n\n```sh\ngpg-tui --splash\n```\n\n![](demo/gpg-tui-splash_screen.gif)\n\nTo enable colors for the splash screen, use the `colored` style.\n\n```sh\ngpg-tui --splash --style colored\n```\n\n![](demo/gpg-tui-splash_screen_colored.gif)\n\n## Roadmap\n\n### Platforms\n\n**gpg-tui** is tested on Linux systems during the development phase. It should be tested on other platforms such as Microsoft Windows and macOS and found issues should be reported for future compatibility with these platforms.\n\n### Packaging\n\n[![Packaging status](https://img.shields.io/repology/repositories/gpg-tui?label=in%20repositories\u0026style=flat\u0026labelColor=424242\u0026color=1d1d1d\u0026logoColor=white)](https://repology.org/project/gpg-tui/versions)\n\n**gpg-tui** should be more and easily accessible for other platforms/distributions. Thus, it should be packaged for package managers such as [Homebrew](https://brew.sh/) and [APT](https://en.wikipedia.org/wiki/APT_(software)). If you're a packager and want to contribute, feel free to [submit an issue](https://github.com/orhun/gpg-tui/issues/new/choose) or [start a discussion](https://github.com/orhun/gpg-tui/discussions/new)!\n\n### Command-Line Fallback\n\nSome of the features of **gpg-tui** require the execution of the CLI program `gpg` in order to operate. This is due to the fact that designing a TUI for the menus that gpg already provides is redundant and time-consuming. Also, in case these menus will change in the future, it is better to rely on the gpg rather than implementing these options using GPGME. On the other hand, gpg has some commands that GPGME doesn't directly provide. (e.g `--refresh-keys`) So it is more convenient to utilize gpg for these cases.\n\nThe plan for the future of **gpg-tui** is utilizing `gpg` _when it is necessary_, depending on whether if it is more convenient for the user.\n\n### Key Management Only\n\n**gpg-tui** only aims to do **key management** for now, although it can do much more utilizing GPGME and/or `gpg`. It's due to the design choice and also for setting the boundaries of the project.\n\n## Resources\n\n### About the project\n\n* [Code of Conduct](./CODE_OF_CONDUCT.md)\n* [Contribution Guidelines](./CONTRIBUTING.md)\n* [Changelog](./CHANGELOG.md)\n* [List of Commands](./COMMANDS.md)\n\n### External links\n\n* [GnuPG Documentation](https://gnupg.org/documentation/)\n* [Understanding PGP/GPG Key Server Output](https://www.jamieweb.net/blog/understanding-pgp-gpg-key-server-output/)\n* [What is the meaning of GnuPG's --list-sigs output?](https://security.stackexchange.com/questions/141501/what-is-the-meaning-of-gnupgs-list-sigs-output)\n\n### In the media\n\n- [Hacker News](https://news.ycombinator.com/item?id=27329598)\n- [heise online - IT-News](https://www.heise.de/news/gpg-tui-GnuPG-Schluessel-bequem-im-Terminal-verwalten-6057698.html)\n\n## Contact\n\n* [![Join Matrix Room](https://img.shields.io/matrix/gpg-tui:matrix.org?style=flat\u0026labelColor=1d1d1d\u0026logo=matrix\u0026logoColor=white\u0026color=424242\u0026label=join%20matrix)](https://matrix.to/#/!WRksRGtlvyEvEDByqt:matrix.org?via=matrix.org)\n* [![Follow @gpg_tui](https://img.shields.io/twitter/follow/gpg_tui?style=flat\u0026labelColor=1d1d1d\u0026logo=twitter\u0026logoColor=white\u0026color=424242)](https://twitter.com/gpg_tui)\n* [![https://orhun.dev](https://img.shields.io/badge/author-orhun-000000?style=flat\u0026labelColor=1d1d1d\u0026color=424242\u0026logo=Rust\u0026logoColor=white)](https://orhun.dev)\n  * [![Follow @orhun](https://img.shields.io/github/followers/orhun?label=follow%20%40orhun\u0026style=flat\u0026labelColor=1d1d1d\u0026logo=GitHub\u0026logoColor=white\u0026color=424242)](https://github.com/orhun)\n  * [![Follow @orhundev](https://img.shields.io/twitter/follow/orhundev?style=flat\u0026labelColor=1d1d1d\u0026logo=twitter\u0026logoColor=white\u0026color=424242)](https://twitter.com/orhundev)\n\n## Funding\n\nIf you find **gpg-tui** and/or other projects on my [GitHub profile](https://github.com/orhun/) useful, consider supporting me on [GitHub Sponsors](https://github.com/sponsors/orhun) or [becoming a patron](https://www.patreon.com/join/orhunp)!\n\n[![Support me on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Dorhunp%26type%3Dpatrons\u0026style=flat\u0026labelColor=424242\u0026color=1d1d1d\u0026logo=Patreon\u0026logoColor=white)](https://patreon.com/join/orhunp)\n[![Support me on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Dorhunp%26type%3Dpledges\u0026style=flat\u0026labelColor=424242\u0026color=1d1d1d\u0026logo=Patreon\u0026logoColor=white\u0026label=)](https://patreon.com/join/orhunp)\n\n## License\n\n[The MIT License](https://opensource.org/licenses/MIT)\n\n## Copyright\n\nCopyright © 2021-2024, [Orhun Parmaksız](mailto:orhunparmaksiz@gmail.com)\n","funding_links":["https://github.com/sponsors/orhun","https://patreon.com/orhunp","https://www.buymeacoffee.com/orhun","https://www.patreon.com/join/orhunp)!","https://patreon.com/join/orhunp"],"categories":["Rust","Productivity","cli","Dev-Utilities","hacktoberfest","\u003ca name=\"security\"\u003e\u003c/a\u003eSecurity and encryption","Table of Contents","💻 Apps"],"sub_categories":["Kubernetes","🚀 Productivity and Utilities"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forhun%2Fgpg-tui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forhun%2Fgpg-tui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forhun%2Fgpg-tui/lists"}