Skip to content

j33l/SwiftSlate

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

54 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation


SwiftSlate Icon

SwiftSlate

System-wide AI text assistant for Android โ€” powered by Gemini, custom providers, and local LLMs

Type a trigger like ?fix at the end of any text, in any app, and watch it get replaced โ€” instantly.


Android Kotlin Gemini License: MIT

Latest Release APK Size API 23+ GitHub Stars


Download APK ย ย  Report Bug ย ย  Request Feature


Note

SwiftSlate works in most apps โ€” WhatsApp, Gmail, Twitter/X, Messages, Notes, and more. No copy-pasting. No app switching. Just type and go. Some apps with custom input fields may not be supported (see limitations).


๐Ÿ“‹ Table of Contents


โšก Quick Demo

๐Ÿ“  You type       โ†’  "i dont no whats hapening ?fix"
โณ  SwiftSlate      โ†’  โ— โ—“ โ—‘ โ—’  (processing...)
โœ…  Result         โ†’  "I don't know what's happening."
๐Ÿ“  You type       โ†’  "hey can u send me that file ?formal"
โณ  SwiftSlate      โ†’  โ— โ—“ โ—‘ โ—’  (processing...)
โœ…  Result         โ†’  "Could you please share the file at your earliest convenience?"
๐Ÿ“  You type       โ†’  "Hello, how are you? ?translate:es"
โณ  SwiftSlate      โ†’  โ— โ—“ โ—‘ โ—’  (processing...)
โœ…  Result         โ†’  "Hola, ยฟcรณmo estรกs?"

โœจ Features

๐ŸŒ Works Almost Everywhere

Integrates at the system level via Android's Accessibility Service. Works in most apps โ€” messaging, email, social media, notes, browsers, and more. Some apps with custom input fields may not be supported (see limitations).

โšก Instant Inline Replacement

Type, trigger, done. The AI response replaces your text directly in the same field โ€” no copy-pasting, no app switching. A spinner (โ— โ—“ โ—‘ โ—’) shows progress for AI commands; text replacer commands execute instantly.

๐Ÿ”‘ Multi-Key Rotation

Add multiple API keys for automatic round-robin rotation. If one key hits a rate limit, SwiftSlate seamlessly switches to the next.

๐ŸŒ™ AMOLED Dark Theme

Pure black (#000000) Material 3 interface designed for OLED screens โ€” saves battery and looks stunning.

๐Ÿค– Powered by Gemini, Custom Providers & Local LLMs

Ships with Google's Gemini API. Or connect any OpenAI-compatible endpoint โ€” cloud providers, or local LLMs like Ollama, LM Studio, and others running on your network.

๐Ÿ› ๏ธ Two Command Types

AI commands send text to your provider for intelligent transformation. Text replacer commands run entirely offline for instant local text manipulation โ€” no API key needed.

๐Ÿ”’ Encrypted Key Storage

API keys are encrypted with AES-256-GCM using the Android Keystore. Your keys never leave your device unencrypted.

๐ŸŒ Localized in 7 Languages

App UI available in English, French, German, Spanish, Portuguese (BR), Hindi, and Simplified Chinese.


๐Ÿงฉ Built-in Commands

SwiftSlate ships with 9 AI-powered commands plus dynamic translation โ€” ready to use out of the box:

Trigger Action Example
?fix Fix grammar, spelling & punctuation i dont no whats hapening โ†’ I don't know what's happening.
?improve Improve clarity and readability The thing is not working good โ†’ The feature isn't functioning properly.
?shorten Shorten while keeping meaning I wanted to let you know that I will not be able to attend the meeting tomorrow โ†’ I can't attend tomorrow's meeting.
?expand Expand with more detail Meeting postponed โ†’ The meeting has been postponed to a later date. We will share the updated schedule soon.
?formal Rewrite in professional tone hey can u send me that file โ†’ Could you please share the file at your earliest convenience?
?casual Rewrite in friendly tone Please confirm your attendance at the event โ†’ Hey, you coming to the event? Let me know!
?emoji Add relevant emojis I love this new feature โ†’ I love this new feature! ๐ŸŽ‰โค๏ธโœจ
?reply Generate a contextual reply Do you want to grab lunch tomorrow? โ†’ Sure, I'd love to! What time works for you?
?undo Restore text from before the last replacement Reverts to your original text before AI modified it
?translate:XX Translate to any language Hello, how are you? ?translate:es โ†’ Hola, ยฟcรณmo estรกs?
๐ŸŒ Supported language codes for translation

Use any standard language code with ?translate:XX:

Code Language Code Language Code Language
es Spanish fr French de German
ja Japanese ko Korean zh Chinese
hi Hindi ar Arabic pt Portuguese
it Italian ru Russian nl Dutch
tr Turkish pl Polish sv Swedish

โ€ฆand many more. Any language code recognized by Google Translate works.


๐Ÿ› ๏ธ Text Replacer Commands

Beyond AI, you can create text replacer commands that run entirely offline โ€” no API key, no network, instant execution. These are custom commands you define with the "Text Replacer" type.

Text replacer commands replace the trigger with a fixed string. They're perfect for:

Use Case Trigger Replacement Result
Signatures ?sig โ€” John Doe, CEO Appends your signature
Canned responses ?ty Thank you for reaching out! I'll get back to you shortly. Instant reply template
Snippets ?addr 123 Main St, Springfield, IL 62701 Quick address insertion
Shortcuts ?email contact@example.com Fast email insertion

Tip

Text replacer commands execute instantly with zero latency โ€” no spinner, no network call. Create them in the Commands tab by selecting the "Text Replacer" type.


๐Ÿš€ Getting Started

Prerequisites

Requirement Details
Android Device Android 6.0+ (API 23 or higher)
API Key Free Gemini key at aistudio.google.com, or a key from any OpenAI-compatible provider. Not required for text replacer commands.

Installation

Tip

The APK is only ~1.2 MB โ€” lightweight with zero external dependencies for networking or JSON.

1. Download the latest APK from the Releases page

2. Install the APK on your device (allow installation from unknown sources if prompted)

3. Open SwiftSlate and follow the setup below

Setup in 3 Steps

Step 1

๐Ÿ”‘ Add API Key

Open the Keys tab, enter your API key. It's validated before saving. Add multiple keys for rotation.

Step 2

โ™ฟ Enable Service

On the Dashboard, tap "Enable" โ†’ find "SwiftSlate Assistant" in Accessibility Settings โ†’ toggle it on.

Step 3

โœ๏ธ Start Typing!

Open any app, type your text, add a trigger like ?fix at the end, and watch the magic happen.


โš™๏ธ How It Works

flowchart TD
    A["๐Ÿ“ You type: 'Hello wrld, how r u ?fix'"] --> B{"๐Ÿ” Accessibility Service\ndetects trigger"}
    B -- "Text Replacer" --> C["โšก Instant local replacement\n(no network call)"]
    B -- "AI Command" --> D["๐Ÿ”‘ Selects next API key\n(round-robin)"]
    D --> E["๐Ÿค– Sends text + prompt\nto AI provider"]
    E --> F["โณ Shows inline spinner\nโ— โ—“ โ—‘ โ—’"]
    F --> G["โœ… Replaces text in-place"]
    C --> G

    style A fill:#1a1a2e,stroke:#e94560,color:#fff
    style B fill:#1a1a2e,stroke:#0f3460,color:#fff
    style C fill:#1a1a2e,stroke:#00b894,color:#fff
    style D fill:#1a1a2e,stroke:#0f3460,color:#fff
    style E fill:#1a1a2e,stroke:#0f3460,color:#fff
    style F fill:#1a1a2e,stroke:#e94560,color:#fff
    style G fill:#16213e,stroke:#00b894,color:#fff
Loading
๐Ÿ”ง Technical deep-dive
  1. Event Listening โ€” SwiftSlate registers an Accessibility Service that listens for TYPE_VIEW_TEXT_CHANGED events across all apps (ignoring its own UI and password fields)
  2. Fast Exit Optimization โ€” For performance, it first checks if the last character of typed text matches any known trigger's last character before doing a full scan
  3. Longest Match โ€” When a potential match is found, it searches for the longest matching trigger at the end of the text
  4. Command Routing โ€” Text replacer commands execute immediately on-device. AI commands proceed to the API call path
  5. API Call โ€” The text + prompt is sent to the configured AI provider using the next available key in the round-robin rotation
  6. Inline Spinner โ€” While waiting for the AI response, a spinner animation (โ— โ—“ โ—‘ โ—’) replaces the text to provide visual feedback
  7. Watchdog Timer โ€” A safety timer auto-cancels stuck processing jobs to prevent the service from becoming unresponsive
  8. Text Replacement โ€” The response replaces the original text using ACTION_SET_TEXT
  9. Fallback Strategy โ€” If ACTION_SET_TEXT fails (some apps don't support it), SwiftSlate falls back to a clipboard-based paste approach
  10. Bounded Responses โ€” API responses are capped at 1 MB to prevent memory issues from malformed responses

๐ŸŽจ Custom Commands

Go beyond the built-ins โ€” create, edit, and manage your own commands in the Commands tab.

Two Types of Custom Commands

Type How It Works Needs API Key? Latency
AI Sends text to your AI provider with your custom prompt Yes ~1โ€“3 seconds
Text Replacer Replaces the trigger with a fixed string, entirely offline No Instant

How to Create One

  1. Open the Commands screen
  2. Select the command type: AI or Text Replacer
  3. Enter a Trigger (e.g., ?poem)
  4. Enter a Prompt (for AI) or Replacement text (for Text Replacer)
  5. Tap "Add Command"

Editing & Deleting

  • Tap the โœ๏ธ edit icon on any custom command to modify its trigger, prompt, or type
  • Tap the ๐Ÿ—‘๏ธ delete icon to remove it
  • Built-in commands are read-only

Example AI Command Ideas

Trigger Prompt Use Case
?eli5 Explain this like I'm five years old. Simplify complex topics
?bullet Convert this text into bullet points. Quick formatting
?headline Rewrite this as a catchy headline. Social media posts
?code Convert this description into pseudocode. Developer shorthand
?tldr Summarize this text in one sentence. Quick summaries

Tip

Just describe the transformation you want โ€” SwiftSlate's system instruction automatically ensures the AI returns only the transformed text without extra commentary.


๐Ÿ”‘ API Key Management

SwiftSlate supports multiple API keys with intelligent rotation:

Feature Details
Round-Robin Rotation Keys are used in turn to spread usage evenly across all configured keys
Rate-Limit Handling If a key gets rate-limited (HTTP 429), SwiftSlate tracks the cooldown and skips it automatically
Invalid Key Detection Keys returning 403 errors are marked invalid and excluded from rotation
Encrypted Storage All keys encrypted with AES-256-GCM via Android Keystore before being saved locally

Tip

Adding 2โ€“3 API keys from different accounts helps avoid rate limits during heavy use. On the free tier, all keys under the same account share a single quota โ€” so rotation only helps with keys from separate accounts.


๐Ÿ’พ Backup & Restore

Export and import your custom commands as JSON files โ€” useful for migrating to a new device or sharing command sets.

  • Export โ€” Saves all custom commands to a .json file via Android's file picker
  • Import โ€” Loads commands from a .json file (validates format, trigger prefix, and size limits before importing)

Find both options in the Settings tab under Backup & Restore.

Note

Imported commands must use the same trigger prefix currently configured in the app. API keys are not included in backups for security.


๐Ÿ–ฅ๏ธ App Screens

SwiftSlate has four screens accessible via the bottom navigation bar:

๐Ÿ“Š Dashboard

  • Service status indicator (green/red)
  • Enable/disable toggle
  • API key count
  • Quick-start guide
  • Version info & GitHub link

๐Ÿ”‘ Keys

  • Add new keys (validated live)
  • Delete existing keys
  • AES-256-GCM encryption
  • Multi-key management
  • Direct link to get API keys

๐Ÿ“ Commands

  • 9 built-in commands (read-only)
  • Add custom commands (AI or Text Replacer)
  • Edit existing custom commands
  • Delete custom commands

โš™๏ธ Settings

  • Provider selection
    • Google Gemini (default)
    • Custom (OpenAI-compatible)
    • Local LLMs (Ollama, LM Studio)
  • Gemini model picker
    • gemini-2.5-flash-lite
    • gemini-3-flash-preview
    • gemini-3.1-flash-lite-preview
  • Custom endpoint URL & model
  • Trigger prefix customization
  • Backup & restore commands

๐ŸŒ Localization

SwiftSlate's UI is available in 7 languages:

Language Code
๐Ÿ‡บ๐Ÿ‡ธ English en
๐Ÿ‡ซ๐Ÿ‡ท French fr
๐Ÿ‡ฉ๐Ÿ‡ช German de
๐Ÿ‡ช๐Ÿ‡ธ Spanish es
๐Ÿ‡ง๐Ÿ‡ท Portuguese (Brazil) pt-rBR
๐Ÿ‡ฎ๐Ÿ‡ณ Hindi hi
๐Ÿ‡จ๐Ÿ‡ณ Simplified Chinese zh-rCN

The app automatically uses your device's language. Contributions for additional translations are welcome!


๐Ÿ”’ Privacy & Security

Note

SwiftSlate is built with privacy as a core architectural principle, not an afterthought.

Concern How SwiftSlate Handles It
๐Ÿ‘๏ธ Text Monitoring Only processes text when a trigger command is detected at the end. All other typing is completely ignored. Password fields are always skipped.
๐Ÿ“ก Data Transmission Text is sent only to the configured AI provider (Google Gemini or your custom endpoint). No other servers are ever contacted. Text replacer commands never leave your device.
๐Ÿ” Key Storage API keys are encrypted with AES-256-GCM using the Android Keystore system. Encryption failures throw rather than falling back to plaintext.
๐Ÿ“Š Analytics None. Zero telemetry, zero tracking, zero crash reporting.
๐Ÿ“– Open Source The entire codebase is open for inspection under the MIT License.
๐Ÿ”‘ Permissions Only requires the Accessibility Service permission โ€” nothing else.
๐Ÿ’พ Backups API keys and settings are excluded from Android cloud backups and device transfers.

๐Ÿ—๏ธ Tech Stack

LanguageKotlin 2.1
UIJetpack Compose ยท Material 3
NavigationNavigation Compose
AsyncKotlin Coroutines
HTTPHttpURLConnection (zero external dependencies)
JSONorg.json (Android built-in)
StorageSharedPreferences (encrypted via Android Keystore)
Core ServiceAndroid Accessibility Service
Build SystemGradle with Kotlin DSL
Java TargetJDK 17
Min SDKAPI 23 (Android 6.0)
Target SDKAPI 36

Zero third-party dependencies for networking or JSON parsing โ€” SwiftSlate uses only Android's built-in APIs.


๐Ÿ”จ Building from Source

Prerequisites

Build

# Clone the repository
git clone https://github.com/Musheer360/SwiftSlate.git
cd SwiftSlate

# Build debug APK
./gradlew assembleDebug

# Output: app/build/outputs/apk/debug/app-debug.apk
๐Ÿ“ฆ Signed release build
export KEYSTORE_FILE=/path/to/your/keystore.jks
export KEYSTORE_PASSWORD=your_keystore_password
export KEY_ALIAS=your_key_alias
export KEY_PASSWORD=your_key_password

./gradlew assembleRelease

โš ๏ธ Known Limitations

  • Some apps use custom input fields that don't support Android's standard text replacement APIs. SwiftSlate includes a clipboard-based fallback, but apps like WeChat and Chrome's address bar may still not work. Most standard text fields (messaging apps, email composers, notes, etc.) work fine.
  • Some OEMs restrict accessibility services. Certain manufacturers (e.g., OnePlus, Xiaomi) may hide or block third-party accessibility services in their settings UI. If SwiftSlate doesn't appear in your accessibility settings, check for a "Downloaded apps" or "Installed services" section, or try searching for it.

๐Ÿค Contributing

Contributions are welcome! Here's how to get involved:

# 1. Fork the repository, then:
git clone https://github.com/YOUR_USERNAME/SwiftSlate.git
cd SwiftSlate

# 2. Create a feature branch
git checkout -b feature/amazing-feature

# 3. Make your changes and commit
git commit -m "Add amazing feature"

# 4. Push and open a Pull Request
git push origin feature/amazing-feature

Ideas for Contributions

  • ๐Ÿงฉ New built-in commands
  • ๐Ÿค– Additional AI provider integrations
  • ๐ŸŽจ UI improvements and new themes
  • ๐ŸŒ Translations for more languages
  • ๐Ÿ“– Documentation improvements

โค๏ธ Support the Project

SwiftSlate is free, open source, and built in my spare time. If it's useful to you, consider supporting its development:

  • โญ Star this repo โ€” it helps others discover SwiftSlate
  • ๐Ÿ’– Sponsor on GitHub โ€” even a small contribution keeps the project going

๐Ÿ“„ License

This project is licensed under the MIT License โ€” see the LICENSE file for details.




Made with โค๏ธ by Musheer Alam

If SwiftSlate makes your typing life easier, consider giving it a โญ


About

Android accessibility service for AI-powered text transformation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Kotlin 100.0%