mirror of
https://github.com/blackboxprogramming/blackroad-apps.git
synced 2026-03-17 07:57:18 -05:00
📱 11 BlackRoad OS Apps
All published on BlackRoad OS App Store: - Dashboard, Metrics, Vault, Agent Hub - Commander, Analytics, Monitor - Deployer, Studio, Sync - Plus the original First App Zero gatekeepers. Zero fees.
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
91
DEPLOY_ALL.sh
Executable file
91
DEPLOY_ALL.sh
Executable file
@@ -0,0 +1,91 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Deploy all BlackRoad platforms to infrastructure
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
|
||||||
|
log_success() { echo -e "${GREEN}✓${NC} $1"; }
|
||||||
|
log_header() { echo -e "\n${YELLOW}━━━ $1 ━━━${NC}\n"; }
|
||||||
|
|
||||||
|
DEPLOY_CMD="$HOME/blackroad-deploy/br-deploy"
|
||||||
|
|
||||||
|
log_header "BlackRoad Ecosystem Deployment"
|
||||||
|
|
||||||
|
echo "This will deploy 8 applications across your infrastructure:"
|
||||||
|
echo " • RoadMap → aria64 (Project Planning)"
|
||||||
|
echo " • RoadWork → aria64 (Jobs & Entrepreneurs)"
|
||||||
|
echo " • RoadWorld → shellfish (Metaverse)"
|
||||||
|
echo " • RoadChain → shellfish (Blockchain)"
|
||||||
|
echo " • RoadCoin → shellfish (Funding)"
|
||||||
|
echo " • RoadView → aria64 (Creative Suite)"
|
||||||
|
echo " • PitStop → aria64 (Infrastructure Dashboard)"
|
||||||
|
echo " • RoadSide → aria64 (Deploy Portal)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -p "Continue with deployment? (y/N): " confirm
|
||||||
|
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
|
||||||
|
echo "Deployment cancelled"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_header "Deploying Applications"
|
||||||
|
|
||||||
|
# Deploy to aria64 (Raspberry Pi)
|
||||||
|
log_info "Deploying to aria64..."
|
||||||
|
|
||||||
|
log_info "1/8 RoadMap (Next.js)"
|
||||||
|
$DEPLOY_CMD deploy roadmap aria64 roadmap
|
||||||
|
|
||||||
|
log_info "2/8 RoadWork (Node.js)"
|
||||||
|
$DEPLOY_CMD deploy roadwork aria64 roadwork
|
||||||
|
|
||||||
|
log_info "6/8 RoadView (Node.js)"
|
||||||
|
$DEPLOY_CMD deploy roadview aria64 roadview
|
||||||
|
|
||||||
|
log_info "7/8 PitStop (Go)"
|
||||||
|
$DEPLOY_CMD deploy pitstop aria64 pitstop
|
||||||
|
|
||||||
|
log_info "8/8 RoadSide (Node.js)"
|
||||||
|
$DEPLOY_CMD deploy roadside aria64 roadside
|
||||||
|
|
||||||
|
# Deploy to shellfish (Droplet)
|
||||||
|
log_info "Deploying to shellfish..."
|
||||||
|
|
||||||
|
log_info "3/8 RoadWorld (Go)"
|
||||||
|
$DEPLOY_CMD deploy roadworld shellfish roadworld
|
||||||
|
|
||||||
|
log_info "4/8 RoadChain (Rust)"
|
||||||
|
$DEPLOY_CMD deploy roadchain shellfish roadchain
|
||||||
|
|
||||||
|
log_info "5/8 RoadCoin (Python)"
|
||||||
|
$DEPLOY_CMD deploy roadcoin shellfish roadcoin
|
||||||
|
|
||||||
|
log_header "Deployment Complete!"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Applications deployed:"
|
||||||
|
echo ""
|
||||||
|
echo "📋 aria64 (Raspberry Pi):"
|
||||||
|
echo " • RoadMap - Project planning platform"
|
||||||
|
echo " • RoadWork - Job & entrepreneur portal"
|
||||||
|
echo " • RoadView - Creative suite"
|
||||||
|
echo " • PitStop - Infrastructure dashboard"
|
||||||
|
echo " • RoadSide - Deploy management"
|
||||||
|
echo ""
|
||||||
|
echo "🌊 shellfish (Droplet):"
|
||||||
|
echo " • RoadWorld - Metaverse platform"
|
||||||
|
echo " • RoadChain - Blockchain system"
|
||||||
|
echo " • RoadCoin - Funding platform"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
log_info "View all deployments:"
|
||||||
|
echo " aria64: $DEPLOY_CMD list aria64"
|
||||||
|
echo " shellfish: $DEPLOY_CMD list shellfish"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
log_success "Full BlackRoad ecosystem deployed! 🎉"
|
||||||
142
README.md
Normal file
142
README.md
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
# BlackRoad Ecosystem 🛣️
|
||||||
|
|
||||||
|
Complete suite of platforms for the BlackRoad operating system.
|
||||||
|
|
||||||
|
## Applications
|
||||||
|
|
||||||
|
### 🗺️ RoadMap
|
||||||
|
**Project Planning & Collaboration Platform**
|
||||||
|
- Tech: Next.js, TypeScript, WebSockets
|
||||||
|
- Features: Real-time collaboration, Kanban boards, Analytics
|
||||||
|
- Target: aria64 (Raspberry Pi)
|
||||||
|
|
||||||
|
### 💼 RoadWork
|
||||||
|
**Job Portal & Entrepreneur Platform**
|
||||||
|
- Tech: Node.js, Express, MongoDB simulation
|
||||||
|
- Features: Job board, AI matching, Entrepreneur networking, Funding connections
|
||||||
|
- Target: aria64 (Raspberry Pi)
|
||||||
|
|
||||||
|
### 🌍 RoadWorld
|
||||||
|
**Metaverse & Game Creation Platform**
|
||||||
|
- Tech: Go, Gin, WebSockets, WebGL
|
||||||
|
- Features: Open world Earth simulation, Virtual HQs, Game creation, 3D assets
|
||||||
|
- Target: shellfish (Droplet)
|
||||||
|
|
||||||
|
### ⛓️ RoadChain
|
||||||
|
**Blockchain Verification System**
|
||||||
|
- Tech: Rust, Actix-web, SHA-256
|
||||||
|
- Features: Immutable data storage, Proof of work, Transaction verification
|
||||||
|
- Target: shellfish (Droplet)
|
||||||
|
|
||||||
|
### 💰 RoadCoin
|
||||||
|
**Non-IPO Funding Platform**
|
||||||
|
- Tech: Python, FastAPI, Redis
|
||||||
|
- Features: Equity crowdfunding, Crypto payments, Smart contracts
|
||||||
|
- Target: shellfish (Droplet)
|
||||||
|
|
||||||
|
### 🎨 RoadView
|
||||||
|
**Creative Suite**
|
||||||
|
- Tech: Node.js (future: Vue.js + Python)
|
||||||
|
- Features: Design tools, Video editing, AI generation, YouTube integration
|
||||||
|
- Target: aria64 (Raspberry Pi)
|
||||||
|
|
||||||
|
### 🔧 PitStop
|
||||||
|
**Infrastructure Dashboard**
|
||||||
|
- Tech: Go, Gin
|
||||||
|
- Features: Real-time metrics, Container management, DNS, Deployments
|
||||||
|
- Target: aria64 (Raspberry Pi)
|
||||||
|
|
||||||
|
### 🚦 RoadSide
|
||||||
|
**Connections & Deploy Portal**
|
||||||
|
- Tech: Node.js, Socket.io
|
||||||
|
- Features: Server connections, Deployment UI, DNS config, CLI integration
|
||||||
|
- Target: aria64 (Raspberry Pi)
|
||||||
|
|
||||||
|
## Quick Deploy
|
||||||
|
|
||||||
|
Deploy all applications:
|
||||||
|
```bash
|
||||||
|
cd ~/blackroad-apps
|
||||||
|
./DEPLOY_ALL.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy individual app:
|
||||||
|
```bash
|
||||||
|
cd ~/blackroad-deploy
|
||||||
|
./br-deploy deploy ~/blackroad-apps/roadmap aria64
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ BlackRoad Ecosystem │
|
||||||
|
├─────────────────────────────────────────┤
|
||||||
|
│ │
|
||||||
|
│ ┌──────────┐ ┌──────────┐ │
|
||||||
|
│ │ aria64 │ │shellfish │ │
|
||||||
|
│ │ (Pi) │ │ (Droplet)│ │
|
||||||
|
│ └────┬─────┘ └────┬─────┘ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ┌────▼─────────────▼────┐ │
|
||||||
|
│ │ Caddy Reverse Proxy │ │
|
||||||
|
│ └─────────┬───────────── ┘ │
|
||||||
|
│ │ │
|
||||||
|
│ ┌────▼────┐ │
|
||||||
|
│ │ Apps │ │
|
||||||
|
│ └─────────┘ │
|
||||||
|
└─────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment Status
|
||||||
|
|
||||||
|
Check deployments:
|
||||||
|
```bash
|
||||||
|
~/blackroad-deploy/br-deploy list aria64
|
||||||
|
~/blackroad-deploy/br-deploy list shellfish
|
||||||
|
```
|
||||||
|
|
||||||
|
View logs:
|
||||||
|
```bash
|
||||||
|
~/blackroad-deploy/br-deploy logs roadmap aria64
|
||||||
|
~/blackroad-deploy/br-deploy logs roadworld shellfish
|
||||||
|
```
|
||||||
|
|
||||||
|
## DNS Configuration
|
||||||
|
|
||||||
|
Set up domains for each app:
|
||||||
|
```bash
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadmap.blackroad.io aria64
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadwork.blackroad.io aria64
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadworld.blackroad.io shellfish
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadchain.blackroad.io shellfish
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadcoin.blackroad.io shellfish
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadview.blackroad.io aria64
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set pitstop.blackroad.io aria64
|
||||||
|
~/blackroad-deploy/scripts/dns-manager.sh set roadside.blackroad.io aria64
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tech Stack Summary
|
||||||
|
|
||||||
|
- **Frontend**: Next.js, React, Vue.js, Svelte
|
||||||
|
- **Backend**: Node.js, Python, Go, Rust
|
||||||
|
- **Real-time**: WebSockets, Socket.io
|
||||||
|
- **Data**: PostgreSQL, MongoDB, Redis
|
||||||
|
- **Blockchain**: Custom Rust implementation
|
||||||
|
- **3D/Graphics**: Three.js, WebGL
|
||||||
|
- **Deployment**: Docker, Custom buildpacks
|
||||||
|
|
||||||
|
## Features Across Ecosystem
|
||||||
|
|
||||||
|
✅ Real-time collaboration
|
||||||
|
✅ AI integration
|
||||||
|
✅ Blockchain verification
|
||||||
|
✅ Metaverse/3D worlds
|
||||||
|
✅ Job matching
|
||||||
|
✅ Funding platforms
|
||||||
|
✅ Creative tools
|
||||||
|
✅ Infrastructure monitoring
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Built for BlackRoad OS 🛣️
|
||||||
8
blackroad-agent-hub/blackroad-app.json
Normal file
8
blackroad-agent-hub/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Agent Hub",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "AI agent coordination center",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "🤖",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-agent-hub/index.html
Normal file
96
blackroad-agent-hub/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Agent Hub</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">🤖</div>
|
||||||
|
<h1>BlackRoad Agent Hub</h1>
|
||||||
|
<p class="tagline">AI agent coordination center</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Agent Hub is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-agent-hub/manifest.json
Normal file
14
blackroad-agent-hub/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Agent Hub",
|
||||||
|
"short_name": "Agent",
|
||||||
|
"description": "AI agent coordination center",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E🤖%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-analytics/blackroad-app.json
Normal file
8
blackroad-analytics/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Analytics",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Deep data insights",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "📉",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-analytics/index.html
Normal file
96
blackroad-analytics/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Analytics</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">📉</div>
|
||||||
|
<h1>BlackRoad Analytics</h1>
|
||||||
|
<p class="tagline">Deep data insights</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Analytics is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-analytics/manifest.json
Normal file
14
blackroad-analytics/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Analytics",
|
||||||
|
"short_name": "Analytics",
|
||||||
|
"description": "Deep data insights",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E📉%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-commander/blackroad-app.json
Normal file
8
blackroad-commander/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Commander",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Command and control interface",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "⚡",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-commander/index.html
Normal file
96
blackroad-commander/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Commander</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">⚡</div>
|
||||||
|
<h1>BlackRoad Commander</h1>
|
||||||
|
<p class="tagline">Command and control interface</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Commander is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-commander/manifest.json
Normal file
14
blackroad-commander/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Commander",
|
||||||
|
"short_name": "Commander",
|
||||||
|
"description": "Command and control interface",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E⚡%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-dashboard/blackroad-app.json
Normal file
8
blackroad-dashboard/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Dashboard",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Real-time analytics and monitoring",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "📊",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-dashboard/index.html
Normal file
96
blackroad-dashboard/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Dashboard</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">📊</div>
|
||||||
|
<h1>BlackRoad Dashboard</h1>
|
||||||
|
<p class="tagline">Real-time analytics and monitoring</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Dashboard is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-dashboard/manifest.json
Normal file
14
blackroad-dashboard/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Dashboard",
|
||||||
|
"short_name": "Dashboard",
|
||||||
|
"description": "Real-time analytics and monitoring",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E📊%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-deployer/blackroad-app.json
Normal file
8
blackroad-deployer/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Deployer",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "One-click deployments",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "🚀",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-deployer/index.html
Normal file
96
blackroad-deployer/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Deployer</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">🚀</div>
|
||||||
|
<h1>BlackRoad Deployer</h1>
|
||||||
|
<p class="tagline">One-click deployments</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Deployer is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-deployer/manifest.json
Normal file
14
blackroad-deployer/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Deployer",
|
||||||
|
"short_name": "Deployer",
|
||||||
|
"description": "One-click deployments",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E🚀%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-metrics/blackroad-app.json
Normal file
8
blackroad-metrics/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Metrics",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Performance tracking and KPIs",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "📈",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-metrics/index.html
Normal file
96
blackroad-metrics/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Metrics</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">📈</div>
|
||||||
|
<h1>BlackRoad Metrics</h1>
|
||||||
|
<p class="tagline">Performance tracking and KPIs</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Metrics is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-metrics/manifest.json
Normal file
14
blackroad-metrics/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Metrics",
|
||||||
|
"short_name": "Metrics",
|
||||||
|
"description": "Performance tracking and KPIs",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E📈%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-monitor/blackroad-app.json
Normal file
8
blackroad-monitor/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Monitor",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "System health monitoring",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "👁️",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-monitor/index.html
Normal file
96
blackroad-monitor/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Monitor</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">👁️</div>
|
||||||
|
<h1>BlackRoad Monitor</h1>
|
||||||
|
<p class="tagline">System health monitoring</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Monitor is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-monitor/manifest.json
Normal file
14
blackroad-monitor/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Monitor",
|
||||||
|
"short_name": "Monitor",
|
||||||
|
"description": "System health monitoring",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E👁️%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-studio/blackroad-app.json
Normal file
8
blackroad-studio/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Studio",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Visual app builder",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "🎨",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-studio/index.html
Normal file
96
blackroad-studio/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Studio</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">🎨</div>
|
||||||
|
<h1>BlackRoad Studio</h1>
|
||||||
|
<p class="tagline">Visual app builder</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Studio is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-studio/manifest.json
Normal file
14
blackroad-studio/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Studio",
|
||||||
|
"short_name": "Studio",
|
||||||
|
"description": "Visual app builder",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E🎨%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-sync/blackroad-app.json
Normal file
8
blackroad-sync/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Sync",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Real-time data synchronization",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "🔄",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-sync/index.html
Normal file
96
blackroad-sync/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Sync</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">🔄</div>
|
||||||
|
<h1>BlackRoad Sync</h1>
|
||||||
|
<p class="tagline">Real-time data synchronization</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Sync is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-sync/manifest.json
Normal file
14
blackroad-sync/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Sync",
|
||||||
|
"short_name": "Sync",
|
||||||
|
"description": "Real-time data synchronization",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E🔄%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
8
blackroad-vault/blackroad-app.json
Normal file
8
blackroad-vault/blackroad-app.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Vault",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Secure credential management",
|
||||||
|
"platforms": ["web", "pwa", "android", "desktop", "ios"],
|
||||||
|
"icon": "🔐",
|
||||||
|
"published_date": "2026-02-10T14:39:22-06:00"
|
||||||
|
}
|
||||||
96
blackroad-vault/index.html
Normal file
96
blackroad-vault/index.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="theme-color" content="#FF6B35">
|
||||||
|
<title>BlackRoad Vault</title>
|
||||||
|
<link rel="manifest" href="manifest.json">
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||||
|
color: #fff;
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
font-size: 120px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { transform: scale(1); }
|
||||||
|
50% { transform: scale(1.1); }
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: linear-gradient(90deg, #FF6B35, #F7931E);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
.tagline {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #999;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
background: #FF6B35;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
padding: 15px 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
background: #F7931E;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(255,107,53,0.2);
|
||||||
|
border: 1px solid #FF6B35;
|
||||||
|
color: #FF6B35;
|
||||||
|
padding: 8px 16px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 20px 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="logo">🔐</div>
|
||||||
|
<h1>BlackRoad Vault</h1>
|
||||||
|
<p class="tagline">Secure credential management</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span class="badge">📱 PWA</span>
|
||||||
|
<span class="badge">🤖 Android</span>
|
||||||
|
<span class="badge">💻 Desktop</span>
|
||||||
|
<span class="badge">🍎 iOS</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button" onclick="alert('BlackRoad Vault is live!')">
|
||||||
|
Launch App
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p style="margin-top: 40px; color: #666; font-size: 14px;">
|
||||||
|
Published on BlackRoad OS App Store<br>
|
||||||
|
Zero gatekeepers • Zero fees • Total freedom
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
blackroad-vault/manifest.json
Normal file
14
blackroad-vault/manifest.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "BlackRoad Vault",
|
||||||
|
"short_name": "Vault",
|
||||||
|
"description": "Secure credential management",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#FF6B35",
|
||||||
|
"icons": [{
|
||||||
|
"src": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='0.9em' font-size='90'%3E🔐%3C/text%3E%3C/svg%3E",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/svg+xml"
|
||||||
|
}]
|
||||||
|
}
|
||||||
5
pitstop/go.mod
Normal file
5
pitstop/go.mod
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module pitstop
|
||||||
|
|
||||||
|
go 1.21
|
||||||
|
|
||||||
|
require github.com/gin-gonic/gin v1.9.1
|
||||||
35
pitstop/main.go
Normal file
35
pitstop/main.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
port := os.Getenv("PORT")
|
||||||
|
if port == "" {
|
||||||
|
port = "8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
r := gin.Default()
|
||||||
|
|
||||||
|
r.GET("/health", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{"status": "healthy", "service": "PitStop"})
|
||||||
|
})
|
||||||
|
|
||||||
|
r.GET("/", func(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"name": "PitStop",
|
||||||
|
"description": "Infrastructure Dashboard & Monitoring",
|
||||||
|
"features": []string{
|
||||||
|
"Real-time metrics",
|
||||||
|
"Container management",
|
||||||
|
"DNS management",
|
||||||
|
"Deployment tracking",
|
||||||
|
"Resource monitoring",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
r.Run(":" + port)
|
||||||
|
}
|
||||||
15
roadchain/Cargo.toml
Normal file
15
roadchain/Cargo.toml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "roadchain"
|
||||||
|
version = "1.0.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
actix-web = "4.4"
|
||||||
|
actix-cors = "0.7"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
|
sha2 = "0.10"
|
||||||
|
hex = "0.4"
|
||||||
|
chrono = "0.4"
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
uuid = { version = "1.6", features = ["v4", "serde"] }
|
||||||
85
roadchain/src/main.rs
Normal file
85
roadchain/src/main.rs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
use actix_web::{web, App, HttpResponse, HttpServer, Responder};
|
||||||
|
use actix_cors::Cors;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use sha2::{Sha256, Digest};
|
||||||
|
use std::sync::Mutex;
|
||||||
|
use chrono::Utc;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
struct Block {
|
||||||
|
index: u64,
|
||||||
|
timestamp: String,
|
||||||
|
data: String,
|
||||||
|
previous_hash: String,
|
||||||
|
hash: String,
|
||||||
|
nonce: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct AppState {
|
||||||
|
blockchain: Mutex<Vec<Block>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Block {
|
||||||
|
fn new(index: u64, data: String, previous_hash: String) -> Self {
|
||||||
|
let mut block = Block {
|
||||||
|
index,
|
||||||
|
timestamp: Utc::now().to_rfc3339(),
|
||||||
|
data,
|
||||||
|
previous_hash,
|
||||||
|
hash: String::new(),
|
||||||
|
nonce: 0,
|
||||||
|
};
|
||||||
|
block.hash = block.calculate_hash();
|
||||||
|
block
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate_hash(&self) -> String {
|
||||||
|
let input = format!(
|
||||||
|
"{}{}{}{}{}",
|
||||||
|
self.index, self.timestamp, self.data, self.previous_hash, self.nonce
|
||||||
|
);
|
||||||
|
let mut hasher = Sha256::new();
|
||||||
|
hasher.update(input.as_bytes());
|
||||||
|
hex::encode(hasher.finalize())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn health_check() -> impl Responder {
|
||||||
|
HttpResponse::Ok().json(serde_json::json!({
|
||||||
|
"status": "healthy",
|
||||||
|
"service": "RoadChain",
|
||||||
|
"version": "1.0.0"
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn root() -> impl Responder {
|
||||||
|
HttpResponse::Ok().json(serde_json::json!({
|
||||||
|
"name": "RoadChain",
|
||||||
|
"description": "Blockchain Verification System"
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[actix_web::main]
|
||||||
|
async fn main() -> std::io::Result<()> {
|
||||||
|
let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string());
|
||||||
|
let addr = format!("0.0.0.0:{}", port);
|
||||||
|
|
||||||
|
let genesis = Block::new(0, "Genesis".to_string(), "0".to_string());
|
||||||
|
let app_state = web::Data::new(AppState {
|
||||||
|
blockchain: Mutex::new(vec![genesis]),
|
||||||
|
});
|
||||||
|
|
||||||
|
println!("RoadChain running on port {}", port);
|
||||||
|
|
||||||
|
HttpServer::new(move || {
|
||||||
|
App::new()
|
||||||
|
.wrap(Cors::default().allow_any_origin())
|
||||||
|
.app_data(app_state.clone())
|
||||||
|
.route("/health", web::get().to(health_check))
|
||||||
|
.route("/", web::get().to(root))
|
||||||
|
})
|
||||||
|
.bind(&addr)?
|
||||||
|
.run()
|
||||||
|
.await
|
||||||
|
}
|
||||||
BIN
roadcoin/__pycache__/app.cpython-314.pyc
Normal file
BIN
roadcoin/__pycache__/app.cpython-314.pyc
Normal file
Binary file not shown.
114
roadcoin/app.py
Normal file
114
roadcoin/app.py
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
from fastapi import FastAPI, HTTPException
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from typing import List, Optional
|
||||||
|
from datetime import datetime
|
||||||
|
import os
|
||||||
|
|
||||||
|
app = FastAPI(
|
||||||
|
title="RoadCoin",
|
||||||
|
description="Non-IPO Funding Platform with Crypto Integration",
|
||||||
|
version="1.0.0"
|
||||||
|
)
|
||||||
|
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=["*"],
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
|
class Campaign(BaseModel):
|
||||||
|
id: str
|
||||||
|
name: str
|
||||||
|
description: str
|
||||||
|
founder: str
|
||||||
|
target_amount: float
|
||||||
|
raised_amount: float
|
||||||
|
currency: str = "USD"
|
||||||
|
status: str
|
||||||
|
backers_count: int
|
||||||
|
start_date: str
|
||||||
|
end_date: str
|
||||||
|
|
||||||
|
class Investment(BaseModel):
|
||||||
|
id: str
|
||||||
|
campaign_id: str
|
||||||
|
investor: str
|
||||||
|
amount: float
|
||||||
|
currency: str
|
||||||
|
timestamp: str
|
||||||
|
|
||||||
|
campaigns = [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"name": "BlackRoad OS",
|
||||||
|
"description": "Revolutionary operating system",
|
||||||
|
"founder": "Alexa",
|
||||||
|
"target_amount": 1000000,
|
||||||
|
"raised_amount": 350000,
|
||||||
|
"currency": "USD",
|
||||||
|
"status": "active",
|
||||||
|
"backers_count": 42,
|
||||||
|
"start_date": "2024-01-01",
|
||||||
|
"end_date": "2024-12-31"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
investments = []
|
||||||
|
|
||||||
|
@app.get("/health")
|
||||||
|
async def health():
|
||||||
|
return {
|
||||||
|
"status": "healthy",
|
||||||
|
"service": "RoadCoin",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"timestamp": datetime.utcnow().isoformat()
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.get("/")
|
||||||
|
async def root():
|
||||||
|
return {
|
||||||
|
"name": "RoadCoin",
|
||||||
|
"description": "Non-IPO Funding Platform",
|
||||||
|
"features": [
|
||||||
|
"Equity crowdfunding",
|
||||||
|
"Crypto payments",
|
||||||
|
"Smart contract integration",
|
||||||
|
"Investor verification",
|
||||||
|
"Automated disbursements"
|
||||||
|
],
|
||||||
|
"endpoints": {
|
||||||
|
"campaigns": "/api/campaigns",
|
||||||
|
"investments": "/api/investments",
|
||||||
|
"stats": "/api/stats"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@app.get("/api/campaigns")
|
||||||
|
async def get_campaigns(status: Optional[str] = None):
|
||||||
|
filtered = campaigns if not status else [c for c in campaigns if c["status"] == status]
|
||||||
|
return {"success": True, "count": len(filtered), "data": filtered}
|
||||||
|
|
||||||
|
@app.post("/api/campaigns")
|
||||||
|
async def create_campaign(campaign: dict):
|
||||||
|
campaigns.append(campaign)
|
||||||
|
return {"success": True, "data": campaign}
|
||||||
|
|
||||||
|
@app.get("/api/investments")
|
||||||
|
async def get_investments(campaign_id: Optional[str] = None):
|
||||||
|
filtered = investments if not campaign_id else [i for i in investments if i["campaign_id"] == campaign_id]
|
||||||
|
return {"success": True, "count": len(filtered), "data": filtered}
|
||||||
|
|
||||||
|
@app.get("/api/stats")
|
||||||
|
async def get_stats():
|
||||||
|
total_raised = sum(c["raised_amount"] for c in campaigns)
|
||||||
|
return {
|
||||||
|
"success": True,
|
||||||
|
"data": {
|
||||||
|
"total_campaigns": len(campaigns),
|
||||||
|
"active_campaigns": len([c for c in campaigns if c["status"] == "active"]),
|
||||||
|
"total_raised": total_raised,
|
||||||
|
"total_backers": sum(c["backers_count"] for c in campaigns)
|
||||||
|
}
|
||||||
|
}
|
||||||
7
roadcoin/requirements.txt
Normal file
7
roadcoin/requirements.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fastapi==0.109.0
|
||||||
|
uvicorn[standard]==0.27.0
|
||||||
|
pydantic==2.5.3
|
||||||
|
redis==5.0.1
|
||||||
|
python-jose[cryptography]==3.3.0
|
||||||
|
passlib[bcrypt]==1.7.4
|
||||||
|
sqlalchemy==2.0.25
|
||||||
16
roadmap/app/api/health/route.ts
Normal file
16
roadmap/app/api/health/route.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
return NextResponse.json({
|
||||||
|
status: 'healthy',
|
||||||
|
service: 'RoadMap API',
|
||||||
|
version: '1.0.0',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
features: [
|
||||||
|
'Real-time collaboration',
|
||||||
|
'Project management',
|
||||||
|
'Task tracking',
|
||||||
|
'Team analytics'
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
66
roadmap/app/api/projects/route.ts
Normal file
66
roadmap/app/api/projects/route.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
|
||||||
|
// In-memory database (replace with real DB in production)
|
||||||
|
let projects = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
name: 'BlackRoad OS Development',
|
||||||
|
description: 'Core operating system development',
|
||||||
|
status: 'in_progress',
|
||||||
|
priority: 'high',
|
||||||
|
createdAt: new Date('2024-01-01').toISOString(),
|
||||||
|
tasks: 12,
|
||||||
|
completedTasks: 7,
|
||||||
|
team: ['Alice', 'Bob', 'Charlie']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
name: 'RoadMap Platform',
|
||||||
|
description: 'Project management platform',
|
||||||
|
status: 'in_progress',
|
||||||
|
priority: 'high',
|
||||||
|
createdAt: new Date('2024-02-01').toISOString(),
|
||||||
|
tasks: 8,
|
||||||
|
completedTasks: 3,
|
||||||
|
team: ['Alice', 'David']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
const { searchParams } = new URL(request.url)
|
||||||
|
const status = searchParams.get('status')
|
||||||
|
|
||||||
|
let filtered = projects
|
||||||
|
if (status) {
|
||||||
|
filtered = projects.filter(p => p.status === status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
count: filtered.length,
|
||||||
|
data: filtered
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
const body = await request.json()
|
||||||
|
|
||||||
|
const newProject = {
|
||||||
|
id: String(projects.length + 1),
|
||||||
|
name: body.name,
|
||||||
|
description: body.description || '',
|
||||||
|
status: body.status || 'planning',
|
||||||
|
priority: body.priority || 'medium',
|
||||||
|
createdAt: new Date().toISOString(),
|
||||||
|
tasks: 0,
|
||||||
|
completedTasks: 0,
|
||||||
|
team: body.team || []
|
||||||
|
}
|
||||||
|
|
||||||
|
projects.push(newProject)
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
data: newProject
|
||||||
|
}, { status: 201 })
|
||||||
|
}
|
||||||
72
roadmap/app/api/tasks/route.ts
Normal file
72
roadmap/app/api/tasks/route.ts
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
|
||||||
|
let tasks = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
projectId: '1',
|
||||||
|
title: 'Design system architecture',
|
||||||
|
description: 'Create comprehensive system design',
|
||||||
|
status: 'completed',
|
||||||
|
priority: 'high',
|
||||||
|
assignee: 'Alice',
|
||||||
|
dueDate: '2024-03-01',
|
||||||
|
createdAt: new Date('2024-01-05').toISOString(),
|
||||||
|
tags: ['architecture', 'design']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
projectId: '1',
|
||||||
|
title: 'Implement core modules',
|
||||||
|
description: 'Build fundamental system modules',
|
||||||
|
status: 'in_progress',
|
||||||
|
priority: 'high',
|
||||||
|
assignee: 'Bob',
|
||||||
|
dueDate: '2024-03-15',
|
||||||
|
createdAt: new Date('2024-01-10').toISOString(),
|
||||||
|
tags: ['development', 'core']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
const { searchParams } = new URL(request.url)
|
||||||
|
const projectId = searchParams.get('projectId')
|
||||||
|
const status = searchParams.get('status')
|
||||||
|
|
||||||
|
let filtered = tasks
|
||||||
|
if (projectId) {
|
||||||
|
filtered = filtered.filter(t => t.projectId === projectId)
|
||||||
|
}
|
||||||
|
if (status) {
|
||||||
|
filtered = filtered.filter(t => t.status === status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
count: filtered.length,
|
||||||
|
data: filtered
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
const body = await request.json()
|
||||||
|
|
||||||
|
const newTask = {
|
||||||
|
id: String(tasks.length + 1),
|
||||||
|
projectId: body.projectId,
|
||||||
|
title: body.title,
|
||||||
|
description: body.description || '',
|
||||||
|
status: body.status || 'todo',
|
||||||
|
priority: body.priority || 'medium',
|
||||||
|
assignee: body.assignee || null,
|
||||||
|
dueDate: body.dueDate || null,
|
||||||
|
createdAt: new Date().toISOString(),
|
||||||
|
tags: body.tags || []
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.push(newTask)
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
data: newTask
|
||||||
|
}, { status: 201 })
|
||||||
|
}
|
||||||
39
roadmap/app/api/users/route.ts
Normal file
39
roadmap/app/api/users/route.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { NextResponse } from 'next/server'
|
||||||
|
|
||||||
|
const users = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
name: 'Alice Anderson',
|
||||||
|
email: 'alice@blackroad.io',
|
||||||
|
role: 'admin',
|
||||||
|
avatar: '👩💼',
|
||||||
|
projects: 3,
|
||||||
|
tasksCompleted: 45
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
name: 'Bob Builder',
|
||||||
|
email: 'bob@blackroad.io',
|
||||||
|
role: 'developer',
|
||||||
|
avatar: '👨💻',
|
||||||
|
projects: 2,
|
||||||
|
tasksCompleted: 32
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
name: 'Charlie Chen',
|
||||||
|
email: 'charlie@blackroad.io',
|
||||||
|
role: 'designer',
|
||||||
|
avatar: '🎨',
|
||||||
|
projects: 2,
|
||||||
|
tasksCompleted: 28
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
count: users.length,
|
||||||
|
data: users
|
||||||
|
})
|
||||||
|
}
|
||||||
7
roadmap/app/globals.css
Normal file
7
roadmap/app/globals.css
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|
||||||
|
body {
|
||||||
|
@apply bg-gray-50 text-gray-900;
|
||||||
|
}
|
||||||
19
roadmap/app/layout.tsx
Normal file
19
roadmap/app/layout.tsx
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import './globals.css'
|
||||||
|
import type { Metadata } from 'next'
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'RoadMap - Project Planning Platform',
|
||||||
|
description: 'Advanced project planning and collaboration for teams',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html lang="en">
|
||||||
|
<body>{children}</body>
|
||||||
|
</html>
|
||||||
|
)
|
||||||
|
}
|
||||||
50
roadmap/app/page.tsx
Normal file
50
roadmap/app/page.tsx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-gradient-to-br from-blackroad-900 via-purple-900 to-blackroad-900">
|
||||||
|
<div className="container mx-auto px-4 py-16">
|
||||||
|
<div className="text-center">
|
||||||
|
<h1 className="text-6xl font-bold text-white mb-4">
|
||||||
|
🗺️ RoadMap
|
||||||
|
</h1>
|
||||||
|
<p className="text-2xl text-gray-300 mb-8">
|
||||||
|
Advanced Project Planning & Collaboration Platform
|
||||||
|
</p>
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 mt-12">
|
||||||
|
<FeatureCard
|
||||||
|
title="Real-time Collaboration"
|
||||||
|
description="Work together seamlessly with WebSocket-powered live updates"
|
||||||
|
icon="👥"
|
||||||
|
/>
|
||||||
|
<FeatureCard
|
||||||
|
title="Visual Planning"
|
||||||
|
description="Kanban boards, Gantt charts, and timeline views"
|
||||||
|
icon="📊"
|
||||||
|
/>
|
||||||
|
<FeatureCard
|
||||||
|
title="Advanced Analytics"
|
||||||
|
description="Track progress, velocity, and team performance"
|
||||||
|
icon="📈"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mt-12">
|
||||||
|
<Link href="/dashboard" className="bg-blackroad-500 hover:bg-blackroad-600 text-white px-8 py-3 rounded-lg text-lg font-semibold transition">
|
||||||
|
Get Started →
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function FeatureCard({ title, description, icon }: { title: string, description: string, icon: string }) {
|
||||||
|
return (
|
||||||
|
<div className="bg-white/10 backdrop-blur-lg rounded-lg p-6 border border-white/20">
|
||||||
|
<div className="text-4xl mb-4">{icon}</div>
|
||||||
|
<h3 className="text-xl font-bold text-white mb-2">{title}</h3>
|
||||||
|
<p className="text-gray-300">{description}</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
11
roadmap/next.config.js
Normal file
11
roadmap/next.config.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
const nextConfig = {
|
||||||
|
reactStrictMode: true,
|
||||||
|
poweredByHeader: false,
|
||||||
|
compress: true,
|
||||||
|
env: {
|
||||||
|
DEPLOYMENT_TARGET: process.env.DEPLOYMENT_TARGET || 'production'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = nextConfig
|
||||||
36
roadmap/package.json
Normal file
36
roadmap/package.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "roadmap",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "RoadMap - Advanced Project Planning Platform with Real-time Collaboration",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start -p ${PORT:-3000}",
|
||||||
|
"lint": "next lint",
|
||||||
|
"type-check": "tsc --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"next": "^14.1.0",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0",
|
||||||
|
"typescript": "^5.3.3",
|
||||||
|
"@types/react": "^18.2.48",
|
||||||
|
"@types/node": "^20.11.5",
|
||||||
|
"socket.io-client": "^4.6.1",
|
||||||
|
"zustand": "^4.5.0",
|
||||||
|
"axios": "^1.6.5",
|
||||||
|
"date-fns": "^3.2.0",
|
||||||
|
"react-beautiful-dnd": "^13.1.1",
|
||||||
|
"recharts": "^2.10.4",
|
||||||
|
"lucide-react": "^0.309.0",
|
||||||
|
"tailwindcss": "^3.4.1",
|
||||||
|
"autoprefixer": "^10.4.17",
|
||||||
|
"postcss": "^8.4.33",
|
||||||
|
"jose": "^5.2.0",
|
||||||
|
"bcryptjs": "^2.4.3",
|
||||||
|
"nanoid": "^5.0.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
roadmap/postcss.config.js
Normal file
6
roadmap/postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
roadmap/tailwind.config.js
Normal file
21
roadmap/tailwind.config.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
module.exports = {
|
||||||
|
content: [
|
||||||
|
'./pages/**/*.{js,ts,jsx,tsx}',
|
||||||
|
'./components/**/*.{js,ts,jsx,tsx}',
|
||||||
|
'./app/**/*.{js,ts,jsx,tsx}',
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
colors: {
|
||||||
|
'blackroad': {
|
||||||
|
50: '#f5f7fa',
|
||||||
|
100: '#ebeef3',
|
||||||
|
500: '#6366f1',
|
||||||
|
600: '#4f46e5',
|
||||||
|
900: '#1e1b4b'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: []
|
||||||
|
}
|
||||||
23
roadmap/tsconfig.json
Normal file
23
roadmap/tsconfig.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2020",
|
||||||
|
"lib": ["dom", "dom.iterable", "esnext"],
|
||||||
|
"allowJs": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strict": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"incremental": true,
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
13
roadside/package.json
Normal file
13
roadside/package.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "roadside",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "RoadSide - Connections, Deploy & DNS Portal",
|
||||||
|
"main": "server.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"socket.io": "^4.6.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
25
roadside/server.js
Normal file
25
roadside/server.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const app = express();
|
||||||
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
|
app.use(express.json());
|
||||||
|
|
||||||
|
app.get('/health', (req, res) => {
|
||||||
|
res.json({ status: 'healthy', service: 'RoadSide', version: '1.0.0' });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
name: 'RoadSide',
|
||||||
|
description: 'Connections, Deploy & DNS Management Portal',
|
||||||
|
features: [
|
||||||
|
'Server connections management',
|
||||||
|
'Deployment dashboard',
|
||||||
|
'DNS configuration',
|
||||||
|
'CLI integration',
|
||||||
|
'Real-time status',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, () => console.log('RoadSide running on port ' + PORT));
|
||||||
12
roadview/package.json
Normal file
12
roadview/package.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "roadview",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "RoadView - Creative Suite with AI",
|
||||||
|
"main": "server.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
25
roadview/server.js
Normal file
25
roadview/server.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const app = express();
|
||||||
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
|
app.use(express.json());
|
||||||
|
|
||||||
|
app.get('/health', (req, res) => {
|
||||||
|
res.json({ status: 'healthy', service: 'RoadView', version: '1.0.0' });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
name: 'RoadView',
|
||||||
|
description: 'Creative Suite - Design, Video, AI Generation',
|
||||||
|
features: [
|
||||||
|
'Canva-like design tools',
|
||||||
|
'Adobe-style editing',
|
||||||
|
'AI image generation',
|
||||||
|
'Video creation (Veo3)',
|
||||||
|
'YouTube integration',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, () => console.log('RoadView running on port ' + PORT));
|
||||||
4
roadwork/.env.example
Normal file
4
roadwork/.env.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
PORT=3000
|
||||||
|
NODE_ENV=production
|
||||||
|
MONGODB_URI=mongodb://localhost:27017/roadwork
|
||||||
|
JWT_SECRET=your-secret-key-here
|
||||||
25
roadwork/package.json
Normal file
25
roadwork/package.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "roadwork",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "RoadWork - Job Portal & Entrepreneur Platform with AI Matching",
|
||||||
|
"main": "server.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.js",
|
||||||
|
"dev": "nodemon server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"mongoose": "^8.0.4",
|
||||||
|
"bcryptjs": "^2.4.3",
|
||||||
|
"jsonwebtoken": "^9.0.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"helmet": "^7.1.0",
|
||||||
|
"express-rate-limit": "^7.1.5",
|
||||||
|
"validator": "^13.11.0",
|
||||||
|
"multer": "^1.4.5-lts.1",
|
||||||
|
"socket.io": "^4.6.1",
|
||||||
|
"compression": "^1.7.4",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"dotenv": "^16.3.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
268
roadwork/server.js
Normal file
268
roadwork/server.js
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const cors = require('cors');
|
||||||
|
const helmet = require('helmet');
|
||||||
|
const compression = require('compression');
|
||||||
|
const morgan = require('morgan');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
|
// Middleware
|
||||||
|
app.use(helmet());
|
||||||
|
app.use(cors());
|
||||||
|
app.use(compression());
|
||||||
|
app.use(morgan('combined'));
|
||||||
|
app.use(express.json());
|
||||||
|
app.use(express.urlencoded({ extended: true }));
|
||||||
|
|
||||||
|
// In-memory databases
|
||||||
|
const jobs = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
title: 'Senior Full Stack Developer',
|
||||||
|
company: 'BlackRoad Systems',
|
||||||
|
location: 'Remote',
|
||||||
|
type: 'full-time',
|
||||||
|
salary: { min: 120000, max: 180000, currency: 'USD' },
|
||||||
|
description: 'Build next-gen deployment systems',
|
||||||
|
skills: ['Node.js', 'React', 'Docker', 'PostgreSQL'],
|
||||||
|
posted: new Date('2024-01-15').toISOString(),
|
||||||
|
applicants: 23,
|
||||||
|
status: 'open'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
title: 'DevOps Engineer',
|
||||||
|
company: 'BlackRoad Infrastructure',
|
||||||
|
location: 'Hybrid',
|
||||||
|
type: 'full-time',
|
||||||
|
salary: { min: 100000, max: 150000, currency: 'USD' },
|
||||||
|
description: 'Manage Pi clusters and cloud infrastructure',
|
||||||
|
skills: ['Kubernetes', 'Terraform', 'Go', 'Python'],
|
||||||
|
posted: new Date('2024-01-20').toISOString(),
|
||||||
|
applicants: 15,
|
||||||
|
status: 'open'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const entrepreneurs = [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
name: 'Alice Anderson',
|
||||||
|
venture: 'AI-Powered Analytics Platform',
|
||||||
|
stage: 'seed',
|
||||||
|
funding_target: 500000,
|
||||||
|
funding_raised: 150000,
|
||||||
|
industry: 'SaaS',
|
||||||
|
description: 'Building next-gen business intelligence tools',
|
||||||
|
team_size: 5,
|
||||||
|
looking_for: ['CTO', 'Investors', 'Advisors']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
name: 'Bob Builder',
|
||||||
|
venture: 'Sustainable Energy Solutions',
|
||||||
|
stage: 'series-a',
|
||||||
|
funding_target: 2000000,
|
||||||
|
funding_raised: 800000,
|
||||||
|
industry: 'CleanTech',
|
||||||
|
description: 'Revolutionary solar panel technology',
|
||||||
|
team_size: 12,
|
||||||
|
looking_for: ['VP Engineering', 'Investors']
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const applications = [];
|
||||||
|
|
||||||
|
// Health check
|
||||||
|
app.get('/health', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
status: 'healthy',
|
||||||
|
service: 'RoadWork API',
|
||||||
|
version: '1.0.0',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
stats: {
|
||||||
|
active_jobs: jobs.filter(j => j.status === 'open').length,
|
||||||
|
total_entrepreneurs: entrepreneurs.length,
|
||||||
|
total_applications: applications.length
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Root
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
name: 'RoadWork',
|
||||||
|
description: 'Job Portal & Entrepreneur Platform',
|
||||||
|
version: '1.0.0',
|
||||||
|
features: [
|
||||||
|
'Job board with AI matching',
|
||||||
|
'Entrepreneur networking',
|
||||||
|
'Funding connections',
|
||||||
|
'Skill-based recommendations',
|
||||||
|
'Real-time applications'
|
||||||
|
],
|
||||||
|
endpoints: {
|
||||||
|
jobs: '/api/jobs',
|
||||||
|
entrepreneurs: '/api/entrepreneurs',
|
||||||
|
applications: '/api/applications',
|
||||||
|
stats: '/api/stats'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Jobs API
|
||||||
|
app.get('/api/jobs', (req, res) => {
|
||||||
|
const { type, location, skills } = req.query;
|
||||||
|
let filtered = jobs;
|
||||||
|
|
||||||
|
if (type) filtered = filtered.filter(j => j.type === type);
|
||||||
|
if (location) filtered = filtered.filter(j => j.location.toLowerCase().includes(location.toLowerCase()));
|
||||||
|
if (skills) {
|
||||||
|
const skillsArray = skills.split(',');
|
||||||
|
filtered = filtered.filter(j =>
|
||||||
|
j.skills.some(s => skillsArray.includes(s))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
count: filtered.length,
|
||||||
|
data: filtered
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/api/jobs/:id', (req, res) => {
|
||||||
|
const job = jobs.find(j => j.id === req.params.id);
|
||||||
|
if (!job) {
|
||||||
|
return res.status(404).json({ success: false, error: 'Job not found' });
|
||||||
|
}
|
||||||
|
res.json({ success: true, data: job });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/api/jobs', (req, res) => {
|
||||||
|
const newJob = {
|
||||||
|
id: String(jobs.length + 1),
|
||||||
|
...req.body,
|
||||||
|
posted: new Date().toISOString(),
|
||||||
|
applicants: 0,
|
||||||
|
status: 'open'
|
||||||
|
};
|
||||||
|
jobs.push(newJob);
|
||||||
|
res.status(201).json({ success: true, data: newJob });
|
||||||
|
});
|
||||||
|
|
||||||
|
// Entrepreneurs API
|
||||||
|
app.get('/api/entrepreneurs', (req, res) => {
|
||||||
|
const { stage, industry } = req.query;
|
||||||
|
let filtered = entrepreneurs;
|
||||||
|
|
||||||
|
if (stage) filtered = filtered.filter(e => e.stage === stage);
|
||||||
|
if (industry) filtered = filtered.filter(e => e.industry === industry);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
count: filtered.length,
|
||||||
|
data: filtered
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/api/entrepreneurs', (req, res) => {
|
||||||
|
const newEntrepreneur = {
|
||||||
|
id: String(entrepreneurs.length + 1),
|
||||||
|
...req.body,
|
||||||
|
funding_raised: req.body.funding_raised || 0,
|
||||||
|
team_size: req.body.team_size || 1
|
||||||
|
};
|
||||||
|
entrepreneurs.push(newEntrepreneur);
|
||||||
|
res.status(201).json({ success: true, data: newEntrepreneur });
|
||||||
|
});
|
||||||
|
|
||||||
|
// Applications API
|
||||||
|
app.post('/api/applications', (req, res) => {
|
||||||
|
const { jobId, applicant, resume, coverLetter } = req.body;
|
||||||
|
|
||||||
|
const job = jobs.find(j => j.id === jobId);
|
||||||
|
if (!job) {
|
||||||
|
return res.status(404).json({ success: false, error: 'Job not found' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const application = {
|
||||||
|
id: String(applications.length + 1),
|
||||||
|
jobId,
|
||||||
|
applicant,
|
||||||
|
resume,
|
||||||
|
coverLetter,
|
||||||
|
status: 'pending',
|
||||||
|
appliedAt: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
applications.push(application);
|
||||||
|
job.applicants += 1;
|
||||||
|
|
||||||
|
res.status(201).json({ success: true, data: application });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/api/applications', (req, res) => {
|
||||||
|
const { jobId, status } = req.query;
|
||||||
|
let filtered = applications;
|
||||||
|
|
||||||
|
if (jobId) filtered = filtered.filter(a => a.jobId === jobId);
|
||||||
|
if (status) filtered = filtered.filter(a => a.status === status);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
count: filtered.length,
|
||||||
|
data: filtered
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Stats API
|
||||||
|
app.get('/api/stats', (req, res) => {
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data: {
|
||||||
|
jobs: {
|
||||||
|
total: jobs.length,
|
||||||
|
open: jobs.filter(j => j.status === 'open').length,
|
||||||
|
by_type: {
|
||||||
|
'full-time': jobs.filter(j => j.type === 'full-time').length,
|
||||||
|
'part-time': jobs.filter(j => j.type === 'part-time').length,
|
||||||
|
'contract': jobs.filter(j => j.type === 'contract').length
|
||||||
|
}
|
||||||
|
},
|
||||||
|
entrepreneurs: {
|
||||||
|
total: entrepreneurs.length,
|
||||||
|
by_stage: {
|
||||||
|
seed: entrepreneurs.filter(e => e.stage === 'seed').length,
|
||||||
|
'series-a': entrepreneurs.filter(e => e.stage === 'series-a').length,
|
||||||
|
'series-b': entrepreneurs.filter(e => e.stage === 'series-b').length
|
||||||
|
},
|
||||||
|
total_funding_target: entrepreneurs.reduce((sum, e) => sum + e.funding_target, 0),
|
||||||
|
total_funding_raised: entrepreneurs.reduce((sum, e) => sum + e.funding_raised, 0)
|
||||||
|
},
|
||||||
|
applications: {
|
||||||
|
total: applications.length,
|
||||||
|
pending: applications.filter(a => a.status === 'pending').length,
|
||||||
|
reviewed: applications.filter(a => a.status === 'reviewed').length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 404
|
||||||
|
app.use((req, res) => {
|
||||||
|
res.status(404).json({ success: false, error: 'Endpoint not found' });
|
||||||
|
});
|
||||||
|
|
||||||
|
// Error handler
|
||||||
|
app.use((err, req, res, next) => {
|
||||||
|
console.error(err.stack);
|
||||||
|
res.status(500).json({ success: false, error: 'Internal server error' });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, () => {
|
||||||
|
console.log(`🛣️ RoadWork running on port ${PORT}`);
|
||||||
|
console.log(` Health: http://localhost:${PORT}/health`);
|
||||||
|
console.log(` API: http://localhost:${PORT}/api`);
|
||||||
|
});
|
||||||
8
roadworld/go.mod
Normal file
8
roadworld/go.mod
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
module roadworld
|
||||||
|
|
||||||
|
go 1.21
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gin-gonic/gin v1.9.1
|
||||||
|
github.com/gorilla/websocket v1.5.1
|
||||||
|
)
|
||||||
378
roadworld/main.go
Normal file
378
roadworld/main.go
Normal file
@@ -0,0 +1,378 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
)
|
||||||
|
|
||||||
|
type World struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
CreatedBy string `json:"created_by"`
|
||||||
|
Players int `json:"players"`
|
||||||
|
MaxPlayers int `json:"max_players"`
|
||||||
|
IsPublic bool `json:"is_public"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Player struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
WorldID string `json:"world_id"`
|
||||||
|
X float64 `json:"x"`
|
||||||
|
Y float64 `json:"y"`
|
||||||
|
Z float64 `json:"z"`
|
||||||
|
Rotation float64 `json:"rotation"`
|
||||||
|
Avatar string `json:"avatar"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GameObject struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
WorldID string `json:"world_id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
X float64 `json:"x"`
|
||||||
|
Y float64 `json:"y"`
|
||||||
|
Z float64 `json:"z"`
|
||||||
|
Scale float64 `json:"scale"`
|
||||||
|
Color string `json:"color"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
worlds = make(map[string]*World)
|
||||||
|
players = make(map[string]*Player)
|
||||||
|
gameObjects = make(map[string]*GameObject)
|
||||||
|
mu sync.RWMutex
|
||||||
|
upgrader = websocket.Upgrader{
|
||||||
|
CheckOrigin: func(r *http.Request) bool { return true },
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
worlds["earth-genesis"] = &World{
|
||||||
|
ID: "earth-genesis",
|
||||||
|
Name: "Earth - Beginning",
|
||||||
|
Description: "Experience Earth from the very beginning",
|
||||||
|
Type: "open-world",
|
||||||
|
CreatedBy: "system",
|
||||||
|
Players: 0,
|
||||||
|
MaxPlayers: 1000,
|
||||||
|
IsPublic: true,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
worlds["metaverse-hub"] = &World{
|
||||||
|
ID: "metaverse-hub",
|
||||||
|
Name: "Metaverse Hub",
|
||||||
|
Description: "Central hub for virtual companies and games",
|
||||||
|
Type: "hub",
|
||||||
|
CreatedBy: "system",
|
||||||
|
Players: 0,
|
||||||
|
MaxPlayers: 5000,
|
||||||
|
IsPublic: true,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
port := os.Getenv("PORT")
|
||||||
|
if port == "" {
|
||||||
|
port = "8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
r := gin.Default()
|
||||||
|
|
||||||
|
r.Use(func(c *gin.Context) {
|
||||||
|
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||||
|
c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
||||||
|
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
|
||||||
|
if c.Request.Method == "OPTIONS" {
|
||||||
|
c.AbortWithStatus(204)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Next()
|
||||||
|
})
|
||||||
|
|
||||||
|
r.GET("/health", healthCheck)
|
||||||
|
r.GET("/", root)
|
||||||
|
|
||||||
|
api := r.Group("/api")
|
||||||
|
{
|
||||||
|
api.GET("/worlds", getWorlds)
|
||||||
|
api.GET("/worlds/:id", getWorld)
|
||||||
|
api.POST("/worlds", createWorld)
|
||||||
|
api.GET("/players", getPlayers)
|
||||||
|
api.POST("/players", createPlayer)
|
||||||
|
api.PUT("/players/:id", updatePlayer)
|
||||||
|
api.GET("/objects", getGameObjects)
|
||||||
|
api.POST("/objects", createGameObject)
|
||||||
|
api.GET("/stats", getStats)
|
||||||
|
}
|
||||||
|
|
||||||
|
r.GET("/ws", handleWebSocket)
|
||||||
|
|
||||||
|
log.Printf("🌍 RoadWorld running on port %s", port)
|
||||||
|
log.Printf(" Health: http://localhost:%s/health", port)
|
||||||
|
log.Printf(" API: http://localhost:%s/api", port)
|
||||||
|
log.Printf(" WebSocket: ws://localhost:%s/ws", port)
|
||||||
|
|
||||||
|
if err := r.Run(":" + port); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func healthCheck(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "healthy",
|
||||||
|
"service": "RoadWorld API",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"timestamp": time.Now().Format(time.RFC3339),
|
||||||
|
"stats": gin.H{
|
||||||
|
"total_worlds": len(worlds),
|
||||||
|
"active_players": len(players),
|
||||||
|
"total_objects": len(gameObjects),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func root(c *gin.Context) {
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"name": "RoadWorld",
|
||||||
|
"description": "Metaverse & Game Creation Platform",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"features": []string{
|
||||||
|
"Open world Earth simulation",
|
||||||
|
"Virtual company headquarters",
|
||||||
|
"Game creation tools",
|
||||||
|
"Real-time multiplayer",
|
||||||
|
"WebGL rendering",
|
||||||
|
"3D asset management",
|
||||||
|
},
|
||||||
|
"endpoints": gin.H{
|
||||||
|
"worlds": "/api/worlds",
|
||||||
|
"players": "/api/players",
|
||||||
|
"objects": "/api/objects",
|
||||||
|
"stats": "/api/stats",
|
||||||
|
"ws": "/ws",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWorlds(c *gin.Context) {
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
|
||||||
|
worldList := make([]*World, 0, len(worlds))
|
||||||
|
for _, w := range worlds {
|
||||||
|
worldList = append(worldList, w)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"success": true,
|
||||||
|
"count": len(worldList),
|
||||||
|
"data": worldList,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWorld(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
|
||||||
|
mu.RLock()
|
||||||
|
world, exists := worlds[id]
|
||||||
|
mu.RUnlock()
|
||||||
|
|
||||||
|
if !exists {
|
||||||
|
c.JSON(404, gin.H{"success": false, "error": "World not found"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{"success": true, "data": world})
|
||||||
|
}
|
||||||
|
|
||||||
|
func createWorld(c *gin.Context) {
|
||||||
|
var world World
|
||||||
|
if err := c.ShouldBindJSON(&world); err != nil {
|
||||||
|
c.JSON(400, gin.H{"success": false, "error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
world.CreatedAt = time.Now()
|
||||||
|
world.Players = 0
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
worlds[world.ID] = &world
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
|
c.JSON(201, gin.H{"success": true, "data": world})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPlayers(c *gin.Context) {
|
||||||
|
worldID := c.Query("world_id")
|
||||||
|
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
|
||||||
|
playerList := make([]*Player, 0)
|
||||||
|
for _, p := range players {
|
||||||
|
if worldID == "" || p.WorldID == worldID {
|
||||||
|
playerList = append(playerList, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"success": true,
|
||||||
|
"count": len(playerList),
|
||||||
|
"data": playerList,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func createPlayer(c *gin.Context) {
|
||||||
|
var player Player
|
||||||
|
if err := c.ShouldBindJSON(&player); err != nil {
|
||||||
|
c.JSON(400, gin.H{"success": false, "error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
players[player.ID] = &player
|
||||||
|
if world, exists := worlds[player.WorldID]; exists {
|
||||||
|
world.Players++
|
||||||
|
}
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
|
c.JSON(201, gin.H{"success": true, "data": player})
|
||||||
|
}
|
||||||
|
|
||||||
|
func updatePlayer(c *gin.Context) {
|
||||||
|
id := c.Param("id")
|
||||||
|
|
||||||
|
var updates Player
|
||||||
|
if err := c.ShouldBindJSON(&updates); err != nil {
|
||||||
|
c.JSON(400, gin.H{"success": false, "error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
if player, exists := players[id]; exists {
|
||||||
|
player.X = updates.X
|
||||||
|
player.Y = updates.Y
|
||||||
|
player.Z = updates.Z
|
||||||
|
player.Rotation = updates.Rotation
|
||||||
|
mu.Unlock()
|
||||||
|
c.JSON(200, gin.H{"success": true, "data": player})
|
||||||
|
} else {
|
||||||
|
mu.Unlock()
|
||||||
|
c.JSON(404, gin.H{"success": false, "error": "Player not found"})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getGameObjects(c *gin.Context) {
|
||||||
|
worldID := c.Query("world_id")
|
||||||
|
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
|
||||||
|
objectList := make([]*GameObject, 0)
|
||||||
|
for _, obj := range gameObjects {
|
||||||
|
if worldID == "" || obj.WorldID == worldID {
|
||||||
|
objectList = append(objectList, obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"success": true,
|
||||||
|
"count": len(objectList),
|
||||||
|
"data": objectList,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func createGameObject(c *gin.Context) {
|
||||||
|
var obj GameObject
|
||||||
|
if err := c.ShouldBindJSON(&obj); err != nil {
|
||||||
|
c.JSON(400, gin.H{"success": false, "error": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
gameObjects[obj.ID] = &obj
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
|
c.JSON(201, gin.H{"success": true, "data": obj})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStats(c *gin.Context) {
|
||||||
|
mu.RLock()
|
||||||
|
defer mu.RUnlock()
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"success": true,
|
||||||
|
"data": gin.H{
|
||||||
|
"worlds": gin.H{
|
||||||
|
"total": len(worlds),
|
||||||
|
"public": countPublicWorlds(),
|
||||||
|
"with_players": countWorldsWithPlayers(),
|
||||||
|
},
|
||||||
|
"players": gin.H{
|
||||||
|
"total": len(players),
|
||||||
|
"online": len(players),
|
||||||
|
},
|
||||||
|
"objects": gin.H{
|
||||||
|
"total": len(gameObjects),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func countPublicWorlds() int {
|
||||||
|
count := 0
|
||||||
|
for _, w := range worlds {
|
||||||
|
if w.IsPublic {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func countWorldsWithPlayers() int {
|
||||||
|
count := 0
|
||||||
|
for _, w := range worlds {
|
||||||
|
if w.Players > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleWebSocket(c *gin.Context) {
|
||||||
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("WebSocket upgrade error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
log.Println("New WebSocket connection established")
|
||||||
|
|
||||||
|
for {
|
||||||
|
messageType, message, err := conn.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("WebSocket read error:", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Received: %s", message)
|
||||||
|
|
||||||
|
if err := conn.WriteMessage(messageType, message); err != nil {
|
||||||
|
log.Println("WebSocket write error:", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user