Elyra
Elyra The coding agent e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Release notes
Changelog
Elyra
Askr documentation

Askr documentation

Askr is a standalone, memory-safe PHP application server written in Rust. It embeds the PHP interpreter in-process (no FastCGI, no FPM), serves it from a memory-safe hot path, and — in worker mode — boots your app once and serves many requests against it, eliminating per-request framework bootstrap.

Version 1.4.14. Production target is Linux; development also works on macOS.

Start here

Guide What it covers
Architecture How Askr works: embedding, non-ZTS process-per-core, the worker loop, request lifecycle, TLS, recycling, reload, the admin plane.
Installation Start here — step by step from nothing to a served Laravel app (Docker, tarball or source)
Building Building libphp (macOS & Ubuntu) and the askr binary; the extension matrix.
Releasing Maintainer checklist: version bump, tag, and verifying the release actually reached users
Configuration The askr.toml reference, CLI flags, and environment variables.
CLI reference Every command and flag (serve, doctor, config-check).
Hosting multiple domains Virtual hosts ([[site]]), redirects (www→apex, http→https), multi-domain TLS.
Stability & compatibility The 1.0 compatibility contract: stable surfaces + deprecation policy.
Laravel setup Recommended Laravel guidecomposer require kwhorne/askr-laravel, .env, runner scripts, queue/scheduler/broadcasting, durable L2, production checklist.
Worker mode Boot-once-serve-many, the Laravel worker script, per-request state reset, writing your own worker.
Power features Response cache + tag invalidation, coalescing, Pusher WS, askr_defer, CoW autoscaling, record/replay, fork test runner.
Auto-TLS (ACME) Obtain + renew Let's Encrypt certs over HTTP-01 (--acme) — no proxy.
Hardening / sandbox seccomp no-exec + Landlock filesystem sandbox (--sandbox, Linux).
Docker Official multi-arch GHCR image — one container replaces app+nginx+redis+queue+cron.
Benchmarks Reproducible comparison vs FrankenPHP, PHP-FPM+nginx and RoadRunner — and the PHP-vs-I/O split that shaped the roadmap.
io_uring core (plan) Design notes for a Linux io_uring I/O core. Deprioritised — benchmarks show PHP is ~99.5% of request time, so I/O isn't the bottleneck.
CoW template Boot once, fork workers (copy-on-write) — ~ms warm respawn + shared memory (experimental).
Shared cache In-binary cache, atomic counters and rate limiting (no Redis); the Laravel driver.
Broadcasting Live updates to browsers via SSE + askr_broadcast() (no Reverb/Pusher).
Storage backends L1 shared memory + L2 SQL Anywhere: durable, replicated, multi-box cache/queue/pub-sub (epic elyra-2).
Admin dashboard The built-in status/reload/metrics API and web dashboard.
Observability Ship per-request logs to ElyraSQL / any MySQL-wire database (--features observ, ASKR_OBSERV_DSN) and query them with SQL.
Deployment Production: systemd, TLS, zero-downtime reload, recycling, scaling, hardening.
Upgrading How to upgrade and roll back, what's worth adopting at each version, and an honest list of what can bite you.
Ubuntu setup Recommended production install on Ubuntu (release tarball, systemd, TLS, tuning).
Maintenance After it's running: the 30-second check, deploys, clearing the three caches, certificates, log rotation, backups, and the mistakes already made in production.

60-second tour

Install a self-contained release (Linux x86_64 / arm64) and serve a Laravel app:

VER=v1.4.14; ARCH=$(uname -m)
curl -fsSLO https://github.com/kwhorne/askr/releases/download/$VER/askr-${VER#v}-linux-$ARCH.tar.gz
tar xzf askr-${VER#v}-linux-$ARCH.tar.gz && cd askr-${VER#v}-linux-$ARCH

./askr-run.sh doctor
ASKR_APP_BASE=/var/www/app ./askr-run.sh serve \
  --root /var/www/app/public \
  --worker-script examples/laravel-worker.php \
  --workers "$(nproc)" --tls-self-signed --admin 127.0.0.1:9000

Production setup (systemd, TLS, hardening): Ubuntu setup. Then Maintenance for the operating side. Building from source: Building.

What works today (1.4.14)

  • Embedded PHP (non-ZTS) running real Laravel 12, ~9× the per-request/FPM model
  • Multi-core via one worker process per core on a shared listen socket
  • Worker mode (Octane-style) with per-request state reset — no bleed
  • --paranoid state-bleed detector — is your app worker-safe?
  • CoW template (--cow) — boot once, fork workers for ~ms warm respawn (experimental)
  • Queue workers + scheduler + sidecars in the same binary (no Horizon/cron)
  • Shared cache / sessions / locks / job queue (askr_cache_*, askr_queue_* + Laravel drivers) — fully replaces Redis on a single box
  • Broadcasting — SSE + askr_broadcast(), plus a Pusher-compatible WebSocket (--pusher, drop-in Reverb with auth)
  • Response cache with tag invalidation, ESI fragment assembly, PURGE/BAN, stale-if-error, per-path [[cache.rule]], request coalescing, askr_defer() post-response work — and it survives restarts
  • Fleet-wide rate limiting before PHP wakes up, and canary deploys that abort and drain themselves on regression
  • Multipart uploads ($_FILES) + response compression (br/gzip)
  • Record & replay failing requests (--record-errors / askr replay)
  • Graceful recycling + auto-respawn + crash resilience
  • TLS (rustls) + HTTP/2; --tls-self-signed for dev; auto-TLS via ACME (--acme)
  • Hardening (--sandbox, Linux): seccomp no-exec + Landlock write-restriction
  • Zero-downtime rolling reload on SIGHUP, with optional canary
  • Request hardening: body-size limit (413), HEAD, GET/POST
  • Typed askr.toml config + config-check
  • Built-in admin dashboard + API (status, reload, live metrics)
  • In-process metrics — PHP-vs-I/O split, latency histogram, per-worker RSS
  • askr doctor pre-flight checks

Not yet

HTTP/3 (QUIC) and OpenTelemetry trace export. The per-core io_uring core is deprioritised: our benchmarks show PHP execution is ~99.5% of request time, so an I/O-syscall optimisation would move ~0.5% — the engine, not I/O, is the ceiling.