Project Types — Fabric’s four independent pipelines
Fabric is a multi-project-type AI builder: the user explicitly picks the target platform when creating a project in the editor, and each target platform corresponds to an independent, technology-stack-optimal pipeline.
Companion doc:
fabric-ux— how the 4 project types coexist inside a single editor for editing, previewing, and debugging (“editor as remote control” principle).
Project-creation contract
The Fabric authoring surface and the target runtime being created are independent dimensions. All five authoring clients—Web, Desktop, iOS, Android, and the WeChat Mini Program—can create and manage all four project types:
| Authoring client | Web | WeChat MP | Mobile (RN / Keel) | Desktop (Electron) |
|---|---|---|---|---|
| Web | ✅ | ✅ | ✅ | ✅ |
| Desktop | ✅ | ✅ | ✅ | ✅ |
| iOS | ✅ | ✅ | ✅ | ✅ |
| Android | ✅ | ✅ | ✅ | ✅ |
| WeChat Mini Program | ✅ | ✅ | ✅ | ✅ |
Shared interaction contract:
GET /project-typesis the only source for enabled types, the default, and display order. All five clients render the returnedproject_typesarray in order and keep no client-side fallback ordering.- The server default is Web → WeChat MP → Mobile → Desktop, with Web
selected by default. Operators can change both centrally through
FABRIC_PROJECT_TYPES_ORDERandFABRIC_PROJECT_TYPES_DEFAULT; the default must be enabled. POST /projectvalidatesruntimeagainst the same server catalog and uses the configured default when it is unspecified, so a disabled type cannot be created by bypassing the picker.- A project type is immutable after creation; changing type means creating a new, independent project.
- When an authoring client cannot host a runtime natively, it still exposes that type and provides an appropriate preview or release path such as a WebView, Keel Go, QR code, or target-platform toolchain.
- Enterprise, Mortar, team size, and distribution channels are capabilities or configuration, not additional project types.
Core principle: one independent pipeline per platform
One independent pipeline per target platform, technology stack = the de facto standard for that platform, AI agent uses a system prompt specialized for that stack.
What the four project types share:
- Editor UI (Fabric itself)
- AI agent infrastructure (different system prompts; model / tool calling / context management are shared)
- Mortar BaaS (auth / data / files / realtime / compute / usage — orthogonal to the frontend stack)
What the four project types don’t share:
- Source code (one per project; the AI does NOT do “cross-platform code generation”)
- Build stack
- Deployment / distribution
- Runtime
- Testing / debugging methods
Overview of the four pipelines
Fabric (web)
User picks project type
│
┌──────────┬───────────┼───────────┬──────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ ┌──────┐
│ Mobile │ │ Web │ │ Desktop │ │ WeChat │ │ Ent. │
│ (RN) │ │ (Vite │ │(Electron │ │ Mini │ │x-cut │
│ Keel │ │ React) │ │ wrap │ │ (WXML) │ │ │
│ │ │ │ │ web) │ │ │ │ │
│ │ │ │ │ │ │ │ │ │
└────────┘ └────────┘ └──────────┘ └──────────┘ └──────┘
│ │ │ │
▼ ▼ ▼ ▼
Cloud Static Electron WeChat
Build Deploy Build DevTools CLI
+ Update (CDN/edge) + auto- + miniprogram-ci
│ │ updater │
▼ ▼ ▼ ▼
Keel Go User domain .app/.exe/ WeChat Open Platform
QR / scan + SSL .deb/.rpm appid + review
│ │ │ │
└──────────┴───────────┴───────────┘
│
▼
┌──────────────────────────┐
│ Mortar BaaS (shared) │
│ auth · data · files · │
│ realtime · compute · │
│ usage │
└──────────────────────────┘
Mobile (RN / Keel)
Positioning: Appunvs’s initial launch product. The crucial junction of China’s mobile-native culture and an AI builder.
Stack:
- Source: React Native + TypeScript
- Build: KAS Build (metro + Hermes bytecode)
- Distribution:
- Dev preview: Keel Go QR-scan (the host shell instantly loads a jsbundle without recompiling a native binary)
- Production release: the user’s host shell app (embedding the Keel SDK) + KAS Update
- Debugging: the user opens Keel Go on their own phone → scans the QR Fabric shows → second-level on-device preview
- Libraries: Tier 1 list (see
keel/MODULES.md)
Why RN is irreplaceable here (not because of cross-platform, but because of host-shell instant preview):
- Native Swift/Kotlin: every code change requires recompiling a binary; App Store review is minutes-to-hours → UX collapses
- Flutter: hot reload requires an IDE attach; not a user-level “scan-and-preview” experience
- WebView wrapping a mobile webapp: not truly “debugging a mobile app inside a mobile app”
- RN + host shell (Expo Go pattern) is the only stack that achieves “AI generates code → user pulls out phone, scans QR → instant on-device debug”
Implementation status:
- ✅ host shell (iOS Swift / Android Kotlin) embeds Keel SDK
- ✅ KAS Build (metro + Docker pipeline)
- ✅ Update server (Go, includes bsdiff4 patch generation)
- ✅ Keel Go (free tester app) + Dev Client (project-specific)
- ✅ Update client SDK (TS / iOS Swift / Android Kotlin all three done)
- 🟨 Update productionized (CDN / custom domains / staged rollout, planned)
Web (Vite + React + Tailwind + shadcn/ui)
Positioning: Same battlefield as Lovable / v0 / Bolt — a web AI builder.
Three stack picks (settled):
| Layer | Choice | Alternatives vs reason chosen |
|---|---|---|
| Framework | Vite + React + TypeScript | Next.js App Router / Remix / Astro / Nuxt → the backend is Mortar (the generated app is a pure client SPA with no SSR value), and deployment was a static export anyway (which neuters Next’s server features); Vite matches Lovable / bolt (they generate client apps too), the toolchain is lighter, and preview + prod are both static |
| CSS | Tailwind CSS | CSS Modules / styled-components / Emotion → Tailwind utility-first lets AI write styles without inventing class names (class = style); extremely rich LLM training corpus |
| UI components | shadcn/ui | MUI / Ant Design / Chakra / bare Tailwind+headlessui → shadcn copies source instead of installing a package, so users can edit any component; couples naturally with Tailwind tokens; Lovable / v0 / Bolt all use it → writing shadcn is already muscle memory for AI |
Decided later (not in this doc’s scope — decide before Web implementation to avoid premature commitment): form library (react-hook-form / @tanstack/form), state management (Zustand / Jotai / Redux), data fetching (@tanstack/query / SWR), animation (Framer Motion), icons (lucide-react)
Deployment: vite build → dist/ static tree → Aliyun OSS + Aliyun CDN (GA mainland-focused; overseas later adds Cloudflare R2 / Fastly); preview / dev uses vite
Database / Auth / Files: connect to Mortar Cloud directly via @mortar-ai/client SDK (shares the same Mortar workspace shape as Mobile)
Libraries: the React ecosystem is fully open (npm install anything)
Implementation status: not started (kicks off after Mobile completes)
Desktop (Electron wrapping Web)
Positioning: Let Web users choose “distribute as a desktop app”.
Stack: Electron wrapping the dist/ static output from vite build.
Why Electron, not Tauri:
Tauri uses the system webview (Windows WebView2 / macOS WebKit / Linux WebKitGTK), and the three webviews behave inconsistently —
For human engineers: Tauri’s ~10 MB binary advantage over Electron’s ~150 MB is worth it; engineers can manually test on each platform and write compatibility code.
For an AI builder: the lethal problem is the AI can write code, can compile, but can’t verify.
- Tauri lacks mature cross-webview automated rendering comparison test infrastructure
- WebKitGTK silently fails on certain modern web APIs (CSS Container Queries,
:has(), newer Intl APIs); the AI can’t see “silent breakage” - Forcing the AI to write code that “works on three webviews” = writing 2–3-year-old web code, a UX regression
- LLM training corpora are heavily skewed toward Chromium-consistent cases
Electron trades ~140 MB for “one Chromium, AI-written code is trustworthy” — for an AI-generated product that’s the core trade. Tauri is fine for projects with human engineers manually testing each platform; not fine for an AI builder.
Future reversal condition: if Tauri switches to servo (the Rust browser engine Mozilla restarted in 2024) as a single-engine option, this trade-off flips. But servo is at least 2–3 years from production-ready — too long to wait.
Implementation status: not started (kicks off after Web completes; ~2–3 weeks to add Electron wrapper + auto-updater + code signing)
WeChat Mini Program (native WXML)
Reason: after Mobile / Web / Desktop cover the three mainstream forms, WeChat MP is another unavoidable pipeline for the China market — restaurant / retail / O2O merchants’ demand intensity for mini programs even exceeds native apps. Enterprise is a cross-cutting feature that can be sold on top of any Mobile / Web / Desktop / WeChat MP project type and doesn’t block WeChat MP.
Positioning: Capture China’s “use-and-go” Mini Program user base (WeChat ~1B MAU), competing in a totally different segment from Lovable / v0. Primary customer segment: Chinese ToB merchants (restaurant / retail / O2O).
Stack:
- Source: native WXML + WXSS + restricted JS (write
wx.*APIs directly) - Build: WeChat DevTools CLI + the official
miniprogram-cinpm package - Distribution: developer registers an appid → submits to WeChat review → publishes
Upload auth mechanism (miniprogram-ci official flow; Appunvs doesn’t reinvent the wheel):
- User registers an appid on mp.weixin.qq.com (real-name / enterprise verification)
- User goes to Development → Development Settings → Mini Program Code Upload
- Downloads the upload key (
.keyprivate-key file, similar to an SSH key) - Configures an IP allowlist (must include the Appunvs build worker egress IPs)
- Downloads the upload key (
- User uploads
appid + .keyto Appunvs (encrypted at rest; only the build worker can use it) - Appunvs calls
miniprogram-ci: signs with the.key+ uploads to that appid - WeChat review / release flow on the WeChat Open Platform is user-triggered (Appunvs can’t intervene)
No WeChat OAuth / cookies path — WeChat Open Platform’s OAuth is for “user login” (@keel-ai/wechat), unrelated to developer permissions. Appunvs must hold the .key on the user’s behalf; there is no third-party-authorization shortcut. This matches how Aliyun / Tencent Cloud Functions and other third-parties integrate with WeChat Mini Programs.
Why not Taro / uni-app:
- Taro / uni-app are for “small/medium companies who want to take a shortcut”: write one React/Vue codebase that compiles to many platforms
- An AI builder doesn’t need shortcuts; the AI doesn’t get tired writing code, so it should produce optimal output for each platform
- Taro’s compilation is lossy, AI training data is sparse, output quality has a low ceiling
Why only WeChat for now, not Alipay / Douyin / Baidu:
- User-count order of magnitude: WeChat ~1B vs others ~500–700M
- Each Mini Program platform added = an independent pipeline + an independent AI prompt + an independent review process
- WeChat first validates as a single-platform feasibility study; expansion is a later decision
Implementation status (2026-07): GA-ready (code side). WeChat is its own
authoring type types.ProjectTypeWechat (WXML/TypeScript prompt + JSON/page/tsc
check_build + templates/wechatapp scaffold); miniprogram-ci runs in the harness
(runner-wechat / wechat-ci.js, upload|preview) via
cloudbuild.HarnessWeChatBuilder (the old WeChatMPDockerBuilder +
cloud-build-wechat were retired). Publish, dev-version preview (QR), appid/.key
via the unified Publish Config, and test-connectivity ship on web/iOS/Android;
review is manual (self-managed model — see wechat-mp-architecture.md). The
create picker now offers WeChat. The one non-code GA prerequisite is ICP filing
for the Mortar API domain.
Enterprise (cross-cutting)
Positioning: a enterprise capability overlay that crosses all 4 project pipelines — NOT a new project type. Customer base: mid-to-large enterprises (restaurant / retail chains, government / enterprise customers, SaaS companies with compliance requirements).
Feature set (sold as an add-on on any Mobile / Web / Desktop / WeChat MP project type):
| Capability | Notes |
|---|---|
| Private deployment | Fabric + Mortar Cloud bundle deployed inside the customer’s Aliyun VPC / private IDC |
| SSO / SAML / OIDC | Integrate with customer IdP (Okta / Feishu / DingTalk / Microsoft AD) |
| Audit log | All AI turn / publish / billing events go to an audit log, exportable / queryable |
| SLA | 99.9%+ availability contract, dedicated support |
| Team collaboration / RBAC | Project-level permissions: owner / editor / viewer, inheritable from IdP groups |
| Data compliance | Data residency commitment (China-only / EU-only), customer-managed encryption keys (BYOK), data export / deletion SLA |
| Private AI provider | Customers wire their own Anthropic / OpenAI / self-hosted model endpoint, bypassing Appunvs’s shared quota |
Why after WeChat MP, not bringing it forward: private deploy / SSO / audit log are sales tools, not product differentiators — you have to ship Mobile / Web / Desktop / WeChat MP first to prove “what an AI builder can do”, and only then is there an enterprise package worth selling. The counter-intuitive “do enterprise before mini programs” version was rejected: enterprise is cross-cutting and sold against an existing product; without WeChat MP (mini programs), you lose half the Chinese ToB market.
Implementation status: not started. Kicks off after WeChat MP; expected ~3–4 months of sustained investment.
The official websites (appunvs.com / mortar.appunvs.com / keel.appunvs.com / docs.appunvs.com) are NOT a separate project type. They’re built directly as Web projects: there are 4 special Web projects inside Fabric, each bound to one of the above domains, going through exactly the same build / deploy pipeline as any other user’s Web project. This is the purest form of dogfood. The required “custom domain → Web deploy URL” mapping is planned in a later Web iteration (B5 custom domains).
Roadmap
| Project type | Content | Effort estimate | Prerequisite |
|---|---|---|---|
| Mobile | Mobile (RN/Keel) project type | ✅ Done | None |
| Web | Web (Vite + React) project type | ~6–8 weeks | Mobile done |
| Desktop | Desktop (Electron wrapping Web) project type | ~2–3 weeks | Web done |
| WeChat MP | WeChat Mini Program (WXML) project type | ~6–8 weeks | Desktop done |
| Enterprise | Enterprise cross-cutting (private deploy / SSO / audit log / SLA / RBAC) | ~3–4 months | WeChat MP done |
Each project type ships independently: mobile going live enables mobile, web going live enables web — no interdependency. Enterprise overlays on any of Mobile / Web / Desktop / WeChat MP.
Why WeChat MP comes before Enterprise
Reasons:
- WeChat MP is the unavoidable form for the China market — restaurant / retail / O2O merchants almost exclusively ship mini programs, not native apps. Skipping WeChat MP to do Enterprise = losing half the Chinese ToB market.
- Enterprise is a cross-cutting feature, not a new project type — Mobile / Web / Desktop / WeChat MP must first land “what an AI builder can do”; only then is there a sellable enterprise SKU. Doing Enterprise before WeChat MP = selling air.
- After WeChat MP, enterprise customers get mobile + web + desktop + MP four project types at once, completing the sales narrative: one enterprise purchase, four shipping endpoints.
- WeChat MP customer base highly overlaps with the enterprise customer base — having WeChat MP first gives enterprise reps an “AI can also generate mini programs” talking point, making Enterprise deals close faster.
Shared layer
What the four project types share:
1. AI agent infrastructure
- Model layer: Claude / GPT / etc. multi-provider abstraction (see
fabric/server/internal/ai) - Tool calling: generic tools like
fs_write/publish_project/run_testreusable across project types - Context management / message compaction / streaming protocol
Each project type has its own system-prompt set:
- Mobile prompt: expert in RN / Tier 1 modules / Hermes constraints / mobile UX patterns
- Web prompt: expert in Vite + React / Tailwind / shadcn/ui / web UX patterns
- Desktop prompt: expert in Electron main/renderer process separation / IPC / system integration APIs
- WeChat prompt: expert in WXML / wx.* API / mini program lifecycle / Chinese-specific UX patterns
2. Mortar BaaS
auth/data/files/realtime/compute/usage— six capabilities common across platforms- Each project type calls Mortar via the platform’s SDK (
@mortar-ai/clientfor web/desktop, Mortar Swift/Kotlin SDK for mobile, wx-mortar-sdk for WeChat) - Pricing / billing / quota dimensions are unified at the Mortar layer
3. Fabric
- Project management / Project concept / git workspace
- User accounts / billing / collaboration
- AI conversation UI
Hosting / distribution responsibility split
Where do each project type’s build artifacts get deployed? Who owns it? This is the key clarification of the two product boundaries (Appunvs vs Keel):
| Project type | Build runs on | Artifacts deployed to | Who runs this infra |
|---|---|---|---|
| Mobile | KAS Build (Keel’s own cloud) | KAS Update CDN (manifest + bsdiff bundles) → host shell + Keel Go fetch | Keel |
| Web | Fabric Web Build worker | Appunvs self-run CDN (Aliyun OSS + Aliyun CDN, GA domestic; overseas later adds Cloudflare R2 etc.) → <projectid>.preview.appunvs.com or a custom domain | Appunvs |
| Desktop | Fabric Desktop Build worker | Appunvs self-run OSS + Electron auto-updater endpoint → users download .app/.exe/.deb | Appunvs |
| WeChat Mini | Locally / on an Appunvs worker, running miniprogram-ci | WeChat Open Platform (NOT Appunvs’s responsibility) | |
| Enterprise | Customer’s VPC / IDC (private deploy) | Customer’s intranet / customer-facing domain | Customer ops + Appunvs support |
Key clarification: Keel has no Hosting layer (keel/docs/architecture.md top notes: Keel doesn’t target web). But Appunvs DOES have Hosting responsibility because Appunvs is broader than Keel and has to manage web/desktop project type deployments.
See architecture § Appunvs self-run hosting infrastructure.
Analogy:
- Keel ≈ Expo + EAS (mobile RN platform + 5-layer SaaS: SDK / CLI / Build / Update / Submit)
- Appunvs ≈ Lovable / v0 / Bolt (AI builder + user-app deployment hosting) — but Appunvs adds mobile / desktop / mini-program three additional project types
The two are adjacent but cleanly split: Keel owns the Mobile pipeline end-to-end (from build to OTA distribution); Appunvs owns web / desktop hosting + the cross-project-type editor + AI agent + billing.
Relationship to Keel’s positioning
Keel is the only product component Mobile uses. Keel itself remains an independent product (Apache 2.0 open source), and can be sold to any company building an RN-based mobile builder — not just Appunvs.
Web / Desktop / WeChat MP / Enterprise don’t depend on Keel:
- Web uses Vite + React + static hosting; nothing to do with Keel
- Desktop uses Electron wrapping Web; nothing to do with Keel
- WeChat uses WXML + miniprogram-ci; nothing to do with Keel
- Enterprise is cross-cutting; not tied to a specific project type
- The official websites (appunvs.com / mortar.appunvs.com / keel.appunvs.com) exist as Web projects and don’t need an independent pipeline
Keel’s market = companies in China building RN mobile builders (Appunvs as a self-user + external sales). Appunvs’s market = full-stack AI builder (consumes Keel itself for mobile, self-builds web/desktop/WeChat pipelines for the rest).
The two are decoupled, neither locks in the other.