<div class="neon-hero" markdown>
  <img src="assets/neon-logo.svg" alt="Neon Logo"/>
  <h1>NEON</h1>
  <p class="neon-subtitle">Vision · Language · Action</p>
  <p>Open-source VLA model for the Unitree G1 humanoid robot.</p>
  <p>Video foundation model backbone · 29 DoF whole-body control · Audio in/out</p>
  <div class="neon-badges">
    <img src="https://img.shields.io/badge/License-MIT-green.svg" alt="MIT"/>
    <img src="https://img.shields.io/badge/tests-80%20passed-brightgreen" alt="tests"/>
    <img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="python"/>
  </div>
</div>

<div class="neon-stats" markdown>
  <span class="neon-stat"><span class="accent">29</span> DoF</span>
  <span class="neon-stat"><span class="accent">80</span> Tests</span>
  <span class="neon-stat"><span class="accent">7</span> Data Sources</span>
  <span class="neon-stat"><span class="accent">4</span> Training Configs</span>
  <span class="neon-stat">Parameter Golf <span class="accent">v2</span></span>
</div>

---

## What is Neon?

Neon turns a **video foundation model** into a humanoid robot controller. Instead of treating robot control as image classification, Neon leverages video models that already understand motion, physics, and temporal dynamics — then decodes that understanding into 29 degrees of freedom.

```mermaid
graph LR
    CAM["📹 Camera"] --> NV{"🤖 Neon VLA"}
    TXT["🗣️ Voice / Text"] --> NV
    PROP["🦾 Joint States"] --> NV
    NV --> ACT["29 DoF Actions"]
    NV --> SPK["🔊 Speech"]

    style NV fill:#e65100,stroke:#ff6d00,color:#fff,stroke-width:2px
```

---

## Get Started in 5 Lines

```bash
pip install neon-vla
```

```python
from neon.model.neon_vla import NeonVLA, NeonConfig

model = NeonVLA(NeonConfig(control_mode="arms_only"))
model.load_backbone()

output = model.predict(image=camera_frame, instruction="Pick up the red cup")
# output.actions → (16, 17) — 16 future timesteps, 17 joint dimensions
```

→ **[Full Quickstart](getting-started/quickstart.md)** | **[Installation](getting-started/installation.md)**

---

## Three Ways to Use

=== "As a Model"
    ```python
    from neon.model.neon_vla import NeonVLA, NeonConfig

    model = NeonVLA(NeonConfig(control_mode="arms_only"))
    model.load_backbone()
    output = model.predict(image=frame, instruction="Pick up the cup")
    ```

=== "As an Inference Server"
    ```python
    from neon.inference.server import NeonInferenceServer

    server = NeonInferenceServer("cagataydev/neon-g1-v1")
    output = server.predict(image=frame, instruction="Pick up the cup")
    ```

=== "As a Strands Agent Tool"
    ```python
    from strands import Agent
    from neon.tools import neon_tool

    agent = Agent(tools=[neon_tool])
    agent("Neon, pick up the red cup and bring it to me")
    ```

---

## The Full Pipeline

```mermaid
graph TD
    subgraph Inputs
        CAM["📹 Camera Frames"]
        MIC["🎤 Microphone"]
        TXT["📝 Text Instruction"]
        PROP["🦾 Joint States"]
    end

    subgraph "Neon VLA"
        VB["Video Backbone<br/>Qwen2.5-Omni / Cosmos-Reason2"]
        AE["Audio Encoder<br/>Whisper / Omni"]
        PE["Proprioception Encoder"]
        FUS["Feature Fusion<br/>Linear + ReLU²"]
        AH["Action Heads<br/>Parameter Golf v2"]
        SH["Speech Head"]
    end

    subgraph Outputs
        JOINTS["🤖 Joint Commands"]
        LOCO["🏃 Locomotion"]
        VOICE["🔊 Robot Speech"]
    end

    CAM --> VB
    TXT --> VB
    MIC --> AE
    PROP --> PE

    VB --> FUS
    AE --> FUS
    PE --> FUS

    FUS --> AH
    FUS --> SH

    AH --> JOINTS
    AH --> LOCO
    SH --> VOICE

    style VB fill:#1565c0,color:#fff
    style FUS fill:#333,color:#fff
    style AH fill:#1b5e20,color:#fff
```

---

## What's Inside

<div class="neon-features" markdown>
  <div class="neon-feature" markdown>
### 📹 Video Backbone
Qwen2.5-Omni or Cosmos-Reason2. Video models understand motion, not just snapshots.

→ [Video Backbone Guide](guide/video-backbone.md)
  </div>
  <div class="neon-feature" markdown>
### 🦾 29 DoF Action Space
Full G1 humanoid — arms, grippers, torso, head, legs — with normalization and safety limits.

→ [Action Space](concepts/action-space.md)
  </div>
  <div class="neon-feature" markdown>
### 🏌️ Parameter Golf v2
ReLU², RMSNorm, learnable residual scales, U-Net skip, soft-capping — every trick for small heads.

→ [Parameter Golf](concepts/parameter-golf.md)
  </div>
  <div class="neon-feature" markdown>
### 🍲 Data Soup
7 source types: LeRobot, Agibot, Cosmos DreamGen, Stereo4D, voice commands, OXE, custom teleoperation.

→ [Data Soup](concepts/data-soup.md)
  </div>
  <div class="neon-feature" markdown>
### 🌌 Cosmos Relative Actions
Cross-embodiment action representation from Cosmos-Predict2.5. Same movement = same numbers.

→ [Relative Actions](concepts/relative-actions.md)
  </div>
  <div class="neon-feature" markdown>
### 🎤 Audio In/Out
Hear spoken commands via Whisper. Speak back via PersonaPlex TTS. The robot has a voice.

→ [Audio](concepts/audio.md)
  </div>
</div>

---

## Quick Links

<div class="grid" markdown>

[:material-download: **Installation** →](getting-started/installation.md)

[:material-rocket-launch: **Quickstart** →](getting-started/quickstart.md)

[:material-video: **Why Video Models** →](concepts/why-video.md)

[:material-robot: **Action Space** →](concepts/action-space.md)

[:material-school: **Training** →](guide/training.md)

[:material-file-tree: **Architecture** →](architecture.md)

[:material-code-tags: **API Reference** →](api-reference.md)

[:material-tools: **Strands Tool** →](guide/strands-tool.md)

</div>
