Skip to content

Commit bd18ccf

Browse files
Merge pull request #2 from BeardedTech0o/claude/retheme-nullmesh-rename-ynzplm
Lowercase nullmesh branding, bump to 1.0.11
2 parents d0858f7 + 6359ef2 commit bd18ccf

11 files changed

Lines changed: 50 additions & 50 deletions

File tree

‎BUILD.bat‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@echo off
2-
title Nullmesh Builder
2+
title nullmesh Builder
33
pushd "%~dp0"
44

55
if not exist "package.json" (
@@ -9,7 +9,7 @@ if not exist "package.json" (
99

1010
echo.
1111
echo ===================================
12-
echo Nullmesh - Building installer
12+
echo nullmesh - Building installer
1313
echo ===================================
1414
echo Folder: %CD%
1515
echo.

‎INSTALL.bat‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@echo off
22
echo.
3-
echo Nullmesh - Installing dependencies
3+
echo nullmesh - Installing dependencies
44
echo This only needs to run once.
55
echo.
66

@@ -17,5 +17,5 @@ echo Node.js found. Installing packages...
1717
npm install
1818

1919
echo.
20-
echo Done! Run START.bat to launch Nullmesh.
20+
echo Done! Run START.bat to launch nullmesh.
2121
pause

‎README-BUILD.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Nullmesh — Building the Installer
1+
# nullmesh — Building the Installer
22

33
## To build the Windows installer (.exe)
44

@@ -7,17 +7,17 @@
77
1. Open this folder
88
2. Double-click **BUILD.bat**
99
3. Wait ~2 minutes for dependencies to download
10-
4. The installer appears in the `dist/` folder as `Nullmesh-Setup-1.0.0.exe`
10+
4. The installer appears in the `dist/` folder as `nullmesh-setup-1.0.0.exe`
1111

1212
## Sharing
1313

14-
Send people the single `Nullmesh-Setup-1.0.0.exe` file.
14+
Send people the single `nullmesh-setup-1.0.0.exe` file.
1515
They double-click it, click through the installer, done.
1616
No Node.js, no command line, nothing else needed.
1717

1818
## What the installer includes
1919

20-
- The full Nullmesh app
20+
- The full nullmesh app
2121
- Bundled Node.js runtime (users don't need it installed)
2222
- Creates a Start Menu shortcut and optional Desktop shortcut
2323
- Adds an Add/Remove Programs entry for clean uninstall

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<img src="assets/icon512.png" width="150" />
44

5-
# Nullmesh
5+
# nullmesh
66
### Your Desktop Gateway to the Meshtastic Network
77

88
</div>
@@ -12,7 +12,7 @@
1212
---
1313

1414
## Overview
15-
Nullmesh is a Windows desktop application designed to bridge the gap between your PC and the Meshtastic network. It allows users to connect to Meshtastic nodes over IP, providing an interface for network visualization, mapping, and messaging.
15+
nullmesh is a Windows desktop application designed to bridge the gap between your PC and the Meshtastic network. It allows users to connect to Meshtastic nodes over IP, providing an interface for network visualization, mapping, and messaging.
1616

1717
## Key Features
1818
* **IP Connectivity:** Connect to Meshtastic nodes directly via TCP/IP or Wi-Fi.

‎START.bat‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@echo off
22
echo.
3-
echo Starting Nullmesh...
3+
echo Starting nullmesh...
44
echo Your browser will open automatically.
55
echo Close this window to stop.
66
echo.

‎app.js‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ function connectWS() {
4646
S.ws.onopen = () => {
4747
clearInterval(S.wsTimer);
4848
S.wsTimer = setInterval(() => { try { S.ws.send(JSON.stringify({type:'ping'})); } catch {} }, 20000);
49-
sysMsg('Connected to Nullmesh server');
49+
sysMsg('Connected to nullmesh server');
5050
};
5151
S.ws.onclose = () => { clearInterval(S.wsTimer); sysMsg('Reconnecting...'); setTimeout(connectWS, 2000); };
5252
S.ws.onerror = () => {};
@@ -531,14 +531,14 @@ function renderChannelHeader(){
531531
function renderDMThread(){
532532
renderDMHeader();
533533
const id=S.activeDM;
534-
let title='Nullmesh', sub='Connect to get started';
534+
let title='nullmesh', sub='Connect to get started';
535535
if(id){ const num=parseInt(id.slice(3)); title=S.nodes[num]?.name||numToId(num); sub='No messages — say something!'; }
536536
renderThreadInto('msgFeed', id, title, sub);
537537
}
538538
function renderChannelThread(){
539539
renderChannelHeader();
540540
const id=S.activeChannel;
541-
let title='Nullmesh', sub='Select a channel on the left to see its broadcasts';
541+
let title='nullmesh', sub='Select a channel on the left to see its broadcasts';
542542
if(id){ const idx=parseInt(id.slice(3)); title=S.channels[idx]?.name||'Channel'; sub='No messages yet'; }
543543
renderThreadInto('msgFeed2', id, title, sub);
544544
}
@@ -945,13 +945,13 @@ function updateIdentity() {
945945
if (!nameEl || !subEl) return;
946946
const me = S.myNodeNum != null ? S.nodes[S.myNodeNum] : null;
947947
if (S.connected && me) {
948-
nameEl.textContent = me.shortName && me.shortName !== '???' ? me.shortName : (me.name || 'Nullmesh');
948+
nameEl.textContent = me.shortName && me.shortName !== '???' ? me.shortName : (me.name || 'nullmesh');
949949
subEl.textContent = 'Meshtastic ' + (me.name || numToId(me.num));
950950
} else if (S.connected && S.myNodeNum != null) {
951951
nameEl.textContent = numToId(S.myNodeNum);
952952
subEl.textContent = 'Meshtastic node';
953953
} else {
954-
nameEl.textContent = 'Nullmesh';
954+
nameEl.textContent = 'nullmesh';
955955
subEl.textContent = 'No node connected';
956956
}
957957
}
@@ -1028,7 +1028,7 @@ function showLanguages() {
10281028
// ══════════════════════════════════════════════════════════════════
10291029
// CONFIG PAGE
10301030
// ══════════════════════════════════════════════════════════════════
1031-
// Every config section Nullmesh can read and write. `kind` says which
1031+
// Every config section nullmesh can read and write. `kind` says which
10321032
// AdminMessage family it belongs to; the server registry in server/server.js
10331033
// mirrors this list and is what actually validates writes.
10341034
// Field types: bool | enum | number | float | text | password
@@ -1150,7 +1150,7 @@ const CFG_SECTIONS = {
11501150
label:'Network', kind:'config',
11511151
cards:[
11521152
{ title:'Wi-Fi',
1153-
desc:'The radio joins your Wi-Fi as a client. This is how Nullmesh talks to it — changing it will drop the connection until the node rejoins.',
1153+
desc:'The radio joins your Wi-Fi as a client. This is how nullmesh talks to it — changing it will drop the connection until the node rejoins.',
11541154
fields:[
11551155
{key:'wifiEnabled', label:'Wi-Fi enabled', type:'bool',
11561156
help:'Turn the Wi-Fi radio on. Wi-Fi and Bluetooth cannot both be used on ESP32 boards.'},
@@ -1267,7 +1267,7 @@ const CFG_SECTIONS = {
12671267
label:'Bluetooth', kind:'config',
12681268
cards:[
12691269
{ title:'Pairing',
1270-
desc:'How a phone pairs with this radio. On ESP32 boards Bluetooth and Wi-Fi cannot both be on — turning this on may drop Nullmesh’s connection.',
1270+
desc:'How a phone pairs with this radio. On ESP32 boards Bluetooth and Wi-Fi cannot both be on — turning this on may drop nullmesh’s connection.',
12711271
fields:[
12721272
{key:'enabled', label:'Bluetooth enabled', type:'bool', help:'Turn the Bluetooth radio on.'},
12731273
{key:'mode', label:'Pairing mode', type:'enum', enum:'pairingMode',
@@ -1484,7 +1484,7 @@ const CFG_SECTIONS = {
14841484
{key:'allowUndefinedPinAccess', label:'Allow any pin', type:'bool',
14851485
help:'Off restricts access to the pins listed on the node. On exposes every GPIO — risky.'},
14861486
],
1487-
note:'The named pin list is not editable from Nullmesh — use the official Meshtastic client for that. Whatever the node already has is left untouched when you save here.'},
1487+
note:'The named pin list is not editable from nullmesh — use the official Meshtastic client for that. Whatever the node already has is left untouched when you save here.'},
14881488
],
14891489
},
14901490

@@ -1615,7 +1615,7 @@ function renderConfigPage() {
16151615
el.innerHTML = `<div class="cfg-wrap">${subTabs}<div class="page-empty">
16161616
<span class="icon xl">settings_ethernet</span>
16171617
<div class="page-empty-title">Not connected</div>
1618-
<div class="page-empty-sub">Connect to your node and Nullmesh will read its ${esc(def.label.toLowerCase())} config.</div>
1618+
<div class="page-empty-sub">Connect to your node and nullmesh will read its ${esc(def.label.toLowerCase())} config.</div>
16191619
</div></div>`;
16201620
return;
16211621
}
@@ -1624,7 +1624,7 @@ function renderConfigPage() {
16241624
el.innerHTML = `<div class="cfg-wrap">${subTabs}<div class="page-empty">
16251625
<span class="icon xl">downloading</span>
16261626
<div class="page-empty-title">Reading ${esc(def.label.toLowerCase())} config…</div>
1627-
<div class="page-empty-sub">Nullmesh asked the radio for these settings. This takes a few seconds
1627+
<div class="page-empty-sub">nullmesh asked the radio for these settings. This takes a few seconds
16281628
over Wi-Fi. <button class="link-btn" onclick="refreshConfigSection('${section}')">Ask again</button></div>
16291629
</div></div>`;
16301630
return;
@@ -1652,7 +1652,7 @@ function renderConfigPage() {
16521652
<button class="btn-primary" onclick="saveConfigSection('${section}')"><span class="icon sm">save</span> Save to node</button>
16531653
</div>
16541654
<p class="cfg-note">Saving writes the whole ${esc(def.label)} block to the radio and commits it. The radio may
1655-
briefly restart its settings, then Nullmesh re-reads the values so you can confirm they stuck.</p>
1655+
briefly restart its settings, then nullmesh re-reads the values so you can confirm they stuck.</p>
16561656
</div>`;
16571657
}
16581658

‎index.html‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta http-equiv="Content-Security-Policy" content="default-src 'self' file: 'unsafe-inline' https:; img-src 'self' file: data: https:; connect-src 'self' ws://127.0.0.1:* wss://127.0.0.1:* https:; object-src 'none'; base-uri 'self';">
55
<meta charset="UTF-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7-
<title>Nullmesh</title>
7+
<title>nullmesh</title>
88
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
99
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
1010
<!-- Material Symbols (Google Icons) -->
@@ -24,7 +24,7 @@
2424
<div class="nav-identity">
2525
<div class="nav-id-icon"><span class="icon filled" style="color:#fff;font-size:20px">cell_tower</span></div>
2626
<div class="nav-id-text">
27-
<div class="nav-id-name" id="navNodeName">Nullmesh</div>
27+
<div class="nav-id-name" id="navNodeName">nullmesh</div>
2828
<div class="nav-id-sub" id="navNodeSub">No node connected</div>
2929
</div>
3030
<button class="icon-btn" id="navEditBtn" onclick="toggleConnPanel()" title="Connection settings">
@@ -300,8 +300,8 @@ <h1 class="page-title">Config</h1>
300300
<div class="fr-card">
301301
<div class="fr-icon"><span class="icon filled" style="color:#fff;font-size:28px">cell_tower</span></div>
302302
<h2 class="fr-title">Connect to your Meshtastic node</h2>
303-
<p class="fr-body">Nullmesh talks to a node on your local network over Wi-Fi. Enter the IP address your
304-
radio shows on its screen (or the one your router assigned it) and Nullmesh will load your mesh.</p>
303+
<p class="fr-body">nullmesh talks to a node on your local network over Wi-Fi. Enter the IP address your
304+
radio shows on its screen (or the one your router assigned it) and nullmesh will load your mesh.</p>
305305
<div class="fr-field">
306306
<label class="fr-label" for="frIp">Node IP address</label>
307307
<input class="fr-input" id="frIp" placeholder="192.168.1.103" value="192.168.1.103"

‎main.js‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ let appPort = 3000;
1515
// release artifacts (electron-updater would need latest.yml published
1616
// alongside the installer and would add weight to the packaged app).
1717
const UPDATE_REPO = 'BeardedTech0o/meshnatter';
18-
const UPDATE_ASSET_RE = /^Nullmesh-Setup-.*\.exe$/i; // matches build.nsis.artifactName
18+
const UPDATE_ASSET_RE = /^nullmesh-setup-.*\.exe$/i; // matches build.nsis.artifactName
1919

2020
function ghHeaders() {
2121
const headers = {
22-
'User-Agent': 'Nullmesh-Updater',
22+
'User-Agent': 'nullmesh-updater',
2323
'Accept': 'application/vnd.github+json',
2424
};
2525
// Public repos need no token; support one anyway so a private repo just works later.
@@ -97,9 +97,9 @@ async function checkForUpdates() {
9797
buttons: ['Download & Install', 'Later'],
9898
defaultId: 0,
9999
cancelId: 1,
100-
title: 'Nullmesh update available',
101-
message: `Nullmesh ${String(latest).replace(/^v/i, '')} is available.`,
102-
detail: `You are running ${current}. Download the installer (${Math.round((asset.size || 0) / 1048576)} MB) and run it now?\n\nNullmesh will close so the installer can replace its files.`,
100+
title: 'nullmesh update available',
101+
message: `nullmesh ${String(latest).replace(/^v/i, '')} is available.`,
102+
detail: `You are running ${current}. Download the installer (${Math.round((asset.size || 0) / 1048576)} MB) and run it now?\n\nnullmesh will close so the installer can replace its files.`,
103103
noLink: true,
104104
});
105105
if (response !== 0) { console.log('[update] User deferred update'); return; }
@@ -132,7 +132,7 @@ function startServer(port) {
132132
require('./server.bundle.cjs');
133133
console.log('[main] Server started on port', port);
134134
} catch (err) {
135-
dialog.showErrorBox('Nullmesh Error', 'The server failed to start.\n\n' + err.message);
135+
dialog.showErrorBox('nullmesh Error', 'The server failed to start.\n\n' + err.message);
136136
console.error('[main] Server error:', err.stack);
137137
app.quit();
138138
}
@@ -161,7 +161,7 @@ function createWindow(port) {
161161
minHeight: 600,
162162
backgroundColor: '#e6e9ee',
163163
frame: true,
164-
title: 'Nullmesh',
164+
title: 'nullmesh',
165165
webPreferences: {
166166
nodeIntegration: false, // Never expose Node.js to renderer
167167
contextIsolation: true, // Renderer isolated from main process
@@ -234,9 +234,9 @@ function createTray() {
234234
try {
235235
const img = nativeImage.createFromPath(path.join(__dirname, 'assets', 'icon.ico'));
236236
tray = new Tray(img.isEmpty() ? nativeImage.createEmpty() : img);
237-
tray.setToolTip('Nullmesh');
237+
tray.setToolTip('nullmesh');
238238
tray.setContextMenu(Menu.buildFromTemplate([
239-
{ label: 'Nullmesh', enabled: false }, { type: 'separator' },
239+
{ label: 'nullmesh', enabled: false }, { type: 'separator' },
240240
{ label: 'Show', click: () => mainWindow?.show() },
241241
{ type: 'separator' },
242242
{ label: 'Quit', click: () => { app.isQuitting = true; app.quit(); } },
@@ -259,7 +259,7 @@ if (!app.requestSingleInstanceLock()) {
259259

260260
try { await waitForWS(appPort); }
261261
catch (e) {
262-
dialog.showErrorBox('Nullmesh', 'Server did not start:\n\n' + e.message);
262+
dialog.showErrorBox('nullmesh', 'Server did not start:\n\n' + e.message);
263263
app.quit(); return;
264264
}
265265

‎package.json‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "nullmesh",
3-
"version": "1.0.10",
4-
"description": "Nullmesh — Meshtastic Network Monitor",
3+
"version": "1.0.11",
4+
"description": "nullmesh — Meshtastic Network Monitor",
55
"main": "main.js",
66
"type": "commonjs",
7-
"author": "Nullmesh",
7+
"author": "nullmesh",
88
"license": "MIT",
99
"private": true,
1010
"scripts": {
@@ -34,7 +34,7 @@
3434
},
3535
"build": {
3636
"appId": "com.nullmesh.app",
37-
"productName": "Nullmesh",
37+
"productName": "nullmesh",
3838
"asar": true,
3939
"compression": "maximum",
4040
"directories": {
@@ -76,11 +76,11 @@
7676
"allowToChangeInstallationDirectory": true,
7777
"createDesktopShortcut": true,
7878
"createStartMenuShortcut": true,
79-
"shortcutName": "Nullmesh",
79+
"shortcutName": "nullmesh",
8080
"installerIcon": "assets/icon.ico",
8181
"uninstallerIcon": "assets/icon.ico",
8282
"installerHeaderIcon": "assets/icon.ico",
83-
"artifactName": "Nullmesh-Setup-${version}.${ext}"
83+
"artifactName": "nullmesh-setup-${version}.${ext}"
8484
}
8585
}
8686
}

‎server.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Nullmesh server.js - HTTP polling for Heltec V3
2+
* nullmesh server.js - HTTP polling for Heltec V3
33
* More robust connection with retry logic and better error handling
44
*/
55
import { createServer } from 'http';
@@ -300,7 +300,7 @@ wss.on('connection', ws => {
300300

301301
httpServer.listen(SERVER_PORT, () => {
302302
console.log(`\n╔══════════════════════════════════════╗`);
303-
console.log(`║ Nullmesh — http://localhost:${SERVER_PORT} ║`);
303+
console.log(`║ nullmesh — http://localhost:${SERVER_PORT} ║`);
304304
console.log(`╚══════════════════════════════════════╝\n`);
305305
if (process.platform === 'win32') {
306306
import('child_process').then(({ exec }) => exec(`start http://localhost:${SERVER_PORT}`));

0 commit comments

Comments
 (0)