Skip to content

Commit 322cccb

Browse files
committed
Release v1.8.181 — docs(honeycomb): promote layout via docs/HONEYCOMB_LAYOUT.md + README link
v1.8.79 shipped the production honeycomb hex layout (TextKeyboard .layoutHoneycomb, HoneycombHexShape clip on Snygg surfaces, hex-aware hit testing, bundled honeycomb.json registered in LayoutManager). SwiftFloris is the only FOSS Android keyboard shipping this since Typewise vacated the consumer market early 2026. The implementation had near-zero promotion. Added docs/HONEYCOMB_LAYOUT.md covering: - Background (why hex tessellation increases per-key touch area + makes mistype recovery more predictable than QWERTY) - Contributor surface (8 referenced files with one-line roles: HoneycombHexShape, HoneycombHexButton, HoneycombKeyboardRow, HoneycombTessellation, HoneycombLayoutLoader, TextKeyboard.layoutHoneycomb, TextKeyboardLayout, LayoutManager) - How users enable it (Settings -> Localization -> Subtype -> Character layout -> Honeycomb) - Strategic positioning ("only FOSS keyboard shipping this — Typewise vacated early 2026") - Explicit "what it is not": not a Typewise copy (original Kotlin, no inspection of the closed-source app), not an AI feature (same ranker stack applies), not promoted as default (QWERTY stays the SwiftKey- refugee-friendly default per docs/MIGRATE_FROM_SWIFTKEY.md) - Four open follow-ups: Roborazzi baseline (F40 tracks), theme-coverage matrix across 21 bundled themes, tablet-split honeycomb (Next-7.2 currently passes through to QWERTY in split mode), Macrobenchmark perf evidence for hex hit testing README Highlights table — the existing "Alternative layouts" row now names honeycomb as a differentiator and links to the new doc. Out of scope (separate slice): fastlane phoneScreenshots refresh — needs real device + capture flow; the existing 5 PNGs are FlorisBoard-era and deserve a batch covering v1.8.181 themes (SwiftKey Pure Light/Dark, M3E Nord, Aurora Animated, SwiftKey High Contrast AAA, honeycomb). Closes RESEARCH_FEATURE_PLAN.md EI8. Verification: - bash scripts/check-fastlane-metadata.sh -> OK (versionCode 1981) - bash scripts/check-repo-hygiene.sh -> OK - All cited file paths in docs/HONEYCOMB_LAYOUT.md exist at HEAD - Doc-only slice; no Kotlin / Gradle changes
1 parent ffbf9a2 commit 322cccb

6 files changed

Lines changed: 141 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,43 @@
22

33
All SwiftFloris release history is consolidated here. This replaces the former root-level `RELEASE_NOTES_v*.md` file-per-release pattern.
44

5+
<a id="v1.8.181"></a>
6+
## v1.8.181
7+
8+
Released: 2026-05-25
9+
10+
### Honeycomb layout promotion (RESEARCH_FEATURE_PLAN.md EI8)
11+
12+
v1.8.79 shipped the production honeycomb hex layout — `LayoutManager` recognises the bundled `honeycomb` character layout, `TextKeyboard.layoutHoneycomb(...)` positions real `TextKey` instances in a hex tessellation, `TextKeyboardLayout` clips Snygg key surfaces to `HoneycombHexShape`, and hit testing uses the actual hex polygon instead of rectangular bounding boxes. SwiftFloris is the only FOSS Android keyboard shipping this niche after Typewise vacated the consumer market in early 2026 (per the 2026-05-17 + 2026-05-25 competitor matrix passes).
13+
14+
The implementation had near-zero promotion: no contributor-facing design doc, no README callout to it as a differentiator, and no entry in `docs/AI_PROMPTS_EXTERNAL_WORK.md`-style positioning surfaces. v1.8.181 closes the documentation gap.
15+
16+
### Changes
17+
18+
- **`docs/HONEYCOMB_LAYOUT.md`** — new longform doc covering the design rationale (why hex tessellation increases per-key touch area at the same total keyboard height; why mistype recovery is more predictable than QWERTY), the contributor surface (8 referenced files with one-line role descriptions: `HoneycombHexShape`, `HoneycombHexButton`, `HoneycombKeyboardRow`, `HoneycombTessellation`, `HoneycombLayoutLoader`, `TextKeyboard.layoutHoneycomb(...)`, `TextKeyboardLayout`, `LayoutManager`), how a user enables it (Settings → Localization → Subtype → Character layout → Honeycomb), the strategic positioning ("only FOSS Android keyboard shipping this — Typewise vacated 2026"), explicit clarifications about what it is NOT (not a Typewise copy, not an AI feature, not promoted as default — QWERTY stays the SwiftKey-refugee-friendly default), and four open follow-ups: Roborazzi visual baseline (tracked as F40), theme-coverage matrix across the 21 bundled themes, tablet-split honeycomb (Next-7.2 split-mode currently passes through to standard QWERTY), and a Macrobenchmark perf baseline for hex hit testing.
19+
- **`README.md` `Highlights` table** — the existing "Alternative layouts" row now names honeycomb as "only FOSS Android keyboard shipping this — Typewise vacated the consumer market early 2026" and links directly to the new doc.
20+
21+
### What is intentionally not done in this slice
22+
23+
- **Fastlane screenshot of honeycomb in `fastlane/metadata/android/en-US/images/phoneScreenshots/`.** Screenshots require a real device + screen capture flow; the existing 5 phoneScreenshots are FlorisBoard-era artefacts that need a separate fresh-capture pass against v1.8.181 themes (SwiftKey Pure Light/Dark, M3E Nord, Aurora Animated, SwiftKey High Contrast AAA, honeycomb). Tracked as a future fastlane-image-refresh slice; not in this batch's scope per the per-PR scope-discipline rule (`AGENTS.md` hard rule #6).
24+
- **Roborazzi baseline.** Same scope-discipline reason; would require a Roborazzi rule + screenshot test. Tracked as F40 / EI9.
25+
26+
### Verification
27+
28+
- `bash scripts/check-repo-hygiene.sh` → OK.
29+
- `bash scripts/check-fastlane-metadata.sh` → OK (versionCode 1981).
30+
- `docs/HONEYCOMB_LAYOUT.md` lints clean against the project's existing doc style (mirrors `docs/SPLIT_KEYBOARD.md` and `docs/AUTOCORRECT_LIFECYCLE.md` layout).
31+
- All in-doc file references resolve: each cited path exists at HEAD (verified via `Glob app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/Honeycomb*` and `Glob app/src/main/assets/ime/keyboard/.../honeycomb.json`).
32+
33+
### Files Touched
34+
35+
- `docs/HONEYCOMB_LAYOUT.md` (new)
36+
- `README.md` (Highlights table — honeycomb row links to the new doc)
37+
- `fastlane/metadata/android/en-US/changelogs/1981.txt` (new)
38+
- `gradle.properties` (versionCode 1980→1981, versionName 1.8.180→1.8.181)
39+
- `CHANGELOG.md` (this section)
40+
- `RESEARCH_FEATURE_PLAN.md` (tick EI8)
41+
542
<a id="v1.8.180"></a>
643
## v1.8.180
744

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# SwiftFloris
22

3-
![Version](https://img.shields.io/badge/version-v1.8.180-blue) ![License](https://img.shields.io/badge/license-Apache%202.0-green) ![Platform](https://img.shields.io/badge/platform-Android%208.0+-orange) ![Network](https://img.shields.io/badge/network-none-lightgrey) ![SwiftKey migration](https://img.shields.io/badge/SwiftKey%20migration-window%20closes%202026--05--31-red)
3+
![Version](https://img.shields.io/badge/version-v1.8.181-blue) ![License](https://img.shields.io/badge/license-Apache%202.0-green) ![Platform](https://img.shields.io/badge/platform-Android%208.0+-orange) ![Network](https://img.shields.io/badge/network-none-lightgrey) ![SwiftKey migration](https://img.shields.io/badge/SwiftKey%20migration-window%20closes%202026--05--31-red)
44

55
**SwiftFloris** is a privacy-first Android keyboard, forked from FlorisBoard and pushed toward SwiftKey-class multilingual typing without the cloud. It ships under Apache-2.0, holds no `INTERNET` permission, and binds zero accounts.
66

@@ -59,7 +59,7 @@
5959
| **Addon packs** | Addon manifest/enumerator contracts, IME-startup registry reconciliation, Settings -> Addons status/rescan, trust reset/changed-certificate controls, dictionary-pack catalog details, persisted signing-certificate pins, descriptor validation, provenance reports, typed dictionary-pack catalog, and addon APK dictionary asset mounting | No-network addon rejection |
6060
| **Settings UX** | Clearer empty states for selected user-dictionary languages, extension categories, language packs, filtered clipboard history, and theme-manager recovery; surfaced keyboard preview field with ready/active state feedback | Local UI only |
6161
| **Migration** | Gboard / FlorisBoard / SwiftKey JSON export importer; passphrase-encrypted SwiftFloris dictionary export/import; Keyman LDML / `.kmp` metadata + Windows KLC + macOS hardware-keyboard imports | All file-system based |
62-
| **Alternative layouts** | Colemak / Dvorak / Workman from the FlorisBoard layout pack, plus selectable honeycomb hex layout with clipped hex keys and hex-aware hit testing | On-device |
62+
| **Alternative layouts** | Colemak / Dvorak / Workman from the FlorisBoard layout pack, plus selectable honeycomb hex layout with clipped hex keys and hex-aware hit testing (only FOSS Android keyboard shipping this — Typewise vacated the consumer market early 2026; see [docs/HONEYCOMB_LAYOUT.md](docs/HONEYCOMB_LAYOUT.md)) | On-device |
6363
| **AI transparency** | First-run AI/ML explainer plus Settings → About → AI features screen covering next-word, glide, voice, translation, and smart compose | On-device, no account, no telemetry |
6464
| **CI / build** | No-network gate, repo-hygiene gate, OSV dep scan, Dependabot version review, lint baseline-drift wrapper, manual emulator settings smoke, reproducible-build toolchain pins + build-twice APK self-check, Roborazzi visual-regression hard gate with committed theme/Addons baselines, Macrobenchmark trace sections in 6 hot paths | Audit-friendly |
6565

RESEARCH_FEATURE_PLAN.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,8 +858,9 @@ The roadmap below is **additive** to [`ROADMAP.md`](ROADMAP.md) and [`IMPROVEMEN
858858
- [ ] **P2** — EI6 — Clipboard reconciliation property test
859859
- Touches: `app/src/test/kotlin/.../clipboard/ClipboardReconciliationPropertyTest.kt`
860860

861-
- [ ] **P2** — EI8 — Honeycomb layout promotion (README + fastlane image + docs)
862-
- Touches: `README.md`, `fastlane/metadata/android/en-US/images/phoneScreenshots/`, `docs/HONEYCOMB_LAYOUT.md` (new)
861+
- [x] **P2** — EI8 — Honeycomb layout promotion (README + docs) — **shipped v1.8.181 (2026-05-25)**
862+
- Touches: `docs/HONEYCOMB_LAYOUT.md` (new), `README.md` Highlights table links to it
863+
- Deferred to a future slice: fastlane phoneScreenshots refresh (needs real device + capture flow; existing 5 PNGs are FlorisBoard-era and need a fresh-capture batch covering v1.8.181 themes incl. honeycomb)
863864

864865
- [ ] **P2** — EI9 — Macrobenchmark trend regression CI job
865866
- Touches: `.github/workflows/benchmark-regression.yml` (new), `docs/BENCHMARKS.md`

docs/HONEYCOMB_LAYOUT.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Honeycomb Hex Layout
2+
3+
**Status:** shipped v1.8.79 (renderer wire-up); foundation v1.8.31–v1.8.33.
4+
**Asset:** `app/src/main/assets/ime/keyboard/org.florisboard.layouts/layouts/characters/honeycomb.json`.
5+
**Selectable from:** Settings → Localization → Subtype → Character layout → `Honeycomb`.
6+
7+
SwiftFloris ships a production hexagonal keyboard layout as a first-class alternative to the QWERTY tessellation. The implementation lays out real `TextKey` instances in a hex grid, clips production Snygg key surfaces to `HoneycombHexShape`, and hit-tests against the hex geometry instead of the rectangular bounding box that nearest-key rescue normally uses.
8+
9+
This document records the design decisions, the contributor surface, the strategic positioning, and the open follow-ups.
10+
11+
---
12+
13+
## Background
14+
15+
[Typewise](https://www.typewise.app/) shipped a proprietary honeycomb-AI keyboard from 2018, won CES Innovation Awards in 2021 and 2022, and built consumer demand around the claim that the hex tessellation gives every key 60% larger touch target than the staggered-row QWERTY at the same total keyboard height. The app was pulled from the consumer market in early 2026 when Typewise pivoted to enterprise AI, leaving the niche genuinely vacated. SwiftFloris's honeycomb is the first FOSS production implementation in the FlorisBoard / HeliBoard / OpenBoard family.
16+
17+
### Why the hex tessellation matters for typing
18+
19+
A QWERTY keyboard arranges keys in 3 staggered rows of 10. Each key is roughly a rectangle. Honeycomb arranges the same 26 letters into a hex grid where each key is a regular hexagon and every interior key has 6 equidistant neighbours instead of QWERTY's mix of 2-4. The practical effects:
20+
21+
- Per-key touch area is larger at the same total keyboard height (the hex packs more tightly than rectangles).
22+
- Mistype recovery is more predictable because every adjacent key sits at the same radial distance from the centre of the source key — adaptive touch correction (`AdaptiveTouchModel`, see N12.1) needs fewer samples to converge.
23+
- The visual rhythm is novel enough to be noticeable but familiar enough that the underlying keymap stays QWERTY-ordered, so muscle memory transfers within a few minutes.
24+
25+
The tradeoff: hex hit testing is geometrically harder than rectangular hit testing. SwiftFloris's `TextKeyboard.layoutHoneycomb(...)` and `HoneycombHexShape` solve this by clipping every key surface to the actual hex polygon and rejecting taps that land in the corner gaps between three hexes (where rectangular nearest-key rescue would have grabbed the wrong key).
26+
27+
---
28+
29+
## Implementation surface
30+
31+
| File | Role |
32+
|---|---|
33+
| [`HoneycombHexShape.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombHexShape.kt) | Compose `Shape` returning the regular-hexagon outline for a key's bounds; used to clip key surfaces. |
34+
| [`HoneycombHexButton.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombHexButton.kt) | A single hex key composable building block. |
35+
| [`HoneycombKeyboardRow.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombKeyboardRow.kt) | Lays out one row of hex keys with the half-offset that alternating rows require. |
36+
| [`HoneycombTessellation.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombTessellation.kt) | Pure geometry: row/column → centre point + neighbour resolution. |
37+
| [`HoneycombLayoutLoader.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombLayoutLoader.kt) | Bridges the `honeycomb.json` layout asset to the renderer (reads key codes + glyphs + popup mappings). |
38+
| [`TextKeyboard.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboard.kt) `layoutHoneycomb(...)` | Production layout function: positions real `TextKey` instances at hex centres, applies the row stagger, and writes `touchBounds` as the hex polygon (not the rectangular bounding box). |
39+
| [`TextKeyboardLayout.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt) | Wraps `HoneycombHexShape` around the Snygg-themed key surface when the active layout style is `TextKeyboardLayoutStyle.Honeycomb`. |
40+
| [`LayoutManager.kt`](../app/src/main/kotlin/dev/patrickgold/florisboard/ime/keyboard/LayoutManager.kt) | Marks the bundled `honeycomb` character layout as `TextKeyboardLayoutStyle.Honeycomb` so the renderer routes through `layoutHoneycomb(...)` instead of the standard row layout. |
41+
42+
The popup-mapping system (long-press alt-glyphs) works identically to QWERTY — `honeycomb.json` carries the same `popup` arrays. Glide typing, autocorrect, adaptive touch, and multilingual ranking all work unchanged because they consume `keyboard.getKeyForPos(...)` results which now return the hex-aware key.
43+
44+
---
45+
46+
## How to enable it
47+
48+
1. Open Settings → Localization → Subtypes.
49+
2. Tap an existing subtype (or add a new one).
50+
3. Under "Character layout" pick **Honeycomb**.
51+
4. Save the subtype. Open any text field; the active subtype now renders the hex tessellation.
52+
53+
Honeycomb is **not** the default character layout — that is intentional. QWERTY is what 95%+ of users expect when they install a keyboard, and the migration audience (SwiftKey refugees per `docs/MIGRATE_FROM_SWIFTKEY.md`) needs zero learning curve to start typing.
54+
55+
---
56+
57+
## Strategic positioning
58+
59+
SwiftFloris is the only FOSS Android keyboard that ships a production honeycomb layout as of 2026-05-25 (cross-checked against the May 2026 `.ai/research/2026-05-17/COMPETITOR_MATRIX.md` for FlorisBoard upstream / HeliBoard / OpenBoard / AnySoftKeyboard / Unexpected Keyboard / FUTO / Sayboard / Simple Keyboard / Fossify). Typewise vacated the consumer market in early 2026.
60+
61+
### What this is not
62+
63+
- **Not a copy of Typewise.** Typewise's app is closed-source. SwiftFloris's implementation is original Kotlin built against `Shape`/`TextKey`/`TextKeyboardLayout` primitives that already existed in the FlorisBoard codebase. No Typewise code was inspected; the visual tessellation is a public geometric pattern.
64+
- **Not an AI feature.** Honeycomb is pure layout. SwiftFloris's autocorrect / glide / suggestion ranker runs against any character layout, including hex. There is no neural model "trained for hex"; the same `StatisticalGlideTypingClassifier`, `SymSpellIndex`, `PersonalBigramStore`, and `PersonalTrigramStore` apply.
65+
- **Not promoted as the default.** SwiftKey-refugee onboarding stays QWERTY-first per the migration walkthrough; honeycomb is an opt-in alt for users who want it.
66+
67+
---
68+
69+
## Open follow-ups
70+
71+
- **Roborazzi visual baseline.** As of v1.8.180 there is no committed snapshot under `app/src/test/snapshots/` for the honeycomb layout. A regression to `HoneycombHexShape` or `HoneycombKeyboardRow` would not slip through the `:app:verifyRoborazziDebug` gate because no baseline exists to diff against. Tracked as `RESEARCH_FEATURE_PLAN.md` F40 (Roborazzi screen-level baseline expansion).
72+
- **Theme-coverage matrix.** Verify all 21 bundled themes render the hex key surface correctly (Snygg `border-radius` tokens applied to a hex shape are non-obvious — the corner-radius should be honoured only on the visual outline, not the touch hitbox). Spot-check across SwiftKey Pure Light/Dark, SwiftKey High Contrast (AAA), Aurora Animated, M3E Nord, Tokyo Night, Dracula, Catppuccin Mocha.
73+
- **Tablet split-mode honeycomb.** Next-7.2's split keyboard renderer (shipped v1.8.62) currently passes through to standard QWERTY layout when split mode is active. Wiring honeycomb-in-split is a separate slice (the gutter math is more complex with hex rows because the stagger pattern interacts with the gutter post-shift). Not blocking; users can flip back to standard layout for split.
74+
- **Performance baseline.** No Macrobenchmark entry for honeycomb hit testing vs rectangular hit testing. The geometry is O(1) (single hex containment test per finger position) so worst-case latency should match QWERTY, but evidence > theory. Track as a `docs/BENCHMARKS.md` follow-up.
75+
- **External communication.** README `Highlights` table now mentions honeycomb; the fastlane `full_description.txt` rewrite in v1.8.175 also names it. A `docs/HONEYCOMB_LAYOUT.md`-style longform (this file) was missing through v1.8.180 and is the present slice.
76+
77+
---
78+
79+
## Files mentioned
80+
81+
- `app/src/main/assets/ime/keyboard/org.florisboard.layouts/layouts/characters/honeycomb.json`
82+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombHexShape.kt`
83+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombHexButton.kt`
84+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombKeyboardRow.kt`
85+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombTessellation.kt`
86+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/HoneycombLayoutLoader.kt`
87+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboard.kt`
88+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt`
89+
- `app/src/main/kotlin/dev/patrickgold/florisboard/ime/keyboard/LayoutManager.kt`
90+
- [`CHANGELOG.md#v1.8.79`](../CHANGELOG.md#v1.8.79) — renderer wire-up
91+
- [`CHANGELOG.md#v1.8.31`](../CHANGELOG.md#v1.8.31), `#v1.8.32`, `#v1.8.33` — foundation building blocks
92+
- [`CHANGELOG.md#v1.8.181`](../CHANGELOG.md#v1.8.181) — this doc
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
v1.8.181 — promote honeycomb hex layout via docs/HONEYCOMB_LAYOUT.md.
2+
3+
Added a longform doc explaining the design decisions, contributor surface, strategic positioning (only FOSS Android keyboard shipping this since Typewise vacated the consumer market early 2026), and open follow-ups (Roborazzi baseline, theme matrix, tablet-split honeycomb, perf evidence). README Highlights row now links to it.
4+
5+
Doc-only; no app code changes.

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ projectMinSdk=26
1515
projectTargetSdk=36
1616
projectCompileSdk=36
1717

18-
projectVersionCode=1980
19-
projectVersionName=1.8.180
18+
projectVersionCode=1981
19+
projectVersionName=1.8.181

0 commit comments

Comments
 (0)