2026-02-17 15:03:34 +00:00
|
|
|
<template>
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
<div class="min-h-full">
|
|
|
|
|
<BootScreen :visible="showBootScreen" @ready="onServerReady" />
|
|
|
|
|
<div v-if="!showBootScreen" class="min-h-full flex items-center justify-center">
|
|
|
|
|
<div class="flex flex-col items-center gap-4 opacity-0 root-redirect-fade">
|
|
|
|
|
<svg class="animate-spin h-8 w-8 text-white/60" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
|
|
|
|
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
|
|
|
|
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
|
|
|
|
</svg>
|
|
|
|
|
</div>
|
2026-02-17 15:03:34 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
import { ref, onMounted } from 'vue'
|
|
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
2026-02-17 15:03:34 +00:00
|
|
|
import { isOnboardingComplete } from '@/composables/useOnboarding'
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
import BootScreen from '@/components/BootScreen.vue'
|
2026-02-17 15:03:34 +00:00
|
|
|
|
|
|
|
|
const router = useRouter()
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
const route = useRoute()
|
|
|
|
|
const showBootScreen = ref(false)
|
2026-02-17 15:03:34 +00:00
|
|
|
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
async function quickHealthCheck(): Promise<boolean> {
|
|
|
|
|
try {
|
|
|
|
|
const ac = new AbortController()
|
|
|
|
|
const t = setTimeout(() => ac.abort(), 2000)
|
|
|
|
|
const res = await fetch('/rpc/v1', {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
|
|
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'server.echo', params: { message: 'ping' } }),
|
|
|
|
|
signal: ac.signal,
|
|
|
|
|
})
|
|
|
|
|
clearTimeout(t)
|
|
|
|
|
return res.status !== 502 && res.status !== 503
|
|
|
|
|
} catch {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function proceedToApp() {
|
2026-02-17 15:03:34 +00:00
|
|
|
const devMode = import.meta.env.VITE_DEV_MODE
|
|
|
|
|
if (devMode === 'setup' || devMode === 'existing') {
|
2026-03-01 17:53:18 +00:00
|
|
|
router.replace('/login').catch(() => {})
|
2026-02-17 15:03:34 +00:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-09 19:32:28 +00:00
|
|
|
const localComplete = localStorage.getItem('neode_onboarding_complete') === '1'
|
|
|
|
|
if (localComplete) {
|
|
|
|
|
router.replace('/login').catch(() => {})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-01 17:53:18 +00:00
|
|
|
let seenOnboarding = false
|
|
|
|
|
try {
|
|
|
|
|
const result = await Promise.race([
|
|
|
|
|
isOnboardingComplete(),
|
2026-03-09 19:32:28 +00:00
|
|
|
new Promise<boolean>((resolve) => setTimeout(() => resolve(false), 3000)),
|
2026-03-01 17:53:18 +00:00
|
|
|
])
|
|
|
|
|
seenOnboarding = result
|
|
|
|
|
} catch {
|
2026-03-09 19:32:28 +00:00
|
|
|
seenOnboarding = false
|
2026-03-01 17:53:18 +00:00
|
|
|
}
|
|
|
|
|
router.replace(seenOnboarding ? '/login' : '/onboarding/intro').catch(() => {})
|
feat: v1.2.0-alpha — E2E encrypted mesh relay, steganography, relay status polling
Phase 5 mesh networking:
- E2E encrypted TX relay (X25519 + ChaCha20-Poly1305) — non-Archy nodes
relay encrypted blobs transparently via Meshcore native routing
- Steganographic encoding modes (WeatherStation, SensorNetwork) — traffic
looks like sensor data on the wire, 0xAA marker, configurable per-node
- Pre-flight Bitcoin Core health check on relay node — specific error codes
(bitcoin_unreachable, bitcoin_syncing, tx_rejected) instead of generic fails
- mesh.relay-status RPC endpoint — frontend polls for relay result every 3s
- On-Chain / Lightning tabs in Off-Grid Bitcoin panel
- Archy Peers vs Mesh Broadcast relay mode selector
- Mesh view fills viewport (no page scroll), internal panel scrolling
- Version bump to 1.2.0-alpha
Also includes: deploy hardening, container fixes, IndeedHub updates,
boot screen, dashboard improvements, MASTER_PLAN task tracking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 23:56:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onServerReady() {
|
|
|
|
|
// Clear flags so splash intro plays on reload
|
|
|
|
|
localStorage.removeItem('neode_intro_seen')
|
|
|
|
|
localStorage.removeItem('neode_onboarding_complete')
|
|
|
|
|
// Reload with ?intro=1 so we know to skip boot and let App.vue handle splash
|
|
|
|
|
window.location.href = '/?intro=1'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
const devMode = import.meta.env.VITE_DEV_MODE
|
|
|
|
|
|
|
|
|
|
// Coming back from boot screen — do nothing, let App.vue's SplashScreen take over
|
|
|
|
|
if (route.query.intro === '1') {
|
|
|
|
|
// Clean the URL without navigating
|
|
|
|
|
window.history.replaceState({}, '', '/')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Standard dev modes
|
|
|
|
|
if (devMode === 'setup' || devMode === 'existing') {
|
|
|
|
|
proceedToApp()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Boot dev mode — always show boot screen
|
|
|
|
|
if (devMode === 'boot') {
|
|
|
|
|
showBootScreen.value = true
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Production: quick health check
|
|
|
|
|
const isUp = await quickHealthCheck()
|
|
|
|
|
if (isUp) {
|
|
|
|
|
proceedToApp()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Server not ready — show boot screen
|
|
|
|
|
showBootScreen.value = true
|
2026-02-17 15:03:34 +00:00
|
|
|
})
|
|
|
|
|
</script>
|
2026-03-09 19:32:28 +00:00
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.root-redirect-fade {
|
|
|
|
|
animation: root-fade-in 0.3s ease 0.5s forwards;
|
|
|
|
|
}
|
|
|
|
|
@keyframes root-fade-in {
|
|
|
|
|
to { opacity: 1; }
|
|
|
|
|
}
|
|
|
|
|
</style>
|