A Wayland-native emoji picker for Ubuntu/GNOME — search, select, paste.
Project description
mojify
A Wayland-native emoji picker for Ubuntu/GNOME.
Press a shortcut, type to search, hit Enter — the emoji is copied to your
clipboard. Paste it anywhere with Ctrl + V.
pip install mojify
Why it exists
GNOME's built-in emoji picker only works inside GTK apps, and most
third-party pickers (rofi-emoji, etc.) rely on xdotool / ydotool to type
the emoji — which does not work on Wayland because Wayland blocks programs
from synthesizing keystrokes into other apps for security reasons.
mojify takes the Wayland-friendly route: it copies the emoji to your
clipboard and lets you paste it yourself with Ctrl + V. That works in every
application — your terminal, browser, editor, chat app, anywhere — with no
input-injection hacks.
It's built on GTK3 (PyGObject), which already ships with Ubuntu's GNOME desktop, so the only thing you need to add is the clipboard helper.
Install
pip install mojify
Required dependency: wl-clipboard
mojify uses wl-copy to put the emoji on your clipboard:
sudo apt install wl-clipboard
GTK3 / PyGObject already come with Ubuntu's GNOME desktop. If you're on a stripped-down system and the picker won't start, install them with:
sudo apt install python3-gi gir1.2-gtk-3.0
Usage
Launch the picker directly:
mojify
Other commands:
mojify --version # print the version
mojify --list # print every bundled emoji (char<TAB>name<TAB>keywords)
mojify --stdout # print the chosen emoji to stdout instead of copying
mojify --no-notify # skip the "Copied" desktop notification
--list is handy for scripting, e.g. piping into your own fuzzy finder:
mojify --list | fzf | cut -f1 | wl-copy
Set up the Super + . keyboard shortcut (GNOME)
The whole point is to summon mojify with one keystroke. Bind it as a custom shortcut:
- Open Settings → Keyboard → View and Customize Shortcuts.
- Scroll to the bottom and click Custom Shortcuts, then the + button.
- Fill in:
- Name:
mojify - Command:
mojify(if that doesn't work, use the absolute path — runwhich mojifyto find it, e.g./home/you/.local/bin/mojify) - Shortcut: press
Super + .
- Name:
- Click Add.
Now press Super + . anywhere and the picker pops up.
Note:
Superis the Windows/⌘ key. If GNOME says the shortcut is already in use, pick another combo (e.g.Super + E) — the steps are the same.
Tip: if you installed with
pip install --user, make sure~/.local/binis on yourPATH, or just use the absolute path in the command field.
Show mojify in the app grid / dock (optional)
To register mojify as a desktop app (with its icon) so it appears in the GNOME app grid, search, and dock — and can be pinned:
mojify --install-desktop # installs a .desktop file + icon
mojify --uninstall-desktop # removes them
You may need to log out/in for the icon to refresh. Note the picker itself is a borderless pop-up, so it intentionally has no titlebar icon.
How it works
- Press your shortcut (e.g.
Super + .). - A small floating search window appears in the center of the screen, always on top, with no titlebar.
- Browse by category tab — starting with a 🕒 Recent tab of your
most-used emojis — or just start typing to search by name or keyword
(
fire,smile,heart,rocket, …). Search spans every category and updates in real time. - Use arrow keys to move through the grid, or click with the mouse.
- Press Enter (or click) to select. The emoji is copied to your clipboard and the window closes instantly.
- Press
Ctrl + Vwherever you want the emoji. - Press Escape at any time to dismiss the picker without selecting.
Known limitation
You have to paste manually with Ctrl + V. mojify cannot type the emoji
into the focused app for you, because Wayland deliberately prevents
applications from injecting keystrokes into other windows. Copy-to-clipboard
is the robust, secure way to do this on Wayland — and it works everywhere.
Project layout
mojify/
├── mojify/
│ ├── __init__.py
│ ├── __main__.py # CLI entry point (python -m mojify / `mojify`)
│ ├── picker.py # GTK3 floating picker window
│ └── emojis.py # bundled emoji dataset + search
├── setup.py
├── pyproject.toml
├── README.md
└── LICENSE
Contributing
Contributions are very welcome! 🎉
- Fork the repo and create a feature branch.
- Make your change. The codebase is small and dependency-light:
- Adding emojis? Edit
mojify/emojis.py. Each entry is a(character, name, keywords)tuple. Add generous keywords — they're what make search forgiving. - UI tweaks? They live in
mojify/picker.py.
- Adding emojis? Edit
- Test locally with an editable install:
pip install -e . mojify
- Open a pull request describing the change.
Please keep the zero-heavy-dependency philosophy: GTK3 (already on Ubuntu) for
the UI and wl-clipboard for the clipboard — nothing more.
License
MIT © 2026 Piyush Doorwar
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mojify-0.5.0.tar.gz.
File metadata
- Download URL: mojify-0.5.0.tar.gz
- Upload date:
- Size: 89.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13ab85f6476422377186ea57d79f26ce980a99e05289ed0d7a92df8647dd9b19
|
|
| MD5 |
dc2c5e51f6ac6449b59438984b7c4f44
|
|
| BLAKE2b-256 |
556279121d0e8dacf1c1406fee2c4ab267818b35d4bc3df4b21bf0bcc1c32db5
|
Provenance
The following attestation bundles were made for mojify-0.5.0.tar.gz:
Publisher:
publish.yml on piyushdoorwar/mojify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mojify-0.5.0.tar.gz -
Subject digest:
13ab85f6476422377186ea57d79f26ce980a99e05289ed0d7a92df8647dd9b19 - Sigstore transparency entry: 1848247172
- Sigstore integration time:
-
Permalink:
piyushdoorwar/mojify@55e24522bd7855c4023cfe1b05cd36e7f1723025 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/piyushdoorwar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@55e24522bd7855c4023cfe1b05cd36e7f1723025 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mojify-0.5.0-py3-none-any.whl.
File metadata
- Download URL: mojify-0.5.0-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
889385493969d3ed03f902231a14d051c26f537a636599caa5f8d52a30d75c8a
|
|
| MD5 |
9b105d1aed33c4dc47a4874cce6ab787
|
|
| BLAKE2b-256 |
788cfab4b0e6efbebb7effcbfcbfaf57b7c24ce32119296b61413a84b68f3697
|
Provenance
The following attestation bundles were made for mojify-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on piyushdoorwar/mojify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mojify-0.5.0-py3-none-any.whl -
Subject digest:
889385493969d3ed03f902231a14d051c26f537a636599caa5f8d52a30d75c8a - Sigstore transparency entry: 1848247288
- Sigstore integration time:
-
Permalink:
piyushdoorwar/mojify@55e24522bd7855c4023cfe1b05cd36e7f1723025 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/piyushdoorwar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@55e24522bd7855c4023cfe1b05cd36e7f1723025 -
Trigger Event:
push
-
Statement type: