diff --git a/README.md b/README.md index c57f9d1..02067b2 100644 --- a/README.md +++ b/README.md @@ -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 (Win+.). + +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 Ctrl+Alt+M, fully remappable (the Win key works too, e.g. Win+Y). +- **Your own meme library** — add images by clicking **+**, dragging files onto the window, or simply pasting with Ctrl+V. 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-.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 | Ctrl+Alt+M, or left-click the tray icon | +| Insert a meme | Click it | +| Add memes | **+** button, drag files in, or Ctrl+V | +| 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 | Esc, 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 Enter. 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 + Ctrl+V 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)