Build a project

A project is the composition and deployment layer of PLeX. Keep reusable implementation in packages and keep target-specific choices in the consuming project.

Start from a manifest

synps new app
cd app

The generated manifest contains only identity:

[package]
name = "app"
version = "0.1.0"

A deployable project also needs build packages, at least one public entrypoint, policies, and whatever dependencies/weights/assets those components require.

Add dependencies

Use local paths while developing related repositories:

[dependencies]
component = { path = "../component" }
codec = { git = "https://github.com/useplx/Quantizations.git", version = "v1.0.0" }

Registry-style version dependencies are parsed by the manifest but registry resolution is not implemented. Use path or Git sources today.

Configure dependency variables

A dependency may publish a [package.variables] schema. The root project sets those values under [packages.<dependency>]:

[packages.component]
context = 2048

SYNaPSe rejects unknown packages, unknown fields, type mismatches, required values that are missing, and numeric values outside declared ranges.

Compose build packages

A root build package can absorb build packages from dependencies with extends and link build artifacts with uses:

[build.orchestration]
toolchain = "cpp"
sources = ["src/application.cpp"]
extends = ["component:orchestration"]

extends combines sources/build metadata into the consuming build package; uses keeps a separately built artifact as a build/link input.

Select the public entrypoint

[entrypoint]
package = "component"

When component is a dependency alias, SYNaPSe selects that package. Its graph and orchestration facets supply the physical bindings; the root project does not repeat them.

Declare graph policy

A minimal root policy needs a dtype, backend, and immutable-constant scheme:

[policies."model"]
dtype = "f16"

[policies."model".backend]
device = "local"

[[policies."model".schemes]]
format = "f16"

Add narrower policies only where the model needs a different decision. See Graph paths & policies.

Add weights

The root project supplies checkpoints:

[weights]
path = "${MODEL_WEIGHTS}"

or:

[weights]
paths = ["part-00001.safetensors", "part-00002.safetensors"]

Exactly one of path or paths is accepted and paths cannot be empty. ${VAR} references in weight paths must be set.

Add assets

The default asset directory is assets/. Files found there are included in the artifact and exposed to orchestration through session.asset(name).

Change the layout when needed:

[layout]
assets = "deployment-assets"

Inspect the resolved build

synps graph
synps inspect

Run these before long builds. inspect is the best way to verify which build-package runtime, toolchain, entrypoint, policy, hook, weight source, and artifact module the current manifest resolves to.

Build and clean

synps build --release
synps clean

The artifact path is build/<root-package-name>.mln. clean removes the local build/ directory, not the Git dependency cache or synps.lock.

Record dependency resolution

synps install and synps update currently both resolve the manifest and write synps.lock. The resolver does not currently read that lockfile back to pin a later resolution, so reproducibility comes from immutable Git rev values or local source control, not from lockfile consumption.