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/.squad/agents/bishop/charter.md b/.squad/agents/bishop/charter.md index a3d37a8e..9e64613e 100644 --- a/.squad/agents/bishop/charter.md +++ b/.squad/agents/bishop/charter.md @@ -1,10 +1,10 @@ # Bishop — Tester -Unit tests, Playwright E2E, coverage gates, and quality assurance for MeshCore Analyzer. +Unit tests, Playwright E2E, coverage gates, and quality assurance for CoreScope. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Node.js native test runner, Playwright, c8 + nyc (coverage), supertest **User:** User diff --git a/.squad/agents/bishop/history.md b/.squad/agents/bishop/history.md index 99292a4a..5792f3cf 100644 --- a/.squad/agents/bishop/history.md +++ b/.squad/agents/bishop/history.md @@ -2,7 +2,7 @@ ## Project Context -MeshCore Analyzer has 14 test files, 4,290 lines of test code. Backend coverage 85%+, frontend 42%+. Tests use Node.js native runner, Playwright for E2E, c8/nyc for coverage, supertest for API routes. vm.createContext pattern used for testing frontend helpers in Node.js. +CoreScope has 14 test files, 4,290 lines of test code. Backend coverage 85%+, frontend 42%+. Tests use Node.js native runner, Playwright for E2E, c8/nyc for coverage, supertest for API routes. vm.createContext pattern used for testing frontend helpers in Node.js. User: User diff --git a/.squad/agents/hicks/charter.md b/.squad/agents/hicks/charter.md index 61b3dbfe..9a7d12ef 100644 --- a/.squad/agents/hicks/charter.md +++ b/.squad/agents/hicks/charter.md @@ -1,10 +1,10 @@ # Hicks — Backend Dev -Server, decoder, packet-store, SQLite, API, MQTT, WebSocket, and performance for MeshCore Analyzer. +Server, decoder, packet-store, SQLite, API, MQTT, WebSocket, and performance for CoreScope. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Node.js 18+, Express 5, SQLite (better-sqlite3), MQTT (mqtt), WebSocket (ws) **User:** User diff --git a/.squad/agents/hicks/history.md b/.squad/agents/hicks/history.md index 077192d4..4e521242 100644 --- a/.squad/agents/hicks/history.md +++ b/.squad/agents/hicks/history.md @@ -2,7 +2,7 @@ ## Project Context -MeshCore Analyzer is a real-time LoRa mesh packet analyzer. Node.js + Express + SQLite backend, vanilla JS SPA frontend. Custom decoder.js fixes path_length bug from upstream library. In-memory packet store provides O(1) lookups for 30K+ packets. TTL response cache achieves 7,000× speedup on bulk health endpoint. +CoreScope is a real-time LoRa mesh packet analyzer. Node.js + Express + SQLite backend, vanilla JS SPA frontend. Custom decoder.js fixes path_length bug from upstream library. In-memory packet store provides O(1) lookups for 30K+ packets. TTL response cache achieves 7,000× speedup on bulk health endpoint. User: User diff --git a/.squad/agents/kobayashi/charter.md b/.squad/agents/kobayashi/charter.md index caaa2c00..ff5aeb4d 100644 --- a/.squad/agents/kobayashi/charter.md +++ b/.squad/agents/kobayashi/charter.md @@ -1,10 +1,10 @@ # Kobayashi — Lead -Architecture, code review, and decision-making for MeshCore Analyzer. +Architecture, code review, and decision-making for CoreScope. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Node.js 18+, Express 5, SQLite, vanilla JS frontend, Leaflet, WebSocket, MQTT **User:** User diff --git a/.squad/agents/kobayashi/history.md b/.squad/agents/kobayashi/history.md index 18381061..b49a33ba 100644 --- a/.squad/agents/kobayashi/history.md +++ b/.squad/agents/kobayashi/history.md @@ -2,7 +2,7 @@ ## Project Context -MeshCore Analyzer is a real-time LoRa mesh packet analyzer. Node.js + Express + SQLite backend, vanilla JS SPA frontend with Leaflet maps, WebSocket live feed, MQTT ingestion. Production at v2.6.0, ~18K lines, 85%+ backend test coverage. +CoreScope is a real-time LoRa mesh packet analyzer. Node.js + Express + SQLite backend, vanilla JS SPA frontend with Leaflet maps, WebSocket live feed, MQTT ingestion. Production at v2.6.0, ~18K lines, 85%+ backend test coverage. User: User diff --git a/.squad/agents/newt/charter.md b/.squad/agents/newt/charter.md index d6152ace..f35c59e1 100644 --- a/.squad/agents/newt/charter.md +++ b/.squad/agents/newt/charter.md @@ -1,10 +1,10 @@ # Newt — Frontend Dev -Vanilla JS UI, Leaflet maps, live visualization, theming, and all public/ modules for MeshCore Analyzer. +Vanilla JS UI, Leaflet maps, live visualization, theming, and all public/ modules for CoreScope. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Vanilla HTML/CSS/JavaScript (ES5/6), Leaflet maps, WebSocket, Canvas animations **User:** User diff --git a/.squad/agents/newt/history.md b/.squad/agents/newt/history.md index abc42c1e..3d4d8207 100644 --- a/.squad/agents/newt/history.md +++ b/.squad/agents/newt/history.md @@ -2,7 +2,7 @@ ## Project Context -MeshCore Analyzer is a real-time LoRa mesh packet analyzer with a vanilla JS SPA frontend. 22 frontend modules, Leaflet maps, WebSocket live feed, VCR playback, Canvas animations, theme customizer with CSS variables. No build step, no framework. ES5/6 for broad browser support. +CoreScope is a real-time LoRa mesh packet analyzer with a vanilla JS SPA frontend. 22 frontend modules, Leaflet maps, WebSocket live feed, VCR playback, Canvas animations, theme customizer with CSS variables. No build step, no framework. ES5/6 for broad browser support. User: User diff --git a/.squad/agents/ralph/charter.md b/.squad/agents/ralph/charter.md index 7f7ef5b5..dd36f312 100644 --- a/.squad/agents/ralph/charter.md +++ b/.squad/agents/ralph/charter.md @@ -4,7 +4,7 @@ Tracks the work queue and keeps the team moving. Always on the roster. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **User:** User ## Responsibilities diff --git a/.squad/agents/ripley/charter.md b/.squad/agents/ripley/charter.md index c96666f4..352336bb 100644 --- a/.squad/agents/ripley/charter.md +++ b/.squad/agents/ripley/charter.md @@ -1,10 +1,10 @@ # Ripley — Support Engineer -Deep knowledge of every frontend behavior, API response, and user-facing feature in MeshCore Analyzer. Fields community questions, triages bug reports, and explains "why does X look like Y." +Deep knowledge of every frontend behavior, API response, and user-facing feature in CoreScope. Fields community questions, triages bug reports, and explains "why does X look like Y." ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Vanilla JS frontend (public/*.js), Node.js backend, SQLite, WebSocket, MQTT **User:** Kpa-clawbot diff --git a/.squad/agents/ripley/history.md b/.squad/agents/ripley/history.md index e99a50b2..86c8611d 100644 --- a/.squad/agents/ripley/history.md +++ b/.squad/agents/ripley/history.md @@ -1,7 +1,7 @@ # Ripley — Support Engineer History ## Core Context -- Project: MeshCore Analyzer — real-time LoRa mesh packet analyzer +- Project: CoreScope — real-time LoRa mesh packet analyzer - User: Kpa-clawbot - Joined the team 2026-03-27 to handle community support and triage diff --git a/.squad/agents/scribe/charter.md b/.squad/agents/scribe/charter.md index 1bf1dcf1..2209a57b 100644 --- a/.squad/agents/scribe/charter.md +++ b/.squad/agents/scribe/charter.md @@ -1,10 +1,10 @@ # Scribe — Session Logger -Silent agent that maintains decisions, logs, and cross-agent context for MeshCore Analyzer. +Silent agent that maintains decisions, logs, and cross-agent context for CoreScope. ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **User:** User ## Responsibilities diff --git a/.squad/casting/history.json b/.squad/casting/history.json index bf07c51c..1a27f6b6 100644 --- a/.squad/casting/history.json +++ b/.squad/casting/history.json @@ -5,7 +5,7 @@ "universe": "aliens", "created_at": "2026-03-26T04:22:08Z", "agents": ["Kobayashi", "Hicks", "Newt", "Bishop"], - "reason": "Initial team casting for MeshCore Analyzer project" + "reason": "Initial team casting for CoreScope project" } ] } diff --git a/.squad/team.md b/.squad/team.md index cfb7bba7..d45190e4 100644 --- a/.squad/team.md +++ b/.squad/team.md @@ -1,8 +1,8 @@ -# Squad — MeshCore Analyzer +# Squad — CoreScope ## Project Context -**Project:** MeshCore Analyzer — Real-time LoRa mesh packet analyzer +**Project:** CoreScope — Real-time LoRa mesh packet analyzer **Stack:** Node.js 18+, Express 5, SQLite (better-sqlite3), vanilla JS frontend, Leaflet maps, WebSocket (ws), MQTT (mqtt) **User:** User **Description:** Self-hosted alternative to analyzer.letsmesh.net. Ingests MeshCore mesh network packets via MQTT, decodes with custom parser (decoder.js), stores in SQLite with in-memory indexing (packet-store.js), and serves a rich SPA with live visualization, packet analysis, node analytics, channel chat, observer health, and theme customizer. ~18K lines, 14 test files, 85%+ backend coverage. Production at v2.6.0. 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 -[](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) -[](https://github.com/Kpa-clawbot/meshcore-analyzer/actions/workflows/deploy.yml) +[](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[](https://github.com/Kpa-clawbot/corescope/actions/workflows/deploy.yml) +[](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/benchmark.js b/benchmark.js index d7ce92d1..e7b39899 100644 --- a/benchmark.js +++ b/benchmark.js @@ -148,7 +148,7 @@ async function benchmarkEndpoints(port, endpoints, nocache = false) { } async function run() { - console.log(`\nMeshCore Analyzer Benchmark — ${RUNS} runs per endpoint`); + console.log(`\nCoreScope Benchmark — ${RUNS} runs per endpoint`); console.log('Launching servers...\n'); // Launch both servers 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(`
Frontend not found. API available at /api/
`)) + w.Write([]byte(`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 70618929..14d1c9dd 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..9a362e50 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 + git clone https://github.com/Kpa-clawbot/meshcore-analyzer.git + 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..24fc84ff 100755 --- a/manage.sh +++ b/manage.sh @@ -1,13 +1,13 @@ #!/bin/bash -# MeshCore Analyzer — Setup & Management Helper +# CoreScope — Setup & Management Helper # Usage: ./manage.sh [command] # # Idempotent: safe to cancel and re-run at any point. # 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 @@ -1105,7 +1105,7 @@ cmd_reset() { cmd_help() { echo "" - echo "MeshCore Analyzer — Management Script" + echo "CoreScope — Management Script" echo "" echo "Usage: ./manage.shHow familiar are you with MeshCore?