{"id":37624615,"url":"https://github.com/d3ucey/clipcat","last_synced_at":"2026-03-03T11:13:09.939Z","repository":{"id":331492043,"uuid":"1126762247","full_name":"d3uceY/Clipcat","owner":"d3uceY","description":"just a clipboard manager (windows doesn't do a very good job at managing my clips so i had to create my own) 😈","archived":false,"fork":false,"pushed_at":"2026-01-14T09:57:21.000Z","size":8384,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-16T21:40:01.157Z","etag":null,"topics":["clipboard","clipboard-manager","desktop-app","go","react","wails","windows"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/d3uceY.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-02T14:31:30.000Z","updated_at":"2026-01-14T09:57:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/d3uceY/Clipcat","commit_stats":null,"previous_names":["d3ucey/clipussy","d3ucey/clipcat"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/d3uceY/Clipcat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3uceY%2FClipcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3uceY%2FClipcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3uceY%2FClipcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3uceY%2FClipcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/d3uceY","download_url":"https://codeload.github.com/d3uceY/Clipcat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d3uceY%2FClipcat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28698343,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T17:25:48.045Z","status":"ssl_error","status_checked_at":"2026-01-23T17:25:47.153Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clipboard","clipboard-manager","desktop-app","go","react","wails","windows"],"created_at":"2026-01-16T10:45:56.172Z","updated_at":"2026-03-03T11:13:09.933Z","avatar_url":"https://github.com/d3uceY.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./build/appicon.png\" alt=\"icon\" width=\"90\"\u003e\n\u003c/p\u003e\n\u003cdiv align=\"center\"\u003e\n\u003ch1\u003eClipcat\u003c/h1\u003e\n\u003c/div\u003e\n\nA creative and stylish clipboard manager built with Wails, designed to keep track of everything you copy through a clean, paper-aesthetic interface. It automatically records every clipboard change in real time, storing your copy history so you can easily revisit, reuse, and manage past content whenever you need it.\n\n\u003cimg width=\"1912\" height=\"1026\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ec4870c1-8555-49e0-9cb4-52c83f7551b0\" /\u003e\n\n\n## ⬇️ Download\n![Clipcat Banner](https://img.shields.io/badge/Made%20with-Wails-00ADD8?style=for-the-badge\u0026logo=go)\n![License](https://img.shields.io/badge/license-MIT-blue?style=for-the-badge)\n\n[![Download Clipcat v0.7.2 for Windows](https://img.shields.io/badge/Download-Windows%20Installer-0078D4?style=for-the-badge\u0026logo=windows\u0026logoColor=white)](https://github.com/d3uceY/Clipcat/releases/download/v0.7.2/Clipcat.exe)\n\n**[⬇️ Clipcat](https://github.com/d3uceY/Clipcat/releases/download/v0.7.2/Clipcat.exe)**\n\n\u003e Windows 10/11 (64-bit) | Version 0.7.2\n\n![clipcat (1)](https://github.com/user-attachments/assets/ca28ae42-2a9d-42c3-9a47-183808d59cf6)\n\n### ⚠️ Windows SmartScreen Warning\n\nWhen running the app for the first time, Windows SmartScreen may show a warning because the app is not yet code-signed. This is normal for open-source applications.\n\n**To run the app:**\n1. Click \"More info\" on the SmartScreen warning\n2. Click \"Run anyway\"\n\nOr alternatively:\n1. Right-click the downloaded .exe file\n2. Select \"Properties\"\n3. Check \"Unblock\" at the bottom\n4. Click \"Apply\" → \"OK\"\n5. Run the executable\n\nThe app is safe and [open source](https://github.com/d3uceY/Clipcat) - you can verify the code yourself!\n\n\n\n## ✨ Features\n\n- **Automatic Clipboard Monitoring** - Automatically captures everything you copy (text and images)\n- **Image Support** - Captures and displays clipboard images with base64 encoding\n- **Pin Important Clips** - Keep your most-used clips at the top\n- \u003cimg width=\"577\" height=\"471\" alt=\"image\" src=\"https://github.com/user-attachments/assets/aa6e7ff1-159e-4fc0-8565-fdc9208a07c4\" /\u003e\n\n- **Fast Search** - Quickly find clips with Ctrl+F\n- \u003cimg width=\"530\" height=\"112\" alt=\"showcase-search\" src=\"https://github.com/user-attachments/assets/c2c76d50-5f94-481d-9191-ad37f2518967\" /\u003e\n\n- **Unique Paper Aesthetic** - Beautiful hand-drawn, notebook-style UI\n- **Easy Management** - Copy, pin, and delete clips with intuitive controls\n- **Edit Clips** - Modify the content of your saved clips anytime\n- **Manual Creation** - Add new clips directly from the app without copying\n- \u003cimg width=\"705\" height=\"324\" alt=\"showcase-action-btns\" src=\"https://github.com/user-attachments/assets/d03a6634-8b41-4d78-a976-662b4c2b8f89\" /\u003e\n\n- **Privacy Mode** - Instantly hide clip content for privacy or during screen sharing\n- \u003cimg width=\"242\" height=\"227\" alt=\"image\" src=\"https://github.com/user-attachments/assets/9fed26d4-31cb-4ff0-bdd4-e8ee25780dba\" /\u003e\n\n- \u003cimg width=\"1223\" height=\"244\" alt=\"image\" src=\"https://github.com/user-attachments/assets/0d242347-2e1d-46bf-b57f-20255d7c4fd1\" /\u003e\n\n- **Bulk Actions** - Quickly delete all, recent, or pinned clips via the settings menu\n- \u003cimg width=\"196\" height=\"179\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a6cb09b3-14fa-4bc7-884a-57fc0d17d561\" /\u003e\n\n- \u003cimg width=\"467\" height=\"193\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a78a8a32-0d91-4920-ba4a-4100bb8d8cca\" /\u003e\n\n- **Full Content View** - Click any clip to view complete content in a scrollable dialog\n- \u003cimg width=\"572\" height=\"552\" alt=\"image\" src=\"https://github.com/user-attachments/assets/d85b3231-0380-4643-952a-e8d5dfcc71c4\" /\u003e\n\n- **Duplicate Detection** - Automatically prevents saving duplicate clipboard content\n- **Sound Effects** - Audible feedback for actions\n- **Persistent Storage** - SQLite database keeps your clips safe\n- **Configurable Storage Limit** - Customize how many clips to keep (default: 100)\n- \u003cimg width=\"259\" height=\"335\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ca3ed1ef-8a44-4aa2-a759-37d025e0682b\" /\u003e\n\n- **Mini Clip Mode** - A compact, always-on-top window for unobtrusive usage\n- \u003cimg width=\"270\" height=\"330\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ddedff44-5007-4f57-b98e-006e28e24e71\" /\u003e\n\n- **Startup Support** - Option to launch automatically when your system starts\n- \u003cimg width=\"293\" height=\"335\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2437742c-48c4-4e09-9726-19551d86eb54\" /\u003e\n\n- **Auto Update Check** - Automatically checks for new versions on GitHub\n\n## 🛠️ Technologies Used\n\n### Backend\n- **[Go](https://golang.org/)** - Core application logic\n- **[Wails v2](https://wails.io/)** - Desktop application framework\n- **[SQLite](https://www.sqlite.org/)** (via modernc.org/sqlite) - Local database for clip storage\n- **[golang.design/x/clipboard](https://github.com/golang-design/clipboard)** - Cross-platform clipboard access with image support\n- **Windows API** (lxn/win) - Native Windows clipboard monitoring\n\n### Frontend\n- **[React 18](https://react.dev/)** - UI framework\n- **[TypeScript](https://www.typescriptlang.org/)** - Type-safe JavaScript\n- **[Vite](https://vitejs.dev/)** - Fast build tool and dev server\n- **[Tailwind CSS](https://tailwindcss.com/)** - Utility-first CSS framework\n- **[shadcn/ui](https://ui.shadcn.com/)** - Accessible component library\n- **[GSAP](https://greensock.com/gsap/)** - Animation library\n- **[Lucide React](https://lucide.dev/)** - Icon library\n\n## Why Wails?\n\nClipcat uses Wails to:\n- Integrate native Windows clipboard APIs via Go\n- Communicate clipboard events to a React UI in real time\n- Bundle a lightweight, native-feeling desktop app without Electron\n## 🏗️ Architecture\n\nClipcat follows a clean architecture pattern with clear separation between frontend and backend:\n\n```\n┌─────────────────────────────────────────────────┐\n│                   Frontend (React)               │\n│  ┌────────────┐  ┌──────────┐  ┌──────────┐    │\n│  │  UI Layer  │  │ Context  │  │ Components│    │\n│  │  (TSX/CSS) │  │ Provider │  │  (Cards)  │    │\n│  └────────────┘  └──────────┘  └──────────┘    │\n└──────────────────────┬──────────────────────────┘\n                       │ Wails Bridge (IPC)\n┌──────────────────────┴──────────────────────────┐\n│                Backend (Go)                      │\n│  ┌────────────┐  ┌──────────┐  ┌──────────┐    │\n│  │   App.go   │  │ clips.go │  │  db.go   │    │\n│  │  (Bridge)  │  │ (Logic)  │  │(Storage) │    │\n│  └────────────┘  └──────────┘  └──────────┘    │\n└──────────────────────┬──────────────────────────┘\n                       │\n          ┌────────────┴────────────┐\n          │                         │\n    ┌─────▼─────┐          ┌────────▼────────┐\n    │  SQLite   │          │ OS Clipboard    │\n    │ Database  │          │   Listener      │\n    └───────────┘          └─────────────────┘\n```\n\n### Data Flow\n\n1. **Clipboard Monitoring**\n   - Windows clipboard listener runs in the background\n   - Detects clipboard changes via Windows API\n   - Filters out duplicate or empty content\n\n2. **Data Storage**\n   - New clips are saved to SQLite database\n   - Automatic cleanup keeps only 100 most recent clips (prioritizing pinned)\n   - Each clip stores: content, type, timestamp, and pinned status\n\n3. **Frontend Updates**\n   - Backend emits events when clipboard changes\n   - React context manages clip state\n   - UI automatically re-renders with new data\n\n4. **User Actions**\n   - Copy: Uses browser clipboard API\n   - Pin/Unpin: Toggles database flag, reorders UI\n   - Delete: Removes from database, refreshes list\n   - Search: Client-side filtering with instant results\n\n## 📂 Project Structure\n\n```\nClipcat/\n├── app.go                      # Main application entry point\n├── clips.go                    # Clip CRUD operations\n├── db.go                       # Database initialization\n├── main.go                     # Wails runtime setup\n├── go.mod                      # Go dependencies\n├── wails.json                  # Wails configuration\n├── internal/\n│   └── clipboard/\n│       └── listener_window.go  # Windows clipboard listener\n├── frontend/\n│   ├── src/\n│   │   ├── App.tsx            # Root component\n│   │   ├── components/\n│   │   │   ├── page.tsx       # Main page layout\n│   │   │   └── ui/\n│   │   │       ├── clip-card.tsx   # Individual clip card\n│   │   │       └── dialog.tsx      # Modal dialog\n│   │   ├── context/\n│   │   │   └── ClipContext.tsx     # Global state management\n│   │   ├── helpers/\n│   │   │   ├── formatTime.ts       # Date formatting\n│   │   │   └── playSound.ts        # Audio feedback\n│   │   └── types/\n│   │       └── clip.ts             # TypeScript interfaces\n│   ├── wailsjs/                    # Auto-generated Wails bindings\n│   ├── public/                     # Static assets\n│   ├── package.json\n│   └── vite.config.ts\n└── build/                          # Build configuration\n    └── windows/\n        └── installer/              # NSIS installer config\n```\n\n## 🔧 How It Works\n\n### Backend Implementation\n\n**Clipboard Monitoring** (`internal/clipboard/listener_window.go`)\n```go\n// Polls clipboard every 500ms using Windows API\n// Compares clipboard sequence numbers to detect changes\n// Invokes callback when new content is detected\n```\n\n**Database Schema** (`db.go`)\n```sql\nCREATE TABLE clips (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    content TEXT,\n    image BLOB,\n    type TEXT NOT NULL,\n    pinned BOOLEAN DEFAULT 0,\n    created_at DATETIME\n);\n\nCREATE TABLE clip_storage_limit (\n    id INTEGER PRIMARY KEY CHECK (id = 0),\n    limit_count INTEGER DEFAULT 100\n);\n```\n\n**Note:** The `content` field is nullable to support image-only clips. Either `content` or `image` will be populated based on the clip `type`.\n\n**Key Operations** (`clips.go`)\n- `getClips()` - Fetches all clips ordered by pinned status, then by date\n- `clipExists()` - Checks if content already exists to prevent duplicates (text only)\n- `addClip()` - Inserts new text clip (skips duplicates) and maintains dynamic clip limit\n- `addImageClip()` - Inserts new image clip as BLOB and maintains dynamic clip limit\n- `togglePinClip()` - Toggles pinned status by ID\n- `deleteClip()` - Removes clip from database\n- `getStorageLimit()` - Retrieves current storage limit from database\n- `updateStorageLimit()` - Updates the maximum number of clips to store\n\n### Frontend Implementation\n\n**State Management** (`ClipContext.tsx`)\n- Global state using React Context API\n- Splits clips into pinned and recent arrays\n- Listens for clipboard events from backend\n- Provides `getClips()` method for manual refresh\n\n**UI Components**\n- **ClipCard** - Individual clip with copy/pin/delete actions; displays text or image based on type\n- **Page** - Main layout with search, pinned section, recent section\n- **AboutDialog** - Modal with app information and automatic update checking\n\n**Animations** (GSAP)\n- Paper curtain reveal on startup\n- Cat character entrance\n- Info button nudge animation\n- Sound effects on interactions\n\n## Getting Started\n\n### Prerequisites\n- Go 1.24.0 or higher\n- Node.js 18+ and npm\n- Wails CLI: `go install github.com/wailsapp/wails/v2/cmd/wails@latest`\n\n### Development\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/d3uceY/clipcat.git\n   cd clipcat\n   ```\n\n2. **Install dependencies**\n   ```bash\n   # Backend dependencies\n   go mod download\n   \n   # Frontend dependencies\n   cd frontend\n   npm install\n   cd ..\n   ```\n\n3. **Run in development mode**\n   ```bash\n   wails dev\n   ```\n\n   The app will launch with hot-reload enabled for both frontend and backend.\n\n### Building\n\n**Development Build**\n```bash\nwails build\n```\n\n**Production Build with NSIS Installer (Windows)**\n```bash\nwails build -nsis\n```\n\nThe built application will be in `build/bin/`.\n\n## 📝 Database Location\n\nClips are stored in a SQLite database at:\n```\nWindows: %APPDATA%\\clipussy\\db\\gyatt.db\n```\n\n## ⌨️ Keyboard Shortcuts\n\n- `Ctrl + F` - Focus search bar\n- `Ctrl + C` - Copy selected text (triggers clipboard monitoring)\n\n## 🎨 Customization\n\n### Changing Clip Limit\nThe storage limit is now dynamic and stored in the database. You can update it programmatically:\n\n**From Frontend:**\n```typescript\nimport { GetStorageLimit, UpdateStorageLimit } from './wailsjs/go/main/App'\n\n// Get current limit\nconst limit = await GetStorageLimit()\n\n// Set new limit\nawait UpdateStorageLimit(200)\n```\n\n**Or manually in the database:**\n```sql\nINSERT OR REPLACE INTO clip_storage_limit (id, limit_count) VALUES (0, 200);\n```\n\n### Adjusting Sound Volume\nEdit respective handlers in `clip-card.tsx` and `page.tsx`:\n```typescript\nplaySound(\"/sounds/file.mp3\", soundOn, 0.3)  // 0.0 to 1.0\n```\n\n### Modifying UI Colors\nEdit `frontend/src/index.css` and Tailwind classes in components.\n\n##  Contributing\n\nContributions are welcome! Feel free to submit issues and pull requests.\n\n##  Author\n\n**Onyekwelu Jesse** ([@d3uceY](https://github.com/d3uceY))\n\n##  License\n\nThis project is licensed under the MIT License.\n\n##  Acknowledgments\n\n- [Wails](https://wails.io/) for the amazing Go + Web framework\n- All open-source contributors whose libraries made this possible\n\n---\n\nMade with 💜 by d3uceY\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd3ucey%2Fclipcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fd3ucey%2Fclipcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd3ucey%2Fclipcat/lists"}