A lightweight VS Code extension for editing CircuitPython files wirelessly through Web Workflow.
CircuitPython Remote 0.0.4 is available for early testing on macOS.
Back up important files on the board before testing remote write, sync, and delete operations.
CircuitPython Remote requires a board and CircuitPython build that support Web Workflow. It does not work with every CircuitPython board.
The current beta has been tested with:
- ESP32-S3-DevKitC-1-N8R8
- CircuitPython 10.2.1
- Web Workflow API v4
- VS Code on macOS
Other boards, operating systems, firmware versions, and Web Workflow API versions have not yet been verified. Test reports are welcome.
- Discover
_circuitpython._tcp.localdevices over mDNS, including on Macs with multiple active network interfaces. - Connect directly by IPv4 address when mDNS is unavailable.
- Browse and refresh remote files and directories through the Web Workflow
/fs/API. - Edit, create, rename, delete, upload, and download individual files; create and rename directories and delete them when empty.
- Protect known binary formats from accidental text writes while preserving binary upload, download, and project sync.
- Create a local project from a device and remember its device association.
- Sync selected new, modified, and locally deleted files from a local project to the linked device, with text diffs and confirmation before overwrites or deletions.
- Show program output wirelessly and request Reload and Run.
- Store Web Workflow passwords in VS Code Secret Storage.
- Retry transient read failures without retrying write or delete operations.
Back up the board, then install the latest stable CircuitPython release for your exact board from CircuitPython Downloads. For example, this extension is currently tested with CircuitPython 10.2.1; use a newer stable release when one is available for your board. Older firmware may contain Web Workflow issues already fixed in current releases.
Create or update settings.toml in the root of CIRCUITPY:
CIRCUITPY_WIFI_SSID="your-wifi"
CIRCUITPY_WIFI_PASSWORD="your-wifi-password"
CIRCUITPY_WEB_API_PASSWORD="choose-a-separate-password"CIRCUITPY_WEB_API_PASSWORD is required. Do not reuse an important password:
Web Workflow uses unencrypted HTTP on the local network. Port 80 is the
default, so CIRCUITPY_WEB_API_PORT normally does not need to be set. Keep
settings.toml private and do not commit it to a public repository.
See the official CircuitPython environment variable reference for optional settings.
On native USB boards such as ESP32-S2 and ESP32-S3, Web Workflow cannot safely
write while the computer owns the CIRCUITPY USB drive.
For a temporary setup, eject CIRCUITPY in the operating system. For a
persistent wireless workflow, create boot.py in the root of CIRCUITPY:
import storage
storage.disable_usb_drive()Save all files and safely eject the drive before resetting. This intentionally
hides CIRCUITPY from the computer after the next hard reset. Know how to enter
safe mode or use the serial console before enabling it; see the official
USB customization guide
for recovery instructions.
Press the reset button or power-cycle the board after changing settings.toml
or boot.py. A soft reload is not sufficient for boot.py USB changes.
Any router or access point mode is fine as long as the computer and board are on the same local network and can communicate directly. Upstream Internet access is optional.
Make sure the network allows local devices to communicate; some guest Wi-Fi networks block device-to-device traffic. If you often connect by IP address, you can reserve a stable address for the board in your router. Then verify Web Workflow using the board's actual address:
curl --max-time 5 http://BOARD_IP/cp/version.jsonReplace BOARD_IP with the address shown by your router. A JSON response
confirms that the HTTP service is reachable. Ping or mDNS discovery alone does
not prove that Web Workflow is running.
- Install CircuitPython Remote from the VS Code Extensions view, or install the beta VSIX from the GitHub release.
- Open Explorer and find CircuitPython Remote.
- Click the plug icon and select a discovered board.
- If discovery does not find it, choose Connect by IP Address and enter an address shown for the board by your router.
- Enter the board's
CIRCUITPY_WEB_API_PASSWORD. - Expand the remote tree and use Refresh to reload it.
Use this workflow for quick edits and direct file management on the device.
Selecting a text file opens an editor backed directly by the board. Saving
writes the complete file to the device. Binary files such as .mpy, firmware,
images, audio, fonts, and archives remain visible but are not opened as text.
Use the tree toolbar or context menus to create files and folders, upload local files, rename items, and run the program. Right-click a remote file to download or delete it. Remote directory deletion is limited to empty directories.
- Wait a few seconds, then run Developer: Reload Window or close and reopen VS Code to restart mDNS discovery.
- Use Connect by IP Address; a working IP connection does not depend on mDNS.
- Confirm the board and computer are on the same local network and that the network allows them to communicate directly.
- Test
/cp/version.jsonwithcurl. If ping works but HTTP is refused or times out, hard reset the board and checksettings.toml. - Open View → Output → CircuitPython Remote for discovery, retry, and HTTP error details.
If browsing works but writes report a read-only filesystem, eject the
CIRCUITPY drive or configure storage.disable_usb_drive() as described above.
- Connect to the device in the remote tree.
- Open the Command Palette (
Cmd+Shift+Pon macOS orCtrl+Shift+Pon Windows/Linux), then run CircuitPython Remote: Create Local Project from Device, or use its tree toolbar icon. - Select an empty local directory.
- Open the downloaded folder when prompted.
The extension links that exact workspace root to the source device. The linked project and device appear in the VS Code status bar. Existing local projects can be associated using CircuitPython Remote: Link Workspace to Device.
- Edit and save files in the linked local workspace.
- Click the linked-project status item and choose Sync Local Project to Device, or run the same command from the Command Palette.
- Review the new, modified, and remote-only files found by the comparison.
- Select exactly which changes to apply, optionally review text diffs, and confirm the operation.
settings.toml and file deletions are not selected by default. Sync can create
needed remote directories, but it does not delete directories; locally deleted
folders may leave empty directories on the board.
Sync is intentionally one-way from the local workspace to the device. Changes made directly on the board after creating the local project are not merged back automatically and may be overwritten if selected during Sync. Review diffs and keep a backup for important projects.
Use CircuitPython Remote: Show Output to open the wireless program output channel. Reload and Run connects the same channel, interrupts the current program, and requests a soft reload. This output view is not an interactive REPL.
Found a problem or have an idea?
- Open this repository in VS Code.
- Run
npm install. - Press
F5and choose Run CircuitPython Remote. - Use the extension in the Extension Development Host window.
- Local project sync is one-way and does not perform three-way conflict detection or merge remote changes back into the local workspace.
- Sync does not delete remote directories or provide atomic recovery from an interrupted write operation.
- The wireless output channel is not an interactive REPL.
- Serial access, firmware flashing, project templates, and AI features are outside the current scope.
- Testing is currently limited to the hardware and software listed under Compatibility.
See CHANGELOG.md for release history.