{"id":32159594,"url":"https://github.com/alynxzhou/showmethekey","last_synced_at":"2026-02-25T02:04:38.852Z","repository":{"id":40645153,"uuid":"348235017","full_name":"AlynxZhou/showmethekey","owner":"AlynxZhou","description":"Show keys you typed on screen.","archived":false,"fork":false,"pushed_at":"2026-02-23T03:30:25.000Z","size":10742,"stargazers_count":531,"open_issues_count":9,"forks_count":39,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-02-23T11:46:33.212Z","etag":null,"topics":["gui","libinput","screenkey-alternative","wayland"],"latest_commit_sha":null,"homepage":"https://showmethekey.alynx.one/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlynxZhou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-03-16T06:14:57.000Z","updated_at":"2026-02-23T03:30:30.000Z","dependencies_parsed_at":"2023-02-14T15:31:35.827Z","dependency_job_id":"0f1f76c9-d483-4bc5-acd0-ab3d042205d4","html_url":"https://github.com/AlynxZhou/showmethekey","commit_stats":{"total_commits":117,"total_committers":5,"mean_commits":23.4,"dds":0.07692307692307687,"last_synced_commit":"4aabb8212db73fab3f0cb68d3b2148bbc9d103bd"},"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/AlynxZhou/showmethekey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlynxZhou%2Fshowmethekey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlynxZhou%2Fshowmethekey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlynxZhou%2Fshowmethekey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlynxZhou%2Fshowmethekey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlynxZhou","download_url":"https://codeload.github.com/AlynxZhou/showmethekey/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlynxZhou%2Fshowmethekey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29808937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T22:43:48.403Z","status":"online","status_checked_at":"2026-02-25T02:00:07.329Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["gui","libinput","screenkey-alternative","wayland"],"created_at":"2025-10-21T13:05:50.763Z","updated_at":"2026-02-25T02:04:38.846Z","avatar_url":"https://github.com/AlynxZhou.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"Show Me The Key\n===============\n\nShow keys you typed on screen.\n------------------------------\n\n[Project Website](https://showmethekey.alynx.one/)\n\nA SUSE Hack Week 20 Project: [Show Me The Key: A screenkey alternative that works under Wayland via libinput](https://hackweek.suse.com/20/projects/a-screenkey-alternative-that-works-under-wayland-via-reading-evdev-directly).\n\n# Feature\n\n[screenkey](https://gitlab.com/screenkey/screenkey) is a popular project for streamers or tutorial recorders because it can visualization your typing on screen, but it does not work with Wayland because it uses X11-only functions to get keyboard event.\n\nShow Me The Key reads key events via libinput directly, and then show them on screen, so it does not depend on X11 or special Wayland Compositors and will work all across them.\n\n# Install\n\n## Distribution Package (Recommended)\n\n### AOSC OS\n\nJust run following command to install from official repository:\n\n```\n# apt install showmethekey\n```\n\n### Arch Linux\n\nJust run following command to install from official repository:\n\n```\n# pacman -S showmethekey\n```\n\n### openSUSE\n\n#### Install from OBS\n\nPackages can be found in [my OBS project](https://build.opensuse.org/package/show/home:AZhou/showmethekey).\n\n```\n# zypper ar https://download.opensuse.org/repositories/home:/AZhou/openSUSE_Tumbleweed/home:AZhou.repo\n# zypper in showmethekey showmethekey-lang\n```\n\nLeap users please replace URL for Tumbleweed with URL for your Leap version.\n\n### Fedora\n\n#### Install from COPR\n\nTo install the package on Fedora Workstation, run the following commands:\n\n```bash\nsudo dnf copr enable pesader/showmethekey\nsudo dnf install showmethekey\n```\n\nIf you are running an Atomic Desktop (Fedora Silverblue, Fedora Kinoite, Fedora Sericea, etc), run:\n\n```bash\nexport RELEASE=40 # or whichever release of Fedora you are running\nsudo curl -o /etc/yum.repos.d/showmethekey.repo https://copr.fedorainfracloud.org/coprs/pesader/showmethekey/repo/fedora-$RELEASE/pesader-showmethekey-fedora-$RELEASE.repo\nrpm-ostree install showmethekey\n```\n\n### Other Distributions\n\nPlease help package showmethekey to your distribution!\n\n## Build From Source\n\n### Dependencies\n\n- libevdev\n- udev (or systemd)\n- libinput\n- glib2 (the dev package may also be needed)\n- gtk4\n- libadwaita\n- json-glib\n- cairo\n- pango\n- libxkbcommon\n- polkit\n- meson\n- ninja\n- gcc\n\n### Build\n\n```\n$ git clone https://github.com/AlynxZhou/showmethekey.git\n$ cd showmethekey\n$ mkdir build \u0026\u0026 cd build \u0026\u0026 meson setup --prefix=/usr . .. \u0026\u0026 meson compile \u0026\u0026 meson install\n$ showmethekey-gtk\n```\n\n# Usage\n\nToggle the switch to show the floating keys window, and drag it to anywhere you want, because Wayland does not allow a client to set its position. You may pin it at the top of other windows if you desktop allows that, then you could disable the clickable switch, and the window will become click-through.\n\nYou may need to input admin password if there is a polkit authentication agent's dialog, because we need superuser permission to read keyboard events (this program does not handle your password). Users in `wheel` group can skip password authentication.\n\nFor detailed usage, please run usage dialog from app menu.\n\n## Special Notice for Wayland Session Users\n\nThere is no official Wayland protocol allowing toplevel clients to set their own position and layer, only users can change those things. But don't worry, users are always allowed to do those things by themselves if their compositors support it.\n\nFor example if you are using GNOME Shell (Wayland), you can right click the \"Clickable Area\" on title bar to show a window manager menu and check \"Always on Top\" and \"Always on Visible Workspace\" in it.\n\nIf you are using KDE Plasma (Wayland), you can right click \"Floating Window - Show Me The Key\" on task bar, check \"Move to Desktop\" -\u003e \"All Desktops\" and \"More Actions\" -\u003e \"Keep Above Others\".\n\nFor Sway users, you can add following configurations into `~/.config/sway/config` to enable floating and sticky (thanks to [haxibami's blog post](https://zenn.dev/haxibami/articles/wayland-sway-install#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E8%A8%AD%E5%AE%9A):\n\n```\nfor_window [app_id=\"showmethekey-gtk\" title=\"Floating Window - Show Me The Key\"] {\n  floating enable\n  sticky enable\n}\n```\n\nFor Hyprland, you can use window rules to achieve the same effect. The config should be at `~/.config/hypr/hyprland.conf` or an extension of it. \nExample config:\n\n```\n# To get more information about a window’s class, title, XWayland status or its size, you can use `hyprctl clients`. (From Hyprland Wiki)\nwindowrulev2 = float,class:^(one.alynx.showmethekey)$\nwindowrulev2 = float,class:^(showmethekey-gtk)$ # make window floating\nwindowrulev2 = pin,class:^(showmethekey-gtk)$ # pin window\n```\n\n## If You are Tired of the App (Settings) Window\n\nYou could always close the app (settings) window after keys window is shown. To show keys window by default, run `showmethekey-gtk` with `-k` option. To hide app window by default, run `showmethekey-gtk` with `-A` option. If you already use some compositor rules to make keys window always on top and at position you want, you may want to make keys window click-through by default, then you could use `-C` option.\n\nWhen keys win is shown, you could always toggle clickable by quickly pressing Ctrl twice (or pressing both Ctrl), and toggle paused by quickly pressing Alt twice (or pressing both Alt).\n\n# Project Structure\n\n## CLI\n\nThis part exists because of Wayland's security policy, which means you cannot run a GUI program with `sudo` (see \u003chttps://wiki.archlinux.org/index.php/Running_GUI_applications_as_root#Wayland\u003e). It's suggested to split your program into a GUI frontend and a CLI backend that do privileged operations, and this is the backend, a custom re-write of \u003chttps://gitlab.freedesktop.org/libinput/libinput/-/blob/master/tools/libinput-debug-events.c\u003e, based on [libinput](https://www.freedesktop.org/wiki/Software/libinput/), [libudev](https://www.freedesktop.org/software/systemd/man/libudev.html) and [libevdev](https://www.freedesktop.org/wiki/Software/libevdev/).\n\nIt generates JSON in lines like `{\"event_name\": \"KEYBOARD_KEY\", \"event_type\": 300, \"time_stamp\": 39869802, \"key_name\": \"KEY_C\", \"key_code\": 46, \"state_name\": \"PRESSED\", \"state_code\": 1}`.\n\n## GTK\n\nA GUI frontend based on GTK, will run CLI backend as root via `pkexec`, and show a transparent floating window to display events.\n\n# FAQ\n\n## Why your program needs root permission? screenkey never asks for it!\n\nIf you debug with libinput, you'll find it needs root permission, too. Because this program support both Wayland and X11, it does not get input events via display protocol, actually it's reading directly from evdev interface under `/dev`. **And if you want to interact with files under `/dev`, you need root permission.** screenkey does not needs root permission because it's heavily X11-based, **it gets input events from X server** instead of `/dev`, which already done it. And because of this it will never support Wayland.\n\n## I am using Sway/Wayfire/[not DEs], and I always get `AUTHENTICATION FAILED` in terminal!\n\nThis is a pkexec bug that it's tty authentication does not work, see \u003chttps://gitlab.freedesktop.org/polkit/polkit/-/issues/17\u003e. Most DEs have their own authentication agents, but if you are not using them, pkexec will try to make itself an agent, and you get this bug.\n\nA possible workaround is \u003chttps://github.com/AlynxZhou/showmethekey/issues/2#issuecomment-1019439959\u003e, actually you can use any agents, not only the gnome one.\n\n## I have remapped \u003ctt\u003eCaps Lock\u003c/tt\u003e to \u003ctt\u003eControl\u003c/tt\u003e, but this program shows \u003ctt\u003eCaps_Lock U\u003c/tt\u003e instead of \u003ctt\u003e^u\u003c/tt\u003e!\n\nKeys which are remapped via the Desktop Environment/X11 tools (for example, `setxkb`, GNOME Tweaks, KDE settings, or other high-level tools) are not visible to Show Me The Key. A workaround is to remap keys using **udev** rules. This has the added benefit of working identically in the Linux console (TTY), Wayland, and X11 alike. See \u003chttps://wiki.archlinux.org/title/Map_scancodes_to_keycodes#Using_udev\u003e.\n\n# Translate\n\nIf you changed translatable strings, don't forget to run `meson compile showmethekey-update-po` in build directory and then edit po files, and please check if there are `fuzzy` tag in comment, you should remove them and make translation exact, otherwise it will not work.\n\nIf you added new source files with translatable strings, don't forget to add it to `showmethekey-gtk/po/POTFILES.in` before running `meson compile showmethekey-update-po`. File paths in `POTFILES.in` should be relative to project directory.\n\nIf you want to add languages, first add a country code in `showmethekey-gtk/po/LINGUAS`, then run `meson compile showmethekey-update-po`, you will get a new `.po` file with your added country code. If this language needs UTF-8 encoding, don't use words like `zh_CN.UTF-8` in `showmethekey-gtk/po/LINGUAS` or file name, because RPM's find\\_lang script may ignore them sometimes, and you should change to `charset=UTF-8` manually in the header.\n\n# Name\n\nAs I want some clear name that hints its usage, but `screenkey` is already taken and I think `visualkey` sounds like `Visual Studio` and it's horrible. My friend [@LGiki](https://github.com/LGiki) suggests `Show Me The Key` which sounds like \"Show me the code\" from Linus Torvalds. At first I think it's a little bit long, but now it is acceptable so it's called `showmethekey` or `Show Me The Key`.\n\nThe Chinese translate of this program name should be `让我看键`, and it's only used for app window title, debug output, package name, desktop entry name and floating window title should not be translated. (**The floating window title is important because some compositors relies on it to write window rules so you should never translate it!!!**)\n\n# Icon\n\nProgram icon made by \u003ca href=\"https://www.freepik.com\" title=\"Freepik\"\u003eFreepik\u003c/a\u003e from \u003ca href=\"https://www.flaticon.com/\" title=\"Flaticon\"\u003ewww.flaticon.com\u003c/a\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falynxzhou%2Fshowmethekey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falynxzhou%2Fshowmethekey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falynxzhou%2Fshowmethekey/lists"}