diff --git a/README.md b/README.md
index ece604e..89491a0 100644
--- a/README.md
+++ b/README.md
@@ -1,42 +1,84 @@
-# PASHUPATI
+

-**Autonomous patrol & inspection stack for quadruped robots (legged or wheel-legged, any brand with a ROS 2 driver) — LiDAR-inertial teach-and-repeat navigation that walks forward, sideways or backwards, path-shift obstacle avoidance, on-robot VLM inspection, crowd sensing, handheld teleop and the NETRA command center.**
+# Pashupati
-[](https://github.com/DarmawanRobotics/Pashupati/actions/workflows/ci.yml)
-[](https://docs.ros.org/en/humble/)
-[](https://releases.ubuntu.com/22.04/)
-[](https://www.python.org/)
-[](LICENSE)
+**Autonomous patrol and inspection stack for quadruped robots, legged or wheel-legged, of any
+brand with a ROS 2 driver: LiDAR-inertial teach and repeat, obstacle avoidance by path shift,
+on-robot AI inspection, crowd sensing, a handheld controller and the NETRA command center.**
+
+[](https://github.com/DarmawanRobotics/Pashupati/actions/workflows/ci.yml)
+[](https://docs.ros.org/en/humble/)
+[](https://releases.ubuntu.com/22.04/)
+
+
+
+
+[](LICENSE)
+
+[Features](#features) · [System](#system) · [Install](#install) · [Workflow](#workflow) ·
+[Operations](#operations) · [Develop](#develop)
---
-## What it does
-
-Mall corridors are patrolled on fixed routes every shift, so Pashupati uses **teach and repeat**
-instead of a global planner:
-
-- **Teach** — drive the robot once (handheld or RViz) while FAST-LIO2 tracks it, mark inspection
- stops, record the AprilTags that anchor the map. The route is uploaded to NETRA automatically.
-- **Repeat** — routes are resampled and smoothed, then followed with a curvature-aware speed
- profile.
- - The default controller uses all three axes of a legged robot: it closes errors sideways, backs
- up or strafes when the route is beside or behind it, and keeps its heading along the route.
- - Obstacles are passed by sliding sideways within a bounded offset from the route (path shift);
- with no gap, the robot stops short.
- - At every stop the robot converges to 5 cm / 3° and inspects. A 360° protective field caps every
- command at a speed the robot can still stop at before the nearest obstacle in its path.
-- **Inspect** — a local VLM via Ollama (any vision model, qwen3-vl by default) watches the floor for
- trash and spills while driving and at every stop; findings go to NETRA for final detection,
- validation and Telegram alerts.
-- **Sense crowds** — people seen by the camera are placed on the floor plan and aggregated into
- per-minute crowd heatmaps.
-- **Operate** — schedules and live control from NETRA, manual control from a Retroid handheld
- over UDP (which also switches the inspection on and off, picks its model and pace, and sets the
- patrol speed), one supervised systemd service on the robot with self-respawning nodes.
+Mall corridors are patrolled on fixed routes every shift. Pashupati therefore uses **teach and
+repeat** instead of a global planner: drive a route once, and the robot repeats it on schedule,
+inspecting the floor and counting people along the way. Everything runs on the robot as one
+supervised service. The [Pashupati Controller](https://github.com/DarmawanRobotics/PashupatiController)
+handheld and NETRA connect to it over the network.
+
+## Features
+
+**Teach**
+- Drive the robot once, from the handheld or RViz, while FAST-LIO2 (or Leg-KILO) tracks it.
+- Mark inspection stops along the way.
+- Record the AprilTags that anchor the map, so a route lines up again wherever the robot is
+ started.
+- When recording ends, the route is uploaded to NETRA.
+
+**Repeat**
+- Routes are resampled and smoothed, then followed with a curvature-aware speed profile.
+- The default controller uses all three axes of a legged robot: it closes errors sideways,
+ strafes or backs up, and keeps its heading along the route.
+- The robot can join a route from beside it. A route loaded again starts over.
+- At every stop the robot converges to 5 cm and 3°, inspects, then moves on.
+- Looping patrols end their lap on low battery.
+
+**Stay safe**
+- Obstacles are passed by sliding sideways within a bounded offset from the route (path shift).
+ When there is no gap, the robot stops short.
+- A 360° protective field caps every command at a speed the robot can still stop at.
+- The software e-stop is latched in the control mux.
+- Navigation stops when odometry or the safety scan goes stale.
+
+**Inspect**
+- A local vision-language model runs through Ollama: qwen3-vl by default, moondream or any other
+ vision model, switched live.
+- Three paces:
+ - *continuous*: frames back to back;
+ - *interval*: a frame every 0.1 s to 5 min, waiting in a first-in-first-out queue that survives
+ restarts;
+ - *stop points only*.
+- Own finding types, each with a description of what to look for, are added from the handheld.
+ Each type is either reported or only shown.
+- Findings go to NETRA with their evidence frame and the pose where the frame was taken.
+
+**Count people**
+- YOLO11n (ONNX, no PyTorch) runs on the GPU when available, 5 times a second; on the CPU it runs
+ twice a second.
+- People are boxed on the handheld video, placed on the floor plan, and aggregated into per-minute
+ crowd heatmaps for NETRA.
+
+**Operate**
+- [Pashupati Controller](https://github.com/DarmawanRobotics/PashupatiController) on a Retroid
+ Pocket: drive, WebRTC video, map and routes, patrol control, inspection settings, and the
+ robot's CPU, GPU and RAM.
+- NETRA: schedules, live telemetry, alerts and Telegram.
+- On the robot: one systemd service with respawning nodes, health monitoring, and uploads spooled
+ while offline.
## System
@@ -53,51 +95,57 @@ flowchart LR
NAV --> UP
PER --> UP
HL[health] --> UP
- TEL[teleop UDP gateway] --> MUX
+ TEL[teleop UDP gateway