added description
This commit is contained in:
@@ -1,2 +1,139 @@
|
||||
# ebbes-meme-clipboard
|
||||
# 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).
|
||||
- **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.
|
||||
|
||||
## 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)
|
||||
|
||||
Reference in New Issue
Block a user