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 ( + + +
+ +
{children}
+
+ + + ); +} 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 ( + + +
+ +
{children}
+
+ + + ); +} 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 ( + + +
+
BlackRoad OS
+ +
+
{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"] +}