Write, deploy and host small C# web services and sites at a public address.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
One-click editor setup isn’t available for this listing yet — we don’t have a confirmed install command, and we’d rather show nothing than point your editor at the wrong package or host. Follow the project’s own setup instructions, linked above.
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.
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.
Two processes: the .NET server, and Vite serving the frontend with hot reload.
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:
Build and test everything the way CI does:
The tests compile and execute real lambdas against a real server on a random port, each against its own temporary data directory.
| 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 |
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/agent | the agent's change of it - under way, or the last one - and how many are left today |
POST /lambdas/:privateKey/agent/start / stop | asks the agent for a change, stops it |
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.
Where the installation runs the build agent, the editor has a Change
section: the owner says what should be different, and the same agent that
builds things on /build changes the lambda - it reads the code and the
history, changes only what was asked with change_code, fixes what does not
compile, and puts the result online as a new version. Switched off, it saves
the version for the owner to look at and deploy themselves.
The section shows it happen: what the agent says it is doing, each tool it calls with what came of it (the version saved, errors from the compiler, the version online), and a clock against its time limit. Afterwards it offers the difference to the version before, the address, and putting the previous version back. The change is followed by the frame of the editor rather than the section, so the sidebar marks it and the lambda is read again when it ends wherever the owner is; and it is kept by the agent under the lambda, so a reload, a second tab or a redeploy of the server finds it where it got to.
It shares the queue and the daily allowance of /build, one change of a
lambda runs at a time, and it can be stopped - whatever it saved stays a
version. A change runs without create_lambda, and its editor key travels in
the brief inside the build container, never in a log line.
A single .NET 11 project hosted by GenHTTP.Full.Ioxide, wired up in
Application.cs and divided into
services that the API resources talk to through interfaces:
No reviews yet — be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/genhttp-lambda)<a href="https://allmcps.com/mcp/genhttp-lambda"><img src="https://allmcps.com/api/badge/genhttp-lambda?style=directory" alt="GenHTTP Lambda on AllMCPs" /></a>