Skip to content

jtvargas/SnipKey

Repository files navigation

⌨️ SnipKey — Save Time, Type Quicker

iOS 17+ Swift SwiftUI License: MIT App Store GitHub

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 and open source. Optional tips are available if you'd like to support ongoing development. View the source code, report issues, or contribute on GitHub.


Table of Contents


Why SnipKey?

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.


Use Cases

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.

Frequently Used Text

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"

Developers & Power Users

  • 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

Form Filling

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)

Content Creation

  • 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

Features

Feature Description
Custom Keyboard Access all your snippets from any app via a dedicated keyboard extension
Full QWERTY Keyboard Complete replacement keyboard with letters, numbers, symbols — no need to switch keyboards
Slash Commands Type / followed by a snippet name to trigger inline autocomplete and paste snippets without leaving the typing flow
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 & Security

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

iCloud Sync (optional)

  • 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

Biometric protection

  • Snippets marked as secure require FaceID or TouchID to view or paste
  • Authentication is handled entirely by Apple's LocalAuthentication framework on-device

Screenshots

Screenshots coming soon.


Tech Stack

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

Project Structure

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 + QWERTY state management
├── KeyboardView.swift                  # SwiftUI keyboard UI (snippet grid + QWERTY toggle)
├── SnipKeyboard.entitlements           # Extension entitlements
├── Info.plist                          # Extension configuration
└── QWERTY/                             # Full QWERTY keyboard implementation
    ├── KeyboardDimensions.swift        # Responsive key sizing from screen width
    ├── QWERTYKeyboardState.swift       # @Observable render state + input tracking
    ├── KeyboardActions.swift           # textDocumentProxy closures via SwiftUI environment
    ├── QWERTYKeyboardLayout.swift      # Static key definitions (letters/numbers/symbols)
    ├── KeyButtonView.swift             # Key rendering with UIKit touch handling
    ├── KeyRowView.swift                # Row layout with edge-aware padding
    ├── QWERTYKeyboardView.swift        # Main keyboard view + toolbar with slash suggestions
    ├── KeyPopupView.swift              # UIKit balloon popup for key press feedback
    └── SlashCommandEngine.swift        # Slash command detection, fuzzy matching, state

Getting Started

Prerequisites

  • Xcode 15.3 or later
  • iOS 17.0+ device or simulator
  • An Apple Developer account (for running on a physical device)

Setup

  1. Clone the repository

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

    open SnipKey.xcodeproj
  3. Select the scheme and destination

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

Notes

  • 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

Dependencies

All dependencies are managed via Swift Package Manager and resolve automatically when you open the project.

Package Purpose
AlertToast Toast / banner notifications
CloudKitSyncMonitor iCloud sync status indicator
Pow Animations and effects
RevenueCat In-app purchase tips (tip jar only)
SwiftUIMasonry Masonry grid layout
SymbolPicker SF Symbol picker for tags

Contributing

Contributions are welcome! Whether it's a bug fix, new feature, or documentation improvement — we appreciate your help.

How to contribute

  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

Guidelines

  • 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

Reporting Issues

Found a bug or have a feature request? You can:


Roadmap & Vision

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 ✅

Status: Complete.

Built a complete QWERTY keyboard that behaves like the native iOS keyboard:

  • All keys functional — letters, numbers, symbols, shift, caps lock, delete, return, space, globe/language switch
  • Layout parity — matches native iOS key sizing, spacing, and row gaps (~258pt total height)
  • Key press feedback — UIKit balloon popup + background highlight using CALayer (zero SwiftUI state)
  • Snippet toggle — dedicated button to switch between QWERTY and snippet list views
  • Performance optimized — UIKit KeyTouchArea for low-latency touch handling, @Observable equality guards, static let cached layouts

Phase 2 — Slash Commands for Quick Snippet Access ✅

Status: Complete.

Type / to trigger inline snippet autocomplete without leaving the typing flow:

  • Type / followed by a snippet name to see matching suggestions in the toolbar above the keys
  • Fuzzy matching — prefix, word-prefix, substring, and ordered character matching (e.g., /addr surfaces "Address - Home")
  • Tap a suggestion to replace the /query text with the full snippet content
  • Biometric support — secure snippets require FaceID/TouchID before insertion
  • Usage trackinglastTimeUsed and usedCount updated on each use
  • Slash trigger button — toolbar button to quickly insert / and activate suggestions
  • Text and URL snippets only (image/PDF not applicable for inline insertion)

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.


License

This project is licensed under the MIT License — see the LICENSE file for details.


Links

App Store Download SnipKey
GitHub Source Code
Website snipkey.jrtv.online
Privacy Policy snipkey.jrtv.online/privacy-policy
Feature Requests snipkey.canny.io

Built with care by Jonathan Taveras. Open source. No tracking. No ads. Just a useful keyboard.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •