Releases: SysAdminDoc/SwiftFloris
SwiftFloris v1.7.5 — SwiftKey indistinguishability wave
SwiftFloris v1.7.5 — SwiftKey indistinguishability wave
Released: 2026-05-09
Versioning: 1.7.4 → 1.7.5 (versionCode 174 → 175)
This release closes the new N12 "SwiftKey indistinguishability" roadmap section plus a chunk of the original Next-1 SymSpell item — twelve commits, all on-device, no Copilot, no cloud, no account. The goal: a user can't tell whether they're typing on SwiftKey or on SwiftFloris.
See SWIFTKEY_PARITY_RESEARCH.md for the underlying research.
What's new
Surface fixes (the two paper-cuts you'd notice in 30 seconds)
- Auto-space after punctuation defaults to ON. Period / comma /
?/!now insert a trailing space without a settings tweak. Existing user overrides still win, so already-installed users toggle in Settings → Typing. - Suggestion-tap haptic. Tapping an autocorrect / suggestion strip word now fires the same key-press vibration as tapping a letter key, with
keyLongPress()on the long-press branch.
N12.1 — Adaptive touch model
New AdaptiveTouchModel keeps per-subtype, per-key Welford-online stats of the user's actual tap-offset distribution (normalised by key half-size). After ≥30 samples per key, hit-tests bias toward where the user actually taps using a 2D-Gaussian log-likelihood — the SwiftKey "feels accurate" effect, all on-device, no offsets ever written to disk.
N12.2 — Next-word predictions via PersonalBigramStore
New per-locale bigram counter persisted to <filesDir>/personal_bigrams_<localeTag>.tsv. Caps: 2,000 prev words per locale, 16 next words per prev, max count 1,000, MIN_COUNT=2. The suggestion strip is no longer empty after a space — it shows the top bigram completions for the previous word.
N12.3 — Multi-language hot-switch
When a subtype has secondary locales enrolled (SubtypeEditorScreen already supports this), LatinLanguageProvider.suggest queries every enrolled locale's dictionary and merges per-locale candidates with a prior of 1.0 for any locale that recognised the typed word and 0.4 for those that didn't. isEligibleForAutoCommit is gated to recognising locales — no more wrong-language autocorrect mid-sentence.
N12.4 — Flow Through Space
GlideTypingGesture.Detector.signalWordBoundary() snapshots and resets the trace mid-stroke; the controller fires it when the trace re-enters the SPACE key after first leaving it. Phantom-space inserts the " " between committed words, classifier resets between words, trail-fade visually punctuates each. Glide a word, drag finger across the space bar, glide the next word — all without lifting.
N12.5 — Trigram next-word predictor
New PersonalTrigramStore is a per-locale (prev2, prev1) → next counter persisted to <filesDir>/personal_trigrams_<localeTag>.tsv. Caps: 4,000 contexts, 12 next words per context. KeyboardManager.learnIfAllowed now learns both bigrams and trigrams via a sliding two-word window. After typing the quick brown fox a couple of times, typing the quick surfaces brown as the top suggestion.
N12.6 — Typing stats screen
New Settings → Typing → "Typing stats" screen reads three on-device numbers off-thread:
- Words-learned count + top-10 personal-dictionary entries by frequency
- Total bigram-store size on disk
- Adaptive-touch-model session sample count
No data leaves the device.
N12.7 — Cold-start bootstrap from dictionary frequency
LatinDictionarySnapshot.topByFrequency(n) lazily caches the top-64 high-frequency dictionary words. Suggestions now layer Tier 0 (trigram, 0.80–0.45) → Tier 1 (bigram, 0.55–0.20) → Tier 2 (dict bootstrap, 0.30–0.55). Result: never-empty suggestion strip on cold-start and after sentence-ending punctuation. Sentence-start detection auto-capitalises the first letter.
N12.8 — Adaptive touch model feeds the glide classifier
AdaptiveTouchModel.adjustedCenter(...) returns user-personalised pixel centers. StatisticalGlideTypingClassifier.findNClosestKeys (matching) and Pruner.generateIdealGestures (template) both consult adjustedCenter() instead of key.visibleBounds.center. Bias clamped to ±0.5×half so a heavily-skewed learner can't drag the template outside the visible key. Gives glide the same per-user spatial bias N12.1 already gives taps.
N12.9 — Sentence-case suggestions
After ., !, or ? (or empty input), every next-word suggestion's first letter is capitalised. SwiftKey-parity at sentence start.
N12.10 — Long-press suggestion to forget
WordSuggestionCandidate from next-word predictions and personal-dict suggestions now both ship isEligibleForUserRemoval = true. New DictionaryManager.forgetWord, PersonalBigramStore.forget, PersonalTrigramStore.forget are all consulted by LatinLanguageProvider.removeSuggestion. Long-press a noisy suggestion → it's gone from personal dict, bigrams, and trigrams in one stroke.
Next-1.A — SymSpell delete-index for distance-1 corrections
New pure-Kotlin SymSpellIndex.kt. LatinDictionarySnapshot.symSpellIndex is by lazy so the build (~100–300 ms over the 117k-word EN dict) lands on first correction call. LatinDictionarySuggester.knownEdits1 now calls dictionary.symSpellIndex.candidatesAtDistance1(input) instead of generating Norvig's L · 54 candidate strings per call — ~50× speedup on the per-keystroke correction path.
Next-1.B — Distance-2 high-frequency auto-commit
New AutoCommitMinFrequencyDistance2 = 0.92 threshold. Distance-2 corrections now auto-commit on space when the candidate is in the very common bucket (~top 3k SCOWL words). Closes the long-word-typo gap: recieved → received, tommorrow → tomorrow, seperate → separate, definately → definitely.
Settings reference
Every new behavior is gated behind a pref so power-users can opt out:
- Typing → Adaptive touch model (default on)
- Typing → Predict the next word (default on)
- Typing → Multilingual suggestions (default on)
- Gestures → Flow through space (default on)
- Typing → Typing stats (link to the new screen)
Out of scope (explicit non-goals)
- Microsoft Copilot / Editor / Tone
- DALL-E sticker / Designer
- Microsoft account login or sync
- Federated learning aggregator
- Anything that requires the
INTERNETpermission
Roadmap status
- N12 SwiftKey indistinguishability — 10/10 ticked (12.5 absorbed into the trigram tier)
- Next-1 SymSpell — 1.A and 1.B ticked, 1.C (full d2 SymSpell index) deferred pending field data
- L1 On-device LLM (Gemma 3 270M Q4) — still the next big jump; multi-week
- Next-3.1 Pre-trained KenLM 5-gram bootstrap — would give first-time users rich predictions before they've typed anything
Verification
./gradlew :app:assembleDebug— green./gradlew :app:assembleRelease— green (signed whenSIGNING_KEYSTORE_BASE64is set; otherwise falls through to debug signing as documented in N6.2):app:verifyNoInternetPermission— green (no INTERNET permission added by any item)- adb-installed on local Pixel-class device, smoke-tested across all five new prefs
SwiftFloris v1.5.3 - Autocorrect Dictionary & Pronoun Fixes
SwiftFloris v1.5.3
Released: 2026-05-05
Changes
- Expanded the built-in English autocorrect dictionary to 49,744 entries for stronger offline suggestions and spell correction.
- Fixed immediate autocorrect for standalone
iso it becomesIin the middle of sentences. - Fixed immediate autocorrect for common English contractions, including
im->I'm,ill->I'll,id->I'd, andive->I've. - Fixed the same contraction autocorrections when typed at the beginning of sentences after auto-capitalization, including
Im,Ill,Id, andIve. - Preserved all-caps acronym behavior so inputs such as
IDandILLare not rewritten as contractions. - Added regression coverage for the immediate autocorrect paths and Latin dictionary behavior.
Verification
:app:testDebugUnitTest:app:lintDebug- signed release APK verification with Android
apksigner - device install smoke test with
adb install -r
APK Details
- File:
SwiftFloris-v1.5.3.apk - SHA-256:
1d5f414ab1c0decd74d97c00aadea2769bc07d19010fdbc76f4ed2caaca1e777 - Signing certificate SHA-256:
b5d537420ded9e11382b3df17dc3616f212b9d9f35138e4fbb3f2adffe50f70a
v1.5.2 — Spell Suggestions & Autocorrect Fixed
Fixed Latin autocorrect and spell suggestions. Spell checker and word prediction now working correctly.
SwiftFloris v1.4.0 — Gesture Typing Enabled
SwiftFloris v1.4.0 — Gesture Typing Stabilization
Release Date: 2026-05-05
🎯 Major Feature: Gesture/Swipe Typing
Gesture typing is now enabled by default in SwiftFloris v1.4.0. Type entire words by dragging your finger across the keyboard!
What's New
- Gesture Typing: Type words by swiping across the keyboard (FlorisBoard GlideTypingManager fully integrated)
- Configurable Sensitivity: 0-100% slider to fine-tune gesture detection
- Visual Feedback: Gesture trail with customizable fade duration (0-500ms)
- Live Prediction: See word suggestions in real-time during gesture
- Offline & Private: No API calls, fully private, works offline
Settings
New Gesture Typing panel in Settings → Gestures with:
- Enable/Disable toggle
- Gesture trail visibility
- Trail fade duration (0-500ms)
- Prediction preview toggle
- Sensitivity adjustment (0-100%)
Documentation
- Gesture Typing Guide — Complete user guide with best practices, troubleshooting, FAQ
- README — Updated with gesture typing feature entry
Technical Details
- FlorisBoard GlideTypingManager: Enabled by default (glide__enabled = true)
- Sensitivity preference: Added int preference (0-100%, default 50)
- GesturesScreen.kt: Fixed PreferenceGroup with proper Compose declarations
- Build: Release APK, 9.6 MB unsigned
Installation
Download �pp-release-unsigned.apk and install on Android 8.0+
Known Limitations
- FlorisBoard's gesture engine is algorithm-based (not ML), may differ from Gboard/SwiftKey
- Gesture accuracy varies by device and typing style
- Device testing for latency/accuracy metrics in progress
Next Steps (v1.4.1+)
- Sensitivity slider backend integration with GlideTypingClassifier
- Device testing and accuracy profiling (Pixel, Samsung, mid-range devices)
- False positive testing (gesture vs. normal tap interaction)
- Termux compatibility verification
Tested: Build successful, gesture typing UI functional. Device testing pending.
SwiftFloris v1.3.0 - Voice Input Release
🎤 Voice Input Feature
SwiftFloris v1.3.0 adds voice-to-text capability powered by Android's built-in Speech Recognizer API.
Major Features:
- 🎤 Speech-to-text input (no API key required)
- 🌍 Multilingual support (EN, DE, FR, ES, IT, PT)
- 📊 Real-time confidence scoring
- ⚡ Works offline on compatible devices
- ✨ Animated UI with pulse effect
What's Included:
- Voice input button in keyboard toolbar
- Automatic language detection from keyboard subtype
- Comprehensive error handling with user guidance
- Material Design 3 UI integration
Documentation:
- Voice Input Guide — Complete feature documentation
- Multilingual Testing — Test spell checking across languages
- Features Overview — Full feature inventory
Installation:
- Download the APK from this release
- Install on your Android 8.0+ device
- Enable SwiftFloris as your default keyboard
- Grant microphone permission when prompted
Testing Checklist:
- Voice input button visible and responsive
- Recording starts/stops properly
- Real-time feedback during transcription
- Confidence scores display correctly
- Multi-language support verified
- Error messages clear and helpful
- Build passes all checks
See CHANGELOG.md for full release notes.
Built with ❤️ by SwiftFloris Team
SwiftFloris v1.2.0 — Auto-Capitalization Parity
SwiftKey Typing Logic Parity
Major Achievement: SwiftFloris now matches SwiftKey's auto-capitalization behavior with intelligent sentence awareness.
What's New in v1.2.0
🔤 Smart Auto-Capitalization
- Automatically capitalizes the first letter after sentence-ending punctuation (. ! ?)
- Properly handles multiple consecutive sentences
- Fixed state machine bug that prevented second-sentence capitalization
- Matches SwiftKey's typing experience exactly
🎯 Technical Improvements
- Preserved SHIFTED_AUTOMATIC state during async callbacks
- Fixed race condition in state machine
- Enhanced sentence awareness logic
🎨 Existing Features
- 4 premium themes (Nord, Tokyo Night, Dracula, Catppuccin)
- Encrypted clipboard history
- Enhanced haptic feedback
- Material Design 3 throughout
- Multi-language support
Installation
Download app-release-unsigned.apk and install on your Android device (Android 8.0+).
Requirements
- Android 8.0+ (Oreo)
- ~20MB storage
Enjoy SwiftKey-quality typing!