At a glance
- 22 content types recognised on copy: plain text, rich text, code, JSON, HTML, CSS, passwords, numbers, payment cards, phone numbers, encoded strings (JWT, Base64, URL), images, documents, spreadsheets, links, emails, colours, video, audio, files, folders and Figma content.
- The preview changes with the type: an email offers masking, a colour offers ten formats, an image offers the text inside it.
- Plain pattern rules, no model: no cloud call, no account, no API key.
- Payment cards pass a Luhn check across 13 to 19 digits before they count as a card.
- Passwords need a digit, letters, and either mixed case or a strict special character.
How the rules run
The order of the rules is what makes this usable. A piece of text is tested as a file path first, then a colour, an email, a link, a card, a number, a password, and only then as code. A copied card number reaches the card rule before the number rule, so you are offered masking instead of thousands separators.
Images and rich text settle earlier, from the pasteboard itself rather than from the characters. A screenshot counts as an image because macOS says so, and a spreadsheet is a spreadsheet because of its file extension.
Detection costs nothing you can feel. There is no queue, no upload, and no model to wake up, so the type is decided before you let go of ⌘C. Klipto began on Maccy's open-source core and has gone its own way since. The type system is one of the parts that is entirely ours.
Each type carries its own chips in the preview, and nothing else competes for the space.
| You copied | What the preview offers |
|---|---|
| Colour in HEX, RGB, HSL, SwiftUI, UIColor, CSS variable or Tailwind | Round-trip to any of ten formats |
| Link | Domain, path, strip parameters, decode, Markdown, HTML |
| Email or phone number | Username, domain, mailto:, tel:, mask before sharing |
| Payment card | Mask to the last four digits, group by four, remove spaces |
| JSON, HTML, CSS, code | Pretty-print, minify, strip tags, list keys, whitespace cleanup |
| Number | Thousands separators, compact form, hex, binary, byte size |
| Encoded string | Decode a JWT, Base64, or a URL-encoded value |
| Image | Recognise the text inside it and paste that instead |
| Plain or rich text | Case styles, the cleanup stack, paste without formatting |
The privacy side of knowing the type
Masking exists because detection exists. A card, an email address and a phone number are the three things people paste into a Slack channel and regret ten seconds later. Klipto spots them and puts a mask one tap away, before anything reaches the paste target.
Passwords are detected for a different reason. A string with a digit, letters and mixed case reads as a password, which keeps it out of chips where it has no business being. There is also a setting under Settings then General that excludes password-manager copies from history. It is available rather than on by default, so turn it on yourself.
Where the guessing shows
Rules are honest about being rules. A 16-digit order number that happens to satisfy Luhn will be read as a card, and a short random-looking string with a digit and a capital will be read as a password. Neither costs you anything, because the type only decides which chips appear. Your clip is untouched until you tap one.
The wider limitation is simple. Detection tells you what the characters look like, not what you meant by them. PowerToys Advanced Paste on Windows uses a model to close that gap and pays with an API key and a round trip. My advice is to take the smaller, faster promise.