Rebrand CommGate to gsmnode and adopt new design system

Rename the whole project from CommGate to gsmnode and re-skin every
surface onto the new signal-green + ink design system (Space Grotesk /
IBM Plex Sans / JetBrains Mono, flat surfaces, two-arrow routing mark,
lowercase gsm+node wordmark).

- Web App + API panel: rewrite token layer, gn-* utilities, data-gsm-theme,
  new logo/favicon assets; both builds verified.
- Phone App (Flutter): green theme, new mark/wordmark widgets, adaptive
  launcher icons; rename Android applicationId/package to app.gsmnode.phone;
  bump AGP to 8.6.0 and google_fonts to 8.1.0; debug APK build verified.
- API Server (Go): panel routes, User-Agent, health service id, branding.
- Home Assistant Plugin: rename integration domain sms_gateway to gsmnode
  (folder, DOMAIN, services, entity ids, classes); py_compile verified.
- Update all READMEs; add .gitignore (excludes Design/, build artifacts).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
tajniak81
2026-07-06 08:53:14 +02:00
commit d6956395c8
166 changed files with 12605 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
// Creates a user in the PocketBase "users" collection to log in with.
//
// Usage (PowerShell):
// $env:POCKETBASE_URL="http://10.2.1.10:8028"
// $env:PB_ADMIN_EMAIL="admin@example.com"
// $env:PB_ADMIN_PASSWORD="admin-password"
// node scripts/create-user.mjs user@example.com "user-password" "Display Name"
const BASE = (process.env.POCKETBASE_URL || "http://10.2.1.10:8028").replace(/\/$/, "");
const EMAIL = process.env.PB_ADMIN_EMAIL;
const PASSWORD = process.env.PB_ADMIN_PASSWORD;
const [, , userEmail, userPassword, userName] = process.argv;
if (!EMAIL || !PASSWORD) {
console.error("Set PB_ADMIN_EMAIL and PB_ADMIN_PASSWORD environment variables.");
process.exit(1);
}
if (!userEmail || !userPassword) {
console.error('Usage: node scripts/create-user.mjs <email> <password> ["name"]');
process.exit(1);
}
async function api(method, path, body, token) {
const res = await fetch(BASE + path, {
method,
headers: { "Content-Type": "application/json", ...(token ? { Authorization: token } : {}) },
body: body ? JSON.stringify(body) : undefined,
});
const text = await res.text();
const json = text ? JSON.parse(text) : null;
if (!res.ok) throw new Error(`${method} ${path} -> ${res.status}: ${json?.message || text}`);
return json;
}
const auth = await api("POST", "/api/collections/_superusers/auth-with-password", {
identity: EMAIL,
password: PASSWORD,
});
const user = await api("POST", "/api/collections/users/records", {
email: userEmail,
password: userPassword,
passwordConfirm: userPassword,
name: userName || "",
emailVisibility: true,
verified: true,
}, auth.token);
console.log(`Created user ${user.email} (id: ${user.id}).`);