From d4376715456c4466ed3bbdc53ec8b2cff1a816b4 Mon Sep 17 00:00:00 2001 From: saladday <1203511142@qq.com> Date: Wed, 23 Sep 2026 22:19:10 +0800 Subject: [PATCH 1/6] docs: guide newcomers from installation to Web node setup --- README.md | 45 ++++-- docs/getting-started/install.md | 151 +++++++++++------- docs/getting-started/operations.md | 31 ++-- docs/getting-started/quickstart.md | 9 +- services/agents-api/HOSTED-SANDBOX-MANAGER.md | 6 +- site/index.html | 19 +-- 6 files changed, 171 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index 3bbc72fb2..271896705 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ -# OpenAgentCore - -![OpenAgentCore: One core. Many agents. Open infrastructure for AI agents.](docs/assets/openagentcore-banner.png) +# Parsar Core **Open-source Agents API infrastructure, with your choice of native harness.** -Run Codex, Claude Code and MiniMax Code behind one execution API. OpenAgentCore +Run Codex, Claude Code and MiniMax Code behind one execution API. Parsar Core owns Sessions, environments, files, credentials and execution history; each native harness keeps its own model and tool loop. Core runs independently of the Parsar product. Core and its Web console ship together. The default installation runs Core, Web -and PostgreSQL with zero execution nodes. A local sandbox provider is optional: -enable microsandbox or Docker explicitly when installing. With a provider enabled, -Core creates each required sandbox from the colocated Runtime image. Model +and PostgreSQL with zero execution nodes. Add execution nodes through Web when +you are ready. Core creates each required sandbox from the shared Runtime image. Model credentials are supplied through the existing write-only API extension. Hosted deployments use one selected provider across local or remote nodes. The @@ -22,7 +19,28 @@ existing Sessions retain their node across disconnects and resume. ## Start here -- [Install Core and Web](docs/getting-started/install.md) +1. **Install Core and Web.** Obtain and verify a matching Linux amd64 bundle, + then run its installer. For node access, choose a reachable HTTPS address + before the first install and configure your DNS/TLS reverse proxy: + + ```sh + ./install.sh --public-url https://core.example + ``` + + This starts Core, Web and PostgreSQL with zero execution nodes. Public release + bundles are not published yet; see the [installation guide](docs/getting-started/install.md) + for building a bundle and the host/network prerequisites. +2. **Sign in to Web.** Open the console address printed by the installer. Use + `admin` and the password in `~/.parsar/core/config/console.password`. + The paired console needs no additional API key setup. +3. **Add a node.** Open **Hosted Sandbox Manager**, choose Docker or microsandbox, + and confirm the reachable Core origin. Select **Generate node command**, then + copy and run it on a prepared Linux host. Web shows when the node is online + and its provider is ready. All nodes in a deployment use the same provider. + +Installation and node enrollment do not call a model. Once a node is ready, +run an optional API example with your own model credentials. + - [Make your first API request](docs/getting-started/quickstart.md) - [Service health, data and operations](docs/getting-started/operations.md) - [Hosted Sandbox Manager](services/agents-api/HOSTED-SANDBOX-MANAGER.md) @@ -30,11 +48,16 @@ existing Sessions retain their node across disconnects and resume. - [Add or select a harness](contracts/agents-api/harness-selection.md) - [Public landing page source](site/index.html) -After verifying and extracting a matching Linux amd64 distribution: +### Other installation options + +Run these from an extracted distribution. The plain command uses loopback for +local console/API access. For node enrollment, use the reachable origin described +above; the installer does not change an existing installation's public URL. +Installing a local provider is optional, and is not required for adding nodes in Web. ```sh -./install.sh # Core + Web + PostgreSQL, no sandbox provider -./install.sh --core-only # Core + PostgreSQL, no sandbox provider +./install.sh # Core + Web + PostgreSQL, loopback access, zero nodes +./install.sh --core-only # Core + PostgreSQL, zero nodes ./install.sh --sandbox-provider true --provider microsandbox ./install.sh --sandbox-provider true --provider docker ``` diff --git a/docs/getting-started/install.md b/docs/getting-started/install.md index 7d5b0533e..903a6b4cc 100644 --- a/docs/getting-started/install.md +++ b/docs/getting-started/install.md @@ -3,45 +3,45 @@ Install one matching Parsar Core distribution. By default it starts PostgreSQL, Core and the existing Web console in containers, with zero execution nodes. It does not import Runtime images, mount the Docker socket or host devices into -Core, or generate a managed Provider configuration. A local sandbox provider is -an explicit installation option. +Core, or generate a managed Provider configuration. Add nodes through Web after +installation. A local sandbox provider is an optional installation choice. No model key, Environment wizard or sample task is required during installation. +Recommended path: [install](#verify-extract-and-install) → +[sign in to Web](#sign-in-to-web) → +[add a node](#add-nodes-after-a-default-installation). +You can leave the deployment with zero nodes until you need execution. + ## Host requirements The first distribution targets Linux amd64 with Python 3.9+, Docker and Docker Compose v2. Run the installer as a non-root user who can use Docker. The default installation requires neither KVM nor systemd user services. -Optional microsandbox also requires glibc, a running systemd user manager with -linger enabled, and user read/write access to `/dev/kvm`. Nested cloud hosts must -expose hardware virtualization. With this option, Core runs as a native user -service so restarting it does not terminate the Provider's microVM processes. -The installer checks these -prerequisites; it does not grant host permissions or silently fall back to Docker. -The optional Docker sandbox provider keeps Core in Compose and requires neither -KVM nor systemd user services. - -For optional microsandbox, reserve capacity for the native Runtime: its initial -profile uses -4 GiB RAM, 2 CPUs, an 8 GiB root disk and an 8 GiB environment disk per active sandbox, with at most 4 active -and 16 retained allocations. Limits are operator configuration, not model input. -Use a trusted, single-operator host and durable local storage. The installer does -not change host virtualization settings, install Docker, create an OS user or -expose a remote administration service. +The optional local provider has additional requirements described under +[installation choices](#installation-choices). Node-host requirements are listed +in the [add-node steps](#add-nodes-after-a-default-installation). ## Verify, extract and install Obtain the archive and checksum from a trusted distributor. Until a release is -published, build an archive using [Build a distribution](#build-a-distribution); +published, obtain a verified bundle from your deployment administrator or build +an archive using [Build a distribution](#build-a-distribution); a source checkout alone is not an installable binary bundle. Do not substitute an unpublished download URL. +For the recommended node workflow, choose an HTTPS address that both node hosts +and their sandbox guests can reach, such as `https://core.example`. Configure +your DNS/TLS reverse proxy as described in [Expose Core and Web](#expose-core-and-web), +and pass that address on the first install. The installer does not create DNS +records or certificates. It does not change an existing installation's public URL. +The command below still installs zero execution nodes. + ```sh sha256sum -c parsar-core--linux-amd64.tar.gz.sha256 mkdir -p "$HOME/.parsar/releases" tar -xzf parsar-core--linux-amd64.tar.gz -C "$HOME/.parsar/releases" cd "$HOME/.parsar/releases/parsar-core--linux-amd64" -./install.sh +./install.sh --public-url https://core.example ``` The bundle contains the same-revision native Core binaries and service image, @@ -53,12 +53,22 @@ microsandbox payloads are used only when a sandbox provider is enabled. The matched `parsar-sandbox-node` executable is included in the native payload and Core service image; packaging it does not start or register a node. +## Sign in to Web + Installation creates private configuration under `~/.parsar/core`, a dedicated PostgreSQL volume, an API caller key and a credential encryption key. It also -creates a separate console password and deployment administrator key. Secret values are not printed. On success: +creates a separate console password and deployment administrator key. Secret values +are not printed. + +Open the console address printed by the installer (`https://core.example` in +the example above). Sign in as `admin` using the password in +`~/.parsar/core/config/console.password`. The bundled console is already connected +to Core; you do not need to paste an API key. + +Default local ports and private files: - API: `http://127.0.0.1:8091/v1` -- Web console: `http://127.0.0.1:8080`, username `admin` +- Web upstream: `http://127.0.0.1:8080`; use the configured public URL in your browser - Console password file: `~/.parsar/core/config/console.password` - API caller key file: `~/.parsar/core/config/caller.key` - Sandbox administrator key file: `~/.parsar/core/admin/sandbox-admin.key` @@ -67,31 +77,6 @@ Use exactly the displayed console address; the production proxy validates its configured browser origin. The console password authenticates to the Web server; the server holds the independent Core key. Model keys remain API execution input. -## Installation choices - -```sh -./install.sh --sandbox-provider true --provider microsandbox -./install.sh --sandbox-provider true --provider docker -./install.sh --core-only -./install.sh --core-only --sandbox-provider true --provider docker -``` - -`--sandbox-provider true` enables a local sandbox provider. If `--provider` is -omitted, it selects microsandbox. Supplying `--provider` without enabling the -sandbox provider is an error. `--core-only` installs Core and PostgreSQL without -Web and has no sandbox provider unless explicitly enabled. - -The provider choice does not select a harness or alter the public `openai_hosted` -discriminator. Both providers reuse one colocated Runtime containing the native -harnesses. The Docker option grants -only Core access to the Docker socket; microsandbox uses the native service account's -KVM access. Web receives neither. An enabled local provider runs through Core's -embedded node connection and preserves its identity and owner epoch in the private -`state/sandbox-node` directory. Docker Core mounts only this state directory -writable in addition to its selected socket; `config` remains read-only. -Native Core uses the same persistent directory directly. The default zero-node -installation creates neither this state directory nor its mount. - Every Core installation creates a separate private deployment administrator key at `admin/sandbox-admin.key`. Core loads its SHA-256 digest from `AGENTS_API_SANDBOX_ADMIN_DIGESTS_FILE`. Only the Core container mounts the @@ -103,7 +88,7 @@ server-side through `CORE_CONSOLE_SANDBOX_ADMIN_TOKEN_FILE`; the Web page does n ask the operator to enter another key. Use the same-origin console connection for management. Choose English or Chinese through the System language selector. -### Add nodes after a default installation +## Add nodes after a default installation 1. Log in to the bundled Web console and open **Hosted Sandbox Manager**. The paired installation needs no second key or Core connection setup. @@ -111,15 +96,18 @@ management. Choose English or Chinese through the System language selector. both node hosts and their sandbox guests. The address must expose Core's API and WebSocket routes, not just the Web console. HTTP loopback is available for local development only; loopback inside a sandbox is not the Core host. -3. Save the selection. It takes effect without restarting Core and remains in - PostgreSQL across restarts. All nodes in this deployment use the chosen type; +3. Select **Initialize sandbox deployment**. It takes effect without restarting + Core and remains in PostgreSQL across restarts. All nodes in this deployment + use the chosen type; this page does not switch providers. Microsandbox uses a five-minute idle timeout and one-day snapshot retention. -4. Generate and copy the node command, then run it as a non-root user on the - target Linux amd64 host. It downloads the matched files from your console, +4. Under **Add node**, select **Generate node command**, then **Copy node command**. + Run it as a non-root user on the target Linux amd64 host. It downloads the + matched files from your console, verifies checksums, imports the Runtime image, writes the provider configuration, registers the node and starts a systemd user service. Web refreshes node health - automatically. A registered but unavailable node cannot accept work. + automatically. Wait for the node to be online and its provider to be ready; + registration alone does not mean it can accept work. The target host needs Python 3.9+, a systemd user session with lingering enabled, and either Docker socket access or microsandbox's KVM/native-library prerequisites. @@ -139,6 +127,55 @@ When a Session needs a sandbox, Core asks the enabled Provider to create one from the prepared Runtime image and initializes the colocated daemon, native harness and workspace. +Once a node is ready, you can [make an API request](quickstart.md). The model +credentials are supplied with execution requests, not during node installation. + +## Installation choices + +```sh +./install.sh --sandbox-provider true --provider microsandbox +./install.sh --sandbox-provider true --provider docker +./install.sh --core-only +./install.sh --core-only --sandbox-provider true --provider docker +``` + +`--sandbox-provider true` enables a local sandbox provider. If `--provider` is +omitted, it selects microsandbox. Supplying `--provider` without enabling the +sandbox provider is an error. `--core-only` installs Core and PostgreSQL without +Web and has no sandbox provider unless explicitly enabled. + +The provider choice does not select a harness or alter the public `openai_hosted` +discriminator. Both providers reuse one colocated Runtime containing the native +harnesses. The Docker option grants +only Core access to the Docker socket; microsandbox uses the native service account's +KVM access. Web receives neither. An enabled local provider runs through Core's +embedded node connection and preserves its identity and owner epoch in the private +`state/sandbox-node` directory. Docker Core mounts only this state directory +writable in addition to its selected socket; `config` remains read-only. +Native Core uses the same persistent directory directly. The default zero-node +installation creates neither this state directory nor its mount. + +### Local provider requirements + +Optional microsandbox also requires glibc, a running systemd user manager with +linger enabled, and user read/write access to `/dev/kvm`. Nested cloud hosts must +expose hardware virtualization. With this option, Core runs as a native user +service so restarting it does not terminate the Provider's microVM processes. +The installer checks these +prerequisites; it does not grant host permissions or silently fall back to Docker. +The optional Docker sandbox provider keeps Core in Compose and requires neither +KVM nor systemd user services. + +For optional microsandbox, reserve capacity for the native Runtime: its initial +profile uses +4 GiB RAM, 2 CPUs, an 8 GiB root disk and an 8 GiB environment disk per active sandbox, with at most 4 active +and 16 retained allocations. Limits are operator configuration, not model input. +Use a trusted, single-operator host and durable local storage. The installer does +not change host virtualization settings, install Docker, create an OS user or +expose a remote administration service. + +### Separate Web installation + To install only Web on a Linux host, provide the existing Core origin and a private caller-key file. A loopback Core uses the same host network namespace; a remote Core must use HTTPS. @@ -163,7 +200,9 @@ revision changes on an existing installation. This includes enabling a sandbox provider on an installation originally created without one; rerunning with new flags does not migrate it. -For remote nodes, install with the intended shared HTTPS endpoint: +## Expose Core and Web + +For nodes added through Web, install with the intended shared HTTPS endpoint: ```sh ./install.sh --public-url https://core.example @@ -175,7 +214,9 @@ node and daemon transport routes to Core using their own credentials. Both the node host and its sandbox guests must reach this address. Installation does not create DNS records or certificates, nor expose a host port publicly. Without this option, the console uses its loopback address for local access. Do not copy a -localhost download command to a different machine. +localhost download command to a different machine. Running plain `./install.sh` +is suitable for local console/API inspection; prepare the shared endpoint before +installing a deployment that will enroll nodes. ## After installation diff --git a/docs/getting-started/operations.md b/docs/getting-started/operations.md index bec46c2b7..089512005 100644 --- a/docs/getting-started/operations.md +++ b/docs/getting-started/operations.md @@ -1,9 +1,9 @@ # Operate your Core The installation operator owns the host, storage and service availability. -The default installation has zero execution nodes. When a sandbox provider is -enabled during installation, the operator also maintains its containers or -microVMs. Provider operations below apply to that optional configuration. Service +The default installation has zero execution nodes. After nodes are added in Web, +their operators maintain the node services, containers or microVMs on those hosts. +A provider enabled during installation runs locally on the Core host. Service health and provider state are separate from a Session's public execution state. ## Read service health @@ -35,8 +35,8 @@ Use these observations for distinct questions: Container liveness alone is not a healthy native harness or an available model. Use public Session, Turn, Items, Environment and Usage reads for execution. Reuse Core's Runtime observations for sandbox details when available; do not infer -execution truth from Docker or invent a second lifecycle collector. The existing -Web is unchanged by this installation batch. +execution truth from Docker or invent a second lifecycle collector. Use Web's +**Hosted Sandbox Manager** for node connection, provider readiness and placement. ## Stop and restart @@ -48,7 +48,9 @@ Settle active work before a planned restart. Then: ``` This stops the control-plane services and retains the database, Runtime state and -credentials. For microsandbox, the systemd user unit uses `KillMode=process`: +credentials. Nodes added through Web run their own services; stopping Core does +not stop those node services. For a local microsandbox installation, the Core +systemd user unit uses `KillMode=process`: only Core stops; microVMs and their work may remain running. Docker-owned Runtime containers likewise remain Provider resources. The command does not promise to stop all compute. Release resources through the existing Core API before a full @@ -71,8 +73,12 @@ Retain together: - the dedicated PostgreSQL volume, including large objects; - `config/credential.key`, caller identity configuration and provider identity; -- `admin/` when a local provider is enabled, containing the separate sandbox +- `admin/`, including on zero-node installations, containing the separate sandbox administrator key and Core's digest configuration; +- each separately installed node's private configuration and persistent identity + directory on its host (`~/.parsar/nodes//` for the Web-generated + installer), as described in the + [node guide](../../services/agents-api/HOSTED-SANDBOX-MANAGER.md#register-a-host); - `state/sandbox-node` when a local provider is enabled, including its private node credential and highest accepted owner epoch; - microsandbox's private state/cache/disks/snapshots, or Docker-owned Runtime @@ -97,6 +103,9 @@ claiming the upgrade complete; there is no downgrade or history migration promis The installer refuses to enable, disable or replace a sandbox provider on an existing installation. Changing flags and rerunning is not a migration procedure. +This restriction does not prevent a zero-node deployment from selecting its first +provider and adding nodes through Web. After selection, every node uses that +provider; the Web setup does not switch it. For an installation with a provider, follow the [maintenance and provider-switch procedure](https://github.com/MiniMax-AI/parsar-core/blob/main/services/agents-api/deploy/microsandbox/README.md#change-the-deployment-provider). The installer never migrates Sessions between providers or deletes old compute. @@ -104,8 +113,12 @@ The installer never migrates Sessions between providers or deletes old compute. API and console bind to host loopback. With native Core, PostgreSQL publishes an installation-specific loopback port; with container Core it has no published port. -The production Web proxy only forwards the public `/v1` surface to its configured -Core; it never receives the Docker socket, KVM device or provider/model secrets. +The production Web proxy forwards the public `/v1` surface and allowlisted sandbox +administration routes to its configured Core after console login. It keeps the +separate project and administrator credentials on the server. Fixed node/daemon +transport routes use their own authentication; `/node-install/` serves only the +matched non-secret node payload. Web has no Docker or KVM authority and does not +expose its server-held credentials to the browser. It requires an independent console password and rejects untrusted browser origins. This is a single-operator console deployment, not a multi-user identity system. diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 98d8de424..ed15dc72d 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -32,10 +32,11 @@ environment. Installation has no mandatory sample task. ## Run a Session when you are ready -This example requires an installation created with a local sandbox provider -enabled. The default installation has zero execution nodes. Choose microsandbox -or Docker using the [installation options](install.md#installation-choices); -adding these flags to an existing default installation is not a supported migration. +This example requires a connected node whose provider is ready. The default +installation has zero execution nodes: sign in to Web and +[add a Docker or microsandbox node](install.md#add-nodes-after-a-default-installation). +A local provider enabled during installation also satisfies this requirement. +You do not need to reinstall Core or change installer flags to add nodes in Web. Core creates the sandbox through its Provider using the prepared Runtime image, then initializes the daemon, native harness and workspace inside it. You do not diff --git a/services/agents-api/HOSTED-SANDBOX-MANAGER.md b/services/agents-api/HOSTED-SANDBOX-MANAGER.md index 3ae656a1c..7a6c3f4cd 100644 --- a/services/agents-api/HOSTED-SANDBOX-MANAGER.md +++ b/services/agents-api/HOSTED-SANDBOX-MANAGER.md @@ -29,8 +29,10 @@ node installation payload. Project keys cannot register, edit or remove nodes. Default installation starts Core, Web and PostgreSQL without local compute. Hosted Sandbox Manager first asks for Docker or microsandbox and the public HTTPS -Core origin reachable from node hosts and sandbox guests. Use Core's origin, not -the Web console URL; the proxy must forward API routes and WebSocket upgrades. +Core origin reachable from node hosts and sandbox guests. In a paired installation, +use the shared HTTPS origin configured with `--public-url`; its proxy forwards +Core API routes and WebSocket upgrades as well as Web. A separate console-only +address that does not forward Core's transport routes is insufficient. HTTP loopback is accepted only for local development. A guest's loopback address cannot reach its Core host. diff --git a/site/index.html b/site/index.html index ac687c8c4..e55a05d02 100644 --- a/site/index.html +++ b/site/index.html @@ -15,7 +15,7 @@ Parsar Core @@ -28,9 +28,9 @@

Agents API
infrastructure.
On your terms.

Run Codex, Claude Code and MiniMax Code through one Core API and a shared Runtime. Deploy it on your infrastructure, with a Web console included.

-

Your service. Your Runtime. Your model provider.

+

Install Core + Web. Sign in. Add your execution nodes.

connect.pyREAD ONLY
@@ -65,13 +65,14 @@

Agents API
infrastructure.
On your terms.
-

02 / Installation

Start with a
local bundle.

Download or build a bundle for your host, extract it, then run the installer from that directory.

The default runs Core, the Web console and PostgreSQL with zero execution nodes. A local sandbox provider is an explicit installation option.

Installation guide
+

02 / Get started

Install. Sign in.
Add a node.

Start with Core, the Web console and PostgreSQL. Add execution nodes through Web when you need them.

Use a verified Linux amd64 bundle. Before installing for node access, choose an HTTPS address reachable from the nodes and their sandboxes, and configure your DNS/TLS reverse proxy.

Installation guide
-

Core + Web

DEFAULT
./install.sh

Includes PostgreSQL. No sandbox provider, KVM or systemd user service required.

-

Local sandbox

Optional microsandbox. Add --provider docker to choose Docker.

./install.sh --sandbox-provider true
-

Core only

Deploy the API without the Web console.

./install.sh --core-only
-

Web only

Connect the console to an existing Core.

./install.sh --web-only
-

Bundle availability and supported hosts are documented in the installation guide. Browse releases ↗

+

1. Install Core + Web

ZERO NODES
./install.sh \
+  --public-url https://core.example

Run from the extracted bundle. Includes PostgreSQL. The Core host needs Docker and Compose; it does not need KVM or a model key.

+

2. Sign in to Web

Open the console address printed by the installer. Use admin and the password in this private file; no additional API key setup.

~/.parsar/core/config/console.password
+

3. Add an execution node

Open Hosted Sandbox Manager. Choose Docker or microsandbox, confirm the Core address, then generate a node command and run it on your prepared Linux host. Wait for the node to be online and its provider to be ready.

+

All nodes use the same provider. Installation and node enrollment do not call a model. Local-provider and separate-component options →

+

Public release bundles are not published yet. Obtain a verified bundle from your deployment administrator or build one from source →.

From 1beec1d6a28252ab55ea2678768882f874017f46 Mon Sep 17 00:00:00 2001 From: saladday <1203511142@qq.com> Date: Wed, 23 Sep 2026 22:22:02 +0800 Subject: [PATCH 2/6] docs: wrap the landing install command for narrow screens --- site/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index e55a05d02..88f5e92c9 100644 --- a/site/index.html +++ b/site/index.html @@ -68,7 +68,8 @@

Agents API
infrastructure.
On your terms.

02 / Get started

Install. Sign in.
Add a node.

Start with Core, the Web console and PostgreSQL. Add execution nodes through Web when you need them.

Use a verified Linux amd64 bundle. Before installing for node access, choose an HTTPS address reachable from the nodes and their sandboxes, and configure your DNS/TLS reverse proxy.

Installation guide

1. Install Core + Web

ZERO NODES
./install.sh \
-  --public-url https://core.example

Run from the extracted bundle. Includes PostgreSQL. The Core host needs Docker and Compose; it does not need KVM or a model key.

+ --public-url \ + https://core.example

Run from the extracted bundle. Includes PostgreSQL. The Core host needs Docker and Compose; it does not need KVM or a model key.

2. Sign in to Web

Open the console address printed by the installer. Use admin and the password in this private file; no additional API key setup.

~/.parsar/core/config/console.password

3. Add an execution node

Open Hosted Sandbox Manager. Choose Docker or microsandbox, confirm the Core address, then generate a node command and run it on your prepared Linux host. Wait for the node to be online and its provider to be ready.

All nodes use the same provider. Installation and node enrollment do not call a model. Local-provider and separate-component options →

From 0f4707be6f668248088687356b138b13acca3861 Mon Sep 17 00:00:00 2001 From: saladday <1203511142@qq.com> Date: Wed, 23 Sep 2026 22:24:18 +0800 Subject: [PATCH 3/6] docs: retain heading spacing when mobile hides the break --- site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index 88f5e92c9..1356f57b2 100644 --- a/site/index.html +++ b/site/index.html @@ -65,7 +65,7 @@

Agents API
infrastructure.
On your terms.
-

02 / Get started

Install. Sign in.
Add a node.

Start with Core, the Web console and PostgreSQL. Add execution nodes through Web when you need them.

Use a verified Linux amd64 bundle. Before installing for node access, choose an HTTPS address reachable from the nodes and their sandboxes, and configure your DNS/TLS reverse proxy.

Installation guide
+

02 / Get started

Install. Sign in.
Add a node.

Start with Core, the Web console and PostgreSQL. Add execution nodes through Web when you need them.

Use a verified Linux amd64 bundle. Before installing for node access, choose an HTTPS address reachable from the nodes and their sandboxes, and configure your DNS/TLS reverse proxy.

Installation guide

1. Install Core + Web

ZERO NODES
./install.sh \
   --public-url \

From fb714bbf810978811793d424fc90d0deb2ee8ce1 Mon Sep 17 00:00:00 2001
From: saladday <1203511142@qq.com>
Date: Wed, 23 Sep 2026 22:37:15 +0800
Subject: [PATCH 4/6] style(site): refine the desktop landing hierarchy and
 setup flow

---
 site/index.html |  84 ++++++++++-------
 site/styles.css | 244 +++++++++++++++++++++++++-----------------------
 2 files changed, 178 insertions(+), 150 deletions(-)

diff --git a/site/index.html b/site/index.html
index 1356f57b2..07c890c3d 100644
--- a/site/index.html
+++ b/site/index.html
@@ -3,8 +3,8 @@
   
     
     
-    
-    
+    
+    
     Parsar Core · Open-source Agents API infrastructure
     
     
@@ -15,7 +15,7 @@
       Parsar Core
       
     
@@ -23,19 +23,20 @@
     
-

Open source. Self-deployed.

-

Agents API
infrastructure.
On your terms.

-

Run Codex, Claude Code and MiniMax Code through one Core API and a shared Runtime. Deploy it on your infrastructure, with a Web console included.

+

Open-source Agents API

+

One Core.
Many agents.

+

Run your native agent harnesses through one API. Keep execution, files and credentials on infrastructure you control.

-

Install Core + Web. Sign in. Add your execution nodes.

+

Self-deployed Core + Web included

-
-
connect.pyREAD ONLY
-
Point an OpenAI client at your Core.
-
import os
+        
+
Your application. Your endpoint.
+
+
connect.pyPYTHON
+
import os
 from openai import OpenAI
 
 client = OpenAI(
@@ -43,50 +44,63 @@ 

Agents API
infrastructure.
On your terms. api_key=os.environ["PARSAR_CORE_API_KEY"], ) +# Use the same client with your Core. for agent in client.beta.agents.list(): print(agent.id)

-
Protocol baselineopenai-python 3.13.0 · agents=v1
-

Use your Core API key and endpoint. This reads saved Agents; it does not call a model. Check coverage →

+
Official Python client3.13.0 agents=v1
+
+

A read-only request. No model call. View protocol coverage

+
+

Native harnesses.
A shared execution API.

+
Codex Claude Code MiniMax Code
+
+
-

01 / Architecture

One execution path.
Multiple native harnesses.

Core owns the API and execution state. The shared Runtime connects that contract to each native harness.

-
-
PUBLIC API

Parsar Core

Agents, Sessions & execution state

+

01 / Under the hood

One execution path.
Clear responsibilities.

Core owns the API and execution state. Each harness keeps its native model and tool loop.

+
+
CONTROL PLANE

Parsar Core

Sessions, credentials, files
and execution history.

Agents API + Web console
-
SHARED CONTRACT

Runtime

Daemon, tools & workspace

+
SHARED RUNTIME

Daemon + workspace

One runtime contract.
Tools and files stay with execution.

Docker / microsandbox
-
CodexClaude CodeMiniMax Code
+
Codexnative
Claude Codenative
MiniMax Codenative
-

Web console included. Connect to your Core through the same public API.

Native differences stay explicit. Supported capabilities depend on the harness and deployment profile.

+

Deploy Core independently of the Parsar product.

Native capability differences stay explicit.

-

02 / Get started

Install. Sign in.
Add a node.

Start with Core, the Web console and PostgreSQL. Add execution nodes through Web when you need them.

Use a verified Linux amd64 bundle. Before installing for node access, choose an HTTPS address reachable from the nodes and their sandboxes, and configure your DNS/TLS reverse proxy.

Installation guide
-
-

1. Install Core + Web

ZERO NODES
./install.sh \
-  --public-url \
-  https://core.example

Run from the extracted bundle. Includes PostgreSQL. The Core host needs Docker and Compose; it does not need KVM or a model key.

-

2. Sign in to Web

Open the console address printed by the installer. Use admin and the password in this private file; no additional API key setup.

~/.parsar/core/config/console.password
-

3. Add an execution node

Open Hosted Sandbox Manager. Choose Docker or microsandbox, confirm the Core address, then generate a node command and run it on your prepared Linux host. Wait for the node to be online and its provider to be ready.

-

All nodes use the same provider. Installation and node enrollment do not call a model. Local-provider and separate-component options →

-

Public release bundles are not published yet. Obtain a verified bundle from your deployment administrator or build one from source →.

+
+

02 / Get started

+

Your infrastructure.
Your starting point.

+

Install Core and Web together. Add execution nodes when you need them.

+ Read the installation guide +
BEFORE YOU START

Use a verified Linux amd64 bundle. Choose an HTTPS address reachable from your nodes and sandboxes, and configure DNS/TLS before the first install.

Public release bundles are not published yet. Obtain one from your deployment administrator or build from source.

+
+
+
    +
  1. Install Core + Web

    ZERO NODES

    Run from your extracted bundle. Core, Web and PostgreSQL start together. No model key required.

    ./install.sh \
    +    --public-url https://core.example
  2. +
  3. Sign in to your console

    Open the address printed by the installer. Sign in as admin with the password in this private file:

    ~/.parsar/core/config/console.password

    The paired console is already connected to Core.

  4. +
  5. Bring a node online

    Open Hosted Sandbox Manager, choose Docker or microsandbox, and confirm your Core address. Generate a node command and run it on a prepared Linux host.

    Dockermicrosandbox

    Web shows when the node is online and its provider is ready. All nodes use the same provider.

  6. +
+

Installation and enrollment do not call a model. Other installation options

-

03 / Before you deploy

Know what you are running.

The pinned Agents API is the compatibility target. Coverage is tracked by operation and workflow; full compatibility is not claimed.

+

03 / Go further

Build with a clear contract.

The pinned Agents API is the compatibility target. Check verified workflows and native differences before you build.

- + diff --git a/site/styles.css b/site/styles.css index 06659c3a7..7665f7ed9 100644 --- a/site/styles.css +++ b/site/styles.css @@ -1,119 +1,148 @@ :root { color-scheme: light; - --ink: #172033; - --muted: #526177; - --accent: #4338ca; - --line: #dbe2ec; - --soft: #f8fafc; + --ink: #20202b; + --muted: #60616f; + --accent: #5a43c7; + --line: #e4e4ed; + --soft: #f5f5f9; + --mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: var(--ink); - background: #fff; + background: #fafafd; font-synthesis: none; - text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; } * { box-sizing: border-box; } body { margin: 0; } -a { color: inherit; text-decoration: none; } +a { color: inherit; text-decoration: none; transition: color 160ms, background-color 160ms, border-color 160ms, box-shadow 160ms; } a:focus-visible { outline: 3px solid var(--accent); outline-offset: 5px; } -p { color: var(--muted); line-height: 1.65; } +p { color: var(--muted); line-height: 1.7; } h1, h2, h3, p { margin-top: 0; } h1, h2, h3 { letter-spacing: -.035em; } -h2 { font-size: clamp(1.8rem, 3vw, 2.35rem); line-height: 1.15; margin-bottom: 0; } -h3 { font-size: 1.06rem; } -pre, code, .eyebrow, .node-kind, .panel-tag, .badge, .doc-number { font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace; } +h2 { font-size: clamp(32px, 3.1vw, 44px); line-height: 1.13; font-weight: 600; margin-bottom: 0; } +h3 { font-size: 20px; font-weight: 600; } +pre, code, .eyebrow, .node-kind, .panel-tag, .badge, .doc-number, .note-label, .step-number { font-family: var(--mono); } pre { overflow-x: auto; margin: 0; } -.wrap { width: min(1120px, calc(100% - 64px)); margin-inline: auto; } -.skip-link { position: fixed; top: -100px; left: 16px; z-index: 2; padding: 12px 18px; background: var(--ink); color: white; } +.wrap { width: min(1184px, calc(100% - 80px)); margin-inline: auto; } +.skip-link { position: fixed; top: -100px; left: 16px; z-index: 3; padding: 12px 18px; background: var(--ink); color: white; } .skip-link:focus { top: 16px; } .site-header { min-height: 96px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); gap: 24px; } -.brand { display: inline-flex; align-items: center; gap: 8px; font-size: 19px; font-weight: 700; letter-spacing: -.04em; white-space: nowrap; } -.brand-core { color: var(--muted); font-weight: 450; } -.brand-mark { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 7px; background: var(--ink); color: #fff; font: 700 22px/1 monospace; margin-right: 3px; padding-bottom: 5px; } -.brand-mark span { color: #a5b4fc; } -nav { display: flex; align-items: center; gap: 30px; font-size: 14px; font-weight: 550; } -nav a:hover, .site-footer > a:last-child:hover { color: var(--accent); } -.nav-github { display: inline-flex; gap: 12px; } -.hero { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; padding-block: 82px 76px; } -.eyebrow { text-transform: uppercase; letter-spacing: .1em; font-size: 11px; font-weight: 650; color: var(--accent); margin-bottom: 24px; display: flex; align-items: center; gap: 9px; } -.small-square { width: 6px; height: 6px; background: var(--accent); } -h1 { font-size: clamp(2.5rem, 4.7vw, 3.6rem); line-height: 1.075; margin-bottom: 24px; font-weight: 680; letter-spacing: -.055em; } +.brand { display: inline-flex; align-items: center; gap: 8px; font-size: 21px; font-weight: 650; letter-spacing: -.05em; white-space: nowrap; } +.brand-core { font-weight: 400; color: var(--muted); } +.brand-mark { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 9px; background: var(--ink); color: #fff; font: 650 23px/1 var(--mono); margin-right: 4px; padding-bottom: 5px; } +.brand-mark span { color: #b7a6f4; } +nav { display: flex; align-items: center; gap: 32px; font-size: 13px; font-weight: 500; } +nav a:hover, .footer-links a:hover { color: var(--accent); } +.nav-github { display: inline-flex; align-items: center; gap: 18px; border: 1px solid #d8d8e2; border-radius: 7px; padding: 10px 15px; background: #fff; } +.nav-github:hover { border-color: #b5abd9; } +.hero { display: grid; grid-template-columns: 1fr 1fr; gap: 76px; align-items: center; padding-block: 86px 76px; } +.eyebrow { text-transform: uppercase; letter-spacing: .11em; font-size: 10px; font-weight: 600; color: var(--accent); margin-bottom: 25px; display: flex; align-items: center; gap: 9px; } +.small-square { width: 7px; height: 7px; border-radius: 2px; background: var(--accent); box-shadow: 0 0 0 4px #ede9fb; } +h1 { font-size: clamp(54px, 5.8vw, 82px); line-height: 1.045; margin-bottom: 26px; font-weight: 600; letter-spacing: -.065em; } h1 > span { color: var(--accent); } -.hero-description { font-size: 16px; max-width: 455px; margin-bottom: 28px; } +.hero-description { font-size: 18px; max-width: 445px; margin-bottom: 32px; line-height: 1.65; } .actions { display: flex; flex-wrap: wrap; gap: 12px; } -.button { min-height: 46px; padding: 12px 19px; border: 1px solid var(--line); border-radius: 6px; font-size: 14px; font-weight: 650; display: inline-flex; align-items: center; justify-content: center; gap: 24px; } -.primary { background: var(--accent); border-color: var(--accent); color: #fff; } -.primary:hover { background: #3730a3; } -.secondary:hover { background: var(--soft); border-color: #a9b4c5; } -.hero-note { font-size: 12px; margin: 18px 0 0; } -.code-panel { min-width: 0; border: 1px solid #cfd7e4; border-radius: 9px; background: var(--soft); box-shadow: 0 12px 28px -22px #33415580; } -.panel-header { padding: 16px 20px; border-bottom: 1px solid var(--line); display: flex; gap: 12px; justify-content: space-between; align-items: center; } -.file-label { font: 12px "SFMono-Regular", Consolas, monospace; } -.file-label > span { color: var(--muted); margin-right: 7px; } -.panel-tag { color: var(--muted); font-size: 9px; letter-spacing: .1em; } -.code-intro { font-size: 13px; padding: 23px 24px 18px; color: var(--muted); } -.code-panel pre { font-size: 12px; line-height: 1.85; padding: 0 24px 25px; color: #26334b; } -.syntax-keyword { color: #6d28d9; } -.syntax-string { color: #116b58; } -.syntax-function { color: #1d4ed8; } -.code-caption { padding: 16px 24px; border-block: 1px solid var(--line); font-size: 11px; display: flex; flex-wrap: wrap; gap: 6px 16px; } -.caption-label { color: var(--muted); } -.code-footnote { font-size: 11px; padding: 16px 24px; margin: 0; } -.code-footnote a { color: var(--accent); white-space: nowrap; text-decoration: underline; text-underline-offset: 3px; } -.architecture-section { padding-block: 56px; background: var(--soft); border-block: 1px solid var(--line); } -.section-heading { display: flex; justify-content: space-between; gap: 40px; align-items: end; margin-bottom: 30px; } -.section-heading .eyebrow { margin-bottom: 14px; } -.section-heading > p { max-width: 365px; font-size: 14px; margin: 0; } -.architecture { display: grid; grid-template-columns: 1fr 52px 1fr 52px 1fr; align-items: center; } -.architecture-node { background: #fff; border: 1px solid #cfd7e4; padding: 25px; border-radius: 7px; } -.node-kind { font-size: 10px; letter-spacing: .08em; color: var(--muted); } -.architecture-node h3 { font-size: 21px; margin: 14px 0 7px; } -.architecture-node p { font-size: 12px; margin: 0; } -.runtime-node { border-color: #a5b4fc; } +.button { min-height: 48px; padding: 13px 20px; border: 1px solid #dedee8; border-radius: 7px; font-size: 13px; font-weight: 600; display: inline-flex; align-items: center; justify-content: center; gap: 24px; } +.primary { background: var(--accent); border-color: var(--accent); color: #fff; box-shadow: 0 3px 6px #4c36b21a; } +.primary:hover { background: #4833ac; border-color: #4833ac; } +.secondary { background: #fff; } +.secondary:hover { border-color: #b6acd7; background: #f4f1fc; } +.hero-note { display: flex; align-items: center; gap: 9px; font-size: 12px; margin: 22px 0 0; } +.hero-note > span:first-child { color: var(--accent); } +.note-divider { color: #c4c3cf; margin-inline: 4px; } +.code-stage { min-width: 0; position: relative; isolation: isolate; padding: 22px 0; } +.code-stage::before { content: ""; position: absolute; z-index: -1; inset: 2px -24px 6px 25%; background-image: radial-gradient(#cfccdF 1px, transparent 1px); background-size: 14px 14px; } +.stage-label { font: 10px var(--mono); color: var(--muted); margin: 0 0 15px 2px; letter-spacing: .025em; } +.stage-label > span { color: var(--accent); margin-right: 7px; } +.code-panel { overflow: hidden; border: 1px solid #323341; border-radius: 12px; background: #20212d; box-shadow: 0 20px 45px -20px #24223f4d, 0 3px 8px #24223f0d; } +.panel-header { padding: 17px 24px; border-bottom: 1px solid #ffffff14; display: flex; gap: 12px; justify-content: space-between; align-items: center; background: #ffffff03; } +.file-label { font: 12px var(--mono); color: #e1e0eb; } +.file-label > span { color: #b6a0fc; margin-right: 9px; } +.panel-tag { color: #aba9bf; font-size: 9px; letter-spacing: .12em; } +.code-panel pre { font-size: 12px; line-height: 1.95; padding: 24px; color: #eeedf6; } +.syntax-keyword { color: #c1a5ff; } +.syntax-string { color: #a5d3c6; } +.syntax-function { color: #c7d6ff; } +.syntax-comment { color: #aaa8ba; } +.code-caption { padding: 15px 24px; border-top: 1px solid #ffffff14; font: 10px var(--mono); display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; color: #b9b7ca; } +.code-caption > span:last-child { color: #d9d5ed; } +.code-footnote { font-size: 11px; margin: 16px 2px 0; } +.code-footnote a { margin-left: 7px; color: var(--accent); } +.code-footnote a:hover { text-decoration: underline; text-underline-offset: 4px; } +.harness-strip { display: flex; align-items: center; justify-content: space-between; gap: 32px; border-top: 1px solid var(--line); padding-block: 26px 32px; } +.harness-strip p { margin: 0; font-size: 12px; line-height: 1.6; } +.harness-strip strong { color: var(--ink); font-weight: 500; } +.harness-names { display: flex; gap: 54px; align-items: center; } +.harness-names > span { font-size: 19px; font-weight: 550; letter-spacing: -.04em; } +.harness-names i { font: normal 10px var(--mono); color: #777584; margin-right: 13px; } +.architecture-section { padding-block: 78px; background: #f0f0f6; border-block: 1px solid #e5e4ef; } +.section-heading { display: flex; justify-content: space-between; gap: 48px; align-items: end; margin-bottom: 38px; } +.section-heading .eyebrow { margin-bottom: 18px; } +.section-heading > p { max-width: 340px; font-size: 15px; margin: 0 0 2px; } +.architecture { display: grid; grid-template-columns: 1fr 48px 1.15fr 48px 1fr; align-items: center; } +.architecture-node { background: #fafafd; border: 1px solid #dcdbe7; padding: 28px; border-radius: 10px; } +.node-kind { font-size: 9px; letter-spacing: .1em; color: var(--muted); } +.architecture-node h3 { font-size: 23px; margin: 20px 0 12px; } +.architecture-node p { font-size: 14px; margin: 0 0 23px; } +.node-detail { font: 10px var(--mono); color: #747181; } +.runtime-node { border-color: #c7bee7; background: #fbfaff; box-shadow: 0 5px 16px #36304e05; } .runtime-node .node-kind { color: var(--accent); } -.connector { text-align: center; color: #64748b; font-size: 24px; } -.harnesses { display: grid; gap: 8px; } -.harnesses span { padding: 11px 20px; border: 1px solid var(--line); border-radius: 5px; background: #fff; font-size: 13px; font-weight: 600; } -.architecture-notes { display: grid; grid-template-columns: 1fr 1fr; gap: 52px; margin-top: 24px; } +.connector { text-align: center; color: #928dA4; font-size: 22px; } +.harnesses { display: grid; gap: 11px; } +.harnesses > div { display: flex; align-items: center; gap: 12px; padding: 20px; border: 1px solid #dcdbe7; border-radius: 7px; background: #fafafd; font-size: 15px; font-weight: 550; } +.harness-dot { width: 6px; height: 6px; background: #b5adc9; border-radius: 2px; flex-shrink: 0; } +.native-label { font: 9px var(--mono); color: #797582; margin-left: auto; } +.architecture-notes { display: flex; justify-content: space-between; gap: 24px; margin-top: 25px; } .architecture-notes p { font-size: 12px; margin: 0; } -.architecture-notes strong { color: var(--ink); font-weight: 600; } -.install-section { padding-block: 72px; display: grid; grid-template-columns: .8fr 1.2fr; gap: 90px; } -.install-copy .eyebrow { margin-bottom: 15px; } -.install-copy h2 { margin-bottom: 24px; } -.install-copy > p:not(.eyebrow) { font-size: 14px; } -.text-link { color: var(--accent); display: inline-flex; gap: 16px; font-size: 14px; font-weight: 600; margin-top: 6px; } -.text-link:hover, .bundle-note a:hover { text-decoration: underline; text-underline-offset: 4px; } -.install-default { border: 1px solid #c7d2fe; border-radius: 7px; background: #f5f6ff; padding: 21px 24px; } -.install-label { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 15px; } -.install-label h3 { margin: 0; } -.badge { color: var(--accent); font-size: 9px; letter-spacing: .06em; } -.install-default pre { font-size: 19px; } -.install-default p { font-size: 12px; margin: 13px 0 0; } -.install-option { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 0; border-bottom: 1px solid var(--line); } -.install-option h3 { font-size: 13px; margin: 0 0 3px; letter-spacing: 0; } -.install-option p { font-size: 11px; margin: 0; } -.install-option code { font-size: 11px; white-space: nowrap; } -.bundle-note { font-size: 11px; margin: 17px 0 0; } -.bundle-note a { color: var(--accent); } -.docs-section { border-top: 1px solid var(--line); padding-block: 55px 64px; } +.architecture-notes p > span { color: #9a8bbb; margin-right: 9px; } +.install-section { padding-block: 92px; display: grid; grid-template-columns: .85fr 1.2fr; gap: 100px; align-items: start; } +.install-copy .eyebrow { margin-bottom: 20px; } +.install-copy h2 { margin-bottom: 25px; } +.install-copy > p:not(.eyebrow) { font-size: 16px; max-width: 360px; } +.text-link { color: var(--accent); display: inline-flex; gap: 18px; font-size: 13px; font-weight: 600; margin-top: 10px; } +.text-link:hover, .install-prerequisites a:hover, .setup-footnote a:hover { text-decoration: underline; text-underline-offset: 4px; } +.install-prerequisites { margin-top: 42px; padding-top: 25px; border-top: 1px solid var(--line); } +.note-label { font-size: 9px; letter-spacing: .09em; color: #747180; } +.install-prerequisites p { font-size: 12px; margin: 15px 0 0; } +.install-prerequisites a { color: var(--accent); } +.setup-path { min-width: 0; } +.setup-steps { list-style: none; margin: 0; padding: 0; } +.setup-step { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: 20px; padding-bottom: 28px; position: relative; } +.setup-step:not(:last-child)::before { content: ""; position: absolute; left: 17px; top: 40px; bottom: 4px; width: 1px; background: var(--line); } +.step-number { display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; font-size: 11px; color: var(--accent); border: 1px solid #dbd4ef; border-radius: 50%; background: #f5f2fd; } +.step-content { padding-top: 6px; min-width: 0; } +.step-content h3 { font-size: 20px; margin: 0 0 12px; } +.step-content p { font-size: 14px; line-height: 1.7; margin: 0 0 16px; } +.step-content p code { font-size: 12px; color: var(--ink); } +.step-title { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; } +.badge { font-size: 8px; letter-spacing: .09em; color: var(--accent); padding: 5px 7px; border-radius: 4px; background: #efebfa; white-space: nowrap; } +.install-command { padding: 20px; font-size: 13px; line-height: 1.8; background: #eeedf5; color: #34303f; border: 1px solid #e3e0ee; border-radius: 7px; } +.file-path { border: 1px solid var(--line); border-radius: 6px; padding: 12px 15px; background: #fff; font-size: 12px; overflow-wrap: anywhere; margin-bottom: 12px; } +.step-content .step-detail { font-size: 12px; color: #686472; margin: 0; } +.provider-options { display: flex; gap: 8px; margin: 0 0 14px; } +.provider-options > span { font: 10px var(--mono); color: #5d566e; border: 1px solid #ddd8e7; border-radius: 4px; padding: 6px 9px; background: #f6f4fa; } +.setup-footnote { border-top: 1px solid var(--line); padding-top: 18px; margin: 0 0 0 56px; font-size: 11px; } +.setup-footnote a { color: var(--accent); display: inline-block; margin-top: 4px; } +.docs-section { border-top: 1px solid var(--line); padding-block: 74px 84px; } .docs-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } -.doc-card { border: 1px solid var(--line); padding: 25px; border-radius: 7px; display: flex; flex-direction: column; } -.doc-card:hover { border-color: #a5b4fc; background: var(--soft); } -.doc-number { color: var(--muted); font-size: 11px; display: flex; justify-content: space-between; margin-bottom: 30px; } -.doc-number > span { font: 18px sans-serif; } -.doc-card h3 { margin-bottom: 12px; font-size: 17px; } -.doc-card p { font-size: 13px; margin-bottom: 22px; } -.doc-link { margin-top: auto; color: var(--accent); font-size: 12px; font-weight: 600; } -.site-footer { border-top: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; gap: 24px; padding-block: 28px; } -.site-footer .brand { font-size: 15px; } -.site-footer .brand-mark { width: 25px; height: 25px; font-size: 18px; } -.site-footer p { font-size: 12px; margin: 0; } -.site-footer > a:last-child { font-size: 12px; } -section[id] { scroll-margin-top: 24px; } +.doc-card { border: 1px solid var(--line); padding: 29px; border-radius: 9px; display: flex; flex-direction: column; background: #fff; } +.doc-card:hover { border-color: #c2b6e3; box-shadow: 0 6px 18px #51437408; } +.doc-number { color: #767180; font-size: 9px; letter-spacing: .08em; display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; } +.doc-number > span { font: 18px sans-serif; color: var(--accent); } +.doc-card h3 { margin-bottom: 13px; font-size: 21px; } +.doc-card p { font-size: 14px; margin-bottom: 28px; } +.doc-link { margin-top: auto; color: var(--accent); font-size: 12px; font-weight: 550; } +.site-footer { border-top: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; gap: 24px; padding-block: 32px; } +.site-footer .brand { font-size: 18px; } +.site-footer .brand-mark { width: 29px; height: 29px; font-size: 20px; } +.site-footer p { font-size: 11px; margin: 12px 0 0; } +.footer-links { display: flex; gap: 28px; font-size: 12px; } +section[id] { scroll-margin-top: 28px; } @media (max-width: 1000px) { .hero { gap: 32px; } .code-panel pre { font-size: 11px; padding-inline: 18px; } .install-section { gap: 45px; } - .install-option { align-items: start; flex-direction: column; gap: 10px; } + .harness-names { gap: 25px; } } @media (max-width: 760px) { .wrap { width: calc(100% - 40px); } @@ -121,35 +150,20 @@ section[id] { scroll-margin-top: 24px; } nav { gap: 18px; font-size: 12px; } nav a:first-child { display: none; } .hero { grid-template-columns: 1fr; padding-block: 48px; gap: 36px; } - h1 { font-size: clamp(2.75rem, 9vw, 4rem); } - .hero-description { max-width: 520px; } - .code-panel pre { font-size: 12px; padding-inline: 24px; } + h1 { font-size: clamp(48px, 9vw, 70px); } + .code-stage::before { inset-inline: 10%; } .section-heading { flex-direction: column; align-items: start; gap: 20px; } .section-heading > p { max-width: 100%; } + .harness-strip, .harness-names { flex-wrap: wrap; } .architecture-section { padding-block: 40px; } .architecture { grid-template-columns: 1fr; } .connector { transform: rotate(90deg); padding: 8px; } - .architecture-node { padding: 22px; } - .harnesses { grid-template-columns: repeat(3, 1fr); } - .harnesses span { text-align: center; padding: 14px 8px; font-size: 12px; } - .architecture-notes { grid-template-columns: 1fr; gap: 12px; margin-top: 22px; } + .architecture-notes { flex-direction: column; gap: 12px; } .install-section { grid-template-columns: 1fr; gap: 28px; padding-block: 44px; } - .install-copy h2 br { display: none; } - .install-copy h2 { margin-bottom: 18px; } - .install-option { flex-direction: row; align-items: center; gap: 16px; } .docs-section { padding-block: 40px; } .docs-grid { grid-template-columns: 1fr; gap: 12px; } - .doc-card { padding: 22px; } - .doc-number { margin-bottom: 16px; } - .doc-card p { margin-bottom: 16px; } - .site-footer { flex-wrap: wrap; gap: 18px; } - .site-footer p { order: 3; width: 100%; } + .site-footer { flex-wrap: wrap; } } -@media (max-width: 400px) { - .wrap { width: calc(100% - 32px); } - .brand { gap: 5px; font-size: 17px; } - nav { gap: 14px; } - .code-panel pre { font-size: 10px; padding-inline: 16px; } - .code-intro, .code-caption, .code-footnote { padding-inline: 16px; } - .install-option { flex-direction: column; align-items: start; gap: 10px; } +@media (prefers-reduced-motion: reduce) { + a { transition: none; } } From 88a12315fadbb5debc1481891391fb458deaf63a Mon Sep 17 00:00:00 2001 From: saladday <1203511142@qq.com> Date: Wed, 23 Sep 2026 22:43:14 +0800 Subject: [PATCH 5/6] style(site): keep desktop headlines on intentional lines --- site/index.html | 2 +- site/styles.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/index.html b/site/index.html index 07c890c3d..dc82569aa 100644 --- a/site/index.html +++ b/site/index.html @@ -75,7 +75,7 @@

One Core.
Many agents.

02 / Get started

-

Your infrastructure.
Your starting point.

+

Install. Sign in.
Add a node.

Install Core and Web together. Add execution nodes when you need them.

Read the installation guide
BEFORE YOU START

Use a verified Linux amd64 bundle. Choose an HTTPS address reachable from your nodes and sandboxes, and configure DNS/TLS before the first install.

Public release bundles are not published yet. Obtain one from your deployment administrator or build from source.

diff --git a/site/styles.css b/site/styles.css index 7665f7ed9..e9110621a 100644 --- a/site/styles.css +++ b/site/styles.css @@ -38,7 +38,7 @@ nav a:hover, .footer-links a:hover { color: var(--accent); } .hero { display: grid; grid-template-columns: 1fr 1fr; gap: 76px; align-items: center; padding-block: 86px 76px; } .eyebrow { text-transform: uppercase; letter-spacing: .11em; font-size: 10px; font-weight: 600; color: var(--accent); margin-bottom: 25px; display: flex; align-items: center; gap: 9px; } .small-square { width: 7px; height: 7px; border-radius: 2px; background: var(--accent); box-shadow: 0 0 0 4px #ede9fb; } -h1 { font-size: clamp(54px, 5.8vw, 82px); line-height: 1.045; margin-bottom: 26px; font-weight: 600; letter-spacing: -.065em; } +h1 { font-size: clamp(54px, 5.2vw, 72px); line-height: 1.045; margin-bottom: 26px; font-weight: 600; letter-spacing: -.065em; } h1 > span { color: var(--accent); } .hero-description { font-size: 18px; max-width: 445px; margin-bottom: 32px; line-height: 1.65; } .actions { display: flex; flex-wrap: wrap; gap: 12px; } From 01fc5d330231d5300c5dfd8aa3af4b91c0e8fdd7 Mon Sep 17 00:00:00 2001 From: saladday <1203511142@qq.com> Date: Wed, 23 Sep 2026 22:52:55 +0800 Subject: [PATCH 6/6] style(site): clarify inline links and improve label contrast --- site/styles.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/site/styles.css b/site/styles.css index e9110621a..f795c4281 100644 --- a/site/styles.css +++ b/site/styles.css @@ -91,7 +91,7 @@ h1 > span { color: var(--accent); } .harnesses { display: grid; gap: 11px; } .harnesses > div { display: flex; align-items: center; gap: 12px; padding: 20px; border: 1px solid #dcdbe7; border-radius: 7px; background: #fafafd; font-size: 15px; font-weight: 550; } .harness-dot { width: 6px; height: 6px; background: #b5adc9; border-radius: 2px; flex-shrink: 0; } -.native-label { font: 9px var(--mono); color: #797582; margin-left: auto; } +.native-label { font: 9px var(--mono); color: #666171; margin-left: auto; } .architecture-notes { display: flex; justify-content: space-between; gap: 24px; margin-top: 25px; } .architecture-notes p { font-size: 12px; margin: 0; } .architecture-notes p > span { color: #9a8bbb; margin-right: 9px; } @@ -105,6 +105,7 @@ h1 > span { color: var(--accent); } .note-label { font-size: 9px; letter-spacing: .09em; color: #747180; } .install-prerequisites p { font-size: 12px; margin: 15px 0 0; } .install-prerequisites a { color: var(--accent); } +.code-footnote a, .install-prerequisites a, .setup-footnote a { text-decoration: underline; text-decoration-color: #a79acd; text-underline-offset: 3px; } .setup-path { min-width: 0; } .setup-steps { list-style: none; margin: 0; padding: 0; } .setup-step { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: 20px; padding-bottom: 28px; position: relative; }