From cdcaa476f2ce9f2e5ea35221880535f6e6359395 Mon Sep 17 00:00:00 2001 From: Kpa-clawbot <259247574+Kpa-clawbot@users.noreply.github.com> Date: Sat, 28 Mar 2026 14:08:15 -0700 Subject: [PATCH] =?UTF-8?q?rename:=20MeshCore=20Analyzer=20=E2=86=92=20Cor?= =?UTF-8?q?eScope=20(Phase=201=20=E2=80=94=20backend=20+=20infra)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename product branding, binary names, Docker images, container names, Go modules, proto go_package, CI, manage.sh, and documentation. Preserved (backward compat): - meshcore.db database filename - meshcore-data / meshcore-staging-data directory paths - MQTT topics (meshcore/#, meshcore/+/+/packets, etc.) - proto package namespace (meshcore.v1) - localStorage keys Changes by category: - Go modules: github.com/corescope/{server,ingestor} - Binaries: corescope-server, corescope-ingestor - Docker images: corescope:latest, corescope-go:latest - Containers: corescope-prod, corescope-staging, corescope-staging-go - Supervisord programs: corescope, corescope-server, corescope-ingestor - Branding: siteName, heroTitle, startup logs, fallback HTML - Proto go_package: github.com/corescope/proto/v1 - CI: container refs, deploy path - Docs: 8 markdown files updated Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/deploy.yml | 8 ++--- AGENTS.md | 2 +- Dockerfile | 6 ++-- Dockerfile.go | 6 ++-- README.md | 18 +++++----- RELEASE-v3.0.0.md | 8 ++--- cmd/ingestor/README.md | 8 ++--- cmd/ingestor/go.mod | 2 +- cmd/ingestor/main.go | 2 +- cmd/server/go.mod | 2 +- cmd/server/main.go | 6 ++-- cmd/server/routes.go | 2 +- config.example.json | 4 +-- docker-compose.yml | 12 +++---- docker/supervisord-go.conf | 8 ++--- docker/supervisord.conf | 2 +- docs/CUSTOMIZATION.md | 2 +- docs/DEPLOYMENT.md | 44 ++++++++++++------------ docs/HASH-PREFIX-DISAMBIGUATION.md | 2 +- docs/api-spec.md | 4 +-- docs/go-migration.md | 32 +++++++++--------- manage.sh | 54 +++++++++++++++--------------- proto/analytics.proto | 2 +- proto/channel.proto | 2 +- proto/common.proto | 2 +- proto/config.proto | 2 +- proto/decoded.proto | 2 +- proto/node.proto | 2 +- proto/observer.proto | 2 +- proto/packet.proto | 2 +- proto/stats.proto | 2 +- proto/websocket.proto | 2 +- server.js | 6 ++-- 33 files changed, 130 insertions(+), 130 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 735848d1..4a9c6d98 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -303,7 +303,7 @@ jobs: - name: Start staging on port 82 run: | # Force remove stale containers - docker rm -f meshcore-staging-go 2>/dev/null || true + docker rm -f corescope-staging-go 2>/dev/null || true # Clean up stale ports fuser -k 82/tcp 2>/dev/null || true docker compose --profile staging-go up -d staging-go @@ -311,14 +311,14 @@ jobs: - name: Healthcheck staging container run: | for i in $(seq 1 120); do - HEALTH=$(docker inspect meshcore-staging-go --format '{{.State.Health.Status}}' 2>/dev/null || echo "starting") + HEALTH=$(docker inspect corescope-staging-go --format '{{.State.Health.Status}}' 2>/dev/null || echo "starting") if [ "$HEALTH" = "healthy" ]; then echo "Staging healthy after ${i}s" break fi if [ "$i" -eq 120 ]; then echo "Staging failed health check after 120s" - docker logs meshcore-staging-go --tail 50 + docker logs corescope-staging-go --tail 50 exit 1 fi sleep 1 @@ -378,6 +378,6 @@ jobs: echo "To promote to production:" >> $GITHUB_STEP_SUMMARY echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY echo "ssh deploy@\$VM_HOST" >> $GITHUB_STEP_SUMMARY - echo "cd /opt/meshcore-deploy" >> $GITHUB_STEP_SUMMARY + echo "cd /opt/corescope-deploy" >> $GITHUB_STEP_SUMMARY echo "./manage.sh promote" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY diff --git a/AGENTS.md b/AGENTS.md index 7d5d59e3..4698c413 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# AGENTS.md — MeshCore Analyzer +# AGENTS.md — CoreScope Guide for AI agents working on this codebase. Read this before writing any code. diff --git a/Dockerfile b/Dockerfile index 9920a105..f96617f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,14 +11,14 @@ WORKDIR /build/server COPY cmd/server/go.mod cmd/server/go.sum ./ RUN go mod download COPY cmd/server/ ./ -RUN go build -ldflags "-X main.Version=${APP_VERSION} -X main.Commit=${GIT_COMMIT} -X main.BuildTime=${BUILD_TIME}" -o /meshcore-server . +RUN go build -ldflags "-X main.Version=${APP_VERSION} -X main.Commit=${GIT_COMMIT} -X main.BuildTime=${BUILD_TIME}" -o /corescope-server . # Build ingestor WORKDIR /build/ingestor COPY cmd/ingestor/go.mod cmd/ingestor/go.sum ./ RUN go mod download COPY cmd/ingestor/ ./ -RUN go build -o /meshcore-ingestor . +RUN go build -o /corescope-ingestor . # Runtime image FROM alpine:3.20 @@ -28,7 +28,7 @@ RUN apk add --no-cache mosquitto mosquitto-clients supervisor caddy wget WORKDIR /app # Go binaries -COPY --from=builder /meshcore-server /meshcore-ingestor /app/ +COPY --from=builder /corescope-server /corescope-ingestor /app/ # Frontend assets + config COPY public/ ./public/ diff --git a/Dockerfile.go b/Dockerfile.go index 427a5d4f..6819e579 100644 --- a/Dockerfile.go +++ b/Dockerfile.go @@ -11,14 +11,14 @@ WORKDIR /build/server COPY cmd/server/go.mod cmd/server/go.sum ./ RUN go mod download COPY cmd/server/ ./ -RUN go build -ldflags "-X main.Version=${APP_VERSION} -X main.Commit=${GIT_COMMIT} -X main.BuildTime=${BUILD_TIME}" -o /meshcore-server . +RUN go build -ldflags "-X main.Version=${APP_VERSION} -X main.Commit=${GIT_COMMIT} -X main.BuildTime=${BUILD_TIME}" -o /corescope-server . # Build ingestor WORKDIR /build/ingestor COPY cmd/ingestor/go.mod cmd/ingestor/go.sum ./ RUN go mod download COPY cmd/ingestor/ ./ -RUN go build -o /meshcore-ingestor . +RUN go build -o /corescope-ingestor . # Runtime image FROM alpine:3.20 @@ -28,7 +28,7 @@ RUN apk add --no-cache mosquitto mosquitto-clients supervisor caddy wget WORKDIR /app # Go binaries -COPY --from=builder /meshcore-server /meshcore-ingestor /app/ +COPY --from=builder /corescope-server /corescope-ingestor /app/ # Frontend assets + config COPY public/ ./public/ diff --git a/README.md b/README.md index 39c90e48..cbd0d2c9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# MeshCore Analyzer +# CoreScope -[![Go Server Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/.badges/go-server-coverage.json)](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[![Go Ingestor Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/.badges/go-ingestor-coverage.json)](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[![Frontend Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/.badges/frontend-tests.json)](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[![Frontend Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/.badges/frontend-coverage.json)](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[![Deploy](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml/badge.svg)](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) +[![Go Server Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/corescope/master/.badges/go-server-coverage.json)](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[![Go Ingestor Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/corescope/master/.badges/go-ingestor-coverage.json)](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[![Frontend Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/corescope/master/.badges/frontend-tests.json)](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[![Frontend Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Kpa-clawbot/corescope/master/.badges/frontend-coverage.json)](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[![Deploy](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml/badge.svg)](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) > High-performance mesh network analyzer powered by Go. Sub-millisecond packet queries, ~300 MB memory for 56K+ packets, real-time WebSocket broadcast, full channel decryption. @@ -79,8 +79,8 @@ Full experience on your phone — proper touch controls, iOS safe area support, No Go installation needed — everything builds inside the container. ```bash -git clone https://github.com/Kpa-clawbot/meshcore-analyzer.git -cd meshcore-analyzer +git clone https://github.com/Kpa-clawbot/corescope.git +cd corescope ./manage.sh setup ``` @@ -171,7 +171,7 @@ Or POST raw hex packets to `POST /api/packets` for manual injection. ## Project Structure ``` -meshcore-analyzer/ +corescope/ ├── cmd/ │ ├── server/ # Go HTTP server + WebSocket + REST API │ │ ├── main.go # Entry point diff --git a/RELEASE-v3.0.0.md b/RELEASE-v3.0.0.md index aece5ab9..c249a10f 100644 --- a/RELEASE-v3.0.0.md +++ b/RELEASE-v3.0.0.md @@ -73,8 +73,8 @@ Advert counts now reflect unique transmissions, not total observations. A packet The Go backend is two binaries managed by supervisord inside Docker: -- **`meshcore-ingestor`** — connects to MQTT brokers, decodes packets, writes to SQLite, maintains the in-memory store -- **`meshcore-server`** — HTTP API, WebSocket broadcast, static file serving, analytics computation +- **`corescope-ingestor`** — connects to MQTT brokers, decodes packets, writes to SQLite, maintains the in-memory store +- **`corescope-server`** — HTTP API, WebSocket broadcast, static file serving, analytics computation Both share the same SQLite database (WAL mode). The frontend is unchanged — same vanilla JS, same `public/` directory, served by the Go HTTP server through Caddy. @@ -120,7 +120,7 @@ curl -s http://localhost/api/health | grep engine The Node.js Dockerfile is preserved as `Dockerfile.node`: ```bash -docker build -f Dockerfile.node -t meshcore-analyzer:latest . +docker build -f Dockerfile.node -t corescope:latest . docker compose up -d --force-recreate prod ``` @@ -152,7 +152,7 @@ This release wouldn't exist without the community: - **LitBomb** — issue reports from production deployments - **mibzzer15** — issue reports and edge case discovery -And to everyone running MeshCore Analyzer in the wild — your packet data, bug reports, and feature requests are what drive this project forward. The Go rewrite happened because the community outgrew what Node.js could handle. 56K packets, dozens of observers, sub-second queries. This is your tool. We just rewrote the engine. +And to everyone running CoreScope in the wild — your packet data, bug reports, and feature requests are what drive this project forward. The Go rewrite happened because the community outgrew what Node.js could handle. 56K packets, dozens of observers, sub-second queries. This is your tool. We just rewrote the engine. --- diff --git a/cmd/ingestor/README.md b/cmd/ingestor/README.md index abd46a84..24eb0718 100644 --- a/cmd/ingestor/README.md +++ b/cmd/ingestor/README.md @@ -1,6 +1,6 @@ # MeshCore MQTT Ingestor (Go) -Standalone MQTT ingestion service for MeshCore Analyzer. Connects to MQTT brokers, decodes raw MeshCore packets, and writes to the same SQLite database used by the Node.js web server. +Standalone MQTT ingestion service for CoreScope. Connects to MQTT brokers, decodes raw MeshCore packets, and writes to the same SQLite database used by the Node.js web server. This is the first step of a larger Go rewrite — separating MQTT ingestion from the web server. @@ -23,19 +23,19 @@ Requires Go 1.22+. ```bash cd cmd/ingestor -go build -o meshcore-ingestor . +go build -o corescope-ingestor . ``` Cross-compile for Linux (e.g., for the production VM): ```bash -GOOS=linux GOARCH=amd64 go build -o meshcore-ingestor . +GOOS=linux GOARCH=amd64 go build -o corescope-ingestor . ``` ## Run ```bash -./meshcore-ingestor -config /path/to/config.json +./corescope-ingestor -config /path/to/config.json ``` The config file uses the same format as the Node.js `config.json`. The ingestor reads the `mqttSources` array (or legacy `mqtt` object) and `dbPath` fields. diff --git a/cmd/ingestor/go.mod b/cmd/ingestor/go.mod index 7ef0f163..cc2098e7 100644 --- a/cmd/ingestor/go.mod +++ b/cmd/ingestor/go.mod @@ -1,4 +1,4 @@ -module github.com/meshcore-analyzer/ingestor +module github.com/corescope/ingestor go 1.22 diff --git a/cmd/ingestor/main.go b/cmd/ingestor/main.go index 495b061e..0c3c8c4b 100644 --- a/cmd/ingestor/main.go +++ b/cmd/ingestor/main.go @@ -552,7 +552,7 @@ var version = "dev" func init() { if len(os.Args) > 1 && os.Args[1] == "--version" { - fmt.Println("meshcore-ingestor", version) + fmt.Println("corescope-ingestor", version) os.Exit(0) } } diff --git a/cmd/server/go.mod b/cmd/server/go.mod index 55343edb..1ef2c8af 100644 --- a/cmd/server/go.mod +++ b/cmd/server/go.mod @@ -1,4 +1,4 @@ -module github.com/meshcore-analyzer/server +module github.com/corescope/server go 1.22 diff --git a/cmd/server/main.go b/cmd/server/main.go index e8d2d8b4..b2e859f3 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -116,7 +116,7 @@ func main() { var tableName string err = database.conn.QueryRow("SELECT name FROM sqlite_master WHERE type='table' AND name='transmissions'").Scan(&tableName) if err == sql.ErrNoRows { - log.Fatalf("[db] table 'transmissions' not found — is this a MeshCore Analyzer database?") + log.Fatalf("[db] table 'transmissions' not found — is this a CoreScope database?") } stats, err := database.GetStats() @@ -155,7 +155,7 @@ func main() { log.Printf("[static] directory %s not found — API-only mode", absPublic) router.PathPrefix("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - w.Write([]byte(`

MeshCore Analyzer

Frontend not found. API available at /api/

`)) + w.Write([]byte(`

CoreScope

Frontend not found. API available at /api/

`)) }) } @@ -182,7 +182,7 @@ func main() { httpServer.Close() }() - log.Printf("[server] MeshCore Analyzer (Go) listening on http://localhost:%d", cfg.Port) + log.Printf("[server] CoreScope (Go) listening on http://localhost:%d", cfg.Port) if err := httpServer.ListenAndServe(); err != http.ErrServerClosed { log.Fatalf("[server] %v", err) } diff --git a/cmd/server/routes.go b/cmd/server/routes.go index b1c84c8c..f07b1554 100644 --- a/cmd/server/routes.go +++ b/cmd/server/routes.go @@ -240,7 +240,7 @@ func (s *Server) handleConfigTheme(w http.ResponseWriter, r *http.Request) { theme := LoadTheme(".") branding := mergeMap(map[string]interface{}{ - "siteName": "MeshCore Analyzer", + "siteName": "CoreScope", "tagline": "Real-time MeshCore LoRa mesh network analyzer", }, s.cfg.Branding, theme.Branding) diff --git a/config.example.json b/config.example.json index 6991efe8..c53a2714 100644 --- a/config.example.json +++ b/config.example.json @@ -10,7 +10,7 @@ "key": "/path/to/key.pem" }, "branding": { - "siteName": "MeshCore Analyzer", + "siteName": "CoreScope", "tagline": "Real-time MeshCore LoRa mesh network analyzer", "logoUrl": null, "faviconUrl": null @@ -32,7 +32,7 @@ "observer": "#8b5cf6" }, "home": { - "heroTitle": "MeshCore Analyzer", + "heroTitle": "CoreScope", "heroSubtitle": "Find your nodes to start monitoring them.", "steps": [ { "emoji": "📡", "title": "Connect", "description": "Link your node to the mesh" }, diff --git a/docker-compose.yml b/docker-compose.yml index 8a474c58..27d5360c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,8 @@ services: prod: - image: meshcore-analyzer:latest - container_name: meshcore-prod + image: corescope:latest + container_name: corescope-prod restart: unless-stopped ports: - "${PROD_HTTP_PORT:-80}:${PROD_HTTP_PORT:-80}" @@ -24,8 +24,8 @@ services: retries: 3 staging: - image: meshcore-analyzer:latest - container_name: meshcore-staging + image: corescope:latest + container_name: corescope-staging restart: unless-stopped ports: - "${STAGING_HTTP_PORT:-81}:${STAGING_HTTP_PORT:-81}" @@ -52,8 +52,8 @@ services: args: APP_VERSION: ${APP_VERSION:-unknown} GIT_COMMIT: ${GIT_COMMIT:-unknown} - image: meshcore-go:latest - container_name: meshcore-staging-go + image: corescope-go:latest + container_name: corescope-staging-go restart: unless-stopped ports: - "${STAGING_GO_HTTP_PORT:-82}:80" diff --git a/docker/supervisord-go.conf b/docker/supervisord-go.conf index 9253beee..8c783615 100644 --- a/docker/supervisord-go.conf +++ b/docker/supervisord-go.conf @@ -14,8 +14,8 @@ stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 -[program:meshcore-ingestor] -command=/app/meshcore-ingestor -config /app/config.json +[program:corescope-ingestor] +command=/app/corescope-ingestor -config /app/config.json directory=/app autostart=true autorestart=true @@ -24,8 +24,8 @@ stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 -[program:meshcore-server] -command=/app/meshcore-server -config-dir /app -db /app/data/meshcore.db -public /app/public -port 3000 +[program:corescope-server] +command=/app/corescope-server -config-dir /app -db /app/data/meshcore.db -public /app/public -port 3000 directory=/app autostart=true autorestart=true diff --git a/docker/supervisord.conf b/docker/supervisord.conf index c1e29880..f55f34d4 100644 --- a/docker/supervisord.conf +++ b/docker/supervisord.conf @@ -14,7 +14,7 @@ stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 -[program:meshcore-analyzer] +[program:corescope] command=node /app/server.js directory=/app autostart=true diff --git a/docs/CUSTOMIZATION.md b/docs/CUSTOMIZATION.md index 640f2f90..6de40ffb 100644 --- a/docs/CUSTOMIZATION.md +++ b/docs/CUSTOMIZATION.md @@ -27,7 +27,7 @@ No restart needed. The server picks up changes to `theme.json` on every page loa **Bare metal / PM2 / systemd:** ```bash # Same directory as server.js and config.json -cp theme.json /path/to/meshcore-analyzer/ +cp theme.json /path/to/corescope/ ``` Check the server logs on startup — it tells you where it's looking: diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index a2e93d28..724f5e15 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -1,6 +1,6 @@ -# Deploying MeshCore Analyzer +# Deploying CoreScope -Get MeshCore Analyzer running with automatic HTTPS on your own server. +Get CoreScope running with automatic HTTPS on your own server. ## Table of Contents @@ -19,7 +19,7 @@ Get MeshCore Analyzer running with automatic HTTPS on your own server. ## What You'll End Up With -- MeshCore Analyzer running at `https://your-domain.com` +- CoreScope running at `https://your-domain.com` - Automatic HTTPS certificates (via Let's Encrypt + Caddy) - Built-in MQTT broker for receiving packets from observers - SQLite database for packet storage (auto-created) @@ -83,8 +83,8 @@ docker --version The easiest way — use the management script: ```bash -git clone https://github.com/Kpa-clawbot/meshcore-analyzer.git -cd meshcore-analyzer +git clone https://github.com/Kpa-clawbot/corescope.git +cd corescope ./manage.sh setup ``` @@ -111,8 +111,8 @@ flowchart LR ### 1. Download the code ```bash -git clone https://github.com/Kpa-clawbot/meshcore-analyzer.git -cd meshcore-analyzer +git clone https://github.com/Kpa-clawbot/corescope.git +cd corescope ``` ### 2. Create your config @@ -153,10 +153,10 @@ Save and close. Caddy handles certificates, renewals, and HTTP→HTTPS redirects ### 4. Build and run ```bash -docker build -t meshcore-analyzer . +docker build -t corescope . docker run -d \ - --name meshcore-analyzer \ + --name corescope \ --restart unless-stopped \ -p 80:80 \ -p 443:443 \ @@ -164,7 +164,7 @@ docker run -d \ -v $(pwd)/caddy-config/Caddyfile:/etc/caddy/Caddyfile:ro \ -v meshcore-data:/app/data \ -v caddy-data:/data/caddy \ - meshcore-analyzer + corescope ``` What each flag does: @@ -184,12 +184,12 @@ Open `https://your-domain.com`. You should see the analyzer home page. Check the logs: ```bash -docker logs meshcore-analyzer +docker logs corescope ``` Expected output: ``` -MeshCore Analyzer running on http://localhost:3000 +CoreScope running on http://localhost:3000 MQTT [local] connected to mqtt://localhost:1883 [pre-warm] 12 endpoints in XXXms ``` @@ -215,7 +215,7 @@ Add a remote broker to `mqttSources` in your `config.json`: } ``` -Restart: `docker restart meshcore-analyzer` +Restart: `docker restart corescope` ### Option B: Run your own observer @@ -271,12 +271,12 @@ If you already run a reverse proxy, skip Caddy entirely and proxy directly to th ```bash docker run -d \ - --name meshcore-analyzer \ + --name corescope \ --restart unless-stopped \ -p 3000:3000 \ -v $(pwd)/config.json:/app/config.json:ro \ -v meshcore-data:/app/data \ - meshcore-analyzer + corescope ``` Then configure your existing proxy to forward traffic to `localhost:3000`. @@ -287,12 +287,12 @@ For local testing or a LAN-only setup, use the default Caddyfile that ships in t ```bash docker run -d \ - --name meshcore-analyzer \ + --name corescope \ --restart unless-stopped \ -p 80:80 \ -v $(pwd)/config.json:/app/config.json:ro \ -v meshcore-data:/app/data \ - meshcore-analyzer + corescope ``` ## MQTT Security @@ -315,7 +315,7 @@ password_file /etc/mosquitto/passwd ``` After starting the container, create users: ```bash -docker exec -it meshcore-analyzer mosquitto_passwd -c /etc/mosquitto/passwd myuser +docker exec -it corescope mosquitto_passwd -c /etc/mosquitto/passwd myuser ``` **Option 3: Use TLS** — For production, configure Mosquitto with TLS certificates. See the [Mosquitto docs](https://mosquitto.org/man/mosquitto-conf-5.html). @@ -331,7 +331,7 @@ Packet data is stored in `meshcore.db` inside the data volume. **Using manage.sh (easiest):** ```bash -./manage.sh backup # Saves to ./backups/meshcore-TIMESTAMP.db +./manage.sh backup # Saves to ./backups/corescope-TIMESTAMP/ ./manage.sh backup ~/my-backup.db # Custom path ./manage.sh restore ./backups/some-file.db # Restore (backs up current DB first) ``` @@ -345,7 +345,7 @@ If you used `-v ./analyzer-data:/app/data` instead of a Docker volume, the datab ```bash crontab -e # Add: -0 3 * * * cd /path/to/meshcore-analyzer && ./manage.sh backup +0 3 * * * cd /path/to/corescope && ./manage.sh backup ``` ## Updating @@ -398,11 +398,11 @@ Center the map on your area in `config.json`: | Problem | Likely cause | Fix | |---------|-------------|-----| -| Site shows "connection refused" | Container not running | `docker ps` to check, `docker logs meshcore-analyzer` for errors | +| Site shows "connection refused" | Container not running | `docker ps` to check, `docker logs corescope` for errors | | HTTPS not working | Port 80 blocked | Open port 80 — Caddy needs it for ACME challenges | | "too many certificates" error | Let's Encrypt rate limit (5/domain/week) | Use a different subdomain, bring your own cert, or wait a week | | Certificate won't provision | DNS not pointed at server | `dig your-domain` must show your server IP before starting | -| No packets appearing | No observer connected | `docker exec meshcore-analyzer mosquitto_sub -t 'meshcore/#' -C 1 -W 10` — if silent, no data is coming in | +| No packets appearing | No observer connected | `docker exec corescope mosquitto_sub -t 'meshcore/#' -C 1 -W 10` — if silent, no data is coming in | | Container crashes on startup | Bad JSON in config | `python3 -c "import json; json.load(open('config.json'))"` to validate | | "address already in use" | Another web server on 80/443 | Stop it: `sudo systemctl stop nginx apache2` | | Slow on Raspberry Pi | First build is slow | Normal — subsequent builds use cache. Runtime performance is fine. | diff --git a/docs/HASH-PREFIX-DISAMBIGUATION.md b/docs/HASH-PREFIX-DISAMBIGUATION.md index 61bae815..e67eb669 100644 --- a/docs/HASH-PREFIX-DISAMBIGUATION.md +++ b/docs/HASH-PREFIX-DISAMBIGUATION.md @@ -1,4 +1,4 @@ -# Hash Prefix Disambiguation in MeshCore Analyzer +# Hash Prefix Disambiguation in CoreScope ## Section 1: Executive Summary diff --git a/docs/api-spec.md b/docs/api-spec.md index c92d70b7..d126fed8 100644 --- a/docs/api-spec.md +++ b/docs/api-spec.md @@ -1,4 +1,4 @@ -# MeshCore Analyzer — API Contract Specification +# CoreScope — API Contract Specification > **Authoritative contract.** Both the Node.js and Go backends MUST conform to this spec. > The frontend relies on these exact shapes. Breaking changes require a spec update first. @@ -1547,7 +1547,7 @@ Theme and branding configuration (merged from config.json + theme.json). ```jsonc { "branding": { - "siteName": string, // default: "MeshCore Analyzer" + "siteName": string, // default: "CoreScope" "tagline": string // default: "Real-time MeshCore LoRa mesh network analyzer" // ... additional branding keys from config/theme files }, diff --git a/docs/go-migration.md b/docs/go-migration.md index 688b8ca4..4c4214cf 100644 --- a/docs/go-migration.md +++ b/docs/go-migration.md @@ -1,6 +1,6 @@ # Migrating from Node.js to Go Engine -Guide for existing MeshCore Analyzer users switching from the Node.js Docker image to the Go version. +Guide for existing CoreScope users switching from the Node.js Docker image to the Go version. > **Status (July 2025):** The Go engine is fully functional for production use. > Go images are **not yet published to Docker Hub** — you build locally from source. @@ -24,11 +24,11 @@ Guide for existing MeshCore Analyzer users switching from the Node.js Docker ima ## Prerequisites - **Docker** 20.10+ and **Docker Compose** v2 (verify: `docker compose version`) -- An existing MeshCore Analyzer deployment running the Node.js image +- An existing CoreScope deployment running the Node.js image - The repository cloned locally (needed to build the Go image): ```bash git clone https://github.com/meshcore-dev/meshcore-analyzer.git - cd meshcore-analyzer + cd corescope git pull # get latest ``` - Your `config.json` and `caddy-config/Caddyfile` in place (the same ones you use now) @@ -122,7 +122,7 @@ docker compose --profile staging-go build staging-go Or build directly: ```bash -docker build -f Dockerfile.go -t meshcore-go:latest \ +docker build -f Dockerfile.go -t corescope-go:latest \ --build-arg APP_VERSION=$(git describe --tags 2>/dev/null || echo unknown) \ --build-arg GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo unknown) \ . @@ -151,7 +151,7 @@ Once satisfied, update `docker-compose.yml` to use the Go image for prod: ```yaml services: prod: - image: meshcore-go:latest # was: meshcore-analyzer:latest + image: corescope-go:latest # was: corescope:latest build: context: . dockerfile: Dockerfile.go # add this @@ -174,9 +174,9 @@ docker compose up -d prod ./manage.sh stop # Build the Go image -docker build -f Dockerfile.go -t meshcore-analyzer:latest . +docker build -f Dockerfile.go -t corescope:latest . -# Start (manage.sh uses the meshcore-analyzer:latest image) +# Start (manage.sh uses the corescope:latest image) ./manage.sh start ``` @@ -248,7 +248,7 @@ These should match (or be close to) your pre-migration numbers. ```bash # Watch container logs for MQTT messages -docker logs -f meshcore-prod --tail 20 +docker logs -f corescope-prod --tail 20 # Or use manage.sh ./manage.sh mqtt-test @@ -279,13 +279,13 @@ If something goes wrong, switching back is straightforward: ```yaml services: prod: - image: meshcore-analyzer:latest # back to Node.js + image: corescope:latest # back to Node.js # Remove the build.dockerfile line if you added it ``` ```bash # Rebuild Node.js image if needed -docker build -t meshcore-analyzer:latest . +docker build -t corescope:latest . docker compose up -d --force-recreate prod ``` @@ -295,8 +295,8 @@ docker compose up -d --force-recreate prod ```bash ./manage.sh stop -# Rebuild Node.js image (overwrites the meshcore-analyzer:latest tag) -docker build -t meshcore-analyzer:latest . +# Rebuild Node.js image (overwrites the corescope:latest tag) +docker build -t corescope:latest . ./manage.sh start ``` @@ -310,9 +310,9 @@ docker build -t meshcore-analyzer:latest . Or manually: ```bash -docker stop meshcore-prod +docker stop corescope-prod cp backups/pre-go-migration/meshcore.db ~/meshcore-data/meshcore.db -docker start meshcore-prod +docker start corescope-prod ``` --- @@ -348,7 +348,7 @@ docker start meshcore-prod |------|---------|-----| | `engine` field in `/api/health` | Not present or `"node"` | Always `"go"` | | MQTT URL scheme | Uses `mqtt://` / `mqtts://` natively | Auto-converts to `tcp://` / `ssl://` (transparent) | -| Process model | Single Node.js process (server + ingestor) | Two binaries: `meshcore-ingestor` + `meshcore-server` (managed by supervisord) | +| Process model | Single Node.js process (server + ingestor) | Two binaries: `corescope-ingestor` + `corescope-server` (managed by supervisord) | | Memory management | Configurable via `packetStore.maxMemoryMB` | Loads all packets; no configurable limit | | Startup time | Faster (no compilation) | Slightly slower (loads all packets from DB into memory) | @@ -393,4 +393,4 @@ The following gaps have been identified. Check the GitHub issue tracker for curr 3. **Go ingestor missing `meshcore/self_info` handling** — The local node identity topic is not processed. Low impact but breaks parity. -4. **No Docker Hub publishing for Go images** — Users must build locally. CI/CD pipeline should publish `meshcore-go:latest` alongside the Node.js image. +4. **No Docker Hub publishing for Go images** — Users must build locally. CI/CD pipeline should publish `corescope-go:latest` alongside the Node.js image. diff --git a/manage.sh b/manage.sh index 09716c39..d8d7756e 100755 --- a/manage.sh +++ b/manage.sh @@ -6,8 +6,8 @@ # Each step checks what's already done and skips it. set -e -CONTAINER_NAME="meshcore-analyzer" -IMAGE_NAME="meshcore-analyzer" +CONTAINER_NAME="corescope" +IMAGE_NAME="corescope" DATA_VOLUME="meshcore-data" CADDY_VOLUME="caddy-data" STATE_FILE=".setup-state" @@ -201,7 +201,7 @@ TOTAL_STEPS=6 cmd_setup() { echo "" echo "═══════════════════════════════════════" - echo " MeshCore Analyzer Setup" + echo " CoreScope Setup" echo "═══════════════════════════════════════" echo "" @@ -501,7 +501,7 @@ prepare_staging_config() { if [ ! -f "$staging_config" ] || [ "$prod_config" -nt "$staging_config" ]; then info "Copying production config to staging..." cp "$prod_config" "$staging_config" - sed -i 's/"siteName":\s*"[^"]*"/"siteName": "MeshCore Analyzer — STAGING"/' "$staging_config" + sed -i 's/"siteName":\s*"[^"]*"/"siteName": "CoreScope — STAGING"/' "$staging_config" log "Staging config created at ${staging_config} with STAGING site name." else log "Staging config is up to date." @@ -541,13 +541,13 @@ cmd_start() { prepare_staging_db prepare_staging_config - info "Starting production container (meshcore-prod) on ports ${PROD_HTTP_PORT:-80}/${PROD_HTTPS_PORT:-443}..." - info "Starting staging container (meshcore-staging) on port ${STAGING_HTTP_PORT:-81}..." + info "Starting production container (corescope-prod) on ports ${PROD_HTTP_PORT:-80}/${PROD_HTTPS_PORT:-443}..." + info "Starting staging container (corescope-staging) on port ${STAGING_HTTP_PORT:-81}..." docker compose --profile staging up -d log "Production started on ports ${PROD_HTTP_PORT:-80}/${PROD_HTTPS_PORT:-443}/${PROD_MQTT_PORT:-1883}" log "Staging started on port ${STAGING_HTTP_PORT:-81} (MQTT: ${STAGING_MQTT_PORT:-1884})" else - info "Starting production container (meshcore-prod) on ports ${PROD_HTTP_PORT:-80}/${PROD_HTTPS_PORT:-443}..." + info "Starting production container (corescope-prod) on ports ${PROD_HTTP_PORT:-80}/${PROD_HTTPS_PORT:-443}..." docker compose up -d prod log "Production started. Staging NOT running (use --with-staging to start both)." fi @@ -586,12 +586,12 @@ cmd_stop() { if $COMPOSE_MODE; then case "$TARGET" in prod) - info "Stopping production container (meshcore-prod)..." + info "Stopping production container (corescope-prod)..." docker compose stop prod log "Production stopped." ;; staging) - info "Stopping staging container (meshcore-staging)..." + info "Stopping staging container (corescope-staging)..." docker compose stop staging log "Staging stopped." ;; @@ -617,12 +617,12 @@ cmd_restart() { local TARGET="${1:-prod}" case "$TARGET" in prod) - info "Restarting production container (meshcore-prod)..." + info "Restarting production container (corescope-prod)..." docker compose up -d --force-recreate prod log "Production restarted." ;; staging) - info "Restarting staging container (meshcore-staging)..." + info "Restarting staging container (corescope-staging)..." docker compose --profile staging up -d --force-recreate staging log "Staging restarted." ;; @@ -698,19 +698,19 @@ cmd_status() { if $COMPOSE_MODE; then echo "═══════════════════════════════════════" - echo " MeshCore Analyzer Status (Compose)" + echo " CoreScope Status (Compose)" echo "═══════════════════════════════════════" echo "" # Production - show_container_status "meshcore-prod" "Production" + show_container_status "corescope-prod" "Production" echo "" # Staging - if container_running "meshcore-staging"; then - show_container_status "meshcore-staging" "Staging" + if container_running "corescope-staging"; then + show_container_status "corescope-staging" "Staging" else - info "Staging (meshcore-staging): Not running (use --with-staging to start both)" + info "Staging (corescope-staging): Not running (use --with-staging to start both)" fi echo "" @@ -804,7 +804,7 @@ cmd_logs() { docker compose logs -f --tail="$LINES" prod ;; staging) - if container_running "meshcore-staging"; then + if container_running "corescope-staging"; then info "Tailing staging logs..." docker compose logs -f --tail="$LINES" staging else @@ -843,10 +843,10 @@ cmd_promote() { # Show what's currently running local staging_image staging_created prod_image prod_created - staging_image=$(docker inspect meshcore-staging --format '{{.Config.Image}}' 2>/dev/null || echo "not running") - staging_created=$(docker inspect meshcore-staging --format '{{.Created}}' 2>/dev/null || echo "N/A") - prod_image=$(docker inspect meshcore-prod --format '{{.Config.Image}}' 2>/dev/null || echo "not running") - prod_created=$(docker inspect meshcore-prod --format '{{.Created}}' 2>/dev/null || echo "N/A") + staging_image=$(docker inspect corescope-staging --format '{{.Config.Image}}' 2>/dev/null || echo "not running") + staging_created=$(docker inspect corescope-staging --format '{{.Created}}' 2>/dev/null || echo "N/A") + prod_image=$(docker inspect corescope-prod --format '{{.Config.Image}}' 2>/dev/null || echo "not running") + prod_created=$(docker inspect corescope-prod --format '{{.Created}}' 2>/dev/null || echo "N/A") echo " Staging: ${staging_image} (created ${staging_created})" echo " Prod: ${prod_image} (created ${prod_created})" @@ -863,8 +863,8 @@ cmd_promote() { mkdir -p "$BACKUP_DIR" if [ -f "$PROD_DATA/meshcore.db" ]; then cp "$PROD_DATA/meshcore.db" "$BACKUP_DIR/" - elif container_running "meshcore-prod"; then - docker cp meshcore-prod:/app/data/meshcore.db "$BACKUP_DIR/" + elif container_running "corescope-prod"; then + docker cp corescope-prod:/app/data/meshcore.db "$BACKUP_DIR/" else warn "Could not backup production database." fi @@ -878,7 +878,7 @@ cmd_promote() { info "Waiting for production health check..." local i health for i in $(seq 1 30); do - health=$(container_health "meshcore-prod") + health=$(container_health "corescope-prod") if [ "$health" = "healthy" ]; then log "Production healthy after ${i}s" break @@ -918,7 +918,7 @@ cmd_update() { cmd_backup() { TIMESTAMP=$(date +%Y%m%d-%H%M%S) - BACKUP_DIR="${1:-./backups/meshcore-${TIMESTAMP}}" + BACKUP_DIR="${1:-./backups/corescope-${TIMESTAMP}}" mkdir -p "$BACKUP_DIR" info "Backing up to ${BACKUP_DIR}/" @@ -972,7 +972,7 @@ cmd_restore() { if [ -d "./backups" ]; then echo "" echo " Available backups:" - ls -dt ./backups/meshcore-* 2>/dev/null | head -10 | while read d; do + ls -dt ./backups/meshcore-* ./backups/corescope-* 2>/dev/null | head -10 | while read d; do if [ -d "$d" ]; then echo " $d/ ($(ls "$d" | wc -l) files)" elif [ -f "$d" ]; then @@ -1019,7 +1019,7 @@ cmd_restore() { # Backup current state first info "Backing up current state..." - cmd_backup "./backups/meshcore-pre-restore-$(date +%Y%m%d-%H%M%S)" + cmd_backup "./backups/corescope-pre-restore-$(date +%Y%m%d-%H%M%S)" docker stop "$CONTAINER_NAME" 2>/dev/null || true diff --git a/proto/analytics.proto b/proto/analytics.proto index f36dce32..a7dbdff0 100644 --- a/proto/analytics.proto +++ b/proto/analytics.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "common.proto"; diff --git a/proto/channel.proto b/proto/channel.proto index 524fa647..9e60bda2 100644 --- a/proto/channel.proto +++ b/proto/channel.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; // ─── Core Channel Type ───────────────────────────────────────────────────────── diff --git a/proto/common.proto b/proto/common.proto index bec038bb..ac32f2ea 100644 --- a/proto/common.proto +++ b/proto/common.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; // ─── Pagination ──────────────────────────────────────────────────────────────── diff --git a/proto/config.proto b/proto/config.proto index 9989b828..6807fcf5 100644 --- a/proto/config.proto +++ b/proto/config.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; // ═══════════════════════════════════════════════════════════════════════════════ // GET /api/config/theme — Theme and branding configuration diff --git a/proto/decoded.proto b/proto/decoded.proto index 69edab65..ddc0fc86 100644 --- a/proto/decoded.proto +++ b/proto/decoded.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; // ─── Decoded Packet Structure ────────────────────────────────────────────────── // Returned by POST /api/decode, POST /api/packets, and WS broadcast. diff --git a/proto/node.proto b/proto/node.proto index 1b7e9100..7d703cdd 100644 --- a/proto/node.proto +++ b/proto/node.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "common.proto"; import "packet.proto"; diff --git a/proto/observer.proto b/proto/observer.proto index bed37e09..26dd9668 100644 --- a/proto/observer.proto +++ b/proto/observer.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "common.proto"; import "packet.proto"; diff --git a/proto/packet.proto b/proto/packet.proto index 43a100d8..3f65dec2 100644 --- a/proto/packet.proto +++ b/proto/packet.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "common.proto"; import "decoded.proto"; diff --git a/proto/stats.proto b/proto/stats.proto index 566d8a4b..d27fdeb2 100644 --- a/proto/stats.proto +++ b/proto/stats.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "common.proto"; diff --git a/proto/websocket.proto b/proto/websocket.proto index 073c6ade..fb350ca3 100644 --- a/proto/websocket.proto +++ b/proto/websocket.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package meshcore.v1; -option go_package = "github.com/meshcore-analyzer/proto/v1"; +option go_package = "github.com/corescope/proto/v1"; import "decoded.proto"; import "packet.proto"; diff --git a/server.js b/server.js index 95d66b5b..4962c213 100644 --- a/server.js +++ b/server.js @@ -344,7 +344,7 @@ app.get('/api/config/theme', (req, res) => { const theme = loadThemeFile(); res.json({ branding: { - siteName: 'MeshCore Analyzer', + siteName: 'CoreScope', tagline: 'Real-time MeshCore LoRa mesh network analyzer', ...(cfg.branding || {}), ...(theme.branding || {}) @@ -2956,7 +2956,7 @@ app.get('/{*splat}', (req, res) => { if (fs.existsSync(indexPath)) { res.sendFile(indexPath); } else { - res.status(200).send('

MeshCore Analyzer

Frontend not yet built.

'); + res.status(200).send('

CoreScope

Frontend not yet built.

'); } }); @@ -2967,7 +2967,7 @@ if (require.main === module) { db.removePhantomNodes(); server.listen(listenPort, () => { const protocol = isHttps ? 'https' : 'http'; - console.log(`MeshCore Analyzer running on ${protocol}://localhost:${listenPort}`); + console.log(`CoreScope running on ${protocol}://localhost:${listenPort}`); // Log theme file location let themeFound = false; for (const p of THEME_PATHS) {