drukscode-v2/docs/developer/architecture.md
OpenCode AI e9899d2e6d
Some checks failed
Android CI Build / check (push) Has been cancelled
Android CI Build / package-apks (push) Has been cancelled
Docs Deploy / build (push) Has been cancelled
Module Market Check / Validate modules/ (push) Has been cancelled
Module Market Publish / Generate submissions.json (push) Has been cancelled
Docs Deploy / deploy (push) Has been cancelled
Initial DruksCode V2: fresh fork of web-to-app (f3b488e) with DruksCode identity
- Package rename com.webtoapp -> br.com.drukstech.codeapp
- Product rename WebToApp/web-to-app -> DruksCode/drukscode
- Design system Wta* -> Dkc*
- applicationId br.com.drukstech.codeapp (.play for gplay flavor)
- rootProject.name DruksCode
- Fresh git history (upstream kept as remote for sync)
2026-09-12 02:42:02 +02:00

2.5 KiB

Architecture

The single most important mental model in DruksCode: preview and export are two different execution paths that share the same runtime code. Most bugs of the form "works in preview, broken after export" come from breaking this contract.

The two paths

Editor (Compose screens in app/)
  ↔ data models (WebApp, configs)
  ↔ export factory (ApkConfig / ApkConfigJsonFactory)
  ↔ ApkBuilder / ApkBuildCache  →  signed generated APK

app/ sources
  → syncShellRuntimeSources  →  shell DEX  →  webview_shell.apk (template)

Generated APK runtime
  DruksCodeApplication → ShellModeManager → load assets JSON config
  → WebViewManager / runtime servers (Node/PHP/Python/Go/WordPress)
Host :app (preview) Generated APK (export)
DEX All app/src classes Shell-synced subset (full runtime set)
Config Editor / in-memory models Assets JSON via ShellModeManager
Template Not used app/src/main/assets/template/webview_shell.apk

The contract

A flag set in the editor is useless at export unless it flows through all of:

  1. Model — WebApp / nested config, bound to the editor UI.
  2. Export mapping — ApkBuilder / ApkConfig / ApkConfigJsonFactory.
  3. Shell config types — ShellModeManager / shell config data classes (if the runtime reads it).
  4. Runtime use site — in shell-synced code.

Miss any step and you get one of three symptoms: the editor shows a switch that export ignores, export embeds config the runtime never reads, or the runtime reads a field that was never written.

One shell template

There is exactly one shell template: webview_shell.apk from :shell release. Do not introduce a second template APK. Generated apps keep a low targetSdk (28) on the shell path because they rely on on-device fork+exec runtimes — do not raise shell targetSdk casually.

Configuration center

The single source of truth for all feature settings is WebApp (data/model/WebApp.kt) and its *Config classes, carried through a full packaging passthrough chain into the generated APK. At runtime, the generated app reads its config from app_config.json in assets via ShellModeManager.

Dependency policy

Avoid new third-party dependencies unless strongly justified (app/build.gradle.kts / shell/build.gradle.kts). Prefer platform APIs and existing modules. The shell has a thin dependency set and a low targetSdk — keep it that way.