feat: Add 9 BlackRoad portals - complete ecosystem#25
feat: Add 9 BlackRoad portals - complete ecosystem#25blackboxprogramming wants to merge 2 commits intomainfrom
Conversation
New portals: - Roadview: Live journey streaming with MapLibre + WebSocket - Lucidia: Knowledge base with MDX guides - Roadcode: Browser-based code sandbox - Radius: Local meetup discovery with geospatial - Roadworld: Social feed aggregating all portal activity - Roadcoin: Token wallet with balance/staking - Roadchain: Blockchain explorer for travel proofs - Roadie: AI travel assistant with voice UI - Universal Computer: Master console unifying all portals Infrastructure: - Channel protocol at ~/.blackroad/channel/ - Portal-specific communication channels - Unified workspace with pnpm 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
https://github.com/blackboxprogramming/blackroad/blob/b2611b4f9200b48ceca797bbb99105cb69984786/apps/radius/app/layout.tsx#L1
Export a root layout for each new App Router app
app/layout.tsx is empty here, so this Next.js app has no default root layout export; next dev/next build will fail before serving pages. The same empty-file pattern appears in apps/roadchain/app/layout.tsx, apps/roadcode/app/layout.tsx, apps/roadcoin/app/layout.tsx, apps/roadie/app/layout.tsx, apps/roadworld/app/layout.tsx, and apps/universal/app/layout.tsx, which means most newly added portals cannot start.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| { name: 'Roadbook', desc: 'Trip journals', port: 3001, color: '#FF1D6C', icon: '📔' }, | ||
| { name: 'Roadview', desc: 'Live maps', port: 3001, color: '#FF1D6C', icon: '🗺️' }, |
There was a problem hiding this comment.
Point Roadbook tile to its own port
Both Roadbook and Roadview are configured with port: 3001, so the Universal dashboard routes two different tiles to the same target URL and users cannot reach a distinct Roadbook endpoint from this console. This is especially visible because the repository already has a separate apps/roadbook app, but clicking the Roadbook tile will navigate to the Roadview address.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This PR introduces a complete ecosystem of 9 new portal applications to the BlackRoad monorepo, creating a unified development environment. The Universal Computer serves as a master console providing centralized access to all portals via localhost URLs. Each portal is built as a Next.js 14 application using the App Router architecture, with Tailwind CSS for styling and workspace-based dependency management via pnpm.
Changes:
- Added Universal Computer portal - master console aggregating all 9 portals
- Added 8 new specialized portals: Roadview (live maps), Lucidia (knowledge base), Roadcode (code sandbox), Radius (local meetups), Roadworld (social feed), Roadcoin (wallet), Roadchain (blockchain explorer), and Roadie (AI assistant)
- Reorganized workspace configuration to include new portal directories
Reviewed changes
Copilot reviewed 47 out of 54 changed files in this pull request and generated 24 comments.
Show a summary per file
| File | Description |
|---|---|
| pnpm-workspace.yaml | Reordered workspace packages (apps before packages) |
| apps/universal/* | Master console portal listing all 9 portals on their respective ports |
| apps/roadview/* | Live journey streaming with MapLibre GL maps and simulated real-time updates |
| apps/lucidia/* | Knowledge base portal with MDX guide library and search functionality |
| apps/roadcode/* | Browser-based code sandbox with JavaScript execution |
| apps/radius/* | Local meetup discovery portal with geospatial event listings |
| apps/roadworld/* | Social feed aggregating activity across all portals |
| apps/roadcoin/* | Cryptocurrency wallet with balance display and transaction history |
| apps/roadchain/* | Blockchain explorer showing blocks, transactions, and network stats |
| apps/roadie/* | AI travel assistant with chat interface and voice input button |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
apps/roadcoin/package.json
Outdated
| "private": true, | ||
| "scripts": { "dev": "next dev -p 3006", "build": "next build", "start": "next start" }, | ||
| "dependencies": { "next": "^14.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "@blackroad/ui": "workspace:*" }, | ||
| "devDependencies": { "@types/react": "^18.2.0", "@types/node": "^20.4.2", "typescript": "^5.1.6" } |
There was a problem hiding this comment.
The application uses Tailwind CSS classes throughout and imports Tailwind directives in globals.css, but the package.json is missing the tailwindcss dependency. Additionally, there is no tailwind.config.js file to configure Tailwind. Both are required for Tailwind to function. Add "tailwindcss", "autoprefixer", and "postcss" to devDependencies, and create a tailwind.config.js file.
| "devDependencies": { "@types/react": "^18.2.0", "@types/node": "^20.4.2", "typescript": "^5.1.6" } | |
| "devDependencies": { "@types/react": "^18.2.0", "@types/node": "^20.4.2", "typescript": "^5.1.6", "tailwindcss": "^3.4.0", "postcss": "^8.4.0", "autoprefixer": "^10.4.0" } |
apps/lucidia/package.json
Outdated
| "devDependencies": { | ||
| "@types/react": "^18.2.0", | ||
| "@types/node": "^20.4.2", | ||
| "typescript": "^5.1.6" |
There was a problem hiding this comment.
The application uses Tailwind CSS classes throughout and imports Tailwind directives in globals.css, but the package.json is missing the tailwindcss dependency. Additionally, there is no tailwind.config.js or tsconfig.json or next.config.js file. These configuration files are necessary for the Next.js application to build and run properly. Add "tailwindcss", "autoprefixer", and "postcss" to devDependencies, and create the missing configuration files. Reference the Roadview portal for examples.
| "typescript": "^5.1.6" | |
| "typescript": "^5.1.6", | |
| "tailwindcss": "^3.4.0", | |
| "autoprefixer": "^10.4.0", | |
| "postcss": "^8.4.0" |
apps/roadie/tsconfig.json
Outdated
| @@ -0,0 +1 @@ | |||
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |||
There was a problem hiding this comment.
The tsconfig.json is minified into a single line, making it difficult to read and maintain. Consider formatting it with proper indentation across multiple lines for better readability and version control diffs.
apps/radius/tsconfig.json
Outdated
| @@ -0,0 +1 @@ | |||
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |||
There was a problem hiding this comment.
The tsconfig.json is minified into a single line, making it difficult to read and maintain. Consider formatting it with proper indentation across multiple lines for better readability and version control diffs.
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |
| { | |
| "compilerOptions": { | |
| "target": "es5", | |
| "lib": [ | |
| "dom", | |
| "esnext" | |
| ], | |
| "jsx": "preserve", | |
| "module": "esnext", | |
| "moduleResolution": "bundler", | |
| "strict": true, | |
| "noEmit": true, | |
| "esModuleInterop": true | |
| }, | |
| "include": [ | |
| "**/*.ts", | |
| "**/*.tsx" | |
| ], | |
| "exclude": [ | |
| "node_modules" | |
| ] | |
| } |
| <input | ||
| placeholder="Search across all portals..." | ||
| className="w-full bg-gray-900 border border-gray-700 rounded-xl px-6 py-4 text-lg focus:border-pink-500 outline-none" | ||
| /> |
There was a problem hiding this comment.
The search input is missing accessibility attributes. Add a type="search" attribute and an aria-label or associate it with a visible label for screen reader users. For example: type="search" aria-label="Search across all portals".
| <input | ||
| value={input} onChange={e => setInput(e.target.value)} onKeyDown={e => e.key === 'Enter' && send()} | ||
| placeholder="Ask Roadie anything..." | ||
| className="flex-1 bg-gray-900 border border-gray-700 rounded-full px-4" | ||
| /> |
There was a problem hiding this comment.
The input element is missing a type attribute and accessibility label. Add type="text" and an aria-label for screen reader users. For example: type="text" aria-label="Ask Roadie a question".
apps/roadworld/package.json
Outdated
| { | ||
| "name": "@blackroad/roadworld", | ||
| "version": "0.0.1", | ||
| "private": true, | ||
| "scripts": { "dev": "next dev -p 3005", "build": "next build", "start": "next start" }, | ||
| "dependencies": { "next": "^14.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "@blackroad/ui": "workspace:*" }, | ||
| "devDependencies": { "@types/react": "^18.2.0", "@types/node": "^20.4.2", "typescript": "^5.1.6" } | ||
| } |
There was a problem hiding this comment.
The application uses Tailwind CSS classes throughout and imports Tailwind directives in globals.css, but the package.json is missing the tailwindcss dependency. Additionally, there is no tailwind.config.js file to configure Tailwind. Both are required for Tailwind to function. Add "tailwindcss", "autoprefixer", and "postcss" to devDependencies, and create a tailwind.config.js file.
apps/universal/tsconfig.json
Outdated
| @@ -0,0 +1 @@ | |||
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |||
There was a problem hiding this comment.
The tsconfig.json is minified into a single line, making it difficult to read and maintain. Consider formatting it with proper indentation across multiple lines for better readability and version control diffs. Reference the Roadview portal's tsconfig.json for a properly formatted example.
apps/roadcoin/tsconfig.json
Outdated
| @@ -0,0 +1 @@ | |||
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |||
There was a problem hiding this comment.
The tsconfig.json is minified into a single line, making it difficult to read and maintain. Consider formatting it with proper indentation across multiple lines for better readability and version control diffs.
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |
| { | |
| "compilerOptions": { | |
| "target": "es5", | |
| "lib": [ | |
| "dom", | |
| "esnext" | |
| ], | |
| "jsx": "preserve", | |
| "module": "esnext", | |
| "moduleResolution": "bundler", | |
| "strict": true, | |
| "noEmit": true, | |
| "esModuleInterop": true | |
| }, | |
| "include": [ | |
| "**/*.ts", | |
| "**/*.tsx" | |
| ], | |
| "exclude": [ | |
| "node_modules" | |
| ] | |
| } |
apps/roadcode/tsconfig.json
Outdated
| @@ -0,0 +1 @@ | |||
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |||
There was a problem hiding this comment.
The tsconfig.json is minified into a single line, making it difficult to read and maintain. Consider formatting it with proper indentation across multiple lines for better readability and version control diffs.
| {"compilerOptions":{"target":"es5","lib":["dom","esnext"],"jsx":"preserve","module":"esnext","moduleResolution":"bundler","strict":true,"noEmit":true,"esModuleInterop":true},"include":["**/*.ts","**/*.tsx"],"exclude":["node_modules"]} | |
| { | |
| "compilerOptions": { | |
| "target": "es5", | |
| "lib": [ | |
| "dom", | |
| "esnext" | |
| ], | |
| "jsx": "preserve", | |
| "module": "esnext", | |
| "moduleResolution": "bundler", | |
| "strict": true, | |
| "noEmit": true, | |
| "esModuleInterop": true | |
| }, | |
| "include": [ | |
| "**/*.ts", | |
| "**/*.tsx" | |
| ], | |
| "exclude": [ | |
| "node_modules" | |
| ] | |
| } |
- Node.js realtime server for local dev (port 8080) - Cloudflare Durable Objects worker for production - Channel connector bridges ~/.blackroad/channel/ with WebSocket - Live journey tracking with simulated movement - Portal-specific message routing (roadview, lucidia, etc.) - REST API for journey creation and status Production: https://blackroad-realtime.amundsonalexa.workers.dev 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Summary
Infrastructure
~/.blackroad/channel/Test plan
pnpm installat rootpnpm --filter @blackroad/<name> dev🤖 Generated with Claude Code