Open-source project
tom-james-watson/Emote avatar
tom-james-watson/Emote

Emote is a GTK4 emoji picker that works on both X11 and Wayland

Emoji Picker for Linux written in GTK4

853 stars46 forksPythonGPL-3.0

At a glance

What is it?
Emote is a popup emoji picker for Linux built with GTK4 and libadwaita, packaged for Flathub and Snap. Its real problem is the same one every Wayland picker has: the global shortcut and the automatic paste both depend on permissions the desktop controls, not the app.
Who is it for?
Emote is a good fit for a Linux user who wants a native looking picker that follows the desktop theme and comes with its own Noto Color Emoji font, and the Flatpak install is a single command. It is the wrong choice on a Wayland desktop where you cannot grant the Remote Interaction permission, because then the automatic paste does nothing.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A popup picker, not a keyboard layout

Emote is a popup emoji picker for Linux, built with GTK4 and libadwaita, and it is distributed as a Snap and a Flatpak. The homepage is the Snap Store page, and the project is licensed under the GNU GPL v3 or later.

What it does is narrow and does it well. You start typing to search, or you scroll through the emoji categories. Recently used emojis are easy to find. You can move through the picker with the keyboard or the mouse, and you can select one emoji or several. Choosing an emoji copies it to the clipboard and, if automatic paste is on, pastes it into the application you were using. There is a skin tone setting, and the app follows the desktop theme.

The interaction model matters more than the feature list here. This is a small window that appears on a global shortcut, does one thing, and disappears. The default shortcut is Ctrl+Alt+E, and the keyboard table gives the rest: Enter to select, Shift+Enter to add to the selection, Ctrl+Tab and Ctrl+Shift+Tab to move between categories, and Ctrl+Q to quit.

Selecting several emojis is done by right-clicking each one or pressing Shift+Enter, and the last Enter confirms the selection and closes the picker.

Wayland makes the global shortcut a negotiation

This is where the interesting engineering is, and it is worth reading the desktop integration section twice.

On X11, Emote handles the global shortcut itself and you change it from the Keyboard Shortcuts panel in the app. On Wayland, your desktop manages the shortcut through its Global Shortcuts portal. Emote offers to set this up the first time you open the picker, and you can skip it, keep an existing manual shortcut, or do it later. The important catch is stated plainly: once a shortcut is set inside the app, you have to update it in your desktop's own shortcut settings as well, because Wayland currently provides no way for the app to update it itself.

If the desktop does not support the portal, the project points at a Wayland shortcut guide in the repository wiki. That is a manual configuration path that depends on the desktop having some other way to bind a key.

The practical consequence for anyone evaluating this picker is that on Wayland the shortcut setup is a two-place operation, and on a desktop without the portal it is a manual exercise. On X11 it is a single place. That is a platform difference, not a defect in the application, but it decides how much friction the first run has.

Automatic paste needs the keyboard, and Wayland asks first

Automatic paste is optional on both X11 and Wayland, and it is on by default on X11. You toggle it in Preferences.

On Wayland there is a second condition. The desktop has to grant permission to control the keyboard, and Emote offers to enable that during setup. On GNOME the prompt asks for Remote Interaction, and the documentation tells you to allow it.

That permission is the crux of the whole feature. Without it, the emoji lands on the clipboard and stops there, so you paste it yourself. On X11 the app can synthesise the paste itself, which is why the default differs between the two.

Automatic paste is also the feature that makes the picker feel native rather than bolted on. A picker that only copies forces a switch back to your editor and a manual keystroke every time, and that friction is what makes most emoji pickers get abandoned. A picker that pastes into the previous application is the one people keep.

It is worth checking your desktop's policy on Remote Interaction before installing, because on a locked down or managed system the permission may be denied and the picker will quietly do less than you expect.

Installing through Flathub or Snap

Flatpak is the recommended route, and the install is one command:

bash
flatpak install flathub com.tomjwatson.Emote

The Snap is equally short:

bash
sudo snap install emote

There is also an unofficial AUR package for Arch Linux, and the project is explicit that it is not maintained by the author and should be installed at your own risk. The Snap requires sudo, the Flatpak does not, which is the practical difference between the two for a normal desktop.

After installation, the app is launched from the application menu. Emote starts automatically at login, and the documentation says to launch it once from the app menu after installing so that the first run flow happens.

That first run matters. It is when the global shortcut setup offer appears, and on Wayland it is also when the keyboard control permission is requested. Both are easy to dismiss by accident, and the shortcut in particular is the thing you will want working.

Preferences, fonts and the bundled Noto Color Emoji

Preferences covers the emoji size, the skin tone and the font. The font choice is the interesting one, because Emote ships its own rather than relying on the system.

The bundled Noto Color Emoji has Unicode 18 support, and the alternative is a System option that uses whatever emoji font your desktop provides. That is a real decision rather than a cosmetic one. A distribution that ships an older emoji font will render newer characters as boxes, and a picker that cannot show you an emoji is not much use. Bundling the font removes that failure mode at the cost of a larger package and a font that may not match the rest of your system.

The skin tone control applies to the characters that support it, and the size control scales the rendered glyphs in the popup.

Emoji data itself comes from OpenMoji, and the category icons include artwork from Lucide, each with its own licence file in the static directory. The bundled Noto Color Emoji is under the SIL Open Font License, which is why a GPL application can ship it.

How the project is built and packaged

The repository is a Python application with a GTK4 front end, and the build files show both a modern and a conventional path.

There is a meson.build for the GNOME style build, a Pipfile and Pipfile.lock for the Python environment, a setup.py for setuptools based installs, and a Makefile that drives development and packaging. The setup.py declares the package as Emote with a single gui_scripts entry point:

python
from setuptools import setup


setup(
    name="Emote",
    packages=["emote"],
    setup_requires=["setuptools"],
    entry_points={
        "gui_scripts": [
            "emote = emote.__init__:main",
        ]
    },
    install_requires=[
        "setproctitle==1.3.7",
        "python-xlib==0.33",
        "python-libei==0.5.2",
    ],
)

The pinned runtime dependencies are minimal and reveal the design. python-xlib is the X11 client library, python-libei is the libei protocol implementation for input emulation, and setproctitle lets the process set its own name.

The Makefile holds the developer workflow, including dev and dev-debug targets that run through pipenv, a dev-portal-identity target, and separate flatpak and snap targets with their own install, requirements, validate and clean steps. There are also dev-reset and prod-reset targets that clear the first run state, which reset the Flatpak permissions, the GNOME global shortcuts and the KDE global accelerator registrations for the application, so that the first run flow can be replayed during testing.

The development guide in docs covers running from source and debugging, and the release guide covers building and publishing the Flatpak and Snap packages.

A major version jump and what came before

The release history is worth reading carefully. Version 5.0.0 was published on 2026-10-19, and v5.0.1 followed the same day, a few hours later. Before that, the most recent tag listed is v4.0.1 from 2023-06-20.

So there is a gap of more than three years between the two lines, and the project moved from 4 to 5 in a single day. The repository is not archived and the last push was on 2026-10-19, so the work behind version 5 is recent, and the older tag tells you nothing about what changed in it.

That has a practical consequence. The release notes for the 5.0 line are where you look for behaviour changes, and this page does not have them. The changelog in the repository and the release guide in docs are the places to check, along with TODO.md at the root, which is where the remaining work is tracked.

The GPL v3 or later licence is the other thing to note for anyone thinking about packaging Emote themselves. It is a copyleft licence, and the project ships several third party components under their own terms, the SIL Open Font License for the bundled font and a separate bundled icon licence for the Lucide derived artwork.

Editorial conclusion

Emote is a good fit for a Linux user who wants a native looking picker that follows the desktop theme and comes with its own Noto Color Emoji font, and the Flatpak install is a single command. It is the wrong choice on a Wayland desktop where you cannot grant the Remote Interaction permission, because then the automatic paste does nothing. Before installing, check whether your desktop offers the Global Shortcuts portal, decide whether you want the bundled emoji font or the system one, and note that the newest release is v5.0.1 from 2026-10-19, with the previous tag dating back to 2023.

Frequently asked questions

How do I install Emote on Linux?

Flatpak is the recommended route: flatpak install flathub com.tomjwatson.Emote. A Snap is also published as sudo snap install emote, and an unofficial AUR package exists for Arch Linux that the author does not maintain.

Why does the global shortcut not work on Wayland?

On Wayland the desktop manages the shortcut through the Global Shortcuts portal, and Emote offers to set that up on first run. Any change you then make inside the app has to be mirrored in your desktop's own shortcut settings, because Wayland currently gives the app no way to update it.

Can Emote paste an emoji automatically?

Yes, but it is optional and on by default only on X11. On Wayland the desktop must also allow the app to control the keyboard, and on GNOME you allow Remote Interaction when prompted. Without that permission the emoji is copied to the clipboard and you paste it yourself.

Official sources

  1. License: GPL-3.0
  2. Project website
  3. README
  4. Releases
  5. tom-james-watson/Emote on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/tom-james-watson-emote.svg)](https://hysenlabs.com/projects/tom-james-watson-emote)

Was this useful?