From 5f958e37552caf4518b82fcf9d057c2230258a5e Mon Sep 17 00:00:00 2001
From: Alexa Amundson <118287761+blackboxprogramming@users.noreply.github.com>
Date: Fri, 21 Nov 2025 00:18:26 -0600
Subject: [PATCH] Add Next.js frontends with health endpoints
---
apps/docs/.eslintrc.json | 3 +++
apps/docs/README.md | 7 ++++++
apps/docs/app/globals.css | 14 +++++++++++
apps/docs/app/health/route.ts | 8 ++++++
apps/docs/app/layout.tsx | 35 ++++++++++++++++++++++++++
apps/docs/app/page.tsx | 11 ++++++++
apps/docs/next-env.d.ts | 5 ++++
apps/docs/next.config.mjs | 9 +++++++
apps/docs/package.json | 25 ++++++++++++++++++
apps/docs/tsconfig.json | 19 ++++++++++++++
apps/prism-console/.eslintrc.json | 3 +++
apps/prism-console/app/globals.css | 14 +++++++++++
apps/prism-console/app/health/route.ts | 8 ++++++
apps/prism-console/app/layout.tsx | 35 ++++++++++++++++++++++++++
apps/prism-console/app/page.tsx | 13 ++++++++++
apps/prism-console/next-env.d.ts | 5 ++++
apps/prism-console/next.config.mjs | 12 +++++++++
apps/prism-console/package.json | 25 ++++++++++++++++++
apps/prism-console/tsconfig.json | 19 ++++++++++++++
apps/web/.eslintrc.json | 3 +++
apps/web/app/globals.css | 14 +++++++++++
apps/web/app/health/route.ts | 8 ++++++
apps/web/app/layout.tsx | 32 +++++++++++++++++++++++
apps/web/app/page.tsx | 12 +++++++++
apps/web/next-env.d.ts | 5 ++++
apps/web/next.config.mjs | 9 +++++++
apps/web/package.json | 25 ++++++++++++++++++
apps/web/tsconfig.json | 19 ++++++++++++++
28 files changed, 397 insertions(+)
create mode 100644 apps/docs/.eslintrc.json
create mode 100644 apps/docs/README.md
create mode 100644 apps/docs/app/globals.css
create mode 100644 apps/docs/app/health/route.ts
create mode 100644 apps/docs/app/layout.tsx
create mode 100644 apps/docs/app/page.tsx
create mode 100644 apps/docs/next-env.d.ts
create mode 100644 apps/docs/next.config.mjs
create mode 100644 apps/docs/package.json
create mode 100644 apps/docs/tsconfig.json
create mode 100644 apps/prism-console/.eslintrc.json
create mode 100644 apps/prism-console/app/globals.css
create mode 100644 apps/prism-console/app/health/route.ts
create mode 100644 apps/prism-console/app/layout.tsx
create mode 100644 apps/prism-console/app/page.tsx
create mode 100644 apps/prism-console/next-env.d.ts
create mode 100644 apps/prism-console/next.config.mjs
create mode 100644 apps/prism-console/package.json
create mode 100644 apps/prism-console/tsconfig.json
create mode 100644 apps/web/.eslintrc.json
create mode 100644 apps/web/app/globals.css
create mode 100644 apps/web/app/health/route.ts
create mode 100644 apps/web/app/layout.tsx
create mode 100644 apps/web/app/page.tsx
create mode 100644 apps/web/next-env.d.ts
create mode 100644 apps/web/next.config.mjs
create mode 100644 apps/web/package.json
create mode 100644 apps/web/tsconfig.json
diff --git a/apps/docs/.eslintrc.json b/apps/docs/.eslintrc.json
new file mode 100644
index 0000000..957cd15
--- /dev/null
+++ b/apps/docs/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals"]
+}
diff --git a/apps/docs/README.md b/apps/docs/README.md
new file mode 100644
index 0000000..c702ccd
--- /dev/null
+++ b/apps/docs/README.md
@@ -0,0 +1,7 @@
+# Docs App (monorepo-owned)
+
+- **Canonical path:** `apps/docs`
+- **Mirror:** `BlackRoad-OS/blackroad-os-docs`
+- **Branch:** `main`
+
+Documentation portal for BlackRoad OS. Edits here are mirrored automatically.
diff --git a/apps/docs/app/globals.css b/apps/docs/app/globals.css
new file mode 100644
index 0000000..5c7e509
--- /dev/null
+++ b/apps/docs/app/globals.css
@@ -0,0 +1,14 @@
+:root {
+ color-scheme: dark;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ background-color: #0f1115;
+ color: #f5f6f8;
+}
+
+a {
+ color: inherit;
+}
+
+body {
+ margin: 0;
+}
diff --git a/apps/docs/app/health/route.ts b/apps/docs/app/health/route.ts
new file mode 100644
index 0000000..42a9bc2
--- /dev/null
+++ b/apps/docs/app/health/route.ts
@@ -0,0 +1,8 @@
+import { NextResponse } from "next/server";
+
+export async function GET() {
+ return NextResponse.json({
+ service: "blackroad-os-docs",
+ status: "ok"
+ });
+}
diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx
new file mode 100644
index 0000000..317ff5b
--- /dev/null
+++ b/apps/docs/app/layout.tsx
@@ -0,0 +1,35 @@
+import "./globals.css";
+import type { ReactNode } from "react";
+
+export const metadata = {
+ title: "BlackRoad OS Docs",
+ description: "Documentation for BlackRoad Operating System"
+};
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/apps/docs/app/page.tsx b/apps/docs/app/page.tsx
new file mode 100644
index 0000000..45208d5
--- /dev/null
+++ b/apps/docs/app/page.tsx
@@ -0,0 +1,11 @@
+export default function Page() {
+ return (
+
+
BlackRoad OS – Documentation
+
+ This site will contain architecture, API references, and
+ operator playbooks for the BlackRoad Operating System.
+
+
+ );
+}
diff --git a/apps/docs/next-env.d.ts b/apps/docs/next-env.d.ts
new file mode 100644
index 0000000..4f11a03
--- /dev/null
+++ b/apps/docs/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs
new file mode 100644
index 0000000..4ad17ed
--- /dev/null
+++ b/apps/docs/next.config.mjs
@@ -0,0 +1,9 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: "standalone",
+ experimental: {
+ appDir: true
+ }
+};
+
+export default nextConfig;
diff --git a/apps/docs/package.json b/apps/docs/package.json
new file mode 100644
index 0000000..4b3c33f
--- /dev/null
+++ b/apps/docs/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "blackroad-os-docs",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev -p 8080",
+ "build": "next build",
+ "start": "next start -p 8080",
+ "lint": "next lint",
+ "health": "curl -f http://localhost:8080/health || exit 1"
+ },
+ "dependencies": {
+ "next": "14.2.3",
+ "react": "18.3.1",
+ "react-dom": "18.3.1"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.0",
+ "@types/react": "^18.3.0",
+ "@types/react-dom": "^18.3.0",
+ "eslint": "^9.0.0",
+ "eslint-config-next": "^15.0.0",
+ "typescript": "^5.6.0"
+ }
+}
diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json
new file mode 100644
index 0000000..e2cb2e8
--- /dev/null
+++ b/apps/docs/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/apps/prism-console/.eslintrc.json b/apps/prism-console/.eslintrc.json
new file mode 100644
index 0000000..957cd15
--- /dev/null
+++ b/apps/prism-console/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals"]
+}
diff --git a/apps/prism-console/app/globals.css b/apps/prism-console/app/globals.css
new file mode 100644
index 0000000..5c7e509
--- /dev/null
+++ b/apps/prism-console/app/globals.css
@@ -0,0 +1,14 @@
+:root {
+ color-scheme: dark;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ background-color: #0f1115;
+ color: #f5f6f8;
+}
+
+a {
+ color: inherit;
+}
+
+body {
+ margin: 0;
+}
diff --git a/apps/prism-console/app/health/route.ts b/apps/prism-console/app/health/route.ts
new file mode 100644
index 0000000..72aa940
--- /dev/null
+++ b/apps/prism-console/app/health/route.ts
@@ -0,0 +1,8 @@
+import { NextResponse } from "next/server";
+
+export async function GET() {
+ return NextResponse.json({
+ service: "blackroad-os-prism-console",
+ status: "ok"
+ });
+}
diff --git a/apps/prism-console/app/layout.tsx b/apps/prism-console/app/layout.tsx
new file mode 100644
index 0000000..61d32b7
--- /dev/null
+++ b/apps/prism-console/app/layout.tsx
@@ -0,0 +1,35 @@
+import "./globals.css";
+import type { ReactNode } from "react";
+
+export const metadata = {
+ title: "BlackRoad OS – Prism Console",
+ description: "Operator console for BlackRoad OS"
+};
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/apps/prism-console/app/page.tsx b/apps/prism-console/app/page.tsx
new file mode 100644
index 0000000..47e61dc
--- /dev/null
+++ b/apps/prism-console/app/page.tsx
@@ -0,0 +1,13 @@
+export default function Page() {
+ return (
+
+
Prism Console
+
Welcome to the BlackRoad OS operator console.
+
+ - Monitor services
+ - Inspect agents
+ - Trigger workflows
+
+
+ );
+}
diff --git a/apps/prism-console/next-env.d.ts b/apps/prism-console/next-env.d.ts
new file mode 100644
index 0000000..4f11a03
--- /dev/null
+++ b/apps/prism-console/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/prism-console/next.config.mjs b/apps/prism-console/next.config.mjs
new file mode 100644
index 0000000..f6590b5
--- /dev/null
+++ b/apps/prism-console/next.config.mjs
@@ -0,0 +1,12 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: "standalone",
+ experimental: {
+ appDir: true
+ },
+ env: {
+ API_URL: process.env.API_URL || "https://api.blackroad.systems"
+ }
+};
+
+export default nextConfig;
diff --git a/apps/prism-console/package.json b/apps/prism-console/package.json
new file mode 100644
index 0000000..5398e9b
--- /dev/null
+++ b/apps/prism-console/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "blackroad-os-prism-console",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev -p 8080",
+ "build": "next build",
+ "start": "next start -p 8080",
+ "lint": "next lint",
+ "health": "curl -f http://localhost:8080/health || exit 1"
+ },
+ "dependencies": {
+ "next": "14.2.3",
+ "react": "18.3.1",
+ "react-dom": "18.3.1"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.0",
+ "@types/react": "^18.3.0",
+ "@types/react-dom": "^18.3.0",
+ "eslint": "^9.0.0",
+ "eslint-config-next": "^15.0.0",
+ "typescript": "^5.6.0"
+ }
+}
diff --git a/apps/prism-console/tsconfig.json b/apps/prism-console/tsconfig.json
new file mode 100644
index 0000000..e2cb2e8
--- /dev/null
+++ b/apps/prism-console/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json
new file mode 100644
index 0000000..957cd15
--- /dev/null
+++ b/apps/web/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals"]
+}
diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css
new file mode 100644
index 0000000..5c7e509
--- /dev/null
+++ b/apps/web/app/globals.css
@@ -0,0 +1,14 @@
+:root {
+ color-scheme: dark;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ background-color: #0f1115;
+ color: #f5f6f8;
+}
+
+a {
+ color: inherit;
+}
+
+body {
+ margin: 0;
+}
diff --git a/apps/web/app/health/route.ts b/apps/web/app/health/route.ts
new file mode 100644
index 0000000..8ac1c44
--- /dev/null
+++ b/apps/web/app/health/route.ts
@@ -0,0 +1,8 @@
+import { NextResponse } from "next/server";
+
+export async function GET() {
+ return NextResponse.json({
+ service: "blackroad-os-web",
+ status: "ok"
+ });
+}
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
new file mode 100644
index 0000000..d0b54c5
--- /dev/null
+++ b/apps/web/app/layout.tsx
@@ -0,0 +1,32 @@
+import "./globals.css";
+import type { ReactNode } from "react";
+
+export const metadata = {
+ title: "BlackRoad OS",
+ description: "The BlackRoad Operating System"
+};
+
+export default function RootLayout({ children }: { children: ReactNode }) {
+ return (
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
new file mode 100644
index 0000000..7462522
--- /dev/null
+++ b/apps/web/app/page.tsx
@@ -0,0 +1,12 @@
+export default function Page() {
+ return (
+
+
BlackRoad Operating System
+
+ A multi-service, agent-native OS for orchestrating AI, compute,
+ and compliance.
+
+
Deployed on Railway. Fronted by Cloudflare. Driven by you.
+
+ );
+}
diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts
new file mode 100644
index 0000000..4f11a03
--- /dev/null
+++ b/apps/web/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs
new file mode 100644
index 0000000..4ad17ed
--- /dev/null
+++ b/apps/web/next.config.mjs
@@ -0,0 +1,9 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ output: "standalone",
+ experimental: {
+ appDir: true
+ }
+};
+
+export default nextConfig;
diff --git a/apps/web/package.json b/apps/web/package.json
new file mode 100644
index 0000000..2a9f54a
--- /dev/null
+++ b/apps/web/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "blackroad-os-web",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev -p 8080",
+ "build": "next build",
+ "start": "next start -p 8080",
+ "lint": "next lint",
+ "health": "curl -f http://localhost:8080/health || exit 1"
+ },
+ "dependencies": {
+ "next": "14.2.3",
+ "react": "18.3.1",
+ "react-dom": "18.3.1"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.0",
+ "@types/react": "^18.3.0",
+ "@types/react-dom": "^18.3.0",
+ "eslint": "^9.0.0",
+ "eslint-config-next": "^15.0.0",
+ "typescript": "^5.6.0"
+ }
+}
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
new file mode 100644
index 0000000..e2cb2e8
--- /dev/null
+++ b/apps/web/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}