Pinscope on Linux

A Raspberry Pi, a gateway or any Linux device next to your microcontrollers, in the same dashboard: its web pages, logs, system metrics and updates. One command.

With an AI assistant. Copy the instructions and paste them into Claude, Cursor, Copilot or ChatGPT in your project: it adds Pinscope the way this page says, and asks you for the project key instead of writing it into your code. Or give it the link: linux.md.

1. Install

In the dashboard, open your project and the tab Connect a device and copy the project key. Then, on the device:

curl -fsSL https://pinscope.dev/install.sh | sudo sh -s psk_... 80

The last number is the local port to expose; 80 is the default. The installer builds the agent (installing a compiler first on Debian, Ubuntu and Raspberry Pi OS if there is none), installs it as the systemd service pinscope-agent, starts it, and prints the device's address. Run it again to update the agent or change the key; the device keeps its identity. It runs on 64-bit and 32-bit ARM and on x86-64: checked on Debian 13, Ubuntu 24.04 and 32-bit ARM.

The device appears under Devices with its host name. It needs to reach connect.pinscope.dev on TCP port 443, outbound only.

2. Reach the device

Whatever listens on the exposed port is served at the device's own HTTPS address, as for microcontrollers: a local dashboard, Node-RED, Home Assistant, a printer's page. See Reach the device. Up to four ports: PINSCOPE_PORTS=80,1880 in the settings.

3. Logs and metrics

The Logs tab shows what a command of your choice prints, for example the system journal or one service:

PINSCOPE_LOGS=journalctl -f -o cat -u my-service

Reported once a minute, with no setup:

MetricMeaning
heap_freeMemory available to programs
cpu_loadLoad over the last minute, as a share of the cores
chip_temp_cSoC temperature, where the system reports one
disk_free_mb, uptime_sFree space on the root file system, and time since boot

4. Updates

Pinscope delivers the file; a command you choose installs it. Set it in the settings:

PINSCOPE_UPDATE=/usr/local/bin/install-update

Upload any file under Firmware (a package, an archive, a script) and press Update firmware on the device. The agent saves it as /var/lib/pinscope/update.bin and runs the command with its path. An exit status of 0 counts as installed; the agent then restarts. Without PINSCOPE_UPDATE, the device takes no updates.

Settings

In /etc/pinscope-agent.env; after a change, sudo systemctl restart pinscope-agent.

SettingWhat it does
PINSCOPE_KEYThe project key
PINSCOPE_NAMEThe name shown in the dashboard; empty for the host name
PINSCOPE_PORTSLocal ports to expose, comma separated; the first is on the device's address
PINSCOPE_VERSIONThe version shown in the dashboard
PINSCOPE_LOGSA command whose output becomes the device log
PINSCOPE_UPDATEA command run with the path of an uploaded file

The agent keeps its identity in /var/lib/pinscope: a random ID made on first start (the machine ID is not sent) and the credential the server gave it.

If it does not work

journalctl -u pinscope-agent -f
What you seeWhat to check
credentials refusedThe key is not the one in the dashboard, or the plan's number of devices is used up
No online at line, no errorThe device cannot reach connect.pinscope.dev on TCP port 443
The address shows an error pageNothing listens on the exposed port on this device (ss -ltn lists what does)
An update shows an errorThe update command exited with a status other than 0; its output is in the journal