LEMCSSH field guide
LEMCSSH exposes the reviewed LEMC command surface through stock
OpenSSH. It is a restricted application endpoint, not a shell,
bastion, SCP/SFTP service, or host login. A login opens the LEMCSSH
shell, where you type lemcli commands. A script or agent
pipes lemcli lines to one connection. Use it to register
for the demo, discover authorized actions, run them, and inspect proof.
Register for the demo
No beta request is required. Register for the public demo at
demo.letemcook.dev with stock OpenSSH, use LEMCSSH to
run one reviewed Tool, and contact us
after the demo only if your team wants LEMC installed on its own
infrastructure.
Do not guess a host key or accept a changed fingerprint. Verify it out of band before the first connection.
Register for demo.letemcook.dev with SSH
Generate a distinct key, keep the private file local at mode 0600, and register only its public half through the LEMCSSH registration screen.
ssh-keygen -t ed25519 -a 64 -f ~/.ssh/lemc-demo
chmod 600 ~/.ssh/lemc-demo
# Verify the host-key fingerprint out of band.
# Register only ~/.ssh/lemc-demo.pub.
ssh -t -p 22 \
-i ~/.ssh/lemc-demo \
-o IdentitiesOnly=yes \
demo.letemcook.dev
LEMCSSH registration → Create demo account
If OpenSSH shows a short LEMC login hint and asks
Password:, leave it empty and press Enter to open
signup. LEMC opens signup only while public registration is
enabled.
The registration screen cannot run jobs, read product data, open a shell, or read storage. After the account is created, reconnect with the exact username from the confirmation.
Open the LEMCSSH shell with your password
You can open the interactive LEMCSSH shell with your LEMC username and web password instead of a registered key. It is not an OS shell. Type lemcli to begin, lemcli auth whoami to check your identity, and exit to leave.
ssh [email protected]
- OpenSSH asks
Password:. Type the password you use for the web login. Signup sets it. - If you belong to more than one account, OpenSSH then asks
Account (...). Type one of the listed account handles. - A password login opens only the interactive shell. Piped lines need a registered SSH key and stop with exit status 4 on a password login.
- To register a key for commands, sign in on the web, choose the account, open SSH Keys, and add only the
.pubfile.
Check the host-key fingerprint before you type a password. A password typed at a false host can be reused on the web login. A key signature cannot be reused.
Keep one verified SSH host configuration
Host demo.letemcook.dev
HostName demo.letemcook.dev
Port 22
User YOUR_EXACT_USERNAME
IdentityFile ~/.ssh/lemc-demo
IdentitiesOnly yes
StrictHostKeyChecking yes
Use this host configuration for every later connection. A key is bound to one exact user and account; use a separate key and host configuration for another account.
Verify identity and discover actions
Open the shell with ssh demo.letemcook.dev and type these lines, or pipe them to one connection. A script or agent sends all lines of one task in one batch. The batch stops at the first failing line and returns its exit status. ssh demo.letemcook.dev apps list (a command after the host) is refused.
ssh -T demo.letemcook.dev <<'EOF'
lemcli help
lemcli auth whoami --format=json
lemcli apps search rotate certificate --format=json
lemcli apps list --format=json
lemcli jobs surface app --uuid APP_UUID --scope individual --format=json
EOF
helplists the commands.help --all --format=jsonprints the full manifest, andguideprints the instance agent guide.auth whoamiconfirms the effective username and account.apps searchfinds the runnable actions that match its words: App and page names, wiki text, action labels and descriptions, recipe names, and form text. Each match has the App UUID, scope, and action ID, best first.apps listreturns only apps authorized for this key.jobs surfacereturns the page, scope, recipe, stable action ID, and declared inputs.- An action marked
needs_setuphas incomplete Provider setup. Do not run it. The Cookbook owner finishes setup first. - Discovery does not grant permission. The server checks current authority again when the job is admitted.
Run and follow one reviewed action
ssh -T demo.letemcook.dev <<'EOF'
lemcli jobs run app --uuid APP_UUID --action ACTION_ID --set environment=production --follow --render jsonl
EOF
Use only the action ID and declared form values returned by the surface. Do not select a runner, execution mode, host path, or arbitrary command. LEMC owns admission, isolation, scheduling, event persistence, and cleanup.
Inspect durable proof
ssh -T demo.letemcook.dev <<'EOF'
lemcli jobs status app --uuid APP_UUID --page 1 --scope individual --task-id TASK_ID --format=json
lemcli jobs logs app --uuid APP_UUID --page 1 --scope individual --recipe "check release readiness" --task-id TASK_ID
lemcli jobs artifacts list app --uuid APP_UUID --page 1 --scope individual --task-id TASK_ID
EOF
A command that reads input takes an input block. End its line with <<TOKEN (1 to 32 uppercase letters, digits, or underscores). The next lines are the input, up to a line that is exactly TOKEN. Quote the outer heredoc so your local shell does not expand $. Use a different inner token. The block is UTF-8 text, LF only, up to 2 MiB. The interactive shell does not accept <<; it asks for the input instead.
ssh -T demo.letemcook.dev <<'EOF'
lemcli cookbooks yaml set COOKBOOK_UUID --view-type individual --format=json <<YAML
cookbook:
name: demo
YAML
lemcli cookbooks yaml get COOKBOOK_UUID --format=json
EOF
To reuse one connection across many batches, add these plain OpenSSH options. Each later ssh -T with the same options opens a channel on the first connection. At most 4 channels run at once, and the connection lasts at most 1 hour.
ssh -T -o ControlMaster=auto -o ControlPath=~/.ssh/cm-%C -o ControlPersist=10m \
demo.letemcook.dev <<'EOF'
lemcli auth whoami --format=json
EOF
A Unix socket path is limited to about 104 bytes (108 on Linux). %C is a 40-character hash, so keep the directory name short and create ~/.ssh first.
A complete caller checks the task ID, terminal status, terminal reason, system and recipe steps, logs, rendered output, artifacts, and cleanup result.
Build through the governed boundary
Accepted teams use the server-owned Builder through LEMCSSH. The agent never receives a Docker socket, host shell, or general container control plane. The agent sends a Dockerfile or source as an input block in a piped batch. The Runner builds and tests in fresh jailed guests and returns managed image identity—including an immutable digest for cookbook pins.
- Discover contracts:
lemcli help --all --format=json, thenlemcli builder images --help. - List managed images:
lemcli builder images list --format=json. - Compile and test with an explicit image and revision identity, for example
builder images compile-run IMAGE_UUID --expected-revision REVISION_UUID --idempotency-key REQUEST_UUID --follow, and send Dockerfile or source as an input block (see below). - Record the immutable digest the Builder returns. Cookbook YAML must pin that digest later.
- In recipe steps use
image: local/USERNAME/IMAGE@sha256:DIGESTfor a Local Image or a standard remote digest reference. Do not use a mutable tag.
ssh -T demo.letemcook.dev <<'EOF'
lemcli builder images --help
lemcli builder images list --format=json
lemcli builder images compile-run IMAGE_UUID --expected-revision REVISION_UUID --idempotency-key REQUEST_UUID --follow
EOF
Hosted-untrusted jobs require a digest-pinned image
(@sha256:…). A local Docker tag or remote
:latest is not production-ready. The SSH host is not a
bastion, SCP/SFTP endpoint, or administrative login—only the
published Builder and job commands apply. Full first-image steps:
Create the first Development Image.
Secrets stay write-only and owner-qualified. The Cookbook defines
each Provider requirement once in its top-level alias catalog. A
recipe lists only the aliases that it needs. The Cookbook owner
binds each selected requirement to an approved Provider Profile,
and Apps use that binding. Only a selected Custom Provider guest
receives plaintext. Each job receives one bounded direct alias map
of its selected aliases through
LEMC_PROVIDER_RESULTS_YAML and its fixed integration
context. Supply a value only through the write-only Secret surface
or an input block where the remote contract allows it. Never put it
in a prompt, URL, argument list, log, or artifact. See
Providers and Secrets
and
form fields → env.
Minimal agent loop
register a distinct key through LEMCSSH
→ verify the exact account
→ list authorized apps
→ inspect the action surface
→ run the returned action
→ follow events to terminal state
→ report the task ID and evidence
Keep planning and execution separate. The model can explain why it chose an action; LEMC supplies the evidence for what that action did.