Nori
I built clipboard-history apps for macOS and Windows. Text, images and files retain their own previews and actions, while hints in the interface show how modifier keys and permissions affect each action.
The project
The app presents text, links, code, colors, images and files as cards suited to each type. A keyboard-driven flow opens the history, searches it and pastes into the app that was just in use.
The macOS version uses SwiftUI, AppKit and SwiftData; the Windows version is a separate C# and WPF implementation. They share the design of classification, privacy and search rules as well as the interface.
How it works
Identify the copied content
The app receives copied content, identifies types such as text or images, and checks for do-not-store markers and signs of secret content.
Choose where it can stay
Ordinary copies go into local history; detected secrets are masked and kept only in memory, while do-not-store items are excluded.
Choose a card and use it
Type-specific cards let you review an item, then paste it into the previously active app or copy it.
Clipboard data is captured as a snapshot before storage, then classified by a pure function that applies privacy rules. Do-not-store markers take priority, and content detected as secret is masked and kept only in memory.
Key handling and on-screen hints use the same decision function. On macOS, the panel leaves the source app active; on Windows, the app remembers the original window and restores focus before pasting.
What the records show
The classification tests cover ordering and multi-file copies. Hints and actions come from the same rules, keeping modifier-key and permission differences visible in the interface.
Demo data and screenshot tooling support GUI checks without touching real history. The Windows version can also capture its display states in CI.
- macOS change-check interval
- 200 ms
- Retention of detected secrets
- 10 min in memory
What this covers
On macOS, ordinary history is stored locally without encryption. Automatic pasting requires Accessibility permission; without it, the action becomes Copy.
