Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

PacketScope

PacketScope is a terminal-based live packet monitor for MeshCore, designed especially for Linux devices such as the ClockworkPi uConsole and Raspberry Pi.

It reads live packet activity from the systemd journal produced by meshcore-packet-capture and presents it in a cleaner, interactive TUI with packet statistics, signal information, MQTT delivery health, filtering, search, pause/resume, logging, Unicode, and emoji support.

Important: PacketScope is a viewer and diagnostics interface. It does not connect directly to a MeshCore radio and it does not replace meshcore-packet-capture.

Architecture

MeshCore Companion Radio
|
v
meshcore-packet-capture
|
+---- MQTT broker(s)
|
v
systemd journal
|
v
PacketScope

PacketScope follows the journal for:

meshcore-packet-capture.service

Equivalent raw command:

journalctl -u meshcore-packet-capture -f

Requirements

PacketScope currently targets Linux systems using systemd.

Required:

  • Linux with systemd
  • A working meshcore-packet-capture installation
  • meshcore-packet-capture.service running
  • Go installed to build PacketScope
  • Permission to read the systemd journal
  • A UTF-8 capable terminal

Recommended platform:

  • Debian / Raspberry Pi OS
  • ARM64 or AMD64
  • ClockworkPi uConsole or Raspberry Pi

Required dependency: meshcore-packet-capture

PacketScope depends on the separate meshcore-packet-capture project:

https://github.com/agessaman/meshcore-packet-capture

meshcore-packet-capture is designed for MeshCore Companion radios and supports BLE, serial, and TCP connections. It can also publish captured packets to one or more MQTT brokers.

For repeaters and RoomServers, the upstream project recommends meshcoretomqtt instead.

Install meshcore-packet-capture as a managed Linux service

The upstream project currently provides a managed-service installer:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/agessaman/meshcore-packet-capture/main/install.sh)"

Follow the upstream setup instructions to configure the Companion radio connection and optional MQTT brokers.

After installation, verify:

systemctl status meshcore-packet-capture --no-pager -l

You should see:

Active: active (running)

Then confirm packets are being logged:

sudo journalctl -u meshcore-packet-capture -f

If packet lines are appearing there, PacketScope has a source to monitor.

Install PacketScope

Clone the repository:

git clone git@github.com:wykweb/PacketScope.git
cd PacketScope

Build:

go mod download
go test ./...
go build -o packetscope ./cmd/packetscope

Run:

./packetscope

If your user cannot read the systemd journal:

sudo -E ./packetscope

A better permanent solution is to grant your user journal access.

Allow journal access without sudo

Check your groups:

groups

If systemd-journal is not listed:

sudo usermod -aG systemd-journal $USER

Then log out and back in, or reboot.

Test:

journalctl -u meshcore-packet-capture -n 5 --no-pager

If that works without sudo, PacketScope can also run without sudo.

UTF-8 and emoji support

PacketScope uses Unicode and emoji icons.

If your desktop terminal session has an incorrect locale, launch PacketScope with a clean UTF-8 environment:

env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 \
lxterminal --no-remote -e /home/dragon/start-packetscope.sh

Example launcher:

cat >~/start-packetscope.sh <<'EOF'#!/bin/bashunset LC_ALLexport LANG=en_CA.UTF-8export LC_CTYPE=en_CA.UTF-8cd /home/dragon/packetscopeexec ./packetscopeEOF
chmod +x ~/start-packetscope.sh

Desktop shortcut

Create:

cat >~/Desktop/PacketScope.desktop <<'EOF'[Desktop Entry]Version=1.0Type=ApplicationName=PacketScopeComment=MeshCore Packet Capture MonitorExec=env -u LC_ALL LANG=en_CA.UTF-8 LC_CTYPE=en_CA.UTF-8 lxterminal --no-remote -e /home/dragon/start-packetscope.shIcon=utilities-terminalTerminal=falseCategories=Network;EOF
chmod +x ~/Desktop/PacketScope.desktop

If your desktop environment asks whether to trust or allow the launcher, choose Allow Launching.

What PacketScope displays

PacketScope parses packet-capture journal lines such as:

Captured packet #3585: F type 6, 102 bytes, SNR: 11.25, RSSI: -36, hash: 57A146E2A50D8E9B (MQTT: 5/5)

The UI can display:

  • packet number
  • route value (F / D)
  • MeshCore packet type
  • packet size
  • RSSI
  • SNR
  • packet hash
  • MQTT delivery result
  • live packet rate
  • packet history
  • signal history
  • pause/resume
  • filters
  • search
  • save-to-log

MQTT status

A value such as:

MQTT: 5/5

comes from meshcore-packet-capture.

PacketScope does not independently connect to those five brokers. It displays the delivery result reported by the capture service.

The current journal format provides aggregate delivery status only. For example, 4/5 tells PacketScope that one delivery failed, but it does not identify which broker failed unless the upstream capture service logs per-broker details.

Keyboard controls

Current builds may include controls such as:

P Pause / resume
C Clear current view
F Filter
S Search
Q Quit

Refer to the footer shown inside PacketScope for the controls supported by the installed version.

Troubleshooting

PacketScope opens but no packets appear

First test the source directly:

journalctl -u meshcore-packet-capture -f

If no packet events appear there, troubleshoot meshcore-packet-capture first.

Permission denied reading the journal

Use:

sudo -E ./packetscope

or add your user to:

systemd-journal

as described above.

Emoji appear as strange characters

Check:

locale charmap

It should return:

UTF-8

If not, use the UTF-8 launcher described above.

Service status

systemctl status meshcore-packet-capture --no-pager -l

Recent raw packets

journalctl -u meshcore-packet-capture -n 50 --no-pager

Development

Format:

gofmt -w .

Test:

go test ./...

Build:

go build -o packetscope ./cmd/packetscope

Commit and push:

git add .
git commit -m "Update PacketScope"
git push origin main

Relationship to MeshScope

PacketScope and MeshScope are separate applications.

MeshScope

  • Derived from corescope-tui
  • Uses the CoreScope REST/WebSocket backend
  • Commonly connects to https://live.meshcore.ca
  • Focuses on nodes, observers, channels, maps, analytics, and messages

PacketScope

  • Independent project
  • Reads the local meshcore-packet-capture journal
  • Focuses on raw packet activity, RF signal metrics, packet types, hashes, MQTT delivery, filtering, and diagnostics

They complement each other but do not depend on each other.

Credits

PacketScope relies on the excellent meshcore-packet-capture project for radio capture and MQTT integration:

https://github.com/agessaman/meshcore-packet-capture

PacketScope is a separate project and is not part of or endorsed by the upstream meshcore-packet-capture project.

About

MeshCore PacketScope for ClockWorkPi uConsole

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages