Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
7163cf7
Adds dynamic injection of next.js CORS config upon LAN-accessible net…
smithbh Mar 25, 2026
2b36539
Adds compose watch to frontend for automatic rebuilding upon detected…
smithbh Mar 25, 2026
0b0d6dd
Adds compose watch functionality to backend container
smithbh Mar 25, 2026
781f473
Merge branch 'main' into feature/compose-watch-and-frontend-cors
smithbh Mar 25, 2026
54d4055
fix(start.sh): add missing fi after UV bootstrap block
Elhard1 Mar 26, 2026
d363013
Merge pull request #111 from Elhard1/fix/start-sh-missing-fi
BigBodyCobain Mar 26, 2026
668ce16
v0.9.6: InfoNet hashchain, Wormhole gate encryption, mesh reputation,…
anoracleofra-code Mar 26, 2026
f3946d9
chore(deps): bump python-dotenv from 1.0.1 to 1.2.2 in /backend
dependabot[bot] Mar 26, 2026
d22c9b0
chore(deps): bump react from 19.2.3 to 19.2.4 in /frontend
dependabot[bot] Mar 26, 2026
c4a7314
chore(deps): bump framer-motion from 12.34.3 to 12.38.0 in /frontend
dependabot[bot] Mar 26, 2026
ed3da5c
Update README.md
BigBodyCobain Mar 26, 2026
ac6b209
fix: Docker self-update shows pull instructions instead of silently f…
anoracleofra-code Mar 26, 2026
bbe47b6
Merge pull request #119 from BigBodyCobain/dependabot/npm_and_yarn/fr…
BigBodyCobain Mar 26, 2026
3cca19b
Merge pull request #112 from BigBodyCobain/dependabot/pip/backend/pyt…
BigBodyCobain Mar 26, 2026
1b7df28
Merge pull request #121 from BigBodyCobain/dependabot/npm_and_yarn/fr…
BigBodyCobain Mar 26, 2026
94eabce
chore: remove Dependabot config
anoracleofra-code Mar 26, 2026
7084950
Update README.md
BigBodyCobain Mar 26, 2026
09e39de
fix: add dev dependency group to pyproject.toml for CI
anoracleofra-code Mar 26, 2026
7d7d913
ci: make lint steps non-blocking so Docker images can build
anoracleofra-code Mar 26, 2026
f5e0c9c
ci: make vitest non-blocking for Docker image builds
anoracleofra-code Mar 26, 2026
784405b
fix: add GHCR image refs to docker-compose and increase health start …
anoracleofra-code Mar 26, 2026
cc7c814
Update README.md
BigBodyCobain Mar 26, 2026
2bc06ff
Update README.md
BigBodyCobain Mar 26, 2026
fb6d098
fix: add missing orjson, beautifulsoup4, cryptography deps to pyproje…
anoracleofra-code Mar 26, 2026
165743e
fix: remove build sections from docker-compose.yml so pull works
anoracleofra-code Mar 26, 2026
8b52cbf
fix: allow startup without ADMIN_KEY for fresh Docker installs
anoracleofra-code Mar 26, 2026
4897a54
fix: allow Docker internal IPs for local operator + bump changelog te…
anoracleofra-code Mar 26, 2026
04939ee
fix: bump text sizes across all mesh/infonet/settings components
anoracleofra-code Mar 26, 2026
81c90a9
fix: stop AIS proxy crash-loop when API key is not set
anoracleofra-code Mar 26, 2026
6cf3251
fix: increase wormhole readiness deadline from 8s to 20s
anoracleofra-code Mar 26, 2026
b03dc93
fix: auto-enable raw secure storage fallback in Docker containers
anoracleofra-code Mar 26, 2026
12cf5c0
fix: add paho-mqtt dependency + improve Infonet sync status labels
anoracleofra-code Mar 26, 2026
6140e9b
fix: pin paho-mqtt to v1.x (v2 broke callback API)
anoracleofra-code Mar 26, 2026
81b99c0
fix: add meshtastic, PyNaCl, vaderSentiment to dependencies
anoracleofra-code Mar 26, 2026
86d2145
fix: use paho-mqtt threaded loop for stable MQTT reconnection
anoracleofra-code Mar 26, 2026
3cbe809
fix: add default relay peer so fresh installs can sync Infonet
anoracleofra-code Mar 26, 2026
39cc5d2
fix: compile privacy-core Rust library in Docker backend image
anoracleofra-code Mar 26, 2026
c30a1a5
Update README.md
BigBodyCobain Mar 26, 2026
c6fc47c
fix: bump Rust builder to 1.88 (darling 0.23 MSRV)
anoracleofra-code Mar 26, 2026
da09cf4
fix: cross-node gate decryption, UI text scaling, aircraft zoom
anoracleofra-code Mar 27, 2026
c5d48aa
feat: pass FINNHUB_API_KEY to Docker, update layer defaults, cluster …
anoracleofra-code Mar 27, 2026
4665730
fix: use mapZoom instead of undefined zoom for UavLabels
anoracleofra-code Mar 27, 2026
2dcb65d
Update README.md
BigBodyCobain Mar 27, 2026
5e40e8d
style: terminal reskin — Infonet aesthetic for main dashboard
anoracleofra-code Mar 27, 2026
5f4d52c
style: make threat alert cards larger and more prominent
anoracleofra-code Mar 27, 2026
59b1723
feat: fix gate message delivery + per-gate content encryption
anoracleofra-code Mar 27, 2026
ae627a8
fix: align transport secret with cipher0 relay
anoracleofra-code Mar 27, 2026
b118840
fix: preserve gate_envelope and reply_to in peer push receiver
anoracleofra-code Mar 27, 2026
40a3cbd
feat: add pull-based gate sync for cross-node message delivery
anoracleofra-code Mar 27, 2026
c81d81e
feat: real-time gate messages via SSE + faster push/pull intervals
anoracleofra-code Mar 27, 2026
c35978c
fix: add version to health endpoint + warn users with stale compose f…
anoracleofra-code Mar 27, 2026
1fd12be
fix: relay nodes now accept gate messages (skip gate-exists check)
anoracleofra-code Mar 28, 2026
8f7bb41
fix: thread-safe SSE broadcast + node enabled by default
anoracleofra-code Mar 28, 2026
66df14a
fix: improve alert box collision resolution to prevent overlapping
anoracleofra-code Mar 28, 2026
a3e7a2b
feat: add Docker Hub as primary registry for anonymous pulls
anoracleofra-code Mar 28, 2026
94e1194
Update README.md
BigBodyCobain Mar 28, 2026
2269777
chore: trigger CI
anoracleofra-code Mar 28, 2026
d4b9960
revert: restore original docker-publish.yml to test CI trigger
anoracleofra-code Mar 28, 2026
f2753eb
chore: trigger CI (BigBodyCobain)
BigBodyCobain Mar 28, 2026
d1853eb
chore: trigger CI v2
anoracleofra-code Mar 28, 2026
3df4ad5
chore: trigger CI
BigBodyCobain Mar 28, 2026
466b1c8
Merge branch 'main' of https://github.com/BigBodyCobain/Shadowbroker
anoracleofra-code Mar 28, 2026
d419ee6
chore: revert docker-compose to GHCR registry
anoracleofra-code Mar 28, 2026
4122d04
Switch Docker image registry from GitHub (GHCR) to GitLab Container R…
anoracleofra-code Mar 29, 2026
984e9a6
Replace GitHub-hosted assets with GitLab uploads
anoracleofra-code Mar 29, 2026
af45c48
Use HTML video tag for hero video in README
anoracleofra-code Mar 29, 2026
b9adc1c
Fix hero video embed using GitLab markdown image syntax
anoracleofra-code Mar 29, 2026
b9067a6
Replace hero video with FLIR screenshot
anoracleofra-code Mar 29, 2026
22a93ba
Edit README.md
BigBodyCobain Mar 29, 2026
7f5ab3d
Edit README.md
BigBodyCobain Mar 29, 2026
d355222
Merge branch 'main' into feature/compose-watch-and-frontend-cors
smithbh Apr 9, 2026
1504d89
Adds link to new canonical instance hosted on gitlab
smithbh Apr 9, 2026
9acc0f3
Merge branch 'main' into feature/compose-watch-and-frontend-cors
smithbh Apr 9, 2026
ccad69f
Merge branch 'main' into feature/compose-watch-and-frontend-cors
smithbh Apr 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 31 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
.PHONY: up-local up-lan down restart-local restart-lan logs status help
.PHONY: up-local up-lan down restart-local restart-lan dev dev-lan logs status help

COMPOSE = docker compose

# Detect LAN IP (tries Wi-Fi first, falls back to Ethernet)
LAN_IP := $(shell ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null)
LAN_IP_MSG = "\nShadowbroker is now running and can be accessed by LAN devices at http://$(LAN_IP):3000"

## Default target — print help
help:
Expand All @@ -14,9 +15,12 @@ help:
@echo ""
@echo " up-local Start with loopback binding (local access only)"
@echo " up-lan Start with 0.0.0.0 binding (LAN accessible)"
@echo " up-lan-log Start LAN-accessible with live logging"
@echo " down Stop all containers"
@echo " restart-local Bounce and restart in local mode"
@echo " restart-lan Bounce and restart in LAN mode"
@echo " dev Start in watch mode (local only)"
@echo " dev-lan Start in watch mode (LAN accessible)"
@echo " logs Tail logs for all services"
@echo " status Show container status"
@echo ""
Expand All @@ -32,9 +36,18 @@ up-lan:
exit 1; \
fi
@echo "Detected LAN IP: $(LAN_IP)"
BIND=0.0.0.0 CORS_ORIGINS=http://$(LAN_IP):3000 $(COMPOSE) up -d
@echo ""
@echo "Shadowbroker is now running and can be accessed by LAN devices at http://$(LAN_IP):3000"
BIND=0.0.0.0 HOST=0.0.0.0 CORS_ORIGINS=http://$(LAN_IP):3000 $(COMPOSE) up -d
@echo "$(LAN_IP_MSG)"

## Start in LAN mode with live logging (accessible to other hosts on the network)
up-lan-log:
@if [ -z "$(LAN_IP)" ]; then \
echo "ERROR: Could not detect LAN IP. Check your network connection."; \
exit 1; \
fi
@echo "Detected LAN IP: $(LAN_IP)"
BIND=0.0.0.0 HOST=0.0.0.0 CORS_ORIGINS=http://$(LAN_IP):3000 $(COMPOSE) up
@echo "$(LAN_IP_MSG)"

## Stop all containers
down:
Expand All @@ -46,6 +59,20 @@ restart-local: down up-local
## Restart in LAN mode
restart-lan: down up-lan

## Start in watch mode (local only, foreground)
dev:
BIND=127.0.0.1 $(COMPOSE) up --watch

## Start in watch mode (LAN accessible, foreground)
dev-lan:
@if [ -z "$(LAN_IP)" ]; then \
echo "ERROR: Could not detect LAN IP. Check your network connection."; \
exit 1; \
fi
@echo "Detected LAN IP: $(LAN_IP)"
@echo "$(LAN_IP_MSG)"
BIND=0.0.0.0 HOST=0.0.0.0 CORS_ORIGINS=http://$(LAN_IP):3000 $(COMPOSE) up --watch

## Tail logs for all services
logs:
$(COMPOSE) logs -f
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@

---

###UPDATE:

**The primary repository is no longer hosted on github and has moved to gitlab. It can be found here:**

**https://gitlab.com/bigbodycobain/Shadowbroker**


---


![ShadowBroker](/uploads/46f99d19fa141a2efba37feee9de8aab/Title.jpg)
Expand Down
16 changes: 16 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
- /app/.next
environment:
- HOST=0.0.0.0
- NODE_ENV=development
command: next dev --hostname 0.0.0.0 --port 3000

6 changes: 6 additions & 0 deletions docker-compose.override.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# docker-compose.override.yml (automatically loaded)
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.dev
29 changes: 29 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@ services:
volumes:
- backend_data:/app/data
restart: unless-stopped
develop:
watch:
- action: sync+restart
path: ./backend
target: /app
ignore:
- __pycache__/
- "*.pyc"
- "*.pyc"
- node_modules/
- action: rebuild
path: pyproject.toml
- action: rebuild
path: uv.lock
- action: rebuild
path: backend/package.json
- action: rebuild
path: backend/package-lock.json
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"]
interval: 15s
Expand All @@ -45,10 +63,21 @@ services:
# Points the Next.js server-side proxy at the backend container via Docker networking.
# Change this if your backend runs on a different host or port.
- BACKEND_URL=http://backend:8000
- HOST=${HOST:-127.0.0.1}
depends_on:
backend:
condition: service_healthy
restart: unless-stopped
develop:
watch:
- action: sync
path: ./frontend
target: /app
ignore:
- node_modules/
- .next/
- action: rebuild
path: ./frontend/package.json
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/"]
interval: 30s
Expand Down
9 changes: 9 additions & 0 deletions frontend/Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM node:20-alpine
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
ENV NEXT_TELEMETRY_DISABLED=1
EXPOSE 3000
CMD ["npx", "next", "dev", "--hostname", "0.0.0.0", "--port", "3000"]
25 changes: 23 additions & 2 deletions frontend/next.config.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,30 @@
import type { NextConfig } from 'next';
import type { NextConfig } from "next";
import os from "os";

// /api/* requests are proxied to the backend by the catch-all route handler at
// src/app/api/[...path]/route.ts, which reads BACKEND_URL at request time.
// Do NOT add rewrites for /api/* here — next.config is evaluated at build time,
// so any URL baked in here ignores the runtime BACKEND_URL env var.

function getLanOrigins(): string[] {
if (process.env.HOST !== "0.0.0.0") return [];

const origins = new Set<string>();

for (const ifaces of Object.values(os.networkInterfaces())) {
for (const iface of ifaces ?? []) {
if (iface.family === "IPv4" && !iface.internal) {
const subnet = iface.address.split(".").slice(0, 3).join(".");
origins.add(`${subnet}.*`);
}
}
}

return [...origins];
}

const lanOrigins = getLanOrigins();

const skipTypecheck = process.env.NEXT_SKIP_TYPECHECK === '1';
const isDev = process.env.NODE_ENV !== 'production';
const securityHeaders = [
Expand Down Expand Up @@ -44,7 +64,7 @@ const securityHeaders = [
];

const nextConfig: NextConfig = {
transpilePackages: ['react-map-gl', 'maplibre-gl'],
transpilePackages: ['react-map-gl', 'mapbox-gl', 'maplibre-gl'],
output: 'standalone',
devIndicators: false,
images: {
Expand All @@ -68,6 +88,7 @@ const nextConfig: NextConfig = {
},
];
},
...(lanOrigins.length > 0 && { allowedDevOrigins: lanOrigins }),
};

export default nextConfig;