[BUG] Broken themes after the latest update
Prerequisites (Required)
- [x] I searched for any existing report about this bug to avoid opening a duplicate.
- [x] This issue contains only one bug.
- [x] The title of this issue accurately describes the bug.
Bug Description (Required)
FlorisBoard was updated to v0.5.0-alpha01 which broke all the themes due to the rewriting of the theming engine.
Steps to reproduce
- Update FlorisBoard
- See the bug
Expected Behavior (Required)
Themes should work fine
Actual Behavior (Required)
FlorisBoard Version (Required)
v0.5.0-alpha01
Gboardish version (Required)
3.0.2, latest
Android version (Required)
Android 15 (GrapheneOS)
Device (Required)
Pixel 6a
Screenshots or Videos (Optional)
No response
Additional Information (Optional)
No response
Gonna update to the latest theme release, I forgot I haven't updated in a while.
Edit: The issue persists on the latest release.
Yep, that’s expected. The hardworking Florisboard team introduced a new theme engine (Snygg2) starting with v0.5.0-alpha01, which changes how themes are structured and styled.
Floristyle needs a full rewrite to support it. Every theme has to be reviewed, updated with new elements and properties, and tested.
Hopefully it’ll be ready in the next few days, there’s a lot of themes to migrate 🥲
So for now, the latest supported Florisboard is v0.4.6
Yes there is need of rework on theme for new 0.5 release .
The latest v5.0.0 version should resolve this issue.
Thank you for the updated Themes, I've approved the addons store release so everybody can download it from there.
Thank you for the quick update, the new version works great and appears to be way more than just a small fix for the schema change
Everything works again, thank you for your work!
It is once again broken and crashing Florisboard when i tried to load any Florisstyle theme.
Heres my logs:
Environment information
- FlorisBoard 0.4.6 (104)
- Device: Google Pixel 6a (bluejay)
- Android: 16 (cn=BAKLAVA sdk=36)
Attached logs and stacktrace files
Detailed info (Debug log header)
======= SYSTEM INFO =======
Time : 2025-08-06T16:24:04.217540Z
Manufacturer : Google
Model : Pixel 6a
Product : bluejay
Android : 16 (cn=BAKLAVA sdk=36) [2025080400]
ABIs : [arm64-v8a, armeabi-v7a, armeabi]
Memory : 4.87 GiB (89.44% used, 5.44 GiB max)
Font scale : 0.85
Locales : en-US,vi-VN
======= APP INFO =======
Package : dev.patrickgold.florisboard
Name : FlorisBoard
Version : 0.4.6 (104)
Build type : release
Build commit hash : bc5ed3475c40d3d1ba40a53b5063186d7228c13c
Java heap memory : 10.10 MiB (3.95% used, 256.00 MiB max)
Native heap memory : 6.79 MiB (46.16% used, 14.70 MiB max)
======= FEATURE CONFIG =======
Smartbar enabled : true
Suggestions enabled : false
Inline autofill enabled : true
Glide enabled : false
Internal clipboard enabled : true
======= EXTENSION CONFIG =======
Theme extensions :
Language Packs :
======= ACTIVE SUBTYPE CONFIG =======
Active Subtype :
-1/en-US/org.florisboard.currencysets:dollar/org.florisboard.layouts:qwerty
Installed Subtypes :
1754497443095.stacktrace
kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 14: Expected start of the object '{', but had '"' instead at path: $['invalid']
JSON input: {
"$schema": "https://schemas.florisboard.o.....
at kotlinx.serialization.json.internal.WriteModeKt.JsonDecodingException(SourceFile:3)
at kotlinx.serialization.json.internal.WriteModeKt.JsonDecodingException(SourceFile:4)
at androidx.room.RoomOpenHelper.fail(SourceFile:61)
at androidx.room.RoomOpenHelper.fail$default(SourceFile:13)
at androidx.room.RoomOpenHelper.fail$kotlinx_serialization_json(SourceFile:69)
at androidx.room.RoomOpenHelper.unexpectedToken(SourceFile:48)
at androidx.room.RoomOpenHelper.consumeNextToken(SourceFile:7)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.beginStructure(SourceFile:65)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(SourceFile:13)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(SourceFile:1)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue$1(SourceFile:122)
at kotlinx.serialization.json.JsonKt.decodeSerializableElement(SourceFile:11)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(SourceFile:52)
at kotlinx.serialization.internal.LinkedHashMapSerializer.readElement(SourceFile:77)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(SourceFile:30)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(SourceFile:1)
at kotlinx.serialization.internal.ObjectSerializer.deserialize(SourceFile:10)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue$1(SourceFile:122)
at kotlinx.serialization.json.Json.decodeFromString(SourceFile:31)
at dev.patrickgold.florisboard.ime.theme.ThemeManager$updateActiveTheme$2.invokeSuspend(SourceFile:235)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:9)
at kotlinx.coroutines.DispatchedTask.run(SourceFile:113)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(SourceFile:96)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@d77b313, Dispatchers.Default]
1754497443097.stacktrace
kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 14: Expected start of the object '{', but had '"' instead at path: $['invalid']
JSON input: {
"$schema": "https://schemas.florisboard.o.....
at kotlinx.serialization.json.internal.WriteModeKt.JsonDecodingException(SourceFile:3)
at kotlinx.serialization.json.internal.WriteModeKt.JsonDecodingException(SourceFile:4)
at androidx.room.RoomOpenHelper.fail(SourceFile:61)
at androidx.room.RoomOpenHelper.fail$default(SourceFile:13)
at androidx.room.RoomOpenHelper.fail$kotlinx_serialization_json(SourceFile:69)
at androidx.room.RoomOpenHelper.unexpectedToken(SourceFile:48)
at androidx.room.RoomOpenHelper.consumeNextToken(SourceFile:7)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.beginStructure(SourceFile:65)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(SourceFile:13)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(SourceFile:1)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue$1(SourceFile:122)
at kotlinx.serialization.json.JsonKt.decodeSerializableElement(SourceFile:11)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(SourceFile:52)
at kotlinx.serialization.internal.LinkedHashMapSerializer.readElement(SourceFile:77)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(SourceFile:30)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(SourceFile:1)
at kotlinx.serialization.internal.ObjectSerializer.deserialize(SourceFile:10)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue$1(SourceFile:122)
at kotlinx.serialization.json.Json.decodeFromString(SourceFile:31)
at dev.patrickgold.florisboard.ime.theme.ThemeManager$updateActiveTheme$2.invokeSuspend(SourceFile:235)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:9)
at kotlinx.coroutines.DispatchedTask.run(SourceFile:113)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(SourceFile:96)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@9a06d6f, Dispatchers.Default]
It's not broken and working as expected. The theme you are trying to install was made for florisboard v0.5.x and thus is not installable on v0.4.x. You can either download the latest release made for FlorisBoard 0.4 or use the latest beta release of FlorisBoard.
@lm41 was faster 😅 Thank you for explaining things clearly and providing the links.
@fossicefairy, for more info and version compatibility, feel free to check out the Compatibility section in the README
