Minimal MVP built with Next.js App Router, TypeScript, Tailwind CSS, Three.js, React Three Fiber, and @react-three/drei.
- Install dependencies:
npm install- Add your Gemini API key:
# .env.local
GEMINI_API_KEY=your_api_key_hereOptional:
GEMINI_MODEL=gemini-2.5-flash
GEMINI_CHAT_MODEL=gemini-2.5-flash
GEMINI_FLASH_MODEL=gemini-2.5-flash
GEMINI_PRO_MODEL=gemini-2.5-pro
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here
ELEVENLABS_VOICE_ID=JBFqnCBsd6RMkjVDRZzb
ELEVENLABS_STT_MODEL=scribe_v2
ELEVENLABS_TTS_MODEL=eleven_multilingual_v2
CORTEX_BIN=cortex
CORTEX_DATA_DIR=.satops-cortex
SATOPS_AGENT_ID=SAT-001- Install the local Cortex Rust binary memory runtime:
# install Rust first via rustup, then:
cargo install cortex-memory- Initialize Cortex once in the local data directory:
mkdir .satops-cortex
cd .satops-cortex
cortex init
cd ..- Start the app:
npm run dev:copilot- The main scene lives in
components/scene/. - Earth rotates slowly while the orbit path remains fixed in an Earth-centered inertial style frame.
- The scene attempts to load the Earth texture from
public/textures/earth_8k.webp. - If you have a higher-fidelity texture asset, place it at
public/textures/earth_8k.webpand it will be used automatically. - Orbit-aware copilot memory is built from one rolling orbital period of deterministic simulation data.
- Completed orbits are checkpointed in
.satops-cortex/satops-memory-state.jsonand mirrored into Cortex when thecortexbinary and project are available. - If Cortex is not installed or not initialized yet, the copilot still works using deterministic short-term orbit context and local baseline state only.
- The AI copilot panel now streams from
app/api/copilot/chat/route.tsusing Gemini Flash by default, and alert triage/escalation is available atapp/api/copilot/alert/route.ts. - Gemini remains the reasoning layer. ElevenLabs is used only for speech-to-text on operator voice input and text-to-speech for Asteri voice replies.