diff --git a/.github/workflows/test-jaseci.yml b/.github/workflows/test-jaseci.yml
index 02f075a098..811d99d0df 100644
--- a/.github/workflows/test-jaseci.yml
+++ b/.github/workflows/test-jaseci.yml
@@ -43,12 +43,15 @@ jobs:
pip install -e jac-streamlit
pip install pytest
pip install pytest-asyncio
+ pip install pytest-xdist
- name: Set environment for testing
run: |
echo "TEST_ENV=true" >> $GITHUB_ENV
- name: Run tests
- run: pytest -x jac jac-cloud jac-byllm jac-streamlit
+ run: |
+ pytest -x jac -n auto
+ pytest -x jac-cloud jac-byllm jac-streamlit
- name: Run jac-cloud tests with DB
run: pytest -x jac-cloud
env:
diff --git a/.gitignore b/.gitignore
index 867915271a..e640b5bf14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,7 @@ MANIFEST
.coverage
.session
*.session.db
+*.session.*.json
.DS_Store
.vscode
build
diff --git a/README.md b/README.md
index 1f8e31dd6a..22540d2bd1 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@
diff --git a/docs/docs/communityhub/release_notes.md b/docs/docs/communityhub/release_notes.md
index eeb47befe9..6b9b8e2ab0 100644
--- a/docs/docs/communityhub/release_notes.md
+++ b/docs/docs/communityhub/release_notes.md
@@ -5,6 +5,7 @@ This document provides a summary of new features, improvements, and bug fixes in
## jaclang 0.8.10 / jac-cloud 0.2.10 / byllm 0.4.5 (Unreleased)
+- **Frontend + Backend with `cl` Keyword (Experimental)**: Introduced a major experimental feature enabling unified frontend and backend development in a single Jac codebase. The new `cl` (client) keyword marks declarations for client-side compilation, creating a dual compilation pipeline that generates both Python (server) and pure JavaScript (client) code. Includes full JSX language integration for building modern web UIs, allowing developers to write React-style components directly in Jac with seamless interoperability between server and client code.
- **Parser Performance Optimization**: Refactored parser node tracking to use O(N) complexity instead of O(N²), drastically reducing parsing time for large files by replacing list membership checks with set-based ID lookups.
- **OPath Designation for Object Spatial Paths**: Moved Path designation for object spatial paths to OPath to avoid conflicts with Python's standard library `pathlib.Path`. This change ensures better interoperability when using Python's path utilities alongside Jac's object-spatial programming features.
- **byLLM Lazy Loading**: Refactored byLLM to support lazy loading by moving all exports to `byllm.lib` module. Users should now import from `byllm.lib` in Python (e.g., `from byllm.lib import Model, by`) and use `import from byllm.lib { Model }` in Jac code. This improves startup performance and reduces unnecessary module loading.
diff --git a/docs/docs/internals/jsx_client_serv_design.md b/docs/docs/internals/jsx_client_serv_design.md
new file mode 100644
index 0000000000..052c30a5f9
--- /dev/null
+++ b/docs/docs/internals/jsx_client_serv_design.md
@@ -0,0 +1,406 @@
+# JSX-Based Webpage Generation Design Document
+
+## Overview
+
+This document describes how Jac's `cl` (client) keyword produces browser-ready web experiences. Client-marked declarations compile to JavaScript and ship through `jac serve` as static bundles that execute entirely in the browser. The current implementation is **CSR-only** (Client-Side Rendering): the server returns an empty HTML shell with bootstrapping metadata and a JavaScript bundle that handles all rendering in the browser.
+
+## Architecture Overview
+
+```mermaid
+graph TD
+ subgraph "Development - Compilation"
+ A[Jac source with cl] --> B[Jac Compiler]
+ B --> C[PyAST Gen Pass
pyast_gen_pass.py]
+ B --> D[ESTree Gen Pass
esast_gen_pass.py]
+ C --> E[Python module
.py output]
+ D --> F[JavaScript code
module.gen.js]
+ end
+
+ subgraph "Runtime - Serving"
+ E --> H[JacAPIServer]
+ F --> I[ClientBundleBuilder]
+ H --> J[GET /page/fn]
+ I --> K["/static/client.js"]
+ J --> L[HTML shell + init payload]
+ K --> M[Runtime + Module JS]
+ L --> N[Browser]
+ M --> N
+ N --> O[Hydrate & Execute]
+ O --> P[Render JSX to DOM]
+ end
+```
+
+### CSR Execution Flow
+
+1. **Compilation**: When a `.jac` file is compiled:
+ - The `cl` keyword marks declarations for client-side execution
+ - `pyast_gen_pass.py` skips Python codegen for client-only nodes (via `_should_skip_client`)
+ - `esast_gen_pass.py` generates ECMAScript AST and JavaScript code
+ - Client metadata is collected in `ClientManifest` (exports, globals, params)
+
+2. **Bundle Generation**: `ClientBundleBuilder` creates the browser bundle:
+ - Compiles [client_runtime.jac](../jaclang/runtimelib/client_runtime.jac) to provide JSX and walker runtime
+ - Compiles the application module's client-marked code
+ - Generates registration code that exposes functions globally
+ - Includes polyfills (e.g., `Object.prototype.get()` for dict-like access)
+
+3. **Page Request**: When `GET /page/` is requested:
+ - Server returns minimal HTML with empty ``
+ - Embeds `
+
+