Not in the top 1,000 by GitHub stars
Toddoward/muse-local-gateway
Let your Muse step out of its cloud computer and work on the one beside you — a folder and a sandboxed shell over Tailscale. Unofficial community skill.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c9ec4916ba9e
No earlier version was observed for comparison.
Heat
Insufficient historyNot enough history yet to measure heat. It appears after a few days of data.
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
muse-local-gateway
When your agent uses it
Work directly on the user's own computer over Tailscale: put files in their shared folder and run shell commands in a sandboxed bench next to it (builds, scripts, USB serial boards). Use when the user wants Muse to act on their home PC, lab box, or home server instead of inside Muse's own VM.
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
1,165 tokensWhen the skill is activated
Reference documents
9,181 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What the user runs
- Procedure
- API (for tools other than bin/)
- This VM's networking
- Rules
Scripts executed separately
bench/Dockerfilebench/bench.pybench/test_bench.pybin/gateway-check.shbin/gateway-exec.shbin/gateway-put.shdirect/run.shdocs/media/make_hero.pydocs/media/make_logo.pygateway/gateway.pygateway/test_gateway.pysetup/setup.ps1setup/setup.shsetup/usb-attach.ps1tests/smoke.py
Files
.env.exampleasset525 bytes.github/workflows/ci.ymlasset480 bytes.gitignoreasset78 bytesCHANGELOG.mddoc1,309 bytesLICENSEasset11,358 bytesREADME.kr.mddoc8,611 bytesREADME.mddoc7,318 bytesSECURITY.kr.mddoc4,267 bytesSECURITY.mddoc3,621 bytesSKILL.mdcore4,286 bytesSKILL.mdcore4,286 bytesSKILL.mdcore4,286 bytesbench/Dockerfileruns463 bytesbench/bench.pyruns7,437 bytesbench/test_bench.pyruns1,570 bytesbin/gateway-check.shruns691 bytesbin/gateway-exec.shruns1,526 bytesbin/gateway-put.shruns564 bytescompose.open.yamlasset345 bytescompose.usb.yamlasset481 bytescompose.yamlasset3,211 bytesdirect/run.shruns1,096 bytesdocs/direct.kr.mddoc1,466 bytesdocs/direct.mddoc1,225 bytesdocs/media/hero-en-dark.svgasset65,734 bytesdocs/media/hero-en-light.svgasset65,737 bytesdocs/media/hero-kr-dark.svgasset65,805 bytesdocs/media/hero-kr-light.svgasset65,808 bytesdocs/media/logo.svgasset52,749 bytesdocs/media/make_hero.pyruns14,036 bytesdocs/media/make_logo.pyruns5,509 bytesdocs/usb-serial.kr.mddoc2,877 bytesdocs/usb-serial.mddoc2,435 bytesegress/squid.confasset1,270 bytesexamples/tailnet-acl.hujsonasset1,164 bytesgateway/gateway.pyruns4,540 bytesgateway/test_gateway.pyruns2,164 bytesserve.jsonasset108 bytessetup/setup.ps1runs5,018 bytessetup/setup.shruns3,200 bytessetup/usb-attach.ps1runs2,009 bytestests/compose.smoke.yamlasset593 bytestests/smoke.pyruns4,148 bytes
Read SKILL.md
# Muse Local Gateway
Community skill, not an official Muse feature. Source and setup: https://github.com/Toddoward/muse-local-gateway
## What the user runs
A small stack on their machine, reachable only over their tailnet:
| Port | Service | What it does |
|---|---|---|
| `8730` | gateway | `PUT /files/<path>` writes into the user's shared folder |
| `8731` | bench | `POST /exec` runs `sh -c` in a container; the shared folder is `/work` |
The bench has no secrets, no Docker socket, and (by default) no route to the user's computer or
LAN. Its internet goes through a proxy. The user chose one network mode at install:View the complete source on GitHubSkills included
- muse-local-gateway
Repository facts
- License
- Apache-2.0
- Created
- Oct 12, 2026
- Last pushed
- Oct 12, 2026
- Forks
- 2
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 23 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddocs/media/hero-en-dark.svg:1Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-dark.svg:2Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-dark.svg:46Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-dark.svg:44Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-dark.svg:45Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-light.svg:1Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-light.svg:2Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-light.svg:46Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-light.svg:44Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-en-light.svg:45Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-dark.svg:1Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-dark.svg:2Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-dark.svg:46Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-dark.svg:44Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-dark.svg:45Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-light.svg:1Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-light.svg:2Analysis incomplete: physical or joined line exceeds character limitdocs/media/hero-kr-light.svg:46Analysis incomplete: physical or joined line exceeds character limit
- No broad tool permissions
- 2 dangerous shell commandsin 1 file: bench/Dockerfile:5
- 128 network referencesin 27 files: README.md:1 README.kr.md:1 tests/smoke.py:5 and 24 more
- No hidden or obfuscated text
- No instruction overrides
- 15 executable scriptsin 15 files: bench/Dockerfile:1 bench/bench.py:1 bench/test_bench.py:1 and 12 more
- 26 references to secretsin 9 files: setup/setup.sh:3 bench/bench.py:23 gateway/gateway.py:19 and 6 more
- No requests to vote in Hot
Show all 171 signals by file
.env.example
- Access to secretsline 1
[Credential-related source omitted]
.gitignore
- Access to secretsline 1
[Credential-related source omitted]
LICENSE
README.kr.md
- Network accessline 1
[](README.md) - Network accessline 2
[](README.kr.md) - Network accessline 10
[](LICENSE) - Network accessline 11
[](CHANGELOG.md) - Network accessline 12
[](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml) - Network accessline 13
[](#만든-것들에-대한-감사) - Network accessline 22
[Muse](https://muse.ai)는 Meta의 개인 AI 에이전트입니다. 목표를 맡기면 알아서 끌고 갑니다. 메일을 정리하고, - Network accessline 29
문 하나는 [Muse Gadgets](https://gadgets.muse.ai)가 열었습니다. ESP32나 라즈베리 파이로 가젯을 만들면, Muse는 내 방에서 - Network accessline 45
Muse가 펌웨어를 쓰고, 작업대에서 ESP-IDF로 빌드하고, USB에 꽂힌 ESP32-S3에 굽고, 부팅 로그를 읽고, 깨진 곳을 고칩니다. 마지막으로 Muse 앱에서 페어링만 하면 됩니다. *(이 과정은 이 스킬 위에 얹는 또 하나의 스킬, [Muse Gadget Forge](https://github.com/Toddoward/muse-gadget-forge)가 맡습니다.)* - Network accessline 47
[Muse Gadget Forge](https://github.com/Toddoward/muse-gadget-forge)가 맡습니다.)* - Network accessline 70
Docker(Windows·macOS는 Docker Desktop), 무료 [Tailscale](https://tailscale.com) 계정, 그리고 Muse가 있으면 됩니다. 10분 정도 걸립니다. - Network accessline 77
git clone https://github.com/Toddoward/muse-local-gateway && cd muse-local-gateway - Network accessline 129
- **[Muse](https://muse.ai)**, **[Muse Gadgets](https://github.com/facebookincubator/muse-gadget-sdk)** (Meta) — 에이전트와 Secure VM, - Network accessline 130
그리고 이 프로젝트가 나란히 서고 싶은 오픈 하드웨어 SDK. - **[Tailscale](https://tailscale.com)** — 사설 네트워크, `tailscale serve`, 그리고 진짜 잠금을 맡는 ACL. - **[Docker](https://www.docker.com)**, **[Squid](https://www.squid-cache.org)** 프록시 (Canonical의 [`ubuntu/squid`](h - Network accessline 131
- **[Tailscale](https://tailscale.com)** — 사설 네트워크, `tailscale serve`, 그리고 진짜 잠금을 맡는 ACL. - Network accessline 132
- **[Docker](https://www.docker.com)**, **[Squid](https://www.squid-cache.org)** 프록시 (Canonical의 [`ubuntu/squid`](https://hub.docker.com/r/ubuntu/squid) 이미지) — 울타리. - Network accessline 133
- **[usbipd-win](https://github.com/dorssel/usbipd-win)** (Frans van Dorsselaer) — Windows에서 USB 보드를 넘겨주는 다리. - Network accessline 134
- [**ESP-IDF**](https://github.com/espressif/esp-idf)와 **esptool** (Espressif) — 작업대가 가장 아끼는 도구. - Network accessline 136
Muse Local Gateway는 **비공식 커뮤니티 프로젝트**이며, Meta가 만들거나 보증하거나 지원하지 않습니다. "Muse"는 Meta의 이름이고, 무엇과 함께 동작하는지 밝히기 위해서만 씁니다. 내 컴퓨터에서 Muse에게 시킨 일의 책임은 사용자에게 있습니다 — [Muse 약관](https://muse.ai/terms)을 확인하세요. - Network accessline 138
[Muse 약관](https://muse.ai/terms)을 확인하세요.
README.md
- Network accessline 1
[](README.md) - Network accessline 2
[](README.kr.md) - Network accessline 10
[](LICENSE) - Network accessline 11
[](CHANGELOG.md) - Network accessline 12
[](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml) - Network accessline 13
[](#credits) - Network accessline 22
[Muse](https://muse.ai) is Meta's personal AI agent. You give it a goal and it carries it — sorting - Network accessline 29
[Muse Gadgets](https://gadgets.muse.ai) opened one door. Build a gadget from an ESP32 or a - Network accessline 47
Muse writes the firmware, builds it with ESP-IDF on the workbench, flashes the ESP32-S3 on your USB port, reads its boot log, and fixes what broke. Then you pair it in the Muse app. *(That last loop is [Muse Gadget Forge](https://github.com - Network accessline 49
loop is [Muse Gadget Forge](https://github.com/Toddoward/muse-gadget-forge), a skill on top of this one.)* - Network accessline 72
You'll need Docker (Docker Desktop on Windows and macOS), a free [Tailscale](https://tailscale.com) - Network accessline 80
git clone https://github.com/Toddoward/muse-local-gateway && cd muse-local-gateway - Network accessline 132
- **[Muse](https://muse.ai)** and **[Muse Gadgets](https://github.com/facebookincubator/muse-gadget-sdk)** by Meta — - Network accessline 133
the agent, its Secure VM, and the open hardware SDK this project is meant to sit beside. - **[Tailscale](https://tailscale.com)** — the private network, `tailscale serve`, and the ACLs that do the real locking. - **[Docker](https://www.dock - Network accessline 134
- **[Tailscale](https://tailscale.com)** — the private network, `tailscale serve`, and the ACLs that do the real locking. - Network accessline 135
- **[Docker](https://www.docker.com)** and the **[Squid](https://www.squid-cache.org)** proxy - Network accessline 136
([`ubuntu/squid`](https://hub.docker.com/r/ubuntu/squid) image by Canonical) — the fence. - Network accessline 137
- **[usbipd-win](https://github.com/dorssel/usbipd-win)** by Frans van Dorsselaer — USB boards on Windows. - Network accessline 138
- **[ESP-IDF](https://github.com/espressif/esp-idf)** and **esptool** by Espressif — the workbench's favorite tools. - Network accessline 140
Muse Local Gateway is an **unofficial community project**, not made, endorsed, or supported by Meta. "Muse" is Meta's name, used here only to say what this works with. You stay responsible for what you ask Muse to do on your machine — see t - Network accessline 142
ask Muse to do on your machine — see the [Muse Terms](https://muse.ai/terms).
SECURITY.kr.md
SECURITY.md
SKILL.md
- Network accessline 8
Community skill, not an official Muse feature. Source and setup: https://github.com/Toddoward/muse-local-gateway
bench/Dockerfile
- Executable scriptline 1
Executable file - Network accessline 4
FROM python:3.12-slim RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl git procps libusb-1.0-0 \ - Dangerous shell operationline 5
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl git procps libusb-1.0-0 && rm -rf /var/lib/apt/lists/* - Network accessline 5
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl git procps libusb-1.0-0 - Network accessline 6
&& apt-get install -y --no-install-recommends ca-certificates curl git procps libusb-1.0-0 \ - Dangerous shell operationline 7
&& rm -rf /var/lib/apt/lists/*
bench/bench.py
- Executable scriptline 1
Executable file - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted]
bench/test_bench.py
- Executable scriptline 1
Executable file
bin/gateway-check.sh
bin/gateway-exec.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 13
PROXY="${HTTPS_PROXY%:*}:3130" BASE="http://$TARGET" - Network accessline 14
BASE="http://$TARGET" - Network accessline 16
payload=$(python3 -c 'import json,sys; print(json.dumps({"cmd": sys.argv[1], "cwd": sys.argv[2], "timeout": int(sys.argv[3]), "wait": 50}))' "$CMD" "$CWD" "$TIMEOUT") resp=$(curl --proxy "$PROXY" --fail-with-body -sS -m 90 \ - Network accessline 17
resp=$(curl --proxy "$PROXY" --fail-with-body -sS -m 90 \ - Network accessline 18
-X POST -H 'Content-Type: application/json' -d "$payload" "$BASE/exec") - Network accessline 23
while [ "$status" = "running" ]; do sleep 10 resp=$(curl --proxy "$PROXY" --fail-with-body -sS -m 60 "$BASE/exec/$id") - Network accessline 24
sleep 10 resp=$(curl --proxy "$PROXY" --fail-with-body -sS -m 60 "$BASE/exec/$id") status="$(get status)" - Network accessline 25
resp=$(curl --proxy "$PROXY" --fail-with-body -sS -m 60 "$BASE/exec/$id")
bin/gateway-put.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 12
PROXY="${HTTPS_PROXY%:*}:3130" curl --proxy "$PROXY" --fail-with-body -sS -m 120 \ - Network accessline 13
curl --proxy "$PROXY" --fail-with-body -sS -m 120 \ - Network accessline 14
-X PUT --data-binary "@$SRC" \ "http://$TARGET/files/$DEST" echo - Network accessline 15
"http://$TARGET/files/$DEST"
compose.yaml
- Network accessline 27
networks: [bench] # internal only: no route to host, LAN, or internet environment: HTTP_PROXY: http://egress:3128 - Network accessline 28
environment: HTTP_PROXY: http://egress:3128 HTTPS_PROXY: http://egress:3128 - Network accessline 29
HTTP_PROXY: http://egress:3128 - Network accessline 30
HTTPS_PROXY: http://egress:3128 - Network accessline 31
http_proxy: http://egress:3128 - Network accessline 32
https_proxy: http://egress:3128 - Access to secretsline 71
[Credential-related source omitted]
direct/run.sh
- Executable scriptline 1
#!/usr/bin/env bash
docs/direct.kr.md
docs/direct.md
docs/media/hero-en-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520" role="img" aria-label="Muse reaches from its cloud computer to a workbench on your computer, where it can build its own gadget">
docs/media/hero-en-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520" role="img" aria-label="Muse reaches from its cloud computer to a workbench on your computer, where it can build its own gadget">
docs/media/hero-kr-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520" role="img" aria-label="Muse reaches from its cloud computer to a workbench on your computer, where it can build its own gadget">
docs/media/hero-kr-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520" role="img" aria-label="Muse reaches from its cloud computer to a workbench on your computer, where it can build its own gadget">
docs/media/logo.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 293.4 312.8" width="293" height="313" role="img" aria-label="Muse Local Gateway logo"><g><circle cx="68.61" cy="252.34" r="18.69" fill="#0C4FB2"/><circle cx="69.44" cy="252.53" r="18.69"
docs/media/make_hero.py
- Executable scriptline 1
Executable file - Network accessline 123
f'<path class="a" d="M{1094 + r * .2:.1f} {353 - r} A{r} {r} 0 0 1 {1094 + r * .2:.1f} {353 + r}" fill="none" stroke="{c["acc"]}" ' f'stroke-width="2" stroke-linecap="round" style="animation-name:wave;animation-delay:{d}s"/>' for r, - Network accessline 124
f'stroke-width="2" stroke-linecap="round" style="animation-name:wave;animation-delay:{d}s"/>' for r, d in ((7, 0), (13, .12), (19, .24))) return f'''<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520 - Network accessline 125
return f'''<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 520" width="1200" height="520" role="img" aria-label="Muse reaches from its cloud computer to a workbench on your computer, where it can build its own gadget">
docs/media/make_logo.py
- Executable scriptline 1
Executable file - Network accessline 116
p = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logo.svg") open(p, "w", encoding="utf-8", newline="\n").write( f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {w:.1f} {h:.1f}" width="{w:.0f}" height="{h:.0f} - Network accessline 117
open(p, "w", encoding="utf-8", newline="\n").write( f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {w:.1f} {h:.1f}" width="{w:.0f}" height="{h:.0f}" ' f'role="img" aria-label="Muse Local Gateway logo">{body}</svg>\n' - Network accessline 118
f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {w:.1f} {h:.1f}" width="{w:.0f}" height="{h:.0f}" '
docs/usb-serial.kr.md
- Network accessline 1
[](usb-serial.md) - Network accessline 2
[](usb-serial.kr.md) - Network accessline 18
Docker Desktop은 Windows의 USB 장치를 보지 못합니다. 설치 스크립트는 [usbipd-win](https://github.com/dorssel/usbipd-win)
docs/usb-serial.md
- Network accessline 1
[](usb-serial.md) - Network accessline 2
[](usb-serial.kr.md) - Network accessline 20
Docker Desktop can't see Windows USB devices. Setup uses [usbipd-win](https://github.com/dorssel/usbipd-win)
egress/squid.conf
- Access to secretsline 10
[Credential-related source omitted]
gateway/gateway.py
- Executable scriptline 1
Executable file - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted]
gateway/test_gateway.py
- Executable scriptline 1
Executable file - Network accessline 2
import http.client - Network accessline 38
def put(path, body=b"hello", headers=None): c = http.client.HTTPConnection("127.0.0.1", srv.server_address[1], timeout=5) - Network accessline 39
c = http.client.HTTPConnection("127.0.0.1", srv.server_address[1], timeout=5)
setup/setup.ps1
- Executable scriptline 1
Executable file - Access to secretsline 3
[Credential-related source omitted] - Network accessline 8
function Die($m) { Write-Host "ERROR: $m" -ForegroundColor Red; exit 1 } if (-not (Get-Command docker -ErrorAction SilentlyContinue)) { Die 'Docker Desktop is required: https://www.docker.com/products/docker-desktop/' } - Network accessline 9
if (-not (Get-Command docker -ErrorAction SilentlyContinue)) { Die 'Docker Desktop is required: https://www.docker.com/products/docker-desktop/' } - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Network accessline 79
---------------------------------------------------------------------- Install the muse-local-gateway skill from https://github.com/Toddoward/muse-local-gateway (SKILL.md). - Network accessline 80
Install the muse-local-gateway skill from https://github.com/Toddoward/muse-local-gateway (SKILL.md). My gateway: files http://${ip}:8730, shell http://${ip}:8731 - Network accessline 81
https://github.com/Toddoward/muse-local-gateway (SKILL.md). - Network accessline 82
My gateway: files http://${ip}:8730, shell http://${ip}:8731
setup/setup.sh
- Executable scriptline 1
#!/usr/bin/env bash - Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 4
[Credential-related source omitted] - Network accessline 8
die() { echo "ERROR: $*" >&2; exit 1; } command -v docker >/dev/null || die "Docker is required: https://docs.docker.com/get-docker/" - Network accessline 9
command -v docker >/dev/null || die "Docker is required: https://docs.docker.com/get-docker/" - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 72
---------------------------------------------------------------------- Install the muse-local-gateway skill from https://github.com/Toddoward/muse-local-gateway (SKILL.md). - Network accessline 73
Install the muse-local-gateway skill from https://github.com/Toddoward/muse-local-gateway (SKILL.md). My gateway: files http://$ip:8730, shell http://$ip:8731 - Network accessline 74
https://github.com/Toddoward/muse-local-gateway (SKILL.md). - Network accessline 75
My gateway: files http://$ip:8730, shell http://$ip:8731
setup/usb-attach.ps1
- Executable scriptline 1
Executable file
tests/compose.smoke.yaml
- Network accessline 1
# Smoke-test override: the "tailscale" service becomes a plain curl client. Requests from it look
tests/smoke.py
- Executable scriptline 1
Executable file - Network accessline 5
Brings the stack up under project "mlg-smoke" with tests/compose.smoke.yaml (curl stands in for - Access to secretsline 17
[Credential-related source omitted] - Network accessline 33
def run(cmd, timeout=60): out = curl("-X", "POST", "-H", "Content-Type: application/json", "http://bench:8731/exec", - Network accessline 34
out = curl("-X", "POST", "-H", "Content-Type: application/json", "http://bench:8731/exec", - Network accessline 48
dc("up", "-d", "--build") for _ in range(60): if '"ok": true' in curl("http://gateway:8730/health") and '"ok": true' in curl("http://bench:8731/health"): - Network accessline 49
for _ in range(60): if '"ok": true' in curl("http://gateway:8730/health") and '"ok": true' in curl("http://bench:8731/health"): break - Network accessline 50
if '"ok": true' in curl("http://gateway:8730/health") and '"ok": true' in curl("http://bench:8731/health"): - Network accessline 55
r = curl("-X", "PUT", "--data-binary", "hello from smoke", "-w", " %{http_code}", "http://gateway:8730/files/smoke/hello.txt") - Network accessline 56
check("PUT file -> 201", r.endswith(" 201"), r) r = curl("-X", "PUT", "--data-binary", "x", "-w", " %{http_code}", "--path-as-is", "http://gateway:8730/files/../escape.txt") check("PUT outside the share -> 400/404", r.endswith(" 400") or r. - Network accessline 57
r = curl("-X", "PUT", "--data-binary", "x", "-w", " %{http_code}", "--path-as-is", "http://gateway:8730/files/../escape.txt") - Network accessline 69
v = run("curl -sS -m 8 --noproxy '*' -o /dev/null -w '%{http_code}' https://pypi.org/simple/ || echo blocked") - Network accessline 70
check("no direct internet (internal network)", "blocked" in v.get("stdout", ""), v) v = run("curl -sS -m 20 -o /dev/null -w '%{http_code}' https://pypi.org/simple/") check("internet through the proxy", v.get("stdout") == "200", v) - Network accessline 71
v = run("curl -sS -m 20 -o /dev/null -w '%{http_code}' https://pypi.org/simple/") - Network accessline 72
check("internet through the proxy", v.get("stdout") == "200", v) for target in ("http://192.168.0.1/", "http://host.docker.internal/", "http://100.100.100.100/"): v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' {target}") - Network accessline 73
for target in ("http://192.168.0.1/", "http://host.docker.internal/", "http://100.100.100.100/"): v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' {target}") check(f"proxy refuses {target}", v.get("stdout") == "403", v) - Network accessline 74
v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' {target}") - Network accessline 75
check(f"proxy refuses {target}", v.get("stdout") == "403", v) v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' http://{LAN_NO}/") check("lan-allow: unlisted device refused", v.get("stdout") == "403", v) - Network accessline 76
v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' http://{LAN_NO}/") - Network accessline 77
check("lan-allow: unlisted device refused", v.get("stdout") == "403", v) v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' http://{LAN_OK}/") check("lan-allow: listed device passes the proxy", v.get("stdout") not in ("403", ""), v) - Network accessline 78
v = run(f"curl -sS -m 8 -o /dev/null -w '%{{http_code}}' http://{LAN_OK}/")
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 2 facts
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentiondocs/media/make_hero.py:125High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentiondocs/media/make_logo.py:118High confidence
Signal confidence: 152 facts
- Network access in prose of documentationREADME.kr.md:1Low confidence
- Network access in prose of documentationREADME.kr.md:2Low confidence
- Network access in prose of documentationREADME.kr.md:10Low confidence
- Network access in prose of documentationREADME.kr.md:11Low confidence
- Network access in prose of documentationREADME.kr.md:12Low confidence
- Network access in prose of documentationREADME.kr.md:13Low confidence
- Network access in prose of documentationREADME.kr.md:22Low confidence
- Network access in prose of documentationREADME.kr.md:29Low confidence
- Network access in prose of documentationREADME.kr.md:45Low confidence
- Network access in prose of documentationREADME.kr.md:47Low confidence
- Network access in prose of documentationREADME.kr.md:70Low confidence
- Network access in code of documentationREADME.kr.md:77Low confidence
- Network access in prose of documentationREADME.kr.md:129Low confidence
- Network access in prose of documentationREADME.kr.md:130Low confidence
- Network access in prose of documentationREADME.kr.md:131Low confidence
- Network access in prose of documentationREADME.kr.md:132Low confidence
- Network access in prose of documentationREADME.kr.md:133Low confidence
- Network access in prose of documentationREADME.kr.md:134Low confidence
- Network access in prose of documentationREADME.kr.md:136Low confidence
- Network access in prose of documentationREADME.kr.md:138Low confidence
- Network access in prose of documentationREADME.md:1Low confidence
- Network access in prose of documentationREADME.md:2Low confidence
- Network access in prose of documentationREADME.md:10Low confidence
- Network access in prose of documentationREADME.md:11Low confidence
- Network access in prose of documentationREADME.md:12Low confidence
- Network access in prose of documentationREADME.md:13Low confidence
- Network access in prose of documentationREADME.md:22Low confidence
- Network access in prose of documentationREADME.md:29Low confidence
- Network access in prose of documentationREADME.md:47Low confidence
- Network access in prose of documentationREADME.md:49Low confidence
- Network access in prose of documentationREADME.md:72Low confidence
- Network access in code of documentationREADME.md:80Low confidence
- Network access in prose of documentationREADME.md:132Low confidence
- Network access in prose of documentationREADME.md:133Low confidence
- Network access in prose of documentationREADME.md:134Low confidence
- Network access in prose of documentationREADME.md:135Low confidence
- Network access in prose of documentationREADME.md:136Low confidence
- Network access in prose of documentationREADME.md:137Low confidence
- Network access in prose of documentationREADME.md:138Low confidence
- Network access in prose of documentationREADME.md:140Low confidence
- Network access in prose of documentationREADME.md:142Low confidence
- Network access in prose of documentationSECURITY.kr.md:1Low confidence
- Network access in prose of documentationSECURITY.kr.md:2Low confidence
- Network access in prose of documentationSECURITY.md:1Low confidence
- Network access in prose of documentationSECURITY.md:2Low confidence
- Network access in prose of the SKILL.mdSKILL.md:8Low confidence
- Executable script in a comment of a file that runsbench/Dockerfile:1Low confidence
- Network access in code of a file that runsbench/Dockerfile:4High confidence
- Dangerous shell operation in code of a file that runsbench/Dockerfile:5High confidence
- Network access in code of a file that runsbench/Dockerfile:5High confidence
and 102 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.