summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorketsuban <ketsuban@kukuri.dev>2026-08-28 18:40:24 +0000
committerketsuban <ketsuban@kukuri.dev>2026-08-28 18:40:24 +0000
commit8799a45024cc80b5720a1c56bb7e658edf190962 (patch)
tree5f7a35c7d915415ad9041fb5037cc3f11709328c
parentb399dbd6ab6d0597998d0fe068c2178bf6d4dfa4 (diff)
downloadkukuri-8799a45024cc80b5720a1c56bb7e658edf190962.tar.gz
kukuri-8799a45024cc80b5720a1c56bb7e658edf190962.tar.bz2
kukuri-8799a45024cc80b5720a1c56bb7e658edf190962.zip
Ship Compose-for-Wasm UI as the live web app
Root cause of earlier wasm OOM: kotlin.daemon.jvmargs=1024m in gradle.properties (CLI -Dkotlin.daemon.jvmargs is ignored for daemon matching). Measured on this 4GB box with daemon heap bisect: 1280m OOM / 1536m OK (dev), production webpack OK at 2048m (peak: kotlin daemon ~2.0GB + gradle daemon ~0.55GB + node 0.15GB). - gradle.properties: kotlin.daemon.jvmargs=-Xmx2048m -XX:+UseSerialGC - orgflow-ui: wasmJs browser target, CanvasBasedWindow entry, index.html with ComposeTarget canvas + loading overlay - bundleWeb: package production webpack output + index.html (13MB: orgflow-ui.js 0.5MB + app.wasm 8.4MB + skiko.wasm 2.8MB) - web/ now renders the full OrgFlowApp in-browser instead of the domain banner/DOM report page
-rw-r--r--gradle.properties2
-rw-r--r--modules/orgflow-domain/build.gradle.kts7
-rw-r--r--modules/orgflow-ui/build.gradle.kts3
-rw-r--r--modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt10
-rw-r--r--modules/orgflow-ui/src/wasmJsMain/resources/index.html20
5 files changed, 39 insertions, 3 deletions
diff --git a/gradle.properties b/gradle.properties
index 958e132..18a9480 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,5 @@
org.gradle.jvmargs=-Xmx1536m -XX:MaxMetaspaceSize=512m
-kotlin.daemon.jvmargs=-Xmx1024m
+kotlin.daemon.jvmargs=-Xmx2048m -XX:+UseSerialGC
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
diff --git a/modules/orgflow-domain/build.gradle.kts b/modules/orgflow-domain/build.gradle.kts
index 23a90ce..0d06289 100644
--- a/modules/orgflow-domain/build.gradle.kts
+++ b/modules/orgflow-domain/build.gradle.kts
@@ -101,8 +101,11 @@ tasks.register<Zip>("bundleWasmNode") {
tasks.register<Zip>("bundleWeb") {
group = "deployment"
- dependsOn("assemble")
- from(layout.buildDirectory.dir("dist/wasmJs/productionExecutable"))
+ dependsOn(project(":modules:orgflow-ui").tasks.named("wasmJsBrowserProductionWebpack"))
+ from(project(":modules:orgflow-ui").layout.buildDirectory.dir("kotlin-webpack/wasmJs/productionExecutable"))
+ from(project(":modules:orgflow-ui").layout.buildDirectory.dir("processedResources/wasmJs/main")) {
+ include("index.html")
+ }
archiveFileName.set("kukuri-wasm-web-${project.version}.zip")
}
diff --git a/modules/orgflow-ui/build.gradle.kts b/modules/orgflow-ui/build.gradle.kts
index 4c66f03..9ad30f3 100644
--- a/modules/orgflow-ui/build.gradle.kts
+++ b/modules/orgflow-ui/build.gradle.kts
@@ -12,6 +12,9 @@ version = "0.1.0"
kotlin {
jvm()
+ @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class)
+ wasmJs { browser(); binaries.executable() }
+
sourceSets {
commonMain.dependencies {
implementation(compose.runtime)
diff --git a/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt b/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt
new file mode 100644
index 0000000..790cd78
--- /dev/null
+++ b/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt
@@ -0,0 +1,10 @@
+package jp.orgflow.ui
+
+import androidx.compose.ui.window.CanvasBasedWindow
+
+@OptIn(androidx.compose.ui.ExperimentalComposeUiApi::class)
+fun main() {
+ CanvasBasedWindow(title = "kukuri OrgFlow") {
+ OrgFlowApp()
+ }
+}
diff --git a/modules/orgflow-ui/src/wasmJsMain/resources/index.html b/modules/orgflow-ui/src/wasmJsMain/resources/index.html
new file mode 100644
index 0000000..ea7248c
--- /dev/null
+++ b/modules/orgflow-ui/src/wasmJsMain/resources/index.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<title>kukuri OrgFlow</title>
+<style>
+html, body { margin: 0; height: 100%; overflow: hidden; background: #fff; }
+#ComposeTarget { width: 100%; height: 100%; display: block; }
+#loading { position: absolute; top: 45%; width: 100%; text-align: center; font-family: system-ui, sans-serif; color: #6750a4; }
+</style>
+</head>
+<body>
+<canvas id="ComposeTarget"></canvas>
+<div id="loading">loading kukuri OrgFlow (Compose/Wasm)…</div>
+<script>
+ window.addEventListener("load", () => document.getElementById("loading")?.remove());
+</script>
+<script src="orgflow-ui.js"></script>
+</body>
+</html>