Files
tajniak81 d6956395c8 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>
2026-07-06 08:53:14 +02:00

83 lines
3.8 KiB
Markdown

# gsmnode
Turn Android phones into a programmable SMS gateway, controlled through a web UI
and a REST API — inspired by [android-sms-gateway](https://docs.sms-gate.app/).
Brand + design system live in
[`Design/SMS Gateway logo design/`](Design/SMS%20Gateway%20logo%20design/) —
signal-green `#2E9E6B` on ink, Space Grotesk (display) · IBM Plex Sans (body) ·
JetBrains Mono (code/labels), the lowercase `gsm`+`node` wordmark, and the
two-arrow routing mark. All three UI surfaces implement it (the Web App and API
panel share a persisted light/dark toggle, `localStorage` key `gsmnode-theme`,
`data-gsm-theme` attribute; the Phone App follows the system theme).
Three application surfaces sit in front of a shared PocketBase. **The API Server
is the only component that talks to PocketBase**; the Web App and Phone App talk
only to the API Server.
```
┌────────────┐ ┌──────────────────┐ ┌──────────────┐
│ Web App │───────►│ │───────►│ │
│ (Vue/Go) │ │ API Server │ │ PocketBase │
├────────────┤ │ (Go) │ │ 10.2.1.10: │
│ Phone App │───────►│ │───────►│ 8028 │
│ (Flutter) │ └──────────────────┘ └──────────────┘
└────────────┘
```
## Surfaces
| Folder | Stack | Port | Status |
|---|---|---|---|
| [`API Server/`](API%20Server/) | Go | `:8080` | ✅ Built & verified (live E2E) |
| [`Web App/`](Web%20App/) | Go BFF + Vue 3 + Tailwind | `:8090` | ✅ Built & verified |
| [`Phone App/`](Phone%20App/) | Flutter (Android) | — | ✅ Built & run on a real device; foreground service + delivery reports |
| [`Home Assistant Plugin/`](Home%20Assistant%20Plugin/) | HA custom component (Python) | — | ✅ `notify.gsmnode` service; flow validated |
## PocketBase collections
Managed by `API Server/scripts/setup-pocketbase.mjs` (idempotent):
- `users` — auth (existing default collection)
- `devices``device_id, name, platform, app_version, push_token, auth_token, status, last_seen_at, owner`
- `messages``phone_numbers, text_message, sim_number, status, error, schedule_at, sent_at, delivered_at, device, owner`
- `inbox``phone_number, message, received_at, device, owner`
- `webhooks``event, url, device, owner`
Collections are locked to superuser access; the API Server enforces per-user
ownership in application logic.
## Run order
1. **PocketBase** — already running at `http://10.2.1.10:8028`.
2. **API Server** (`:8080`):
```powershell
cd "API Server"
Copy-Item .env.example .env # fill in PB_ADMIN_* and JWT_SECRET
node scripts/setup-pocketbase.mjs # one-time schema setup
node scripts/create-user.mjs you@example.com "password" "Your Name"
./scripts/Run-ApiServer.ps1
```
3. **Web App** (`:8090`):
```powershell
cd "Web App"; ./server/Run-WebApp.ps1
```
Open http://localhost:8090 and sign in.
4. **Phone App** — see [`Phone App/README.md`](Phone%20App/README.md) (install
Flutter + JDK 17, `flutter create`, copy `android_overlay/`, `flutter run`).
## Message lifecycle
`Pending` → (device pulls) `Processed` → `Sent` → `Delivered` · or `Failed`.
## Webhooks
Events `sms:received`, `sms:sent`, `sms:delivered`, `sms:failed` are POSTed to
registered URLs as `{event, device_id, payload, created_at}`.
## Per-surface docs
- [API Server README](API%20Server/README.md) — full endpoint reference, setup
- [Web App README](Web%20App/README.md) — dev/build, pages
- [Phone App README](Phone%20App/README.md) — Flutter build + native SMS wiring