feat: initial kwila keyboard implementation #1

Merged
addison merged 21 commits from exe-dev-bot/keyboard:main into main 2026-01-27 17:12:51 -05:00
Contributor

Kwila Keyboard - Android Utility IME

A utility keyboard with three modes:

Modes

  1. Image/OCR - Camera or gallery → ML Kit text extraction → insert to text field
  2. Coding - Two-layer shell-optimized keyboard with sticky modifiers
  3. Voice - Record audio → OpenRouter Whisper transcription → insert text

Coding Mode Features

Layer 1 (Primary):

  • Full QWERTY with numbers
  • High-frequency shell symbols: - / . $
  • Esc, Ctrl, Tab on bottom row
  • Tap L2 to toggle layers

Layer 2 (Navigation & Symbols):

  • All brackets, terminal symbols
  • Arrow keys in natural cluster
  • Alt, Super modifiers

Sticky Modifiers:

  • Tap Ctrl → turns purple (armed)
  • Type any key → sends with Ctrl
  • Auto-releases after keypress
## Kwila Keyboard - Android Utility IME A utility keyboard with three modes: ### Modes 1. **Image/OCR** - Camera or gallery → ML Kit text extraction → insert to text field 2. **Coding** - Two-layer shell-optimized keyboard with sticky modifiers 3. **Voice** - Record audio → OpenRouter Whisper transcription → insert text ### Coding Mode Features **Layer 1 (Primary):** - Full QWERTY with numbers - High-frequency shell symbols: `-` `/` `.` `$` - Esc, Ctrl, Tab on bottom row - Tap L2 to toggle layers **Layer 2 (Navigation & Symbols):** - All brackets, terminal symbols - Arrow keys in natural cluster - Alt, Super modifiers **Sticky Modifiers:** - Tap Ctrl → turns purple (armed) - Type any key → sends with Ctrl - Auto-releases after keypress
- InputMethodService with three modes (Image, Coding, Voice)
- Image/OCR mode using ML Kit text recognition
- Coding mode with sticky modifier keys (Ctrl, Alt, Super, Tab, Esc)
- Voice mode with OpenRouter Whisper transcription
- Settings activity with encrypted API key storage
- Material 3 dark theme
- Gradle Kotlin DSL build configuration
- justfile for common tasks
- Forgejo Actions CI/CD workflows

Co-authored-by: Shelley <shelley@exe.dev>
- Add high-quality launcher icons for all Android densities
- Add adaptive icon foreground PNG for Android 8+
- Icon features bold K letter in primary purple (#BB86FC) on dark background
- Generated from 512x512 source and resized with ImageMagick

Co-authored-by: Shelley <shelley@exe.dev>
- Full QWERTY layout with numbers and symbols
- Arrow keys (←↑↓→) for cursor navigation
- Enter, Backspace, Space keys
- Shift key (sticky like other modifiers)
- All keys work with Ctrl/Alt/Super modifiers
- Modifiers auto-release after keypress

Co-authored-by: Shelley <shelley@exe.dev>
feat(coding): implement two-layer shell-optimized keyboard
Some checks failed
PR Build / build (pull_request) Failing after 51s
4e233a72cc
Layer 1 (Primary):
- Full QWERTY with numbers
- High-frequency symbols: - / . $ (ranks 1-4 in shell usage)
- Esc, Ctrl, Tab on bottom row
- Tap L2 to toggle layers

Layer 2 (Navigation & Symbols):
- All brackets: [] {} () <>
- Terminal symbols: | > : ~ = ; " ' \ `
- Arrow keys in natural cluster
- Alt, Super modifiers
- Tap L1 to return

Sticky modifiers with visual feedback (purple highlight when armed)

Co-authored-by: Shelley <shelley@exe.dev>
fix(ci): use full GitHub URLs for actions
Some checks failed
PR Build / build (pull_request) Failing after 8m30s
6d1a1da3e1
Co-authored-by: Shelley <shelley@exe.dev>
fix(ci): use upload-artifact v3 for Forgejo compatibility
All checks were successful
PR Build / build (pull_request) Successful in 7m54s
27741589f1
Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/430/artifacts/kwila-keyboard-debug)
fix: use MaterialComponents theme for TabLayout compatibility
Some checks failed
PR Build / build (pull_request) Has been cancelled
43cab8e218
Co-authored-by: Shelley <shelley@exe.dev>
refactor: change package to dev.kwila.keyboard and use kwila logo
Some checks failed
PR Build / build (pull_request) Has been cancelled
7002a9dbfa
- Changed app ID from cloud.kwila.keyboard to dev.kwila.keyboard
- Updated launcher icons to use official Kwila logo from kwila.dev

Co-authored-by: Shelley <shelley@exe.dev>
fix: use app name for launcher activity label
All checks were successful
PR Build / build (pull_request) Successful in 10m13s
e7fe4556c0
Co-authored-by: Shelley <shelley@exe.dev>
fix: show helpful message when API key not configured
Some checks failed
PR Build / build (pull_request) Has been cancelled
d53793602e
Voice mode now shows 'Set OpenRouter API key in settings' and
disables the mic button when no API key is set.

Co-authored-by: Shelley <shelley@exe.dev>
fix: update package name in justfile uninstall recipe
Some checks failed
PR Build / build (pull_request) Has been cancelled
2d32e5b2d1
Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/433/artifacts/kwila-keyboard-debug)
fix: use NoActionBar theme variant for Material Components
Some checks failed
PR Build / build (pull_request) Has been cancelled
b63e8cf82f
Co-authored-by: Shelley <shelley@exe.dev>
feat(settings): add buttons to enable and select keyboard
All checks were successful
PR Build / build (pull_request) Successful in 8m49s
8634adbc28
- 'Enable Kwila Keyboard' opens system input method settings
- 'Select Input Method' shows the keyboard picker dialog
- Changed Material3 styles to MaterialComponents for compatibility
- Allow clearing API key (voice mode is optional)

Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/437/artifacts/kwila-keyboard-debug)
fix(service): wrap inflater with themed context for Material components
All checks were successful
PR Build / build (pull_request) Successful in 7m50s
ebe1f6622a
InputMethodService doesn't inherit app theme, causing TabLayout crash.
Use ContextThemeWrapper to apply Theme.KwilaKeyboard to inflated views.

Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/438/artifacts/kwila-keyboard-debug)
fix(settings): remove duplicate hint from API key input
Some checks failed
PR Build / build (pull_request) Has been cancelled
b792f40d37
Co-authored-by: Shelley <shelley@exe.dev>
feat(keyboard): ui improvements
All checks were successful
PR Build / build (pull_request) Successful in 8m43s
1111069ff6
- remove rounded corners from keys
- make coding mode the default
- move period next to $ and enter above L2
- mark image and voice modes as coming soon

Co-authored-by: Shelley <shelley@exe.dev>
fix(ime): correct settings activity package name in method.xml
All checks were successful
PR Build / build (pull_request) Successful in 9m4s
9db574e259
Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/440/artifacts/kwila-keyboard-debug)

📦 Build Successful!

APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/441/artifacts/kwila-keyboard-debug)
Co-authored-by: Shelley <shelley@exe.dev>
feat(dev): add emulator management commands to justfile
All checks were successful
PR Build / build (pull_request) Successful in 7m20s
e4e62121d8
Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

Commit: e4e6212
APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **Commit:** `e4e6212` **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/442/artifacts/kwila-keyboard-debug)
docs: update AGENTS.md with emulator testing workflow
All checks were successful
PR Build / build (pull_request) Successful in 11m11s
43314b5df8
Co-authored-by: Shelley <shelley@exe.dev>
docs: make emulator instructions more general
All checks were successful
PR Build / build (pull_request) Successful in 10m32s
b36f169ffa
Co-authored-by: Shelley <shelley@exe.dev>

📦 Build Successful!

Commit: 43314b5
APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **Commit:** `43314b5` **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/443/artifacts/kwila-keyboard-debug)

📦 Build Successful!

Commit: b36f169
APK: app-debug.apk
Size: 47M

Download Debug APK

## 📦 Build Successful! **Commit:** `b36f169` **APK:** app-debug.apk **Size:** 47M [Download Debug APK](https://git.kwila.cloud/kwila/keyboard/actions/runs/444/artifacts/kwila-keyboard-debug)
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kwila/keyboard!1
No description provided.