GitHub – jtvargas/SnipKey


iOS 17+
Swift
SwiftUI
License: MIT
App Store

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.


Bypass Copy/Paste Restrictions

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

Sensitive Information (with Biometric Lock)

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:

What stays on your device

  • 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 third-party data sharing

  • 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

Keyboard extension & Full Access

  • 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)
  1. Clone the repository

    git clone https://github.com/jtvargas/SnipKey.git
    cd SnipKey
  2. Open the project

  3. Select the scheme and destination

    • Scheme: SnipKey
    • Destination: any iOS 17+ simulator or your device
  4. Build and run (Cmd + R)

  • Code Signing: The project’s DEVELOPMENT_TEAM is intentionally left blank. Before building on a physical device, open the project in Xcode, go to Signing & Capabilities for both the SnipKey and SnipKeyboard targets, 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 from the command line

# 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.

  1. Fork the repository

  2. Create a branch for your feature or fix

    git checkout -b feature/your-feature-name
  3. Make your changes following the existing code style (see AGENTS.md for detailed conventions)

  4. Test your changes — run the app on a simulator, verify the keyboard extension works

  5. 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.

Phase 1 — Full QWERTY Keyboard

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.

Phase 2 — Slash Commands for Quick Snippet Access

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 /addr would 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"

Phase 3 — Emoji Shortcodes

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 :heart would 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! 🚀"

How to Contribute to the Roadmap

All three phases are open for contribution. If you’re interested in working on any of these:

  1. Check the GitHub Issues for existing tasks or discussions
  2. Submit ideas or vote on features at snipkey.canny.io
  3. 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.



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *