clippa 1.0.5 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Ivan Dovhosheia
3
+ Copyright (c) 2026 Clippa contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -5,7 +5,14 @@
5
5
  <h1 align="center">Clippa</h1>
6
6
 
7
7
  <p align="center">
8
- A small, private macOS clipboard app built around one shortcut: press Command-Shift-V, choose a clip, paste.
8
+ Private, keyboard-first clipboard history for macOS.
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://github.com/Vaniawl/Clippa/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/Vaniawl/Clippa/ci.yml?branch=main&style=flat-square"></a>
13
+ <a href="https://github.com/Vaniawl/Clippa/releases/latest"><img alt="Latest release" src="https://img.shields.io/github/v/release/Vaniawl/Clippa?style=flat-square"></a>
14
+ <img alt="macOS 26+" src="https://img.shields.io/badge/macOS-26%2B-111111?style=flat-square">
15
+ <a href="LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/license-MIT-087f78?style=flat-square"></a>
9
16
  </p>
10
17
 
11
18
  <p align="center">
@@ -14,6 +21,8 @@
14
21
  <a href="https://github.com/Vaniawl/Clippa/releases">Releases</a>
15
22
  ·
16
23
  <a href="#privacy">Privacy</a>
24
+ ·
25
+ <a href="CONTRIBUTING.md">Contributing</a>
17
26
  </p>
18
27
 
19
28
  <p align="center">
@@ -22,36 +31,33 @@
22
31
 
23
32
  ## Install Clippa
24
33
 
25
- Install from npm:
34
+ Recommended:
26
35
 
27
36
  ```bash
28
- npx clippa
37
+ brew tap Vaniawl/clippa
38
+ brew install clippa
29
39
  ```
30
40
 
31
- Or install the command globally:
41
+ Update later with:
32
42
 
33
43
  ```bash
34
- npm install -g clippa
35
- clippa
44
+ brew update
45
+ brew upgrade clippa
36
46
  ```
37
47
 
38
- GitHub install is also available:
48
+ You can also install the current version directly from GitHub:
39
49
 
40
50
  ```bash
41
- npx github:Vaniawl/Clippa
51
+ npx --yes github:Vaniawl/Clippa#main
42
52
  ```
43
53
 
44
- Do not use `npx install clippa`: npm treats `install` as the package name in that command. The correct npx command is `npx clippa`.
45
-
46
54
  After it opens, grant Accessibility access when macOS asks. Clippa needs that permission only to paste the selected item into the app where your cursor is already active.
47
55
 
48
56
  Useful installer options:
49
57
 
50
58
  ```bash
51
- npx clippa -- --no-open
52
- npx clippa -- --install-dir ~/Applications
53
- npx github:Vaniawl/Clippa -- --no-open
54
- npx github:Vaniawl/Clippa -- --install-dir ~/Applications
59
+ npx --yes github:Vaniawl/Clippa#main --no-open
60
+ npx --yes github:Vaniawl/Clippa#main --install-dir ~/Applications
55
61
  ```
56
62
 
57
63
  You can also download `Clippa.app.zip` from the latest GitHub release, unzip it, move `Clippa.app` to `/Applications`, and open it.
@@ -59,17 +65,24 @@ You can also download `Clippa.app.zip` from the latest GitHub release, unzip it,
59
65
  ## How It Works
60
66
 
61
67
  - Runs quietly in the background as a menu-bar app.
62
- - Press `Command-Shift-V` while your cursor is in a text field.
68
+ - Press `Command-Shift-V` anywhere to open clipboard history.
63
69
  - Use `Up` / `Down` to choose a clipboard item.
70
+ - Use `Left` / `Right` to switch between clipboard filters.
71
+ - Press `Command-P` to pin or unpin the selected item.
64
72
  - Press `Enter` or click an item to paste it.
73
+ - Keeps the newest copied item at the top and shows pinned items only in the Pinned filter.
74
+ - Optionally adds one space after pasted text or links.
75
+ - Use the context menu to copy, pin, delete, open, or Quick Look an item.
76
+ - Drag text, links, images, and files directly into other apps.
65
77
  - Press `Esc` or click outside the panel to close it.
66
78
  - Stores recent text, links, images, and file references locally on your Mac.
79
+ - Supports configurable retention, history limits, excluded apps, and Launch at Login.
67
80
 
68
81
  ## Privacy
69
82
 
70
83
  Clippa does not upload clipboard contents, does not use analytics, and does not require an account. Clipboard history is stored only on your Mac and encrypted locally with a per-user AES-GCM key file in Application Support. Clippa does not read or write Keychain items at startup, so locally signed reinstall builds do not trigger Keychain password prompts.
71
84
 
72
- Accessibility permission is only used to confirm there is an editable field under the cursor and to paste the selected clip into that frontmost app.
85
+ Accessibility permission is only used to restore focus and paste the selected clip into the app that was active before Clippa opened. If automatic paste is unavailable, Clippa keeps the item on the system clipboard and shows a direct link to the required permission.
73
86
 
74
87
  ## Requirements
75
88
 
@@ -91,15 +104,6 @@ The packaged app is written to:
91
104
  outputs/Clippa.app.zip
92
105
  ```
93
106
 
94
- ## npm Publish
95
-
96
- The npm installer package is prepared as `clippa`. Publishing to npm requires an authenticated npm session:
97
-
98
- ```bash
99
- npm adduser
100
- npm publish --access public
101
- ```
102
-
103
107
  ## Update From Git
104
108
 
105
109
  For an existing checkout:
@@ -110,7 +114,7 @@ git pull origin main
110
114
 
111
115
  ## Production Notes
112
116
 
113
- - Bundle identifier: `com.ivandovhosheia.Clippa`
114
- - Version: `1.0.0`
117
+ - Bundle identifier: `app.clippa.Clippa`
118
+ - Version: `1.0.11`
115
119
  - Release builds use hardened runtime.
116
- - Recent history is limited to 100 active items and stored only on this Mac.
120
+ - History retention and item limits are configurable; the default is 100 items for one week.
@@ -7,10 +7,10 @@ const path = require("node:path");
7
7
  const https = require("node:https");
8
8
 
9
9
  const appName = "Clippa";
10
- const bundleIdentifier = "com.ivandovhosheia.Clippa";
10
+ const bundleIdentifiers = ["app.clippa.Clippa", "io.github.vaniawl.Clippa", "com.ivandovhosheia.Clippa"];
11
11
  const localZipPath = path.resolve(__dirname, "../outputs/Clippa.app.zip");
12
12
  const packageJson = require("../package.json");
13
- const defaultZipUrl = "https://github.com/Vaniawl/Clippa/releases/download/v1.0.5/Clippa.app.zip";
13
+ const defaultZipUrl = "https://github.com/Vaniawl/Clippa/releases/download/v1.0.11/Clippa.app.zip";
14
14
  const zipUrl = process.env.CLIPPA_ZIP_URL || defaultZipUrl;
15
15
 
16
16
  function usage() {
@@ -116,18 +116,21 @@ function copyApp(source, destination) {
116
116
  }
117
117
 
118
118
  function quitRunningApp() {
119
- try {
120
- run("/usr/bin/osascript", ["-e", `tell application id "${bundleIdentifier}" to quit`], {
121
- stdio: "ignore",
122
- timeout: 3000
123
- });
124
- } catch {
119
+ for (const bundleIdentifier of bundleIdentifiers) {
125
120
  try {
126
- run("/usr/bin/killall", [appName], { stdio: "ignore", timeout: 3000 });
121
+ run("/usr/bin/osascript", ["-e", `tell application id "${bundleIdentifier}" to quit`], {
122
+ stdio: "ignore",
123
+ timeout: 3000
124
+ });
127
125
  } catch {
128
- // The app may not be running yet.
126
+ // The app may not be registered with this bundle identifier.
129
127
  }
130
128
  }
129
+ try {
130
+ run("/usr/bin/killall", [appName], { stdio: "ignore", timeout: 3000 });
131
+ } catch {
132
+ // The app may not be running yet.
133
+ }
131
134
  }
132
135
 
133
136
  async function main() {
Binary file
@@ -1,39 +1,65 @@
1
- <svg width="1440" height="900" viewBox="0 0 1440 900" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="1440" height="900" fill="#111414"/>
3
- <rect x="340" y="164" width="760" height="520" rx="30" fill="#181C1D"/>
4
- <rect x="340.5" y="164.5" width="759" height="519" rx="29.5" stroke="#3A4242"/>
5
- <filter id="shadow" x="300" y="124" width="840" height="600" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse">
6
- <feDropShadow dx="0" dy="26" stdDeviation="28" flood-color="#000000" flood-opacity=".34"/>
1
+ <svg width="1600" height="900" viewBox="0 0 1600 900" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="1600" height="900" fill="#0E1011"/>
3
+ <filter id="shadow" x="535" y="90" width="1030" height="700" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse">
4
+ <feDropShadow dx="0" dy="34" stdDeviation="38" flood-color="#000000" flood-opacity=".52"/>
7
5
  </filter>
8
6
  <g filter="url(#shadow)">
9
- <rect x="340" y="164" width="760" height="520" rx="30" fill="#181C1D"/>
10
- <rect x="340.5" y="164.5" width="759" height="519" rx="29.5" stroke="#3A4242"/>
7
+ <rect x="610" y="150" width="850" height="560" rx="34" fill="#202223" fill-opacity=".94"/>
8
+ <rect x="610.5" y="150.5" width="849" height="559" rx="33.5" stroke="#FFFFFF" stroke-opacity=".14"/>
11
9
  </g>
12
- <circle cx="388" cy="221" r="24" fill="#0A84FF"/>
13
- <path d="M379 230l29-29a10 10 0 0 1 14 14l-32 32a17 17 0 0 1-24-24l31-31" stroke="#06131F" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
14
- <text x="430" y="215" fill="#F4F7F5" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="25" font-weight="760">Clippa</text>
15
- <text x="430" y="244" fill="#9BA6A2" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="16" font-weight="620">4 Items</text>
16
- <line x1="380" y1="282" x2="1060" y2="282" stroke="#303838"/>
17
- <rect x="380" y="314" width="680" height="72" rx="14" fill="#12365B"/>
18
- <rect x="380.5" y="314.5" width="679" height="71" rx="13.5" stroke="#0A84FF" stroke-opacity=".62"/>
19
- <rect x="402" y="330" width="42" height="42" rx="10" fill="#20364F"/>
20
- <path d="M414 361h20M414 351h25M414 341h18" stroke="#B6C2C9" stroke-width="4" stroke-linecap="round"/>
21
- <text x="464" y="346" fill="#F5F8F6" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="21" font-weight="720">Release checklist</text>
22
- <text x="464" y="371" fill="#B1BEC8" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="610">Text / Notes</text>
23
- <rect x="380" y="398" width="680" height="72" rx="14" fill="#202526"/>
24
- <rect x="402" y="414" width="42" height="42" rx="10" fill="#143C38"/>
25
- <path d="M413 447l14-17 10 12 6-7 13 17h-43v-5z" fill="#64D2C8"/>
26
- <text x="464" y="430" fill="#F5F8F6" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="21" font-weight="720">Clipboard image</text>
27
- <text x="464" y="455" fill="#98A4A0" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="610">1280 x 720 / 482 KB / Preview</text>
28
- <rect x="380" y="482" width="680" height="72" rx="14" fill="#202526"/>
29
- <rect x="402" y="498" width="42" height="42" rx="10" fill="#223B58"/>
30
- <path d="M413 522c7-9 13-9 20 0s13 9 20 0" stroke="#8EC5FF" stroke-width="5" stroke-linecap="round"/>
31
- <text x="464" y="514" fill="#F5F8F6" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="21" font-weight="720">https://example.com/research</text>
32
- <text x="464" y="539" fill="#98A4A0" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="610">URL / Safari</text>
33
- <rect x="380" y="566" width="680" height="72" rx="14" fill="#202526"/>
34
- <rect x="402" y="582" width="42" height="42" rx="10" fill="#3A3324"/>
35
- <path d="M414 595h18l8 8v20h-26v-28z" stroke="#FFD479" stroke-width="4" stroke-linejoin="round"/>
36
- <text x="464" y="598" fill="#F5F8F6" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="21" font-weight="720">invoice.pdf</text>
37
- <text x="464" y="623" fill="#98A4A0" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="610">File / Finder</text>
38
- <text x="380" y="724" fill="#75817D" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="650">Command-Shift-V opens Clippa. Enter or click pastes the selected item.</text>
10
+
11
+ <image href="app-icon.png" x="650" y="188" width="46" height="46"/>
12
+ <text x="714" y="207" fill="#F5F5F3" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="25" font-weight="700">Clippa</text>
13
+ <text x="714" y="231" fill="#A2A6A5" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="500">4 Items</text>
14
+ <rect x="1328" y="197" width="84" height="28" rx="14" fill="#0A84FF" fill-opacity=".14"/>
15
+ <path d="M1344 211l4-5 4 5v6h-8v-6z" fill="#6DB8FF"/>
16
+ <text x="1360" y="216" fill="#6DB8FF" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="14" font-weight="650">2</text>
17
+
18
+ <rect x="650" y="255" width="762" height="42" rx="11" fill="#FFFFFF" fill-opacity=".07"/>
19
+ <circle cx="671" cy="276" r="6" stroke="#9DA3A2" stroke-width="2"/>
20
+ <path d="M676 281l5 5" stroke="#9DA3A2" stroke-width="2" stroke-linecap="round"/>
21
+ <text x="693" y="281" fill="#929897" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15">Search clipboard</text>
22
+
23
+ <g font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13" font-weight="600">
24
+ <rect x="650" y="314" width="70" height="30" rx="15" fill="#0A84FF"/>
25
+ <text x="674" y="334" fill="white">All</text>
26
+ <rect x="729" y="314" width="90" height="30" rx="15" fill="#FFFFFF" fill-opacity=".07"/>
27
+ <text x="749" y="334" fill="#D6D9D8">Pinned</text>
28
+ <rect x="828" y="314" width="75" height="30" rx="15" fill="#FFFFFF" fill-opacity=".07"/>
29
+ <text x="849" y="334" fill="#D6D9D8">Text</text>
30
+ <rect x="912" y="314" width="78" height="30" rx="15" fill="#FFFFFF" fill-opacity=".07"/>
31
+ <text x="932" y="334" fill="#D6D9D8">Links</text>
32
+ <rect x="999" y="314" width="90" height="30" rx="15" fill="#FFFFFF" fill-opacity=".07"/>
33
+ <text x="1018" y="334" fill="#D6D9D8">Images</text>
34
+ <rect x="1098" y="314" width="76" height="30" rx="15" fill="#FFFFFF" fill-opacity=".07"/>
35
+ <text x="1119" y="334" fill="#D6D9D8">Files</text>
36
+ </g>
37
+
38
+ <rect x="650" y="362" width="762" height="68" rx="13" fill="#0A84FF" fill-opacity=".15"/>
39
+ <rect x="650.5" y="362.5" width="761" height="67" rx="12.5" stroke="#0A84FF" stroke-opacity=".34"/>
40
+ <rect x="663" y="375" width="42" height="42" rx="9" fill="#FFFFFF" fill-opacity=".08"/>
41
+ <path d="M674 403h20M674 393h24M674 383h17" stroke="#E6E8E7" stroke-width="3" stroke-linecap="round"/>
42
+ <text x="720" y="391" fill="#F7F8F7" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="650">Release checklist</text>
43
+ <text x="720" y="414" fill="#AAB0AE" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">Text · Notes · now</text>
44
+ <text x="1380" y="402" fill="#9AA09E" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="17">↵</text>
45
+
46
+ <rect x="650" y="438" width="762" height="68" rx="13" fill="#FFFFFF" fill-opacity=".035"/>
47
+ <rect x="663" y="451" width="42" height="42" rx="9" fill="#64D2C8" fill-opacity=".12"/>
48
+ <path d="M674 482l11-13 8 9 5-5 8 12h-32v-3z" fill="#64D2C8"/>
49
+ <text x="720" y="467" fill="#F7F8F7" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="650">Clipboard image</text>
50
+ <text x="720" y="490" fill="#AAB0AE" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">Image · 1280 × 720 · Preview</text>
51
+
52
+ <rect x="650" y="514" width="762" height="68" rx="13" fill="#FFFFFF" fill-opacity=".035"/>
53
+ <rect x="663" y="527" width="42" height="42" rx="9" fill="#0A84FF" fill-opacity=".12"/>
54
+ <path d="M674 549c5-7 10-7 15 0s10 7 15 0" stroke="#69B4FF" stroke-width="4" stroke-linecap="round"/>
55
+ <text x="720" y="543" fill="#F7F8F7" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="650">https://example.com/research</text>
56
+ <text x="720" y="566" fill="#AAB0AE" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">URL · Safari · 2 min ago</text>
57
+
58
+ <rect x="650" y="590" width="762" height="68" rx="13" fill="#FFFFFF" fill-opacity=".035"/>
59
+ <rect x="663" y="603" width="42" height="42" rx="9" fill="#FFCC66" fill-opacity=".12"/>
60
+ <path d="M675 611h17l8 8v18h-25v-26z" stroke="#FFD479" stroke-width="3" stroke-linejoin="round"/>
61
+ <text x="720" y="619" fill="#F7F8F7" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="650">invoice.pdf</text>
62
+ <text x="720" y="642" fill="#AAB0AE" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">File · Finder · yesterday</text>
63
+
64
+ <text x="610" y="772" fill="#7F8583" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="16" font-weight="600">⇧⌘V to open · ↑↓ to select · ←→ to filter · Return to paste</text>
39
65
  </svg>
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "clippa",
3
- "version": "1.0.5",
4
- "description": "Installer for Clippa, a private macOS paste panel.",
3
+ "version": "1.0.11",
4
+ "description": "Installer for Clippa, a private keyboard-first clipboard history app for macOS.",
5
5
  "bin": {
6
6
  "install-clippa": "bin/install-clippa.js",
7
7
  "clippa": "bin/install-clippa.js"
@@ -28,6 +28,9 @@
28
28
  "keywords": [
29
29
  "macos",
30
30
  "clipboard",
31
+ "clipboard-manager",
32
+ "clipboard-history",
33
+ "privacy",
31
34
  "swiftui",
32
35
  "productivity"
33
36
  ],