projects fluxboard

FluxBoard

Beta

A customisable Android keyboard with a sticker library attached, built by uncoalesced so that nothing you type leaves your phone.

v0.1.7.5-BETA · versionCode 15 · Android 8.0+ · MIT

FluxBoard's mark: two halves of a split keyboard facing each other inside a circle of radiating field linesFluxBoard's mark: two halves of a split keyboard facing each other inside a circle of radiating field lines

01 · what it is

The keyboard is the main thing

You can re-theme it, re-layout it, resize it, glide-type on it, and it learns your words in a dictionary that lives on your device and nowhere else. The sticker side lets you cut stickers out of screenshots and photos, keep them as editable objects rather than one-off exports, and send them from the keyboard.

It is free, MIT-licensed, and has no accounts, no ads, and no analytics. It works and it is being used daily. It is also a beta, and it has rough edges.

  • Android
  • Kotlin
  • keyboard
  • on-device
  • open source

02 · what works

Shipped and in daily use

Typing

  • Glide typing, on by default, and you can turn it off.
  • On-device predictive text and autocorrect, with a personal dictionary that learns the words you actually use.
  • Caps lock by double-tapping shift, and double-space for a full stop.
  • A text-editing panel with a proper cursor pad.
  • Haptics, with a strength slider that maps to something sensible across different phones.

Shaping it

  • Themes you can edit: colours, key shapes, fonts, background images, and how much haze sits behind the keys.
  • Layouts you can remap, plus an optional number row and corner symbols on every key.
  • Three independent size sliders: overall height, key size within its cell, and the gap below the bottom row.
  • Media controls for whatever is playing.

Stickers

  • Import from a screenshot, a photo, or the system photo picker, then crop and erase the background by hand.
  • Edit a sticker again later instead of rebuilding it.
  • Categories and a favourites tab.
  • Turn a trimmed video clip into a GIF or an animated WebP.
  • Send stickers from the keyboard’s own emoji and sticker picker.

Moving between devices

  • Library migration runs over your own network with QR pairing and no server in the middle.
  • A clipboard history that is only ever cleared by you.

03 · privacy

A keyboard sees everything before the app does

That is the whole reason this project has the shape it has. Passwords, card numbers, recovery phrases, medical questions, messages you delete before sending: all of it passes through the keyboard first. A keyboard is the one component on a phone with a structural view of every private thing its owner types, which makes where its prediction and clipboard data actually go a fair question to ask of any keyboard, including this one.

FluxBoard’s answer is to remove the places that data could go. No analytics, no crash reporting, no ad SDK, and no Google Play Services dependency. The dictionary, clipboard history, stickers, and themes stay in the app’s private storage.

Checked by CI, not asserted

Two of those claims are proven on every build rather than written down and trusted. The release APK is unpacked and both its DEX files and R8’s own mapping are scanned; any Play Services, ML Kit, Firebase or datatransport class fails the build. That check carries a positive control, so it fails loudly if the scan itself breaks rather than passing silently. The tester usage log is separately proven absent from release builds as a class, not merely switched off behind a flag.

Credential fields are handled by the keyboard, not by a setting

Password and PIN fields are detected from the field’s own input type, not from a flag the host app has to remember to set. In those fields the keyboard stops learning, stops suggesting, stops autocorrecting, stops decoding glides, and stops capturing clipboard content, and a numeric PIN field gets a digits-only pad. Auto-capitalize is suppressed there too, because a password silently starting with a capital is worse in a masked field than in a visible one. There is also a manual privacy switch for fields Android gives no signal about, and it stays on until you turn it off.

Note to founder

A longer write-up on how manufacturer keyboards collect data passively, and what FluxBoard does differently, is planned and not yet written. This section stays at what the project can currently evidence until that piece exists.

04 · what does not work yet

The parts that are missing

Listed because a description that only covers the good parts is not much use to someone deciding whether to install it. This is the same list the project keeps in its own README.

  • Automatic subject cutout is not in this version

    Extraction is crop plus the manual eraser. The earlier automatic path depended on ML Kit, which pulls Google Play Services and a telemetry transport in with it, so it was removed rather than reconfigured. It comes back only behind a genuinely open on-device model shipped in the repo.

  • Sharing a sticker by link only works on your own network

    Device-to-device migration over Wi-Fi with QR pairing works. The relay that would let a link reach someone off your network exists as code and is deployed nowhere, so treat that feature as absent.

  • Voice input, translate and grammar check are placeholders

    They are visible in the keyboard’s toolbar and say so when tapped.

  • English only, one QWERTY-family layout

    You can remap the letters, but there is no second language.

  • Sticker delivery to WhatsApp and Discord is unconfirmed

    The bug that caused it, a null MIME type on the .sticker extension, is fixed and verified at the provider level. The phone this project is tested on runs LineageOS with neither app installed, so that one is still an open report rather than a closed one.

05 · how it is put together

Four modules, no service layer

FluxBoard implementation choices by layer
UIJetpack Compose, including inside the keyboard itself
ArchitectureMVVM with unidirectional data flow
DIHilt, except the IME’s own ViewModels, which are built by hand
PersistenceRoom for anything queryable, files on disk for sticker bytes
ConcurrencyCoroutines and Flow
Install sizeUnder 100 MB, enforced in CI, currently about 8 MB

app is the settings and sticker-management UI. keyboard-core is the IME, prediction, theming and clipboard. sticker-core is the data layer and the image pipeline. transfer is device-to-device migration. app depends on the other three, and keyboard-core also depends on sticker-core, because the keyboard renders the sticker library.

Kotlin only inside the app; Python is used for the offline dictionary, emoji and icon tooling. Min SDK 26, target SDK 36.

06 · built on other people’s work

Prior art

  • FlorisBoard, the main reference for how to build an Android IME at all, and for its theming and dictionary approach.
  • EweSticker, prior art for a sticker keyboard and for handling several sticker formats.
  • LocalSend, the model for serverless transfer between devices on a network.
  • ZXing and qrcode-kotlin for QR scanning and generation, both Apache-2.0 and neither needing Play Services.
  • SCOWL, for the word lists that filter the dictionary corpus. Without that filter the raw corpus ships misspellings as high-frequency words, and autocorrect then refuses to fix the most common typos.

Copyright 2026 uncoalesced and ZapCannonYT. Bug reports from real use are worth more to this project right now than patches.