
Declarative JS/TSX components compiled into QuickJS bytecode, driving Compose-based native rendering; includes hot-update delivery with verification/rollback, unified component schema DSL, CLI and benchmarks.
JS 写声明式组件、Compose Multiplatform 渲染的 UI 框架,引擎为 QuickJS(经 quickjs-kmp 接入)。Android / iOS 双端。
早期阶段。关键选型已定,M1 Counter 与 M2 列表页已在双端跑通(TSX → 模块字节码 → 引擎 → patch → Compose);进度见 docs/roadmap.md。
docs/ 设计文档、ADR、roadmap
packages/ npm 包:tinyui-core · tinyui-native · tinyui-cli
compose/ KMP 库 app.tinyui:tinyui(Compose Multiplatform 侧)
updates/ KMP 库 app.tinyui:tinyui-updates(热下发:校验、落盘、选择、回退,见 docs/updates.md)
schema/ 内置组件 schema(TS DSL),两侧契约的唯一真值,`pnpm schema` 生成
sample/ 示例 App(sample/js 与 sample/js-extra 是两个包的页面源码,Gradle 构建时经 CLI 编成字节码打进资源)
bench/ 响应式模型与引擎 benchmark
build-logic/ Gradle convention plugins
目录与命名依据见 docs/README.md。
implementation("app.tinyui:tinyui:<version>")(Maven Central;自带 wang.harlon:quickjs-kmp);热下发另加 app.tinyui:tinyui-updates,同版本号pnpm add tinyui-core tinyui-native 与 pnpm add -D tinyui-cli,三包同版本号;tinyui build 用的 quickjs-kmp 宿主工具 qjsc-kmp 随 tinyui-cli 的依赖装好(macOS、Linux 预编译版)版本号与 git tag 一致,不带 v 前缀,Maven 与 npm 三包同号同 tag 发:推 tag 触发 publish.yml,Maven 走 Sonatype,npm 走 trusted publishing(OIDC,无 token)。
pnpm install # Node 22+,pnpm 10
./gradlew build # compose 库 + 测试(Android host / iOS simulator)+ sample APK + iOS framework;需要 JDK 25、Android SDK、Xcode
pnpm build && pnpm test # 三个 npm 包
pnpm schema # 改了 schema/ 之后重新生成两侧代码
pnpm runtime # 改了 packages/core、packages/native 或升了 quickjs-kmp 之后,重新生成库内置的运行时字节码sample 的 Gradle 构建会调 tinyui build 把 sample/js 编成字节码,qjsc-kmp 来自 pnpm install 装好的 npm 包;Android host 测试还需要宿主 JNI 库。两种来源:
local.properties 加 quickjs-kmp.dir=<quickjs-kmp 仓路径>,SDK 从源码构建(composite build),qjsc-kmp 与 JNI 库都由该仓的任务自动编出,零配置TINYUI_QUICKJS_HOST_JNI 指向含 libquickjs_kmp 的目录(CI 的做法见 .github/workflows/build.yml);没有预编译 qjsc-kmp 的平台再用 TINYUI_QJSC 指向自己编的那份JS 写声明式组件、Compose Multiplatform 渲染的 UI 框架,引擎为 QuickJS(经 quickjs-kmp 接入)。Android / iOS 双端。
早期阶段。关键选型已定,M1 Counter 与 M2 列表页已在双端跑通(TSX → 模块字节码 → 引擎 → patch → Compose);进度见 docs/roadmap.md。
docs/ 设计文档、ADR、roadmap
packages/ npm 包:tinyui-core · tinyui-native · tinyui-cli
compose/ KMP 库 app.tinyui:tinyui(Compose Multiplatform 侧)
updates/ KMP 库 app.tinyui:tinyui-updates(热下发:校验、落盘、选择、回退,见 docs/updates.md)
schema/ 内置组件 schema(TS DSL),两侧契约的唯一真值,`pnpm schema` 生成
sample/ 示例 App(sample/js 与 sample/js-extra 是两个包的页面源码,Gradle 构建时经 CLI 编成字节码打进资源)
bench/ 响应式模型与引擎 benchmark
build-logic/ Gradle convention plugins
目录与命名依据见 docs/README.md。
implementation("app.tinyui:tinyui:<version>")(Maven Central;自带 wang.harlon:quickjs-kmp);热下发另加 app.tinyui:tinyui-updates,同版本号pnpm add tinyui-core tinyui-native 与 pnpm add -D tinyui-cli,三包同版本号;tinyui build 用的 quickjs-kmp 宿主工具 qjsc-kmp 随 tinyui-cli 的依赖装好(macOS、Linux 预编译版)版本号与 git tag 一致,不带 v 前缀,Maven 与 npm 三包同号同 tag 发:推 tag 触发 publish.yml,Maven 走 Sonatype,npm 走 trusted publishing(OIDC,无 token)。
pnpm install # Node 22+,pnpm 10
./gradlew build # compose 库 + 测试(Android host / iOS simulator)+ sample APK + iOS framework;需要 JDK 25、Android SDK、Xcode
pnpm build && pnpm test # 三个 npm 包
pnpm schema # 改了 schema/ 之后重新生成两侧代码
pnpm runtime # 改了 packages/core、packages/native 或升了 quickjs-kmp 之后,重新生成库内置的运行时字节码sample 的 Gradle 构建会调 tinyui build 把 sample/js 编成字节码,qjsc-kmp 来自 pnpm install 装好的 npm 包;Android host 测试还需要宿主 JNI 库。两种来源:
local.properties 加 quickjs-kmp.dir=<quickjs-kmp 仓路径>,SDK 从源码构建(composite build),qjsc-kmp 与 JNI 库都由该仓的任务自动编出,零配置TINYUI_QUICKJS_HOST_JNI 指向含 libquickjs_kmp 的目录(CI 的做法见 .github/workflows/build.yml);没有预编译 qjsc-kmp 的平台再用 TINYUI_QJSC 指向自己编的那份