144 lines
6.8 KiB
Markdown
144 lines
6.8 KiB
Markdown
# Ebbe's Meme Clipboard
|
|
|
|
A meme and GIF picker for Windows, inspired by the built-in Windows Emoji Picker (<kbd>Win</kbd>+<kbd>.</kbd>).
|
|
|
|
Press a global hotkey anywhere, a small popup appears, search your memes or Giphy, click one —
|
|
and it lands straight in whatever app you were just typing in. It lives in the system tray and
|
|
stays out of the way until you need it.
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
- **Global hotkey** — opens the picker over any app. Defaults to <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>M</kbd>, fully remappable (the <kbd>Win</kbd> key works too, e.g. <kbd>Win</kbd>+<kbd>Y</kbd>).
|
|
- **Your own meme library** — add images by clicking **+**, dragging files onto the window, or simply pasting with <kbd>Ctrl</kbd>+<kbd>V</kbd>. Supports JPG, PNG and GIF.
|
|
- **Giphy search** — a second tab searches Giphy directly (needs a free API key, see below). Scroll and it keeps loading more results. You can also paste a Giphy link straight into the search box to jump to that one GIF.
|
|
- **Favourites** — right-click any meme to pin it to a ★ Favourites row at the top of that tab. Kept separately per source.
|
|
- **Three insert modes** — copy to clipboard, paste into the active window, or paste *and* send instantly.
|
|
- **Animated GIFs stay animated** — the clipboard is written in several formats at once so GIFs paste as real animations in Discord, Slack and Teams, rather than as a flattened still frame.
|
|
- **Search as you type** — filters your library by filename; Giphy results are debounced so typing doesn't burn through the API rate limit.
|
|
- **Runs from the tray** — optional start-with-Windows, and a movable, dismiss-on-click-away popup.
|
|
|
|
## Installation
|
|
|
|
**Installer (recommended)** — run `EbbesMemeClipboard-Setup-<version>.exe`. It installs per-user by
|
|
default (no admin prompt) but lets you choose "just me" or "all users", and offers optional desktop
|
|
and start-with-Windows shortcuts.
|
|
|
|
**Portable** — grab `EbbesMemeClipboard.exe` and run it. No installation, no .NET runtime needed;
|
|
everything is bundled. It'll write its library and settings to `%AppData%` as usual.
|
|
|
|
> Windows may show a SmartScreen warning on first run, because the executable isn't code-signed.
|
|
> Choose *More info → Run anyway*. Signing requires a paid certificate from a certificate authority.
|
|
|
|
## Usage
|
|
|
|
| Action | How |
|
|
|---|---|
|
|
| Open / close the picker | <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>M</kbd>, or left-click the tray icon |
|
|
| Insert a meme | Click it |
|
|
| Add memes | **+** button, drag files in, or <kbd>Ctrl</kbd>+<kbd>V</kbd> |
|
|
| Favourite / unfavourite | Right-click a meme |
|
|
| Delete a meme | Right-click → **Remove** (goes to the Recycle Bin) |
|
|
| Search | Just start typing |
|
|
| Move the window | Drag the title bar |
|
|
| Close the picker | <kbd>Esc</kbd>, or click elsewhere |
|
|
| Settings / quit | Right-click the tray icon |
|
|
|
|
Pasting plain text into the window still goes to the search box — only images get imported.
|
|
|
|
### Insert modes
|
|
|
|
Set these under **Settings → Insert Mode**:
|
|
|
|
- **Copy to clipboard** — just copies; you paste it yourself.
|
|
- **Paste into active window** *(default)* — restores focus to the app you came from and pastes for you.
|
|
- **Paste and send instantly** — the above, plus <kbd>Enter</kbd>. Handy in chat apps, but it *will* send the message immediately, so it's off by default.
|
|
|
|
### Giphy setup
|
|
|
|
The Giphy tab needs your own free API key:
|
|
|
|
1. Go to [developers.giphy.com](https://developers.giphy.com), create an account and an app, and choose **API Key**.
|
|
2. Paste the key into **Settings → Giphy**.
|
|
|
|
The free tier allows 100 requests per hour, which is plenty for personal use. Giphy's terms
|
|
require the "Powered by GIPHY" attribution shown in the app whenever their results are displayed.
|
|
|
|
You can also paste a Giphy link into the search box — share links
|
|
(`giphy.com/gifs/funny-cat-<id>`), direct media links (`media.giphy.com/media/<id>/giphy.gif`)
|
|
and `i.giphy.com` image links all work, and resolve to that single GIF.
|
|
|
|
## Where your data lives
|
|
|
|
```
|
|
%AppData%\EbbesMemeClipboard\
|
|
settings.json hotkey, insert mode, Giphy API key
|
|
favorites.json favourites, per source
|
|
Library\ your imported memes + an index
|
|
|
|
%LocalAppData%\EbbesMemeClipboard\
|
|
GifCache\ downloaded Giphy GIFs (re-downloadable; safe to delete)
|
|
```
|
|
|
|
Uninstalling deliberately leaves your memes, favourites and settings in place — only the
|
|
re-downloadable cache is cleared.
|
|
|
|
## Known limitations
|
|
|
|
- **The popup appears at the mouse cursor, not the text caret.** The real Emoji Panel can follow
|
|
the caret because it's a privileged part of the Windows shell; third-party apps have no
|
|
equivalent access.
|
|
- **Auto-paste doesn't work into apps running as administrator.** Windows blocks a normal program
|
|
from sending input to an elevated window (UIPI). The meme is still copied — just press
|
|
<kbd>Ctrl</kbd>+<kbd>V</kbd> yourself.
|
|
- **No single-instance guard yet.** If two copies run at once they'll compete for the global
|
|
hotkey. Worth checking you don't have both a Startup shortcut *and* the autostart setting enabled.
|
|
- **Windows only.** See below.
|
|
|
|
## Building from source
|
|
|
|
Requires the [.NET 10 SDK](https://dotnet.microsoft.com/download).
|
|
|
|
```bash
|
|
# run it
|
|
dotnet run --project src/EbbesMemeClipboard
|
|
|
|
# portable single exe -> publish/
|
|
dotnet publish src/EbbesMemeClipboard/EbbesMemeClipboard.csproj -c Release -r win-x64 \
|
|
--self-contained true -p:PublishSingleFile=true \
|
|
-p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true \
|
|
-o publish
|
|
```
|
|
|
|
To build the installer you'll also need [Inno Setup 6](https://jrsoftware.org/isinfo.php). Note the
|
|
publish step deliberately disables .NET's own compression, so Inno's LZMA2 can compress the raw
|
|
bytes instead — that yields a noticeably smaller setup and a faster-starting app:
|
|
|
|
```bash
|
|
dotnet publish src/EbbesMemeClipboard/EbbesMemeClipboard.csproj -c Release -r win-x64 \
|
|
--self-contained true -p:PublishSingleFile=true \
|
|
-p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=false \
|
|
-o publish-installer
|
|
|
|
"%LocalAppData%\Programs\Inno Setup 6\ISCC.exe" installer\EbbesMemeClipboard.iss
|
|
```
|
|
|
|
### Tech stack
|
|
|
|
.NET 10 · WPF · MVVM ([CommunityToolkit.Mvvm](https://github.com/CommunityToolkit/dotnet)) ·
|
|
[H.NotifyIcon](https://github.com/HavenDV/H.NotifyIcon) for the tray icon ·
|
|
`Microsoft.Extensions.DependencyInjection`
|
|
|
|
### Platform support
|
|
|
|
Windows only, and not portable without a rewrite. WPF doesn't exist on macOS or Linux, and the
|
|
features that make the app work — global hotkeys, synthetic paste, tray icon, clipboard formats,
|
|
autostart — are all built directly on Win32. The data and business-logic layer would carry over
|
|
to a cross-platform UI framework such as [Avalonia](https://avaloniaui.net), but every
|
|
platform-integration service and the entire UI would need reimplementing.
|
|
|
|
## License
|
|
|
|
[MIT](LICENSE)
|