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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit c9ec4916ba9e0f72b5bb30213174b5dc66b5f8fc

11GitHub stars
Not availablestars in 7 days
1skill in this repository
16commits in 30 days

Heat

Insufficient history

Not 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

Nov 2, 2026Nov 2, 202611

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 tokens

Always available to the agent

SKILL.md

1,165 tokens

When the skill is activated

Reference documents

9,181 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. What the user runs
  2. Procedure
  3. API (for tools other than bin/)
  4. This VM's networking
  5. Rules

Scripts executed separately

  • bench/Dockerfile
  • bench/bench.py
  • bench/test_bench.py
  • bin/gateway-check.sh
  • bin/gateway-exec.sh
  • bin/gateway-put.sh
  • direct/run.sh
  • docs/media/make_hero.py
  • docs/media/make_logo.py
  • gateway/gateway.py
  • gateway/test_gateway.py
  • setup/setup.ps1
  • setup/setup.sh
  • setup/usb-attach.ps1
  • tests/smoke.py

Files

  • .env.exampleasset525 bytes
  • .github/workflows/ci.ymlasset480 bytes
  • .gitignoreasset78 bytes
  • CHANGELOG.mddoc1,309 bytes
  • LICENSEasset11,358 bytes
  • README.kr.mddoc8,611 bytes
  • README.mddoc7,318 bytes
  • SECURITY.kr.mddoc4,267 bytes
  • SECURITY.mddoc3,621 bytes
  • SKILL.mdcore4,286 bytes
  • SKILL.mdcore4,286 bytes
  • SKILL.mdcore4,286 bytes
  • bench/Dockerfileruns463 bytes
  • bench/bench.pyruns7,437 bytes
  • bench/test_bench.pyruns1,570 bytes
  • bin/gateway-check.shruns691 bytes
  • bin/gateway-exec.shruns1,526 bytes
  • bin/gateway-put.shruns564 bytes
  • compose.open.yamlasset345 bytes
  • compose.usb.yamlasset481 bytes
  • compose.yamlasset3,211 bytes
  • direct/run.shruns1,096 bytes
  • docs/direct.kr.mddoc1,466 bytes
  • docs/direct.mddoc1,225 bytes
  • docs/media/hero-en-dark.svgasset65,734 bytes
  • docs/media/hero-en-light.svgasset65,737 bytes
  • docs/media/hero-kr-dark.svgasset65,805 bytes
  • docs/media/hero-kr-light.svgasset65,808 bytes
  • docs/media/logo.svgasset52,749 bytes
  • docs/media/make_hero.pyruns14,036 bytes
  • docs/media/make_logo.pyruns5,509 bytes
  • docs/usb-serial.kr.mddoc2,877 bytes
  • docs/usb-serial.mddoc2,435 bytes
  • egress/squid.confasset1,270 bytes
  • examples/tailnet-acl.hujsonasset1,164 bytes
  • gateway/gateway.pyruns4,540 bytes
  • gateway/test_gateway.pyruns2,164 bytes
  • serve.jsonasset108 bytes
  • setup/setup.ps1runs5,018 bytes
  • setup/setup.shruns3,200 bytes
  • setup/usb-attach.ps1runs2,009 bytes
  • tests/compose.smoke.yamlasset593 bytes
  • tests/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 GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • docs/media/hero-en-dark.svg:1 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-dark.svg:2 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-dark.svg:46 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-dark.svg:44 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-dark.svg:45 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-light.svg:1 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-light.svg:2 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-light.svg:46 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-light.svg:44 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-en-light.svg:45 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-dark.svg:1 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-dark.svg:2 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-dark.svg:46 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-dark.svg:44 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-dark.svg:45 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-light.svg:1 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-light.svg:2 Analysis incomplete: physical or joined line exceeds character limit
  • docs/media/hero-kr-light.svg:46 Analysis incomplete: physical or joined line exceeds character limit
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

  • Network accessline 2
    Apache License                            Version 2.0, January 2004                         http://www.apache.org/licenses/
  • Network accessline 4
    http://www.apache.org/licenses/
  • Network accessline 196
    http://www.apache.org/licenses/LICENSE-2.0

README.kr.md

  • Network accessline 1
    [![English](https://img.shields.io/badge/lang-English-lightgrey?style=flat-square)](README.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-16161D?style=flat-square)](README.kr.md)
  • Network accessline 10
    [![License](https://img.shields.io/badge/license-Apache--2.0-16161D?style=flat-square)](LICENSE)
  • Network accessline 11
    [![Version](https://img.shields.io/badge/version-0.1.0-16161D?style=flat-square)](CHANGELOG.md)
  • Network accessline 12
    [![CI](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml/badge.svg)](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml)
  • Network accessline 13
    [![Unofficial](https://img.shields.io/badge/Muse-community%20skill-0069D9?style=flat-square)](#만든-것들에-대한-감사)
  • 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
    [![English](https://img.shields.io/badge/lang-English-16161D?style=flat-square)](README.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-lightgrey?style=flat-square)](README.kr.md)
  • Network accessline 10
    [![License](https://img.shields.io/badge/license-Apache--2.0-16161D?style=flat-square)](LICENSE)
  • Network accessline 11
    [![Version](https://img.shields.io/badge/version-0.1.0-16161D?style=flat-square)](CHANGELOG.md)
  • Network accessline 12
    [![CI](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml/badge.svg)](https://github.com/Toddoward/muse-local-gateway/actions/workflows/ci.yml)
  • Network accessline 13
    [![Unofficial](https://img.shields.io/badge/Muse-community%20skill-0069D9?style=flat-square)](#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

  • Network accessline 1
    [![English](https://img.shields.io/badge/lang-English-lightgrey?style=flat-square)](SECURITY.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-111111?style=flat-square)](SECURITY.kr.md)

SECURITY.md

  • Network accessline 1
    [![English](https://img.shields.io/badge/lang-English-111111?style=flat-square)](SECURITY.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-lightgrey?style=flat-square)](SECURITY.kr.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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 14
    PROXY="${HTTPS_PROXY%:*}:3130" RESP=$(curl --proxy "$PROXY" --fail-with-body -sS -m 30 "http://$TARGET/health" 2>&1) || {
  • Network accessline 15
    RESP=$(curl --proxy "$PROXY" --fail-with-body -sS -m 30 "http://$TARGET/health" 2>&1) || {

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

  • Network accessline 1
    [![English](https://img.shields.io/badge/lang-English-lightgrey?style=flat-square)](direct.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-111111?style=flat-square)](direct.kr.md)

docs/direct.md

  • Network accessline 1
    [![English](https://img.shields.io/badge/lang-English-111111?style=flat-square)](direct.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-lightgrey?style=flat-square)](direct.kr.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
    [![English](https://img.shields.io/badge/lang-English-lightgrey?style=flat-square)](usb-serial.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-111111?style=flat-square)](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
    [![English](https://img.shields.io/badge/lang-English-111111?style=flat-square)](usb-serial.md)
  • Network accessline 2
    [![한국어](https://img.shields.io/badge/lang-%ED%95%9C%EA%B5%AD%EC%96%B4-lightgrey?style=flat-square)](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
Signal confidence: 152 facts

and 102 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.