GenHTTP platform to run lambda layouts
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Documented (README)
- !No standard license detected
git clone https://github.com/MDA2AV/GenHTTP.LambdaTools overview
# GenHTTP Lambda
Write a C# snippet that returns a GenHTTP `IHandler`, press deploy, and get a
public URL that serves it. The snippet is compiled with Roslyn at runtime and
the resulting handler is hosted by the same [GenHTTP][genhttp] server that
serves this application.
```csharp
return Inline.Create()
.Get(() => "Hello from my lambda!");
```
## Quick start
```bash
docker compose up --build
```
The application is then available at <http://localhost:8080/>. Its data - the
SQLite database, the stored code and the lambda workspaces - lives in a named
volume mounted at `/data`.
## Developing locally
Two processes: the .NET server, and Vite serving the frontend with hot reload.
```bash
# the server, on http://localhost:8080/
dotnet run --project src/GenHTTP.Lambda
# the frontend, on http://localhost:5173/ (proxies /api and /lambda to the server)
cd src/Frontend && npm install && npm run dev
```
Work against <http://localhost:5173/> while developing. The server on its own
answers with a placeholder page until a frontend has been built into its web
root, which is what `npm run build` does:
```bash
cd src/Frontend && npm run build # writes src/GenHTTP.Lambda/wwwroot
```
Build and test everything the way CI does:
```bash
dotnet build GenHTTP.Lambda.slnx -c Release
dotnet test GenHTTP.Lambda.slnx -c Release
```
The tests compile and execute real lambdas against a real server on a random
port, each against its own temporary data directory.
## Routes
| Route | Serves |
|----------------------|-----------------------------------------------------------|
| `/` | the landing page |
| `/editor/create` | the creation assistant |
| `/editor/:privateKey`| the editor for one lambda |
| `/lambda/:publicKey` | the deployed handler |
| any path, at a lambda's own domain | the deployed handler of a premium lambda with that domain |
| `/api/v1/` | everything the editor calls, see below |
| `/mcp` | the same, for agents |
| `/admin` | every lambda on the server, for whoever runs it |
### API
Browsable at `/api/v1/scalar/`. A lambda is addressed by its editor key, which
is also what authorizes the call. Things that can be listed, read, created or
changed are resources; what is a process rather than a thing is a verb in the
path.
| Endpoint | Does |
|-------------------------------------------------------|-------------------------------------------|
| `POST /lambdas` | creates a lambda |
| `GET / PATCH / DELETE /lambdas/:privateKey` | reads, changes (its key), removes it |
| `GET /lambdas/:privateKey/export` | the lambda as a runnable project (zip) |
| `GET / POST /lambdas/:privateKey/versions` | lists versions, saves a new one (optionally with `specification` and `change`) |
| `GET /lambdas/:privateKey/versions/:version` | reads one version |
| `GET /lambdas/:privateKey/versions/:version/zip` | one version's files as a zip |
| `POST /lambdas/:privateKey/versions/zip` | saves a zip of all files as a new version |
| `POST /lambdas/:privateKey/versions/changes` | changes some files of the newest version |
| `GET /lambdas/:privateKey/deployment` | what is online, and until when |
| `POST /lambdas/:privateKey/deployment/start` / `stop` | puts a version online, takes it off |
| `GET /lambdas/:privateKey/deployment/history` | every stretch it was online, and what ended it |
| `GET /lambdas/:privateKey/summary` | the dashboard: state, traffic, problems, storage |
| `GET /lambdas/:privateKey/traffic` | requests by minute and quarter hour, statuses, paths |
| `GET /lambdas/:privateKey/logs` | its own log, followed with `?since=`; no visitor addresses |
| `GET /lambdas/:privateKey/files` | lists the workspace |
| `GET / PUT / DELETE /lambdas/:privateKey/files/:path` | one file, its path encoded (`a%2Fb.txt`), as base64 up to 32 MB |
| `GET / PUT /lambdas/:privateKey/files/:path/content` | one file as it is, streamed, however large |
| `PUT /lambdas/:privateKey/folders/:path` | makes a folder |
| `POST /lambdas/:privateKey/code/check` | compiles without saving |
| `POST /lambdas/:privateKey/code/semantics`, `completions`, `definition` | what the editor asks the compiler |
| `GET /keys/:publicKey` | whether a key is free, and if not, online |
| `GET /demos` | the demos, and the keys to read them with |
| `POST /builds`, `GET /builds/:id` | the text box on `/build` |
| `GET /system` | terms, limits, starters, build agent |
| `GET /telemetry`, `/logs`, `/admin/...` | for whoever runs the installation |
Creating a lambda asks what somebody would like to build and offers the demos
in those words - "Keep track of things", "Let people sign up" - next to an empty
lambda. Picking a demo starts the new lambda as a copy of it, which is theirs to
change. The files are in `Resources/Templates` and listed in `TemplateCatalog`.
A lambda has two keys. The public one is part of its URL and may be changed;
the private one is the editor link and is shown only to whoever created the
lambda - anyone holding it can edit, deploy and delete.
A lambda may also return a websocket rather than a document, in any of the
three flavours the module offers - `Websocket.Functional()`, `.Reactive()` and
`.Imperative()`. The handshake is an ordinary request and is bounded by the
execution timeout like any other; everything after it belongs to the
connection, which is why a socket may stay open far longer than a lambda is
given to answer. `FrameType`, which the imperative flavour reads off every
frame, is one of the names a lambda is given, so no import is needed.
The editor says when both free tier timers run out: a hint under the public URL
for the deployment, and a chip beside the buttons for the lambda itself, which
opens an explanation of how each one is extended.
Editing and deploying are separate: saving creates a version, deploying picks
one (the latest by default) and makes it live. A lambda has at most one
deployment at a time, and older versions stay available to deploy again.
## How it is put together
A single .NET 11 project hosted by `GenHTTP.Full.Ioxide`, wired up in
[`Application.cs`](src/GenHTTP.Lambda/Application.cs) and divided into
services that the API resources talk to through interfaces:
- **Meta** (`Services/Meta`) - lambdas and their versions, the only component
that speaks to the database. Its public surface is DTOs, mapped by hand.
- **Storage** (`Services/Storage`) - the code itself, on the file system, one
file per version. Never in the database.
- **Workspace** (`Services/Workspace`) - the private directory of a lambda,
reached from the editor. The same directory the generated `Workspace` class
writes to from inside a lambda, under the same limits, so a file put there by
hand behaves like one the lambda wrote itself. Only the room it takes is
limited - 256 MB for most lambdas and 2 GB for a premium one, in any number
of files of any size - counted in blocks of 4 KB as the disk counts it, so
an empty file or a folder is not free. The quota is compiled into the
lambda, so moving it to another tier builds it again on its next request.
- **Deployment** (`Services/Deployment`) - wraps a snippet in a method body,
compiles it with Roslyn, loads the assembly and calls `PrepareAsync()` on
the resulting handler. Compiled once, then cached.
- **Execution** (`Services/Execution`) - an `IHandler`, not a web service: it
looks up the handler for a request and runs it.
- **Protection** (`Services/Protection`) - concerns in front of execution that
resolve the lambda, rate limit per client and cap concurrency.
- **Background** (`Services/Background`) - a small scheduler that undeploys
free tier lambdas a day after their last deployment and removes them after
30 days without a save.
The editor asks the compiler what the code means rather than guessing from how
it is spelled. `Services/Deployment/Compilation/SemanticClassifier.cs` says
what each name is, so a type, a method, a parameter and a local are coloured
apart, and `CompletionResolver.cs` answers what may be written where the caret
sits - including what follows a dot, which needs the type of what precedes it
and therefore needs a compiler. Both bind without emitting; the browser's own
grammar colours each keystroke in the meantime so nothing waits on the network.
Snippets are compiled against the GenHTTP module surface with its namespaces
already imported, so no `using` directives are needed. A guard
(`Compilation/CodeGuard.cs`) rejects code that reaches for the file system,
processes, reflection, sockets or the internals of this application before it
is ever compiled, and a lambda that does need files gets a directory of its
own under `/data/workspaces`.
Compiled lambdas run in the server process. The guard raises the cost of
misbehaving; it is not a sandbox, which is why the container runs unprivileged
and the seccomp profile is left alone.
## Configuration
Everything is read from the environment on startup, see
[`LambdaOptions`](src/GenHTTP.Lambda/ConfiguratiWhat people ask about GenHTTP.Lambda
What is MDA2AV/GenHTTP.Lambda?
+
MDA2AV/GenHTTP.Lambda is tools for the Claude AI ecosystem. GenHTTP platform to run lambda layouts It has 1 GitHub stars and its last recorded update is dated 2026-09-28.
How do I install GenHTTP.Lambda?
+
You can install GenHTTP.Lambda by cloning the repository (https://github.com/MDA2AV/GenHTTP.Lambda) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is MDA2AV/GenHTTP.Lambda safe to use?
+
Our security agent has analyzed MDA2AV/GenHTTP.Lambda and assigned a Trust Score of 62/100 (tier: OK). See the full breakdown of passed checks and flags on this page.
Who maintains MDA2AV/GenHTTP.Lambda?
+
MDA2AV/GenHTTP.Lambda is maintained by MDA2AV. The last recorded GitHub activity is dated 2026-09-28, with 5 open issues.
Are there alternatives to GenHTTP.Lambda?
+
Yes. On ClaudeWave you can browse similar tools at /categories/tools, sorted by popularity or recent activity.
Deploy GenHTTP.Lambda to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/mda2av-genhttp-lambda)<a href="https://claudewave.com/repo/mda2av-genhttp-lambda"><img src="https://claudewave.com/api/badge/mda2av-genhttp-lambda" alt="Featured on ClaudeWave: MDA2AV/GenHTTP.Lambda" width="320" height="64" /></a>More Tools
A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.
An AI skill that provides design intelligence for building professional UI/UX across multiple platforms.
🪨 why use many token when few token do trick. Viral skill + proxy for coding agents that cuts 65% of tokens by talking like a caveman.
CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies
The fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]
Use Claude Code, Codex, VSCode, Pi, and OpenCode (and 6 other harnesses) for free (1.3B+ free tokens) from your terminal, app, IDE, or phone, and now from the browser with native browser sessions (multi-harness + multi-model) like OpenClaw (voice supported + ToS friendly)