Pro koho CopyForge je
Vývojáři žonglující s úryvky kódu, tokeny a hesly. Copywriteři přesouvající bloky
textu mezi dokumenty. Designéři kopírující barvy a hodnoty mezi nástroji. Kdokoli,
kdo během dne kopíruje a vkládá natolik často, že stará verze ze schránky ztrácí
cenu rychleji, než ji stihne použít.
CopyForge ukládá vše, co zkopírujete — text, obrázky, formátovaný
text — a udržuje to organizované, prohledatelné a (volitelně) zašifrované. Jeden
shortcut otevře plovoucí panel, kde najdete cokoliv, co jste kdy zkopírovali.
Klíčové funkce
Historie schránky
Tichý monitor v pozadí ukládá každou změnu. Procházejte historii v plovoucím
panelu, fulltextově vyhledávejte, filtrujte podle typu (text / obrázek / odkaz /
kód). Klikem na položku ji zkopírujete zpět. Důležité klipy lze připnout, aby
zůstaly nahoře.
Chytré akce
Jedním klikem převedete text na velká/malá písmena, odstraníte diakritiku,
ořežete mezery, vyčistíte formátování, naformátujete JSON, vytáhnete URL nebo
e-maily z libovolného textu. Pravým klikem na klip se otevře nabídka akcí.
AES-256-GCM šifrování
Volitelné šifrování všech klipů s klíčem v macOS Klíčence — klíč nikdy neopustí
Mac. Zapnutí/vypnutí šifrování spustí transparentní migraci existujících klipů
bez ztráty dat. CryptoKit + Authenticated Encryption with Associated Data.
Snippety + pracovní prostory
Snippety s dynamickými proměnnými (datum, čas) pro často používané texty. Klipy
organizovatelné do pracovních prostorů (Default / Work / Private) — každý
prostor má vlastní nezávislou historii.
Architektura
CopyForge je MVVM aplikace bez externích dependencies. Jen Apple
frameworky — SwiftUI, AppKit, Core Data, CryptoKit. Žádný SwiftPM, žádný CocoaPods.
Důvod: pro security-aware aplikaci, která manipuluje s clipboardem a šifrovacími
klíči, je každá třetí strana riziko a každý update potenciální problém. Audit
bezpečnosti je triviální, když má kód jediný kořen.
Vrstvy
- App — entry point, AppDelegate s NSStatusItem (menubar ikona) a NSPopover (plovoucí panel)
- Models — Core Data model s
codeGenerationType="class" (Xcode generuje NSManagedObject subclasses)
- ViewModels —
ClipboardViewModel, SettingsViewModel, SnippetsViewModel jako ObservableObject
- Views — SwiftUI views vázané přes
@EnvironmentObject
- Services —
ClipboardMonitor, PrivacyGuard, HotkeyManager, Persistence, EncryptionService
Klíčové technické výzvy
1. Polling clipboardu bez deadlocku
macOS nemá callback API pro změnu clipboardu — musí se polovat. ClipboardMonitor
čte NSPasteboard.general.changeCount každých 0,7 sekundy
(kompromis mezi reaktivitou a CPU). Když se změní:
- Načte
public.utf8-plain-text nebo obrázek z pasteboardu
- Projde
PrivacyGuard regex filtry (např. nezachytávat hesla z 1Password)
- Deduplikuje proti poslední položce
- Uloží do Core Data a vynutí limit historie
Když CopyForge zkopíruje položku zpět do clipboardu (na klik nebo Enter), monitor
se na 1 sekundu pauzuje, aby si nezachytil vlastní zápis. Bez toho
by vznikl loop a duplicitní položky.
2. Privacy Guard — nezachytávat hesla
1Password, KeePassXC a další password managery při copy nastaví do pasteboardu
speciální type indicator (org.nspasteboard.ConcealedType,
com.agilebits.onepassword). PrivacyGuard tyto typy
detekuje a clip ignoruje. Doplněno regex filtry pro zjevně senzitivní obsah
(kreditní karty, JWT tokeny, AWS access keys).
3. Šifrovací migrace bez ztráty dat
Při zapnutí šifrování existují všechny klipy plain-text v Core Data. Migrace probíhá
v background context: každý klip se zašifruje, uloží do nového sloupce,
staré sloupce se vyčistí. Probíhá v transakci — při crashi v polovině je stav buď
úplně plain, nebo úplně šifrovaný, nikdy mix. Klíč v Klíčence je generovaný
SymmetricKey(size: .bits256) a uložen pod accessible
WhenUnlockedThisDeviceOnly — nesynchronizuje se přes iCloud Keychain.
4. Clipboard image deduplikace
Obrázek 4 MB z prohlížeče zkopírovaný 3× za minutu by zaplnil databázi. Hash obrázku
(SHA-256) v dedicated indexu zajišťuje, že identický obrázek se uloží jen jednou,
pouze se updatuje timestamp. Pro pixel-podobné, ale ne identické obrázky (např. po
recompresi) ponecháváme separátně — dedup by byl nákladný a chybový.
UX rozhodnutí
- NSPopover, ne plné okno — panel se otevírá nad aktuální aplikací, vkládá rychle, mizí při Escape
- Klávesová navigace standardní — Up/Down listem, Enter pro paste, Esc pro zavřít, Cmd+F pro fokus search
- Globální hotkey přes
NSEvent.addGlobalMonitorForEvents — výchozí Cmd+Shift+V, konfigurovatelné
- Tmavý a světlý režim automaticky podle systému
Co si z projektu odnášíme
CopyForge byl rigorózní cvičení v nulové třetí straně. Bez
CocoaPods, bez SwiftPM, bez Sentry, bez analytics. Audit kódu zabere odpoledne. Přesně
tak, jak má aplikace, která vidí každé heslo a každý token, vypadat. Tento přístup
přebíráme i do zákaznických projektů, kde má klient bezpečnostní požadavky — finance,
zdravotnictví, vládní sektor. Kde to nedává smysl (běžné aplikace), zůstáváme
u SwiftPM a normálních dependencies.