awslabs/llrt
LLRT (Low Latency Runtime) is an experimental, lightweight JavaScript runtime designed to address the growing demand for fast and efficient Serverless applications.
Healthy across the board
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓5 active contributors
- ✓Apache-2.0 licensed
Show all 6 evidence items →Show less
- ✓CI configured
- ✓Tests present
- ⚠Concentrated ownership — top contributor handles 79% of recent commits
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/awslabs/llrt)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/awslabs/llrt on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: awslabs/llrt
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/awslabs/llrt shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across the board
- Last commit 1d ago
- 5 active contributors
- Apache-2.0 licensed
- CI configured
- Tests present
- ⚠ Concentrated ownership — top contributor handles 79% of recent commits
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live awslabs/llrt
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/awslabs/llrt.
What it runs against: a local clone of awslabs/llrt — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in awslabs/llrt | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of awslabs/llrt. If you don't
# have one yet, run these first:
#
# git clone https://github.com/awslabs/llrt.git
# cd llrt
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of awslabs/llrt and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "awslabs/llrt(\\.git)?\\b" \\
&& ok "origin remote is awslabs/llrt" \\
|| miss "origin remote is not awslabs/llrt (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "Cargo.toml" \\
&& ok "Cargo.toml" \\
|| miss "missing critical file: Cargo.toml"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f "API.md" \\
&& ok "API.md" \\
|| miss "missing critical file: API.md"
test -f "example/functions/src/v3-lib.mjs" \\
&& ok "example/functions/src/v3-lib.mjs" \\
|| miss "missing critical file: example/functions/src/v3-lib.mjs"
test -f ".github/workflows/ci.yml" \\
&& ok ".github/workflows/ci.yml" \\
|| miss "missing critical file: .github/workflows/ci.yml"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/awslabs/llrt"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
LLRT (Low Latency Runtime) is a lightweight JavaScript runtime built in Rust using QuickJS as its engine, designed to run serverless functions on AWS Lambda with 10x faster startup and 2x lower cost than Node.js. It supports ES2023 syntax and bundles native AWS SDK modules (DynamoDB, S3, etc.) for zero-dependency deployments. Monorepo structure with Rust workspace: core runtime in llrt_core/, protocol bindings in llrt/ (the bootstrap binary), ~30 modular Rust crates under modules/ for individual Node.js APIs (llrt_fetch, llrt_crypto, llrt_stream, etc.), and libs/ for shared utilities. Examples and benchmarks in example/ and benchmarks/ directories demonstrating Lambda integration patterns.
👥Who it's for
AWS Lambda developers and DevOps engineers deploying serverless applications who need minimal cold start times and reduced compute costs; especially those running high-volume event-driven workloads where startup latency compounds costs across thousands of invocations.
🌱Maturity & risk
Explicitly marked experimental in the README with a WARNING banner, indicating it's not production-ready. The repo shows active CI/CD setup (workflows for build, test, release, dependabot), but the 'experimental' status and requirement for full dependency bundling signal it's still in evaluation phase. Contributors should expect breaking changes.
High risk for production adoption: (1) explicitly experimental status with no stability guarantees, (2) not a Node.js drop-in replacement—requires consulting compatibility matrix and API.md for each feature, (3) requires manual bundling of all dependencies (no npm ecosystem integration). Single maintainer risk visible through AWS Labs ownership without clear community governance model.
Active areas of work
Active development on core runtime performance and AWS SDK compatibility. GitHub Actions workflows (ci.yml, build.yml, release.yml) indicate regular releases; dependabot.yml shows dependency updates are automated. The monorepo structure suggests ongoing expansion of module coverage (fetch, crypto, streams, timers, etc.) to match Node.js API surface.
🚀Get running
git clone https://github.com/awslabs/llrt.git
cd llrt
cargo build --release
make # builds the runtime
Requires Rust toolchain (likely 1.70+) and Node.js for build scripts (build.mjs files present). No npm install needed for core runtime; JavaScript examples use yarn (see .yarnrc.yml).
Daily commands:
Core runtime compiles to a bootstrap binary via cargo build --release. Lambda functions run via: LAMBDA_HANDLER=app.handler /path/to/bootstrap. For examples: cd example/functions && make build, then package with bootstrap binary. No dev server; testing done via cargo test across workspace members and example functions invoked locally or on Lambda.
🗺️Map of the codebase
Cargo.toml— Root workspace configuration defining all 30+ member crates (libs and modules) that comprise LLRT; essential for understanding build dependencies and project structure.README.md— Defines LLRT's mission as a low-latency JavaScript runtime for AWS Lambda with 10x faster startup; establishes experimental status and performance benchmarks.API.md— Complete API reference for all exposed modules (fetch, crypto, fs, buffer, etc.); required reading for integration and module capability discovery.example/functions/src/v3-lib.mjs— Reference implementation showing DynamoDB integration patterns with AWS SDK v3; demonstrates real-world performance and usage for Serverless applications..github/workflows/ci.yml— CI/CD pipeline defining build, test, and validation gates across all platforms; critical for understanding quality standards and release process.build.mjs— Build orchestration script for compiling LLRT runtime and modules; entry point for local development and cross-platform builds.Makefile— Top-level build targets and common development tasks; first reference for contributors to understand how to build and test locally.
🛠️How to make changes
Add a new built-in module
- Create new module crate in
modules/llrt_<modulename>/with Cargo.toml defining dependencies and name (modules/llrt_fetch/Cargo.toml) - Implement module bindings in
modules/llrt_<modulename>/src/lib.rsusing QuickJS FFI (modules/llrt_fetch/src/lib.rs) - Register the module in the main runtime initialization (workspace member list) (
Cargo.toml) - Add module to build pipeline in
build.mjsto include in compiled binary (build.mjs) - Document module API with examples in
API.mdand add TypeScript definitions (API.md) - Add example usage in
example/functions/src/to demonstrate the module (example/functions/src/hello.mjs)
Add a new example Lambda function
- Create handler file in
example/functions/src/as .mjs (JavaScript) or .ts (TypeScript) (example/functions/src/hello.mjs) - Build TypeScript functions using tsconfig defined in example/functions/ (
example/functions/tsconfig.json) - Add AWS SAM template configuration in
example/llrt-sam/template.yamlwith function resource and environment (example/llrt-sam/template.yaml) - Create test event in
example/llrt-sam-container-image/events/event.jsonfor local testing (example/llrt-sam-container-image/events/event.json) - Deploy using SAM:
sam build && sam deploywith llrt runtime specified in template (example/llrt-sam/samconfig.toml)
Extend runtime with custom hooks
- Create hook module in
example/register-hooks/hooks/(e.g., hooks/custom.js) exporting init function (example/register-hooks/hooks/http.js) - Import and register hook in main application using require() or dynamic import (
example/register-hooks/test.js) - Hook receives runtime context for extending globals, monkey-patching modules, or adding middleware (
example/register-hooks/hooks/calc.js) - Test hooks with provided test script in
example/register-hooks/test.sh(example/register-hooks/test.sh)
Optimize performance for Lambda deployment
- Review benchmark results in
benchmarks/directory comparing LLRT vs Node.js startup/execution times (benchmarks/fetch-streaming.mjs) - Use
example/functions/src/v3-lib.mjsas reference for minimal AWS SDK imports to reduce bundle size (example/functions/src/v3-lib.mjs) - Enable compression in build.mjs and use llrt_compression module for response payloads (
libs/llrt_compression) - Configure SAM template with minimal memory/timeout and LLRT runtime specified (
example/llrt-sam/template.yaml)
🔧Why these technologies
- Rust for runtime core — Memory safety, zero-cost abstractions, and fine-grained control over startup time and resource allocation critical for serverless constraints.
- QuickJS JavaScript engine — Lightweight, embeddable JavaScript engine with small memory footprint and fast startup compared to V8 used in Node.js.
- Cargo workspace with 30+ member crates — Modular architecture allowing selective compilation of only-needed modules, reducing binary size and startup overhead.
- AWS Lambda layer/container image deployment — Native integration with AWS compute platform; examples use SAM/CDK for infrastructure as code with LLRT runtime specification.
⚖️Trade-offs already made
-
Use QuickJS instead of V8
- Why: V8 has larger footprint and slower startup; QuickJS prioritizes minimal overhead.
- Consequence: Some advanced JS features (newer ECMAScript standards, JIT optimization) are limited; acceptable for serverless workloads.
-
Implement Node.js-compatible modules rather than full Node.js compatibility
- Why: Full compatibility would negate startup and size benefits; focused modules reduce bloat.
- Consequence: Not all npm packages will run; developers must vet dependencies for LLRT compatibility.
🪤Traps & gotchas
(1) Dependency bundling is mandatory: Unlike Node.js, LLRT has zero npm ecosystem—all dependencies (including AWS SDK v3 modules) must be bundled into the function zip. (2) No npm/yarn support: JavaScript must be pre-bundled using external tools (esbuild, webpack) before packaging. (3) Lambda-specific bootstrap: The bootstrap binary is the custom runtime entry point; standard Node.js runtime features don't apply. (4) Architecture-specific binaries: ARM64 (llrt-lambda-arm64.zip) vs x64 (llrt-lambda-x64.zip) must match Lambda function architecture. (5) QuickJS engine limits: Some ES2023 features may behave differently than V8; always test edge cases from API.md. (6) No Node globals by default: require(), __dirname, __filename not available without explicit polyfills.
🏗️Architecture
💡Concepts to learn
- Custom Lambda Runtime — LLRT is delivered as a custom runtime (the bootstrap binary), not the standard Lambda Node.js runtime—understanding this difference is critical for packaging and deployment
- QuickJS Engine — LLRT's JavaScript engine; much lighter than V8 but with different performance characteristics and subtle behavioral differences in edge cases
- Binary Size Optimization (LTO, Strip) — Rust release profile in Cargo.toml uses aggressive LTO and stripping to keep the bootstrap binary under Lambda's deployment size limits; understanding these tradeoffs is important for debugging and modifying the runtime
- Lambda Cold Start — LLRT's primary value proposition is reducing cold start latency from Node.js ~200-300ms to ~10-50ms; understanding what constitutes a cold start and how it affects cost is essential for users
- Monorepo Workspace Pattern (Cargo workspaces) — LLRT uses Rust Cargo workspaces with ~35 member crates for modularity; understanding how to add/modify modules within this structure is essential for contributors
- FFI (Foreign Function Interface) / Native Bindings — Node.js APIs are implemented as Rust code exposed to QuickJS; understanding Rust↔JavaScript bindings is key for extending LLRT or debugging API behavior
- Dependency Bundling (No npm at Runtime) — Unlike Node.js, LLRT has zero runtime npm ecosystem—all code must be bundled before execution; this fundamentally changes how developers package and deploy applications
🔗Related repos
nodejs/node— LLRT implements a subset of Node.js APIs; reference for API behavior and compatibility expectationsbellard/quickjs— The JavaScript engine LLRT wraps; understanding QuickJS internals helps debug runtime behavior and limitationsaws/aws-sdk-js-v3— LLRT bundles v3 SDK modules; developers must understand which v3 packages are pre-included vs. require bundlingevanw/esbuild— Recommended build tool for bundling TypeScript/JavaScript dependencies before packaging with LLRT for Lambdaaws-samples/serverless-pattern-collection— Contains real-world Lambda patterns; useful for understanding how LLRT fits into broader serverless architectures
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive benchmark suite workflow for llrt_core performance regressions
The repo has benchmark files in benchmarks/v8-v7/ and benchmarks/fetch-streaming.mjs, but no CI workflow to automatically run them on PRs. This would catch performance regressions early and validate the '10x faster startup' claim. Currently only build.yml, ci.yml, publish.yml, and release.yml exist—a dedicated benchmarks workflow is missing.
- [ ] Create .github/workflows/benchmarks.yml that runs v8-v7 benchmarks on PR and main branch
- [ ] Add baseline comparison logic to detect regressions in crypto.js, deltablue.js, and other benchmark suites
- [ ] Configure workflow to generate benchmark reports and post results as PR comments
- [ ] Update CONTRIBUTING.md with instructions on running benchmarks locally before submitting PRs
Add integration tests for example/functions serverless deployments
The example/ directory contains real-world Lambda function examples (v3.mjs, ssr.ts, React app) but there are no automated tests verifying they build and run correctly. This is critical for a serverless-focused runtime to ensure contributors don't break example code that users rely on for getting started.
- [ ] Create libs/llrt_test or extend existing llrt_test with Lambda-compatible test utilities
- [ ] Add .github/workflows/test-examples.yml to build and validate all example/functions/src/* files
- [ ] Create integration tests that invoke example functions and validate output (e.g., test hello.mjs, v3-lib.mjs DynamoDB calls)
- [ ] Document testing patterns in CONTRIBUTING.md for example code
Add missing unit tests for modules with no test coverage (e.g., llrt_navigator, llrt_intl, llrt_perf_hooks)
The workspace includes 30+ modules (modules/llrt_*) but no visible test directory structure. Critical modules like llrt_navigator, llrt_intl, and llrt_perf_hooks likely lack unit tests. This directly impacts stability as new contributors modify these modules without automated validation.
- [ ] Audit modules/llrt_navigator/src/lib.rs, modules/llrt_intl/src/lib.rs, modules/llrt_perf_hooks/src/lib.rs for public APIs
- [ ] Create tests/ subdirectories in each module following Rust conventions with mod.rs
- [ ] Add unit tests for constructor, method signatures, and error handling in each module
- [ ] Update ci.yml to run 'cargo test --all' to execute all module tests automatically
🌿Good first issues
- Add comprehensive test coverage for
modules/llrt_util/(string_decoder, format, inspect functions)—currently sparse; mirrors Node.js util module but lacks parity tests - Expand API.md with runnable example code snippets for each supported API (currently lists APIs but lacks 'how to use' examples for developers migrating from Node.js)
- Implement missing
modules/llrt_perf_hooks/features: currently minimal; add performance.measure() and performance.mark() with full observer support, tested against Node.js behavior
⭐Top contributors
Click to expand
Top contributors
- @dependabot[bot] — 79 commits
- @nabetti1720 — 16 commits
- @richarddavison — 3 commits
- @hieuit095 — 1 commits
- @WuJunkai2004 — 1 commits
📝Recent commits
Click to expand
Recent commits
da4a248— feat(temporal): Improved compatibility with Temporal.ZonedDateTime (#1532) (nabetti1720)ee1a19a— chore(deps): bump tokio from 1.52.1 to 1.52.2 (#1543) (dependabot[bot])b59615e— chore(deps-dev): bump the aws-cdk group with 2 updates (#1536) (dependabot[bot])fc02862— chore(deps): bump openssl-sys from 0.9.114 to 0.9.115 (#1542) (dependabot[bot])3a4c051— chore(deps): bump rustls from 0.23.39 to 0.23.40 (#1541) (dependabot[bot])fae1cc5— chore(deps): bump junction from 1.4.2 to 2.0.0 (#1540) (dependabot[bot])9a394a4— refactor(buffer): deprecation of the custom implementation of atob/btoa (#1538) (nabetti1720)8d9c9dc— chore(deps): bump yaml from 1.10.2 to 1.10.3 in /example/infrastructure (#1526) (dependabot[bot])bd99901— chore(deps): bump whoami from 2.1.1 to 2.1.2 (#1528) (dependabot[bot])a240924— chore(deps): bump rustls from 0.23.38 to 0.23.39 (#1530) (dependabot[bot])
🔒Security observations
LLRT presents a moderate security posture typical of an experimental project. The primary concerns are: (1) the experimental nature of the runtime which introduces inherent uncertainty; (2) aggressive build optimizations that may hinder security analysis; (3) lack of visible supply chain security controls in dependency management; and (4) missing security disclosure processes. The codebase shows good organizational structure with modular components and clear CI/CD integration, but would benefit from enhanced security documentation, dependency verification, and supply chain hardening before considering for production use in security-sensitive environments.
- Medium · Experimental/Unstable Runtime in Production Use —
README.md, Multiple workflow files. LLRT is explicitly marked as an experimental package subject to change and intended only for evaluation purposes. Using experimental software in production environments introduces unknown risks, potential breaking changes, and lack of stability guarantees. This may lead to unexpected runtime failures, security patches, or API changes without deprecation periods. Fix: Clearly document the experimental status in deployment guidelines. Implement thorough testing and staging environments. Monitor for security advisories and be prepared for rapid updates. Consider using stable alternatives for production workloads until LLRT reaches a stable release. - Medium · Aggressive Optimization Flags in Release Build —
Cargo.toml - [profile.release]. The release profile usesstrip = trueandlto = truewithcodegen-units = 1. While these optimize for performance, they can make debugging and security auditing difficult. Stripped binaries obscure stack traces and symbols, potentially hiding vulnerabilities. LTO (Link Time Optimization) can introduce unexpected behavior. Fix: Maintain a separate debug/debuginfo build for security analysis and incident response. Consider conditional stripping based on deployment environment. Document the optimization choices and their security implications. Ensure comprehensive testing covers edge cases. - Medium · Dependency Management Through Yarn Lock Without Verification —
.yarnrc.yml, example/functions/yarn.lock, example/infrastructure/yarn.lock. Multiple example functions use yarn.lock files (.yarnrc.yml present). Without evidence of lock file verification, checksum validation, or supply chain security measures, dependencies could be subject to tampering or man-in-the-middle attacks. Fix: Enable yarn's audit functionality (yarn audit). Implement CI/CD checks for dependency vulnerabilities. Consider usingyarn --frozen-lockfileto prevent unexpected updates. Regularly audit and update dependencies. Implement package signature verification where available. - Low · Broad Workspace Configuration Without Isolation —
Cargo.toml - [workspace] members. The workspace includes 30+ members with varying purposes (libs, modules, core). Without clear security boundaries or module isolation policies, vulnerabilities in one module could potentially affect others. The cargo workspace resolver='2' may have different dependency resolution behavior than expected. Fix: Document security boundaries between modules. Implement feature flags to disable unnecessary functionality. Regular security audits of the module dependency tree. Consider the principle of least privilege when exposing APIs between modules. - Low · Multiple CI/CD Workflows Without Visible Security Controls —
.github/workflows/ (build.yml, ci.yml, publish.yml, release.yml, build-modules.yml). The repository contains multiple GitHub Actions workflows (build, ci, publish, release, build-modules) with no visible content in the provided structure. These workflows may lack security controls such as: branch protection rules, approval requirements, secret management, artifact signing, or audit logging. Fix: Review all workflow files for: OIDC token usage instead of long-lived tokens, branch protection requirements, required approvals for releases, secrets rotation policies, artifact signature verification, and comprehensive audit logging. Implement the principle of least privilege for workflow permissions. - Low · No Evidence of Security Policy or Disclosure Process —
Repository root. While CODE_OF_CONDUCT.md and GOVERNANCE.md exist, there is no visible SECURITY.md file or security disclosure policy. This makes it difficult for security researchers to responsibly report vulnerabilities. Fix: Create a SECURITY.md file that includes: responsible disclosure guidelines, security contact information, expected response times, and a clear process for handling security vulnerabilities. Consider following the OpenSSF best practices.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.