https://github.com/floatpane/jify
Native shortcode emoji picker anywhere! MacOS, Linux, Windows
https://github.com/floatpane/jify
Last synced: 18 days ago
JSON representation
Native shortcode emoji picker anywhere! MacOS, Linux, Windows
- Host: GitHub
- URL: https://github.com/floatpane/jify
- Owner: floatpane
- License: mit
- Created: 2026-06-25T11:13:26.000Z (about 1 month ago)
- Default Branch: master
- Last Pushed: 2026-06-25T13:11:34.000Z (about 1 month ago)
- Last Synced: 2026-06-25T13:15:23.003Z (about 1 month ago)
- Language: Go
- Homepage: http://jify.floatpane.com/
- Size: 48.8 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
jify
Emoji, everywhere you type.
---
Native shortcode emoji picker. Type a trigger character (`:` by default)
followed by an emoji name in **any** application and jify pops up native
suggestions — press Enter to replace the shortcode with the emoji.
```
:fire -> 🔥
:thumbsup -> 👍
:rocket -> 🚀
```
## Features
- **Works everywhere** — a global keyboard hook watches your typing system-wide.
- **Native popup on every OS**
- **macOS** — "liquid glass" (`NSGlassEffectView`) on macOS 26+, falling back
to a frosted `NSVisualEffectView` on older releases.
- **Windows** — an acrylic-blur, rounded-corner layered window (Win10/11).
- **Linux** — a GTK 3 popup styled with CSS (rounded, translucent, color
emoji via Pango).
- **Configurable** — trigger character, result count, theme and per-app
blacklist all live in a JSON config.
- **App blacklist** — disable jify in specific apps (e.g. password managers).
## Selection UX
- **macOS / Windows** — keystrokes can be intercepted, so the popup is fully
interactive: ↑/↓ to move, Enter/Tab
to insert, Esc to cancel.
- **Linux (X11)** — X11's `XRecord` can observe but not swallow keys, so
selection uses the **closing-trigger** style: type `:smile:` (trigger, name,
trigger) to insert the top suggestion. The popup updates live as you type.
- **Any platform** — you can also **click** a suggestion in the popup to insert
it (rows highlight on hover).
## Install
**macOS (Homebrew):**
```sh
brew install floatpane/jify/jify
```
**Linux (Snap):**
```sh
sudo snap install jify --classic
```
**Windows / manual:** download the archive for your OS from the
[releases page](https://github.com/floatpane/jify/releases) and put `jify` on
your `PATH`.
## Build from source
Requires Go 1.24+.
```sh
# macOS (needs the Xcode command line tools for cgo / Objective-C)
CGO_ENABLED=1 go build -o jify .
# Windows (pure Go, no cgo)
GOOS=windows CGO_ENABLED=0 go build -o jify.exe .
# Linux (needs gtk+-3.0, libx11 and libxtst dev packages, e.g. on Debian:
# sudo apt install libgtk-3-dev libx11-dev libxtst-dev)
CGO_ENABLED=1 go build -o jify .
```
## Usage
```sh
./jify # start jify in the background (type ":name" anywhere)
./jify -f # run in the foreground (don't detach; for debugging)
./jify enable # start jify automatically at login
./jify disable # stop starting jify at login
./jify status # show whether autostart is enabled
./jify config # print the config file path
./jify help # show help
```
### Running in the background & at login
jify is designed to run as a background agent (no dock icon on macOS, no window
until the popup appears). Running `jify` from a terminal detaches it and returns
your prompt immediately; its output goes to a log file next to the config
(`/jify/jify.log`). Use `jify -f` to stay in the foreground. When
launched by launchd/systemd/snap it runs in the foreground so the supervisor can
track it.
It also registers itself to launch at login automatically on first run —
controlled by the `autostart` config field, which is reconciled with the OS every
time jify starts. Use `jify disable` to turn it off.
Login mechanism per OS:
- **macOS** — a LaunchAgent at `~/Library/LaunchAgents/com.floatpane.jify.plist`.
- **Windows** — an `HKCU\…\CurrentVersion\Run` registry value.
- **Linux** — `~/.config/autostart/jify.desktop`.
> **Windows:** build with the GUI subsystem so no console window appears:
> `GOOS=windows CGO_ENABLED=0 go build -ldflags="-H windowsgui" -o jify.exe .`
On first launch macOS will ask for **Accessibility** permission
(System Settings → Privacy & Security → Accessibility). This is required for the
global key event tap. Grant it and relaunch.
- Type the trigger character followed by a name to open the popup.
- ↑/↓ to move the selection.
- Enter / Tab to insert the highlighted emoji.
- Esc or any space/punctuation cancels.
## Configuration
The config file is created with defaults on first run at:
```
~/Library/Application Support/jify/config.json (macOS)
~/.config/jify/config.json (Linux)
```
See [`config.example.json`](config.example.json):
| Field | Description |
| ----------------- | ------------------------------------------------------------------ |
| `trigger` | Character that starts a suggestion session (default `:`). |
| `maxSuggestions` | Maximum emojis shown in the popup. |
| `blacklistedApps` | App bundle ids (`com.apple.Terminal`) or names where jify is off. |
| `theme` | `native`, `dark` or `light`. |
| `autostart` | Launch jify at login (default `true`). |
## Platform support
| Platform | Backend | Hook / inject | Popup |
| -------- | ------------------------------------ | -------------------------- | ---------------- |
| macOS | `darwin.m` (cgo / Objective-C) | `CGEventTap` / `CGEvent` | NSGlassEffectView |
| Windows | `windows.go` (pure Go, Win32) | `WH_KEYBOARD_LL` / SendInput | acrylic layered window |
| Linux | `linux.c` (cgo / GTK3 + X11) | `XRecord` / `XTest` | GTK CSS popup |
The Go core (`pkg/config`, `pkg/emoji`) is platform-independent. The cgo
backends (macOS, Linux) call the shared exported callbacks in `bridge.go`
(`jifyQuery`, `jifyIsBlacklisted`, `jifyTriggerRune`); the Windows backend is
pure Go and calls the core directly.
### Notes & permissions
- **macOS** needs **Accessibility** permission for the event tap.
- **Linux** requires an **X11** session (works under XWayland for most apps) with
the `RECORD` and `XTEST` extensions, which are standard.
- **Windows** needs no special permission; if jify is used in an elevated
(admin) window, run jify elevated too so the hook can see those keystrokes.