From 31cb445432e742626cba9e341891de669ea21b4b Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Thu, 2 Jul 2026 23:13:51 +0200 Subject: [PATCH 1/3] Update manifest formats --- Apps/Brainfuck/manifest.properties | 19 ++++++++----------- Apps/Breakout/manifest.properties | 19 ++++++++----------- Apps/Calculator/manifest.properties | 17 +++++++---------- Apps/Diceware/manifest.properties | 17 +++++++---------- Apps/EpubReader/manifest.properties | 19 ++++++++----------- Apps/GPIO/manifest.properties | 17 +++++++---------- Apps/GraphicsDemo/manifest.properties | 17 +++++++---------- Apps/HelloWorld/manifest.properties | 17 +++++++---------- Apps/M5UnitTest/manifest.properties | 17 +++++++---------- Apps/Magic8Ball/manifest.properties | 17 +++++++---------- Apps/MediaKeys/manifest.properties | 19 ++++++++----------- Apps/MystifyDemo/manifest.properties | 17 +++++++---------- Apps/SerialConsole/manifest.properties | 17 +++++++---------- Apps/Snake/manifest.properties | 19 ++++++++----------- Apps/TamaTac/manifest.properties | 19 ++++++++----------- Apps/TodoList/manifest.properties | 19 ++++++++----------- Apps/TwoEleven/manifest.properties | 19 ++++++++----------- 17 files changed, 127 insertions(+), 178 deletions(-) diff --git a/Apps/Brainfuck/manifest.properties b/Apps/Brainfuck/manifest.properties index 99382f6..44c3548 100644 --- a/Apps/Brainfuck/manifest.properties +++ b/Apps/Brainfuck/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.brainfuck -versionName=0.3.0 -versionCode=3 -name=Brainfuck interpreter -description=Brainfuck esoteric language interpreter +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.brainfuck +app.version.name=0.3.0 +app.version.code=3 +app.name=Brainfuck interpreter +app.description=Brainfuck esoteric language interpreter diff --git a/Apps/Breakout/manifest.properties b/Apps/Breakout/manifest.properties index 5a03ca7..f674147 100644 --- a/Apps/Breakout/manifest.properties +++ b/Apps/Breakout/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.breakout -versionName=0.3.0 -versionCode=3 -name=Breakout -description=Classic brick-breaking arcade game +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.breakout +app.version.name=0.3.0 +app.version.code=3 +app.name=Breakout +app.description=Classic brick-breaking arcade game diff --git a/Apps/Calculator/manifest.properties b/Apps/Calculator/manifest.properties index 06c2c7f..5336f78 100644 --- a/Apps/Calculator/manifest.properties +++ b/Apps/Calculator/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.calculator -versionName=0.4.0 -versionCode=4 -name=Calculator +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.calculator +app.version.name=0.4.0 +app.version.code=4 +app.name=Calculator diff --git a/Apps/Diceware/manifest.properties b/Apps/Diceware/manifest.properties index a7f920f..f29f656 100644 --- a/Apps/Diceware/manifest.properties +++ b/Apps/Diceware/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.diceware -versionName=0.4.0 -versionCode=4 -name=Diceware +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.diceware +app.version.name=0.4.0 +app.version.code=4 +app.name=Diceware diff --git a/Apps/EpubReader/manifest.properties b/Apps/EpubReader/manifest.properties index a6dad37..f099395 100644 --- a/Apps/EpubReader/manifest.properties +++ b/Apps/EpubReader/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32s3,esp32p4 -[app] -id=one.tactility.epubreader -versionName=0.2.0 -versionCode=2 -name=Epub Reader -description=Epub and text file reader. Requires PSRAM! +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32s3,esp32p4 +app.id=one.tactility.epubreader +app.version.name=0.2.0 +app.version.code=2 +app.name=Epub Reader +app.description=Epub and text file reader. Requires PSRAM! diff --git a/Apps/GPIO/manifest.properties b/Apps/GPIO/manifest.properties index b8c7d08..0ca9178 100644 --- a/Apps/GPIO/manifest.properties +++ b/Apps/GPIO/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.gpio -versionName=0.5.0 -versionCode=5 -name=GPIO +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.gpio +app.version.name=0.5.0 +app.version.code=5 +app.name=GPIO diff --git a/Apps/GraphicsDemo/manifest.properties b/Apps/GraphicsDemo/manifest.properties index 42707d1..d4771ac 100644 --- a/Apps/GraphicsDemo/manifest.properties +++ b/Apps/GraphicsDemo/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.graphicsdemo -versionName=0.4.0 -versionCode=4 -name=Graphics Demo +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.graphicsdemo +app.version.name=0.4.0 +app.version.code=4 +app.name=Graphics Demo diff --git a/Apps/HelloWorld/manifest.properties b/Apps/HelloWorld/manifest.properties index d29199a..a33c088 100644 --- a/Apps/HelloWorld/manifest.properties +++ b/Apps/HelloWorld/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.helloworld -versionName=0.4.0 -versionCode=4 -name=Hello World +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.helloworld +app.version.name=0.4.0 +app.version.code=4 +app.name=Hello World diff --git a/Apps/M5UnitTest/manifest.properties b/Apps/M5UnitTest/manifest.properties index 8aae22e..16096c7 100644 --- a/Apps/M5UnitTest/manifest.properties +++ b/Apps/M5UnitTest/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32s3,esp32p4 -[app] -id=one.tactility.m5unittest -versionName=0.2.0 -versionCode=2 -name=M5 Unit Test +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32s3,esp32p4 +app.id=one.tactility.m5unittest +app.version.name=0.2.0 +app.version.code=2 +app.name=M5 Unit Test diff --git a/Apps/Magic8Ball/manifest.properties b/Apps/Magic8Ball/manifest.properties index d894973..5783dd0 100644 --- a/Apps/Magic8Ball/manifest.properties +++ b/Apps/Magic8Ball/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.magic8ball -versionName=0.3.0 -versionCode=3 -name=Magic 8-Ball +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.magic8ball +app.version.name=0.3.0 +app.version.code=3 +app.name=Magic 8-Ball diff --git a/Apps/MediaKeys/manifest.properties b/Apps/MediaKeys/manifest.properties index 7327731..f00d830 100644 --- a/Apps/MediaKeys/manifest.properties +++ b/Apps/MediaKeys/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32s3,esp32p4 -[app] -id=one.tactility.mediakeys -versionName=0.2.0 -versionCode=2 -name=Media Keys -description=Bluetooth media keys. Touch or Physical Keyboard control\nB - previous, P - play/pause, N - next, M - mute, D - volume down, U - volume up.\nQ or ESC to exit focus. +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32s3,esp32p4 +app.id=one.tactility.mediakeys +app.version.name=0.2.0 +app.version.code=2 +app.name=Media Keys +app.description=Bluetooth media keys. Touch or Physical Keyboard control\nB - previous, P - play/pause, N - next, M - mute, D - volume down, U - volume up.\nQ or ESC to exit focus. diff --git a/Apps/MystifyDemo/manifest.properties b/Apps/MystifyDemo/manifest.properties index a7c3592..849e06e 100644 --- a/Apps/MystifyDemo/manifest.properties +++ b/Apps/MystifyDemo/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.mystifydemo -versionName=0.4.0 -versionCode=4 -name=Mystify Demo +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.mystifydemo +app.version.name=0.4.0 +app.version.code=4 +app.name=Mystify Demo diff --git a/Apps/SerialConsole/manifest.properties b/Apps/SerialConsole/manifest.properties index d053d9a..bcfe2b6 100644 --- a/Apps/SerialConsole/manifest.properties +++ b/Apps/SerialConsole/manifest.properties @@ -1,10 +1,7 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.serialconsole -versionName=0.5.0 -versionCode=5 -name=Serial Console +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.serialconsole +app.version.name=0.5.0 +app.version.code=5 +app.name=Serial Console diff --git a/Apps/Snake/manifest.properties b/Apps/Snake/manifest.properties index ca69403..aea1bd3 100644 --- a/Apps/Snake/manifest.properties +++ b/Apps/Snake/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.snake -versionName=0.6.0 -versionCode=6 -name=Snake -description=Classic Snake game +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.snake +app.version.name=0.6.0 +app.version.code=6 +app.name=Snake +app.description=Classic Snake game diff --git a/Apps/TamaTac/manifest.properties b/Apps/TamaTac/manifest.properties index 2b32de5..4424c68 100644 --- a/Apps/TamaTac/manifest.properties +++ b/Apps/TamaTac/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.tamatac -versionName=0.2.0 -versionCode=2 -name=TamaTac -description=Virtual pet inspired by Tamagotchi. Only runs on devices with PSRAM. +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.tamatac +app.version.name=0.2.0 +app.version.code=2 +app.name=TamaTac +app.description=Virtual pet inspired by Tamagotchi. Only runs on devices with PSRAM. diff --git a/Apps/TodoList/manifest.properties b/Apps/TodoList/manifest.properties index a93d9ac..41666c6 100644 --- a/Apps/TodoList/manifest.properties +++ b/Apps/TodoList/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.todolist -versionName=0.3.0 -versionCode=3 -name=Todo List -description=Simple task list manager +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.todolist +app.version.name=0.3.0 +app.version.code=3 +app.name=Todo List +app.description=Simple task list manager diff --git a/Apps/TwoEleven/manifest.properties b/Apps/TwoEleven/manifest.properties index 21bcd95..d7607e9 100644 --- a/Apps/TwoEleven/manifest.properties +++ b/Apps/TwoEleven/manifest.properties @@ -1,11 +1,8 @@ -[manifest] -version=0.1 -[target] -sdk=0.7.0 -platforms=esp32,esp32s3,esp32c6,esp32p4 -[app] -id=one.tactility.twoeleven -versionName=0.5.0 -versionCode=5 -name=2048 -description=A fun, customizable 2048 sliding tile game for tactility!\nSlide tiles to combine numbers and reach 2048.\nChoose grid sizes: 3x3 (easy), 4x4 (classic), 5x5, or 6x6 (expert). +manifest.version=0.2 +target.sdk=0.7.0 +target.platforms=esp32,esp32s3,esp32c6,esp32p4 +app.id=one.tactility.twoeleven +app.version.name=0.5.0 +app.version.code=5 +app.name=2048 +app.description=A fun, customizable 2048 sliding tile game for tactility!\nSlide tiles to combine numbers and reach 2048.\nChoose grid sizes: 3x3 (easy), 4x4 (classic), 5x5, or 6x6 (expert). From 675f40fd98efd9389fb6124580af8fd05913a0e7 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Thu, 2 Jul 2026 23:37:13 +0200 Subject: [PATCH 2/3] New app manifest format --- Apps/Brainfuck/manifest.properties | 4 +- Apps/Breakout/manifest.properties | 4 +- Apps/Calculator/manifest.properties | 4 +- Apps/Diceware/manifest.properties | 4 +- Apps/EpubReader/manifest.properties | 4 +- Apps/GPIO/manifest.properties | 4 +- Apps/GraphicsDemo/manifest.properties | 4 +- Apps/HelloWorld/manifest.properties | 4 +- Apps/M5UnitTest/manifest.properties | 4 +- Apps/Magic8Ball/manifest.properties | 4 +- Apps/MediaKeys/manifest.properties | 4 +- Apps/MystifyDemo/manifest.properties | 4 +- Apps/SerialConsole/manifest.properties | 4 +- Apps/Snake/manifest.properties | 4 +- Apps/TamaTac/manifest.properties | 4 +- Apps/TodoList/manifest.properties | 4 +- Apps/TwoEleven/manifest.properties | 4 +- tactility.py | 57 ++++++++++---------------- 18 files changed, 56 insertions(+), 69 deletions(-) diff --git a/Apps/Brainfuck/manifest.properties b/Apps/Brainfuck/manifest.properties index 44c3548..bd1d7d2 100644 --- a/Apps/Brainfuck/manifest.properties +++ b/Apps/Brainfuck/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.brainfuck -app.version.name=0.3.0 -app.version.code=3 +app.version.name=0.4.0 +app.version.code=4 app.name=Brainfuck interpreter app.description=Brainfuck esoteric language interpreter diff --git a/Apps/Breakout/manifest.properties b/Apps/Breakout/manifest.properties index f674147..3f040e9 100644 --- a/Apps/Breakout/manifest.properties +++ b/Apps/Breakout/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.breakout -app.version.name=0.3.0 -app.version.code=3 +app.version.name=0.4.0 +app.version.code=4 app.name=Breakout app.description=Classic brick-breaking arcade game diff --git a/Apps/Calculator/manifest.properties b/Apps/Calculator/manifest.properties index 5336f78..874d52a 100644 --- a/Apps/Calculator/manifest.properties +++ b/Apps/Calculator/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.calculator -app.version.name=0.4.0 -app.version.code=4 +app.version.name=0.5.0 +app.version.code=5 app.name=Calculator diff --git a/Apps/Diceware/manifest.properties b/Apps/Diceware/manifest.properties index f29f656..a333b68 100644 --- a/Apps/Diceware/manifest.properties +++ b/Apps/Diceware/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.diceware -app.version.name=0.4.0 -app.version.code=4 +app.version.name=0.5.0 +app.version.code=5 app.name=Diceware diff --git a/Apps/EpubReader/manifest.properties b/Apps/EpubReader/manifest.properties index f099395..f8e4fc3 100644 --- a/Apps/EpubReader/manifest.properties +++ b/Apps/EpubReader/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32s3,esp32p4 app.id=one.tactility.epubreader -app.version.name=0.2.0 -app.version.code=2 +app.version.name=0.3.0 +app.version.code=3 app.name=Epub Reader app.description=Epub and text file reader. Requires PSRAM! diff --git a/Apps/GPIO/manifest.properties b/Apps/GPIO/manifest.properties index 0ca9178..2050bb1 100644 --- a/Apps/GPIO/manifest.properties +++ b/Apps/GPIO/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.gpio -app.version.name=0.5.0 -app.version.code=5 +app.version.name=0.6.0 +app.version.code=6 app.name=GPIO diff --git a/Apps/GraphicsDemo/manifest.properties b/Apps/GraphicsDemo/manifest.properties index d4771ac..72091c7 100644 --- a/Apps/GraphicsDemo/manifest.properties +++ b/Apps/GraphicsDemo/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.graphicsdemo -app.version.name=0.4.0 -app.version.code=4 +app.version.name=0.5.0 +app.version.code=5 app.name=Graphics Demo diff --git a/Apps/HelloWorld/manifest.properties b/Apps/HelloWorld/manifest.properties index a33c088..bcf90d0 100644 --- a/Apps/HelloWorld/manifest.properties +++ b/Apps/HelloWorld/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.helloworld -app.version.name=0.4.0 -app.version.code=4 +app.version.name=0.5.0 +app.version.code=5 app.name=Hello World diff --git a/Apps/M5UnitTest/manifest.properties b/Apps/M5UnitTest/manifest.properties index 16096c7..2a7653b 100644 --- a/Apps/M5UnitTest/manifest.properties +++ b/Apps/M5UnitTest/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32s3,esp32p4 app.id=one.tactility.m5unittest -app.version.name=0.2.0 -app.version.code=2 +app.version.name=0.3.0 +app.version.code=3 app.name=M5 Unit Test diff --git a/Apps/Magic8Ball/manifest.properties b/Apps/Magic8Ball/manifest.properties index 5783dd0..f8d4cbc 100644 --- a/Apps/Magic8Ball/manifest.properties +++ b/Apps/Magic8Ball/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.magic8ball -app.version.name=0.3.0 -app.version.code=3 +app.version.name=0.4.0 +app.version.code=4 app.name=Magic 8-Ball diff --git a/Apps/MediaKeys/manifest.properties b/Apps/MediaKeys/manifest.properties index f00d830..1324cef 100644 --- a/Apps/MediaKeys/manifest.properties +++ b/Apps/MediaKeys/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32s3,esp32p4 app.id=one.tactility.mediakeys -app.version.name=0.2.0 -app.version.code=2 +app.version.name=0.3.0 +app.version.code=3 app.name=Media Keys app.description=Bluetooth media keys. Touch or Physical Keyboard control\nB - previous, P - play/pause, N - next, M - mute, D - volume down, U - volume up.\nQ or ESC to exit focus. diff --git a/Apps/MystifyDemo/manifest.properties b/Apps/MystifyDemo/manifest.properties index 849e06e..2611b4a 100644 --- a/Apps/MystifyDemo/manifest.properties +++ b/Apps/MystifyDemo/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.mystifydemo -app.version.name=0.4.0 -app.version.code=4 +app.version.name=0.5.0 +app.version.code=5 app.name=Mystify Demo diff --git a/Apps/SerialConsole/manifest.properties b/Apps/SerialConsole/manifest.properties index bcfe2b6..44bde44 100644 --- a/Apps/SerialConsole/manifest.properties +++ b/Apps/SerialConsole/manifest.properties @@ -2,6 +2,6 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.serialconsole -app.version.name=0.5.0 -app.version.code=5 +app.version.name=0.6.0 +app.version.code=6 app.name=Serial Console diff --git a/Apps/Snake/manifest.properties b/Apps/Snake/manifest.properties index aea1bd3..49a1ee4 100644 --- a/Apps/Snake/manifest.properties +++ b/Apps/Snake/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.snake -app.version.name=0.6.0 -app.version.code=6 +app.version.name=0.7.0 +app.version.code=7 app.name=Snake app.description=Classic Snake game diff --git a/Apps/TamaTac/manifest.properties b/Apps/TamaTac/manifest.properties index 4424c68..895f867 100644 --- a/Apps/TamaTac/manifest.properties +++ b/Apps/TamaTac/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.tamatac -app.version.name=0.2.0 -app.version.code=2 +app.version.name=0.3.0 +app.version.code=3 app.name=TamaTac app.description=Virtual pet inspired by Tamagotchi. Only runs on devices with PSRAM. diff --git a/Apps/TodoList/manifest.properties b/Apps/TodoList/manifest.properties index 41666c6..5b32bef 100644 --- a/Apps/TodoList/manifest.properties +++ b/Apps/TodoList/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.todolist -app.version.name=0.3.0 -app.version.code=3 +app.version.name=0.4.0 +app.version.code=4 app.name=Todo List app.description=Simple task list manager diff --git a/Apps/TwoEleven/manifest.properties b/Apps/TwoEleven/manifest.properties index d7607e9..d4e4a4f 100644 --- a/Apps/TwoEleven/manifest.properties +++ b/Apps/TwoEleven/manifest.properties @@ -2,7 +2,7 @@ manifest.version=0.2 target.sdk=0.7.0 target.platforms=esp32,esp32s3,esp32c6,esp32p4 app.id=one.tactility.twoeleven -app.version.name=0.5.0 -app.version.code=5 +app.version.name=0.6.0 +app.version.code=6 app.name=2048 app.description=A fun, customizable 2048 sliding tile game for tactility!\nSlide tiles to combine numbers and reach 2048.\nChoose grid sizes: 3x3 (easy), 4x4 (classic), 5x5, or 6x6 (expert). diff --git a/tactility.py b/tactility.py index 8215ec2..7fead72 100644 --- a/tactility.py +++ b/tactility.py @@ -1,4 +1,3 @@ -import configparser import json import os import re @@ -13,7 +12,7 @@ from urllib.parse import urlparse ttbuild_path = ".tactility" -ttbuild_version = "3.5.1" +ttbuild_version = "4.0.0" ttbuild_cdn = "https://cdn.tactilityproject.org" ttbuild_sdk_json_validity = 3600 # seconds ttport = 6666 @@ -106,9 +105,17 @@ def get_url(ip, path): return f"http://{ip}:{ttport}{path}" def read_properties_file(path): - config = configparser.RawConfigParser() - config.read(path) - return config + properties = {} + with open(path, "r") as file: + for line in file: + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + key, sep, value = line.partition("=") + if not sep: + continue + properties[key.strip()] = value.strip() + return properties #endregion Core @@ -231,32 +238,12 @@ def read_manifest(): return read_properties_file("manifest.properties") def validate_manifest(manifest): - # [manifest] - if not "manifest" in manifest: - exit_with_error("Invalid manifest format: [manifest] not found") - if not "version" in manifest["manifest"]: - exit_with_error("Invalid manifest format: [manifest] version not found") - # [target] - if not "target" in manifest: - exit_with_error("Invalid manifest format: [target] not found") - if not "sdk" in manifest["target"]: - exit_with_error("Invalid manifest format: [target] sdk not found") - if not "platforms" in manifest["target"]: - exit_with_error("Invalid manifest format: [target] platforms not found") - # [app] - if not "app" in manifest: - exit_with_error("Invalid manifest format: [app] not found") - if not "id" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] id not found") - if not "versionName" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] versionName not found") - if not "versionCode" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] versionCode not found") - if not "name" in manifest["app"]: - exit_with_error("Invalid manifest format: [app] name not found") + for key in ("manifest.version", "target.sdk", "target.platforms", "app.id", "app.version.name", "app.version.code", "app.name"): + if key not in manifest: + exit_with_error(f"Invalid manifest format: {key} not found") def is_valid_manifest_platform(manifest, platform): - manifest_platforms = manifest["target"]["platforms"].split(",") + manifest_platforms = manifest["target.platforms"].split(",") return platform in manifest_platforms def validate_manifest_platform(manifest, platform): @@ -265,7 +252,7 @@ def validate_manifest_platform(manifest, platform): def get_manifest_target_platforms(manifest, requested_platform): if requested_platform == "" or requested_platform is None: - return manifest["target"]["platforms"].split(",") + return manifest["target.platforms"].split(",") else: validate_manifest_platform(manifest, requested_platform) return [requested_platform] @@ -512,7 +499,7 @@ def build_action(manifest, platform_arg, skip_build): if use_local_sdk: global local_base_path local_base_path = os.environ.get("TACTILITY_SDK_PATH") - validate_local_sdks(platforms_to_build, manifest["target"]["sdk"]) + validate_local_sdks(platforms_to_build, manifest["target.sdk"]) if should_fetch_sdkconfig_files(platforms_to_build): fetch_sdkconfig_files(platforms_to_build) @@ -521,7 +508,7 @@ def build_action(manifest, platform_arg, skip_build): sdk_json = read_sdk_json() validate_self(sdk_json) # Build - sdk_version = manifest["target"]["sdk"] + sdk_version = manifest["target.sdk"] if not use_local_sdk: if not sdk_download_all(sdk_version, platforms_to_build): exit_with_error("Failed to download one or more SDKs") @@ -570,7 +557,7 @@ def get_device_info(ip): print_status_error(f"Device info request failed: {e}") def run_action(manifest, ip): - app_id = manifest["app"]["id"] + app_id = manifest["app.id"] print_status_busy("Running") url = get_url(ip, "/app/run") params = {'id': app_id} @@ -614,7 +601,7 @@ def install_action(ip, platforms): return False def uninstall_action(manifest, ip): - app_id = manifest["app"]["id"] + app_id = manifest["app.id"] print_status_busy("Uninstalling") url = get_url(ip, "/app/uninstall") params = {'id': app_id} @@ -670,7 +657,7 @@ def uninstall_action(manifest, ip): exit_with_error("manifest.properties not found") manifest = read_manifest() validate_manifest(manifest) - all_platform_targets = manifest["target"]["platforms"].split(",") + all_platform_targets = manifest["target.platforms"].split(",") # Update SDK cache (tool.json) if not use_local_sdk and should_update_tool_json() and not update_tool_json(): exit_with_error("Failed to retrieve SDK info") From 184ab4555c548e9eabacd460598d5346edff6520 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Thu, 2 Jul 2026 23:50:43 +0200 Subject: [PATCH 3/3] Update release.py for manifest changes --- release.py | 68 +++++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/release.py b/release.py index 094b1b6..9e7e47b 100644 --- a/release.py +++ b/release.py @@ -2,13 +2,20 @@ import tarfile import os import tempfile -import configparser import sys def read_properties_file(path): - config = configparser.RawConfigParser() - config.read(path) - return config + properties = {} + with open(path, "r") as file: + for line in file: + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + key, sep, value = line.partition("=") + if not sep: + continue + properties[key.strip()] = value.strip() + return properties def get_manifest(appPath): """Extract only the file named 'manifest.properties' from the given tar/tar.gz @@ -62,12 +69,12 @@ def get_manifest(appPath): return None def get_versioned_file_name(manifest): - app_id = manifest["app"]["id"] - version_code = manifest["app"]["versionCode"] + app_id = manifest["app.id"] + version_code = manifest["app.version.code"] return f"{app_id}-{version_code}.app" def get_os_version(manifest): - sdk = manifest["target"]["sdk"] + sdk = manifest["target.sdk"] # Remove trailing hyphen suffix if present if "-" in sdk: return sdk.rsplit("-", 1)[0].strip() @@ -75,38 +82,25 @@ def get_os_version(manifest): return sdk def manifest_config_to_flat_json(manifest): - """Convert a ConfigParser manifest into a flat JSON-like dict. - - Expected sections/keys (case-insensitive for keys): - - [app] - id -> appId - versionName -> appVersionName - versionCode -> appVersionCode (int) - name -> appName - description -> appDescription (optional; default "") - - [target] - sdk -> targetSdk - platforms -> targetPlatforms (comma-separated list) + """Convert a flat (V2) manifest dict into a flat JSON-like dict. + + Expected keys: + app.id -> appId + app.version.name -> appVersionName + app.version.code -> appVersionCode (int) + app.name -> appName + app.description -> appDescription (optional; default "") + target.sdk -> targetSdk + target.platforms -> targetPlatforms (comma-separated list) Unknown/missing values fall back to sensible defaults per requirements. """ - def get_opt(section, option, default=None): - if not manifest.has_section(section): - return default - # try exact option then lowercase (RawConfigParser lowercases by default) - if manifest.has_option(section, option): - return manifest.get(section, option) - low = option.lower() - if manifest.has_option(section, low): - return manifest.get(section, low) - return default - # Map values - app_id = get_opt("app", "id", "") - app_version_name = get_opt("app", "versionName", "") - app_version_code_raw = get_opt("app", "versionCode", "0") - app_name = get_opt("app", "name", "") - app_description = get_opt("app", "description", "") or "" + app_id = manifest.get("app.id", "") + app_version_name = manifest.get("app.version.name", "") + app_version_code_raw = manifest.get("app.version.code", "0") + app_name = manifest.get("app.name", "") + app_description = manifest.get("app.description", "") or "" # Coerce version code to int safely try: @@ -114,8 +108,8 @@ def get_opt(section, option, default=None): except Exception: app_version_code = 0 - target_sdk = get_opt("target", "sdk", "") - platforms_raw = get_opt("target", "platforms", "") + target_sdk = manifest.get("target.sdk", "") + platforms_raw = manifest.get("target.platforms", "") target_platforms = [p.strip() for p in str(platforms_raw).split(",") if p.strip()] if platforms_raw is not None else [] filename = get_versioned_file_name(manifest)