Getting Started
ProxyLang runs on proxyweb, the ProxyCore web runtime. This guide takes you from an empty file to a live, audited app in a handful of steps — write a .pxy, serve it, and grow it.
ProxyCore and ProxyLang are in preview and private dogfooding, distributed as a Rust workspace rather than a public package. The steps below assume you have early-access to that workspace — request access if you don't yet.
Step 1 — Get the runtime
You need a recent stable Rust toolchain (rustup) and the ProxyCore workspace. Build it once; the proxyweb binary is what serves your files.
# with early-access to the workspace git clone <proxycore-workspace> proxycore cd proxycore cargo build -p proxyweb
Step 2 — Write your first .pxy
A ProxyLang file is indented text — no braces. Start with a site and one page that declares a route:.
site "Hello" direction: modern-minimal page Home: route: / heading: Hello from ProxyLang paragraph: This whole page is defined in one .pxy file and rendered in the Brevet design system. callout success: Parsed once at startup, served as cached bytes.
Step 3 — Serve it
Point proxyweb at your file. It parses the .pxy, pre-renders each page, and serves on http://127.0.0.1:3200 by default.
cargo run -p proxyweb -- hello.pxy # proxyweb listening on http://127.0.0.1:3200 # open it in a browser
Step 4 — Add a page
Add another page with its own route:. Static pages are pre-rendered and looked up in O(1) per request.
page About: route: /about heading: About this site list ordered: Parse the .pxy Lower the site block Pre-render each page to cached bytes
Step 5 — Make it live
Add a machine for behavior that changes over time. The runtime drives it at /machine/<Name>/fire, performs the checked transition, and records an audit entry per action.
machine Turnstile states: locked open when coin: state = open unlock gate when push: state = locked lock gate
# fire an event at the live machine curl "http://127.0.0.1:3200/machine/Turnstile/fire?event=coin"
Step 6 — Persist data (optional)
To store and read data, give the site a schema:, the allowed mutations:, and named queries:, then point the runtime at a database with PROXYWEB_DB. A form runs only the named mutation; a table reads only a named query.
PROXYWEB_DB=sqlite://hello.db cargo run -p proxyweb -- hello.pxy
See the guestbook example for the full read/write loop.
Next steps
- Language reference — every block, with real syntax.
- Examples — a storefront, a SQL dashboard, a guestbook, an agent.
- Installing ProxyCore — the runtime, CLI, and configuration.