SnipKey is a native iOS app that lets you save text snippets, URLs, images, and PDFs — then paste them anywhere using a custom keyboard. No more retyping. No more switching apps to copy something. Just tap and type.
Built with SwiftUI and SwiftData, SnipKey is designed to be fast, private, and simple. Your data stays on your device (with optional iCloud sync through Apple’s own CloudKit), and nothing is ever shared with third parties. No analytics. No tracking. No ads.
The app is completely free to use. Optional tips are available if you’d like to support ongoing development.
We all have text we type over and over — email addresses, phone numbers, canned replies, code snippets, addresses, URLs. Copying and pasting works most of the time, but it breaks when:
- An app blocks paste in its text fields
- You need to switch between apps just to grab a piece of text
- You’re filling out the same form fields repeatedly
- You want quick access to dozens of snippets without a clipboard manager cluttering your workflow
SnipKey solves all of this with a custom keyboard that sits right where you type. Your snippets are always one tap away, in any app, in any text field.
Some apps and websites intentionally disable paste in their text fields (banking apps, exam portals, certain forms). Because SnipKey works as a keyboard extension, it injects text directly into the input field character by character — the same way you’d type it manually. This means it works in fields where paste is blocked, giving you a way to enter your saved content without retyping it.
Save the things you type every day and access them instantly:
- Email signatures and sign-off templates
- Addresses — home, work, shipping
- Phone numbers, IDs, account numbers
- Canned responses for customer support, sales, or social media
- Standard replies — “Thanks for reaching out!”, “I’ll get back to you shortly”
- Paste code snippets, API keys, config values, or terminal commands
- Quick access to regex patterns, SQL queries, or boilerplate code
- Store environment variables or connection strings you use across projects
Stop retyping the same information across apps:
- Job applications (cover letter paragraphs, skills lists)
- Medical forms (medications, allergies, insurance info)
- E-commerce checkouts (shipping details, discount codes)
- Government/banking forms (ID numbers, tax info)
- Social media bios, hashtag sets, or link-in-bio URLs
- Email templates for outreach, follow-ups, or newsletters
- Markdown snippets for documentation or blog posts
Mark any snippet as secure and it will require FaceID or TouchID before it can be viewed or pasted:
- Recovery codes, backup keys
- Confidential notes
- Private reference numbers
| Feature | Description |
|---|---|
| Custom Keyboard | Access all your snippets from any app via a dedicated keyboard extension |
| 4 Snippet Types | Save text, URLs, images, and PDFs |
| Tag System | Organize snippets with custom tags, each with its own name, SF Symbol icon, and color |
| Biometric Security | Lock sensitive snippets behind FaceID or TouchID |
| iCloud Sync | Sync across all your devices via Apple’s CloudKit |
| Bulk Creation | Paste a list of items to create multiple snippets at once |
| Search & Filter | Full-text search across titles, content, and tags with tag-based filtering |
| Configurable Paste Action | Choose what happens after pasting: return, space, switch keyboard, or nothing |
| Usage Tracking | See when and how often each snippet is used; sort by recently used |
| Dark Mode | System, light, or dark appearance |
| Onboarding | Guided setup walkthrough to get the keyboard enabled quickly |
| Free Forever | No subscriptions, no ads, no paywalls — optional tips to support development |
Privacy is the core principle behind SnipKey. Here’s exactly what happens with your data:
- All snippet data (text, URLs, images, PDFs) is stored locally using Apple’s SwiftData framework
- Tags, settings, and preferences are stored locally
- Nothing is uploaded to any server we own or operate
- If you’re signed into iCloud, snippets sync across your devices using Apple’s CloudKit
- This is Apple’s own infrastructure — your data goes from your device to your iCloud account and nowhere else
- We have zero access to your iCloud data
- No analytics SDKs — we don’t track what you do in the app
- No crash reporting services — no Crashlytics, no Sentry, nothing
- No advertising SDKs — no ads, ever
- No personal data from your snippets is shared with any third party
- The only third-party SDK is RevenueCat, used solely to process optional tips — it does not access your snippets or any personal content
- The keyboard extension can work without Full Access for text snippets
- Full Access is only needed if you want to paste images or PDFs (which requires clipboard access)
- Even with Full Access enabled, no data is transmitted anywhere — it’s used only for local clipboard operations
- Apple requires showing the “Full Access” prompt for any keyboard that interacts with the clipboard; this is an iOS requirement, not a choice to collect data
- Snippets marked as secure require FaceID or TouchID to view or paste
- Authentication is handled entirely by Apple’s LocalAuthentication framework on-device
Screenshots coming soon.
| Technology | Purpose |
|---|---|
| SwiftUI | User interface |
| SwiftData | Local data persistence |
| CloudKit | iCloud sync |
| LocalAuthentication | FaceID / TouchID |
| TipKit | In-app tips and onboarding hints |
| RevenueCat | Optional tip jar (in-app purchases) |
| IBM Plex Mono | Custom monospace font |
SnipKey/
├── SnipKeyApp.swift # App entry point (@main)
├── SnipKeyDataManager.swift # Shared SwiftData ModelContainer
├── Core/
│ └── Colors.swift # Color extensions (system colors + hex)
├── Components/
│ ├── AboutApp.swift # Developer bio / about screen
│ ├── TipDevView.swift # Tip jar UI (RevenueCat)
│ ├── TagColorPicker.swift # Color palette picker for tags
│ ├── TagColorIndicator.swift # Colored circle tag indicator
│ ├── MorphingSymbolView.swift # Animated SF Symbol transitions
│ ├── StaggeredImagesList.swift # Overlapping card-style media gallery
│ └── LoopVideoView.swift # Looping video player
├── Helper/
│ ├── Biometrics.swift # FaceID / TouchID authentication
│ ├── Keyboard.swift # Keyboard utilities (clipboard, extension detection)
│ ├── RevenueCatManager.swift # RevenueCat singleton manager
│ ├── AppIconProvider.swift # App icon name resolver
│ ├── Views.swift # View extensions (hideKeyboard, limitText, pressable)
│ └── Strings.swift # String extensions (HMAC, URL validation)
├── Tips/
│ └── HomeTips.swift # TipKit definitions
└── Features/
├── Home/View/
│ ├── HomeView2.swift # Primary home view (TabView: Snippets/Settings/Search)
│ ├── SearchView.swift # Search with tag browser
│ └── HomeSnippetList.swift # Snippet list component
├── Snippets/
│ ├── SnippetModel.swift # SwiftData models (SnippetItem, SnipTag, SnippetFile)
│ ├── SnippetViewModel.swift # Snippet CRUD operations
│ └── Views/
│ ├── SnippetForm.swift # Create/edit form (single + bulk)
│ ├── SnippetViewDetail.swift # Detail view with biometric lock
│ ├── SnippetListItem.swift # List row + keyboard grid item
│ ├── SnippetTagForm.swift # Tag selection + batch assignment
│ ├── EditTagView.swift # Edit tag (name, icon, color)
│ ├── TagsView.swift # Tags management list
│ ├── SnippetContentForm.swift # Dynamic content editor
│ ├── SnippetContentViewDisplay.swift # Content display renderer
│ ├── SnippetFilesView.swift # Image gallery (masonry grid)
│ ├── SnippetListEmpty.swift # Empty state with typewriter animation
│ ├── KeyboardStatusView.swift # Keyboard setup status
│ └── ArrowSVG.swift # Decorative arrow shape
├── Settings/
│ ├── Model/SettingsModel.swift # Settings data model + enums
│ ├── ViewModel/SettingsViewModel.swift # Settings logic
│ └── Views/SettingsView.swift # Settings screen
├── Subscription/Views/
│ └── SubscriptionView.swift # Free app info screen
└── OnBoarding/
├── OnBoardingModel.swift # Boarding item struct
├── Model/Page.swift # 5-page onboarding model
└── Views/
├── OnBoardingView.swift # Feature list onboarding
├── OnboardingStepperView.swift # Animated welcome walkthrough
├── WelcomeView.swift # Tab-style welcome cards
├── BoardingCardView.swift # Individual boarding card
├── Splashscreen.swift # Splash screen
└── KeyboardHelpGuideView.swift # Keyboard setup guide
SnipKeyboard/ # Keyboard Extension Target
├── KeyboardViewController.swift # UIInputViewController
├── KeyboardView.swift # SwiftUI keyboard UI
├── SnipKeyboard.entitlements # Extension entitlements
└── Info.plist # Extension configuration
- Xcode 15.3 or later
- iOS 17.0+ device or simulator
- An Apple Developer account (for running on a physical device)
-
Clone the repository
git clone https://github.com/jtvargas/SnipKey.git cd SnipKey -
Open the project
-
Select the scheme and destination
- Scheme:
SnipKey - Destination: any iOS 17+ simulator or your device
- Scheme:
-
Build and run (
Cmd + R)
- Code Signing: The project’s
DEVELOPMENT_TEAMis intentionally left blank. Before building on a physical device, open the project in Xcode, go to Signing & Capabilities for both theSnipKeyandSnipKeyboardtargets, and select your own development team. Simulator builds work without this step. - RevenueCat (tip jar): The tip jar feature uses a public RevenueCat API key that ships with the app. Contributors don’t need to set up their own RevenueCat account — the tips section will work as-is.
- iCloud Sync: Requires an active iCloud account. On the simulator, sign into iCloud via Settings to test sync.
- Keyboard Extension: After building, go to Settings > General > Keyboard > Keyboards > Add New Keyboard and enable SnipKey. The app includes a guided setup walkthrough.
# Build for simulator
xcodebuild -project SnipKey.xcodeproj -scheme SnipKey \
-destination 'platform=iOS Simulator,name=iPhone 15' build
# Clean build
xcodebuild -project SnipKey.xcodeproj -scheme SnipKey clean build
All dependencies are managed via Swift Package Manager and resolve automatically when you open the project.
Contributions are welcome! Whether it’s a bug fix, new feature, or documentation improvement — we appreciate your help.
-
Fork the repository
-
Create a branch for your feature or fix
git checkout -b feature/your-feature-name
-
Make your changes following the existing code style (see AGENTS.md for detailed conventions)
-
Test your changes — run the app on a simulator, verify the keyboard extension works
-
Submit a Pull Request with a clear description of what you changed and why
- Follow the MVVM architecture — models in
*Model.swift, view models in*ViewModel.swift, views in SwiftUI - Use the existing code style — see AGENTS.md for naming conventions, import order, state management patterns, and more
- Privacy first — do not add analytics, tracking, or any third-party SDK that collects user data. This is a hard rule.
- No tests exist yet — if you’d like to add tests, that’s a highly valued contribution
- Keep the keyboard extension lightweight — it runs in a constrained memory environment
Found a bug or have a feature request? You can:
SnipKey today is a snippet-only keyboard — you switch to it when you need a snippet, then switch back to your regular keyboard to keep typing. The long-term vision is to make SnipKey a full replacement keyboard that you never need to switch away from. Type normally, access your snippets inline, and never touch the globe icon again.
Think of it like Grammarly’s iOS keyboard: a complete QWERTY keyboard that works exactly like the native one, with powerful features layered on top through a suggestion bar. That’s where SnipKey is headed — but instead of grammar suggestions, the power layer is instant snippet access, slash commands, and emoji shortcodes.
The foundation for everything else. Build a complete keyboard that behaves 1:1 with the native iOS keyboard:
- All keys functional — letters, numbers, symbols, shift, caps lock, delete, return, space, globe/language switch
- Layout parity — match the native iOS key sizing, spacing, and layout for both portrait and landscape
- Haptic feedback — match the native tap-feel behavior
- Snippet toggle — a dedicated button on the keyboard bar to switch between the full QWERTY view and the snippets list, without needing to press the globe icon to change keyboards entirely
- Autocomplete bar — a suggestion bar above the keys (like the native iOS suggestion strip) that will serve as the foundation for slash commands and emoji shortcodes
Reference: The Grammarly iOS keyboard is a good model for how this should feel. It provides a full typing experience identical to the native keyboard, with Grammarly’s features accessible through a toolbar above the keys. SnipKey would follow the same pattern — full keyboard at the bottom, snippet/command features in the toolbar.
Once the full keyboard is in place, users can trigger snippets without ever leaving the typing flow:
- Type
/followed by a snippet name (e.g.,/addressHome,/emailSignature,/thankYou) to trigger inline autocomplete - Matching snippets appear in the suggestion bar above the keys as you type
- Tap a suggestion to instantly replace the slash command text with the full snippet content
- Support fuzzy matching so you don’t need to remember exact names — typing
/addrwould surface “Address – Home”, “Address – Work”, etc. - Configurable trigger character (default
/, but users could choose!,#, etc.)
Example flow:
User types: "Hi, my address is /addr"
Suggestion bar shows: [ Address - Home ] [ Address - Work ] [ Address - Shipping ]
User taps "Address - Home"
Result: "Hi, my address is 123 Main St, Apt 4B, New York, NY 10001"
Bring the developer-friendly emoji shortcode experience (familiar from Slack, Discord, and GitHub) directly into the keyboard:
- Type
:followed by an emoji name (e.g.,:smile,:thumbsup,:fire,:rocket) to trigger emoji autocomplete - Matching emojis appear in the suggestion bar above the keys
- Tap to inject the emoji character directly into the text field
- Support common shortcode conventions compatible with Slack, Discord, and GitHub naming
- Searchable — typing
:heartwould show ❤️, 💓, 😍, and other heart-related emojis
Example flow:
User types: "Great work! :rock"
Suggestion bar shows: [ :rocket: ] [ :rock: ] [ :rocking_chair: ]
User taps ":rocket:"
Result: "Great work! 🚀"
All three phases are open for contribution. If you’re interested in working on any of these:
- Check the GitHub Issues for existing tasks or discussions
- Submit ideas or vote on features at snipkey.canny.io
- Open a PR — even partial implementations (e.g., a single key row, a basic slash command parser) are welcome as building blocks
The keyboard extension lives in SnipKeyboard/ — see AGENTS.md for technical details on how the extension works, its memory constraints, and the NotificationCenter communication pattern between SwiftUI and UIKit.
This project is licensed under the MIT License — see the LICENSE file for details.
Built with care by Jonathan Taveras. No tracking. No ads. Just a useful keyboard.