{"_id":"@altara/ros","_rev":"5-4ff657e2125f2919275c068fd22752fe","name":"@altara/ros","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"@altara/ros","version":"0.0.1","license":"MIT","_id":"@altara/ros@0.0.1","maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"dist":{"shasum":"6ad9de7724c51444964d8fca21a852fa944290be","tarball":"https://registry.npmjs.org/@altara/ros/-/ros-0.0.1.tgz","fileCount":8,"integrity":"sha512-Yo7kchQaqqpVxC1ob/jMCJefnQunFDi96/x/RCw4RLYhsKTKu/oDui0+Hx7i03oBFDmTQYktJOPh+M/GLkhxDQ==","signatures":[{"sig":"MEYCIQDcMNIATXosK3yRjvWh6Cv/81YpH3sytVx1cjjmCQXxjwIhAPWeA89actFi2cFmTWKDseij4SxLih8Cg3VHJeVpINtU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52671},"main":"./dist/index.js","_from":"file:altara-ros-0.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"jayachapparam","email":"cjskishan@gmail.com"},"_resolved":"/tmp/0c806b47992c7f24c5c98ce550619c21/altara-ros-0.0.1.tgz","_integrity":"sha512-Yo7kchQaqqpVxC1ob/jMCJefnQunFDi96/x/RCw4RLYhsKTKu/oDui0+Hx7i03oBFDmTQYktJOPh+M/GLkhxDQ==","_npmVersion":"10.8.2","description":"ROS2 rosbridge adapter for Altara","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.3.0","vitest":"^1.5.0","happy-dom":"^14.7.1","typescript":"^5.4.0","@altara/core":"0.0.1","@types/react":"^18.3.0"},"peerDependencies":{"react":">=18.0.0","@altara/core":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/ros_0.0.1_1777686836996_0.8510942910222812","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@altara/ros","version":"0.0.2","keywords":["react","ros2","ros","rosbridge","robotics","telemetry","real-time","websocket","sensor-msgs","altara"],"author":{"name":"Jaya Sai Kishan Chapparam"},"license":"MIT","_id":"@altara/ros@0.0.2","maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"homepage":"https://github.com/JayaSaiKishanChapparam/altara/tree/main/packages/ros#readme","bugs":{"url":"https://github.com/JayaSaiKishanChapparam/altara/issues"},"dist":{"shasum":"49b2a8b3862ca5118fca9c36e87446a6209e814e","tarball":"https://registry.npmjs.org/@altara/ros/-/ros-0.0.2.tgz","fileCount":9,"integrity":"sha512-ivEm8mRvo/QQHSXgu7auHBPgBXJ+nnc+lkh3i0FYOzrIfnpBvn6AUV7W9RYX6ecCcb235yb6XOuadLzEc506GA==","signatures":[{"sig":"MEYCIQDmTk1qzjkZBuFW/8UWNwA0cG6QvJp6yFSAdxrbgENfEwIhANjfSi3ZzAp2wwbx7GdZxE6fz+6QZXai4SCCHx1JfB+B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56313},"main":"./dist/index.js","_from":"file:altara-ros-0.0.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"jayachapparam","email":"cjskishan@gmail.com"},"_resolved":"/tmp/de3c6c85637e1794b5d20bf4884f282d/altara-ros-0.0.2.tgz","_integrity":"sha512-ivEm8mRvo/QQHSXgu7auHBPgBXJ+nnc+lkh3i0FYOzrIfnpBvn6AUV7W9RYX6ecCcb235yb6XOuadLzEc506GA==","repository":{"url":"git+https://github.com/JayaSaiKishanChapparam/altara.git","type":"git","directory":"packages/ros"},"_npmVersion":"10.8.2","description":"ROS2 rosbridge adapter for Altara — typed factories for sensor_msgs/* in one line.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.3.0","vitest":"^1.5.0","happy-dom":"^14.7.1","typescript":"^5.4.0","@altara/core":"0.0.2","@types/react":"^18.3.0"},"peerDependencies":{"react":">=18.0.0","@altara/core":"0.0.2"},"_npmOperationalInternal":{"tmp":"tmp/ros_0.0.2_1777687721535_0.18558377527250447","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@altara/ros","version":"0.1.0","keywords":["react","ros2","ros","ros-react","react-ros","rosbridge","rosbridge-suite","ros-bridge","robotics","robot-monitoring","robot-dashboard","telemetry","real-time","websocket","sensor-msgs","imu","navsatfix","battery-state","dashboard","monitoring","altara"],"author":{"name":"Jaya Sai Kishan Chapparam"},"license":"MIT","_id":"@altara/ros@0.1.0","maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"homepage":"https://github.com/JayaSaiKishanChapparam/altara/tree/main/packages/ros#readme","bugs":{"url":"https://github.com/JayaSaiKishanChapparam/altara/issues"},"dist":{"shasum":"a2d3a18a5f8d705480432a23a42de90de4fa65a0","tarball":"https://registry.npmjs.org/@altara/ros/-/ros-0.1.0.tgz","fileCount":9,"integrity":"sha512-cOzj6WJG/+WQQIlKNxSnU5MCILiOB5V3ju+TSBM5mUo0GGUs+eRNIxz3rWnsUZ0GQoBB1Q2ZKeaUvjF7jwDwxQ==","signatures":[{"sig":"MEQCIFkoNuA3AyaiDOwDezcqWbFcqvvVuQe5TAcW02OD3fN6AiBD4oMpvFSuQvl1FgYXf/ovnlCfGrGOlmmsHCvmWpI5dw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101813},"main":"./dist/index.js","_from":"file:altara-ros-0.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"jayachapparam","email":"cjskishan@gmail.com"},"_resolved":"/tmp/a947376843503928367fd2f45c4e0213/altara-ros-0.1.0.tgz","_integrity":"sha512-cOzj6WJG/+WQQIlKNxSnU5MCILiOB5V3ju+TSBM5mUo0GGUs+eRNIxz3rWnsUZ0GQoBB1Q2ZKeaUvjF7jwDwxQ==","repository":{"url":"git+https://github.com/JayaSaiKishanChapparam/altara.git","type":"git","directory":"packages/ros"},"_npmVersion":"10.8.2","description":"ROS2 rosbridge adapter for React — pipe live sensor_msgs/* topics (IMU, GPS, battery, range, temperature) into real-time Altara dashboards. Typed factories, auto-reconnect, ROS timestamp normalization.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.3.0","vitest":"^1.5.0","happy-dom":"^14.7.1","typescript":"^5.4.0","@altara/core":"0.1.0","@types/react":"^18.3.0"},"peerDependencies":{"react":">=18.0.0","@altara/core":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ros_0.1.0_1781725216459_0.5226403435280613","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@altara/ros","version":"0.1.1","keywords":["react","ros2","ros","ros-react","react-ros","rosbridge","rosbridge-suite","ros-bridge","robotics","robot-monitoring","robot-dashboard","telemetry","real-time","websocket","sensor-msgs","imu","navsatfix","battery-state","dashboard","monitoring","altara"],"author":{"name":"Jaya Sai Kishan Chapparam"},"license":"MIT","_id":"@altara/ros@0.1.1","maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"homepage":"https://github.com/JayaSaiKishanChapparam/altara/tree/main/packages/ros#readme","bugs":{"url":"https://github.com/JayaSaiKishanChapparam/altara/issues"},"dist":{"shasum":"5876b5c37539395fc5ab873e213b715b76e40307","tarball":"https://registry.npmjs.org/@altara/ros/-/ros-0.1.1.tgz","fileCount":9,"integrity":"sha512-hmNY3cQ147JgnmR6Ygoy9qdGjYF0YztO/UAREGpDIjkFJQHud9DG2Ijr0ZhfXFsX+BCEPbYHtgeMb+uIGGq8IQ==","signatures":[{"sig":"MEYCIQDf/JFQan2bfkZySbLgWql473XWKU4yKdqiU+QMOhnr6AIhANdNHJyGEzbB4YBtT9ZRMF8xra840ZF23Zq4f7MJ7XIw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101813},"main":"./dist/index.js","_from":"file:altara-ros-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"jayachapparam","email":"cjskishan@gmail.com"},"_resolved":"/tmp/548cffed79ebcb2358c125678184d6bc/altara-ros-0.1.1.tgz","_integrity":"sha512-hmNY3cQ147JgnmR6Ygoy9qdGjYF0YztO/UAREGpDIjkFJQHud9DG2Ijr0ZhfXFsX+BCEPbYHtgeMb+uIGGq8IQ==","repository":{"url":"git+https://github.com/JayaSaiKishanChapparam/altara.git","type":"git","directory":"packages/ros"},"_npmVersion":"10.8.2","description":"ROS2 rosbridge adapter for React — pipe live sensor_msgs/* topics (IMU, GPS, battery, range, temperature) into real-time Altara dashboards. Typed factories, auto-reconnect, ROS timestamp normalization.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.3.0","vitest":"^1.5.0","happy-dom":"^14.7.1","typescript":"^5.4.0","@altara/core":"0.2.0","@types/react":"^18.3.0"},"peerDependencies":{"react":">=18.0.0","@altara/core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ros_0.1.1_1781816832907_0.35908324071123876","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@altara/ros","version":"0.1.2","description":"ROS2 rosbridge adapter for React — pipe live sensor_msgs/* topics (IMU, GPS, battery, range, temperature) into real-time Altara dashboards. Typed factories, auto-reconnect, ROS timestamp normalization.","license":"MIT","type":"commonjs","author":{"name":"Jaya Sai Kishan Chapparam"},"homepage":"https://github.com/JayaSaiKishanChapparam/altara/tree/main/packages/ros#readme","repository":{"type":"git","url":"git+https://github.com/JayaSaiKishanChapparam/altara.git","directory":"packages/ros"},"bugs":{"url":"https://github.com/JayaSaiKishanChapparam/altara/issues"},"keywords":["react","ros2","ros","ros-react","react-ros","rosbridge","rosbridge-suite","ros-bridge","robotics","robot-monitoring","robot-dashboard","telemetry","real-time","websocket","sensor-msgs","imu","navsatfix","battery-state","dashboard","monitoring","altara"],"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"peerDependencies":{"@altara/core":"^0.2.0","react":">=18.0.0"},"devDependencies":{"@types/react":"^18.3.0","happy-dom":"^14.7.1","react":"^18.3.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^1.5.0","@altara/core":"0.2.2"},"sideEffects":false,"engines":{"node":">=20"},"scripts":{"build":"tsup && node ../../scripts/add-use-client.mjs","test":"vitest run","lint":"eslint src --ext .ts,.tsx","typecheck":"tsc --noEmit"},"_id":"@altara/ros@0.1.2","_integrity":"sha512-14ZELOT/+LoolrJN0dcFONlWErWImCDkDjUtJSGXdwvOYtCArdThbzqfgY3BJEecGw/4hZ0xnMqupMkNFiWe5A==","_resolved":"/tmp/0a74fa16aadf2b035f14e5ee494e6463/altara-ros-0.1.2.tgz","_from":"file:altara-ros-0.1.2.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-14ZELOT/+LoolrJN0dcFONlWErWImCDkDjUtJSGXdwvOYtCArdThbzqfgY3BJEecGw/4hZ0xnMqupMkNFiWe5A==","shasum":"8b6c1595b42c419ec243f62e5c8d6bcaa6295430","tarball":"https://registry.npmjs.org/@altara/ros/-/ros-0.1.2.tgz","fileCount":10,"unpackedSize":109141,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCckVAX3Ax+kXFwT56D6X4a6mGDbycK4JjnaV9OqX+JrwIgZ6RL5Ky9Co0++VowGhAKpK7VnXkqmgX1yYDaWyOesvw="}]},"_npmUser":{"name":"jayachapparam","email":"cjskishan@gmail.com"},"directories":{},"maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ros_0.1.2_1787090496719_0.9014558906527792"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-02T01:53:56.885Z","modified":"2026-08-18T22:01:37.021Z","0.0.1":"2026-05-02T01:53:57.153Z","0.0.2":"2026-05-02T02:08:41.677Z","0.1.0":"2026-06-17T19:40:16.606Z","0.1.1":"2026-06-18T21:07:13.062Z","0.1.2":"2026-08-18T22:01:36.851Z"},"bugs":{"url":"https://github.com/JayaSaiKishanChapparam/altara/issues"},"author":{"name":"Jaya Sai Kishan Chapparam"},"license":"MIT","homepage":"https://github.com/JayaSaiKishanChapparam/altara/tree/main/packages/ros#readme","keywords":["react","ros2","ros","ros-react","react-ros","rosbridge","rosbridge-suite","ros-bridge","robotics","robot-monitoring","robot-dashboard","telemetry","real-time","websocket","sensor-msgs","imu","navsatfix","battery-state","dashboard","monitoring","altara"],"repository":{"type":"git","url":"git+https://github.com/JayaSaiKishanChapparam/altara.git","directory":"packages/ros"},"description":"ROS2 rosbridge adapter for React — pipe live sensor_msgs/* topics (IMU, GPS, battery, range, temperature) into real-time Altara dashboards. Typed factories, auto-reconnect, ROS timestamp normalization.","maintainers":[{"name":"jayachapparam","email":"cjskishan@gmail.com"}],"readme":"# @altara/ros\n\n**ROS2 rosbridge adapter for Altara.** Subscribe to a ROS2 topic from React in one line and pipe live samples (IMU, GPS, battery, range, temperature, ...) into any [`@altara/core`](https://www.npmjs.com/package/@altara/core) component. Built for robotics dashboards, drone ground stations, and rover monitoring UIs.\n\n![Live GPS map driven by ROS2 telemetry](https://raw.githubusercontent.com/JayaSaiKishanChapparam/altara/main/apps/storybook/public/gifs/live-map.gif)\n\n[![npm version](https://img.shields.io/npm/v/@altara/ros?color=EF9F27&label=npm)](https://www.npmjs.com/package/@altara/ros)\n[![bundle size](https://img.shields.io/bundlephobia/minzip/@altara/ros?color=378ADD&label=gzip)](https://bundlephobia.com/package/@altara/ros)\n[![types included](https://img.shields.io/badge/types-included-1D9E75)](https://www.npmjs.com/package/@altara/ros)\n[![license](https://img.shields.io/npm/l/@altara/ros?color=888780)](https://github.com/JayaSaiKishanChapparam/altara/blob/main/LICENSE)\n\n## Install\n\n```bash\nnpm install @altara/core @altara/ros\n```\n\nYou'll also need [`rosbridge_suite`](https://github.com/RobotWebTools/rosbridge_suite) running on your robot (or in a Docker container during development):\n\n```bash\nros2 launch rosbridge_server rosbridge_websocket_launch.xml\n# → ws://localhost:9090\n```\n\n## Quick start\n\n```tsx\nimport { AltaraProvider, TimeSeries } from '@altara/core';\nimport { createRosbridgeAdapter } from '@altara/ros';\n\nconst source = createRosbridgeAdapter({\n  url: 'ws://localhost:9090',\n  topic: '/imu/data',\n  messageType: 'sensor_msgs/Imu',\n  valueExtractor: (msg) => msg.angular_velocity.z,\n});\n\nexport function App() {\n  return (\n    <AltaraProvider theme=\"dark\">\n      <TimeSeries dataSource={source} height={240} />\n    </AltaraProvider>\n  );\n}\n```\n\n**See it live:** [Website](https://www.usealtara.dev/) · [Live demo](https://jayasaikishanchapparam.github.io/altara/demo/) · [Storybook](https://jayasaikishanchapparam.github.io/altara/storybook/)\n\n## What you get\n\n`createRosbridgeAdapter` handles:\n\n- rosbridge v2 envelope (`{ op: 'subscribe', topic, type }`) on connect\n- Auto-reconnect with exponential backoff (1 s → 30 s)\n- ROS `header.stamp.{sec, nanosec}` → unix milliseconds normalization\n- Optional `throttleMs` to drop samples that arrive faster than you want to render\n- Three timestamp modes (`'wallclock'` / `'message'` / `'relative'`)\n- Cleanup on `destroy()` including the `unsubscribe` envelope\n\n## Typed convenience factories\n\nFor common ROS message types, skip the `messageType` + `valueExtractor` boilerplate:\n\n| Factory | Message type | Extracted value |\n| --- | --- | --- |\n| `createBatteryStateAdapter` | `sensor_msgs/BatteryState` | `percentage * 100` (voltage fallback — see below) |\n| `createRangeAdapter` | `sensor_msgs/Range` | `range` (m) |\n| `createTemperatureAdapter` | `sensor_msgs/Temperature` | `temperature` (°C) |\n| `createNavSatFixAdapter({ axis })` | `sensor_msgs/NavSatFix` | `latitude` / `longitude` / `altitude` |\n| `createImuAdapter` | `sensor_msgs/Imu` | `{ roll, pitch, yaw }` in degrees (see below) |\n| `createFloat32Adapter` | `std_msgs/Float32` | `data` |\n| `createFloat64Adapter` | `std_msgs/Float64` | `data` |\n\n```ts\nimport { createBatteryStateAdapter } from '@altara/ros';\n\nconst battery = createBatteryStateAdapter({\n  url: 'ws://localhost:9090',\n  topic: '/battery',\n});\n// hand to any component that takes `dataSource={…}`\n```\n\n### Battery state of charge with a voltage fallback\n\nPX4 and ArduPilot publish `BatteryState.percentage` as `-1` (or `NaN`) when the\nfirmware has no fuel-gauge estimate — the common case on a bare LiPo pack. By\ndefault that sample is dropped and the gauge stays blank. Pass a `voltageRange`\nto derive an estimate from `voltage` instead:\n\n```ts\nconst battery = createBatteryStateAdapter({\n  url: 'ws://localhost:9090',\n  topic: '/mavros/battery',\n  voltageRange: { min: 14.0, max: 16.8 }, // 4S LiPo (3.5–4.2 V/cell)\n});\n```\n\n> ⚠️ The voltage→charge map is a **clamped linear approximation**. A LiPo's\n> discharge curve is non-linear, so treat this as **presence-of-charge**\n> (is there juice left?), **not** an accurate range-remaining percentage. A\n> valid `percentage` from the firmware always takes precedence.\n\n## Multi-channel sources & the PFD\n\nA flight display needs several signals at once (roll, pitch, heading, airspeed,\naltitude). Two helpers make that one coherent `dataSource`:\n\n- **`channels`** — pass a `{ name: extractor }` map to `createRosbridgeAdapter`\n  (or use `createImuAdapter`) to pull several numbers from **one** message over\n  **one** socket. Returns `{ [name]: AltaraDataSource }`.\n- **`mergeChannels`** — union several single-value sources into one\n  channel-tagged source that a multi-input component routes by channel.\n\n`createImuAdapter` converts `sensor_msgs/Imu.orientation` (a quaternion) into\n`{ roll, pitch, yaw }` degree channels for you (the standalone\n`quaternionToEuler(q)` is exported too, clamped at the ±90° poles). Note IMU\n`yaw` is heading in the IMU frame, **not** compass heading — drive the PFD's\n`heading` from `VFR_HUD`.\n\nA full Primary Flight Display wires on **two sockets** — one IMU, one VFR_HUD:\n\n```tsx\nimport { PrimaryFlightDisplay } from '@altara/aerospace';\nimport { createImuAdapter, createRosbridgeAdapter, mergeChannels } from '@altara/ros';\n\nconst imu = createImuAdapter({ url, topic: '/mavros/imu/data' }); // { roll, pitch, yaw }\nconst hud = createRosbridgeAdapter({\n  url,\n  topic: '/mavros/vfr_hud',\n  messageType: 'mavros_msgs/VFR_HUD',\n  channels: {\n    heading: (m) => m.heading,\n    airspeed: (m) => m.airspeed * 1.94384, // m/s -> kt\n    altitude: (m) => m.altitude * 3.28084, // m -> ft\n  },\n});\n\nconst source = mergeChannels({\n  roll: imu.roll,\n  pitch: imu.pitch,\n  heading: hud.heading,\n  airspeed: hud.airspeed,\n  altitude: hud.altitude,\n});\n\n// <PrimaryFlightDisplay dataSource={source} showFlightDirector />\n```\n\n`mergeChannels` is re-exported from `@altara/ros` (it lives in `@altara/core`),\nso a single import line covers the whole wiring.\n\n## Documentation\n\n- **[📚 Connecting ROS2 guide (live Storybook)](https://jayasaikishanchapparam.github.io/altara/storybook/?path=/docs/guides-connecting-ros2--api-reference)** — Docker setup, multi-topic dashboards, timestamp source modes, throttling, troubleshooting.\n- **[🛰️ Live demo dashboard](https://jayasaikishanchapparam.github.io/altara/demo/)** — see the components a rosbridge feed would drive.\n\nOr run Storybook locally:\n\n```bash\ngit clone https://github.com/JayaSaiKishanChapparam/altara.git\ncd altara\npnpm install\npnpm --filter @altara/storybook storybook\n```\n\nThen open **Guides → Connecting ROS2**.\n\n## Sibling packages\n\n| Package | What it does |\n| --- | --- |\n| [`@altara/core`](https://www.npmjs.com/package/@altara/core) | Components, hooks, MQTT/mock adapters, design tokens. The starting point. |\n| [`@altara/aerospace`](https://www.npmjs.com/package/@altara/aerospace) | Flight instruments — PFD, HSI, altimeter, airspeed, VSI, engine cluster, TCAS, TAWS, FMA, fuel gauge, radio altimeter. |\n| [`@altara/mqtt`](https://www.npmjs.com/package/@altara/mqtt) | MQTT-over-WebSocket adapter for IoT brokers. |\n\n## Links\n\n- [Storybook (live)](https://jayasaikishanchapparam.github.io/altara/storybook/) · [Demo dashboard (live)](https://jayasaikishanchapparam.github.io/altara/demo/)\n- [GitHub repository](https://github.com/JayaSaiKishanChapparam/altara)\n- [Issue tracker](https://github.com/JayaSaiKishanChapparam/altara/issues)\n- [Discussions](https://github.com/JayaSaiKishanChapparam/altara/discussions)\n- [rosbridge_suite](https://github.com/RobotWebTools/rosbridge_suite) — the WebSocket server you're connecting to\n\n## Stability\n\n**Pre-1.0.** Every package is below `1.0.0`, and until one reaches it the public\nAPI is not considered stable:\n\n- **Patch** (`0.2.1` -> `0.2.2`) — bug fixes, docs, packaging. Safe.\n- **Minor** (`0.2.x` -> `0.3.0`) — new features, and **may include breaking\n  changes**. This is the pre-1.0 semver allowance, not an accident. Pin the\n  minor (`~0.2.0`) if you need that not to happen.\n- Breaking changes are always described in the package's\n  [CHANGELOG](CHANGELOG.md); anything spanning packages also lands in\n  [MIGRATION.md](https://github.com/JayaSaiKishanChapparam/altara/blob/main/MIGRATION.md).\n\nIn practice the component APIs have been stable since `0.1.0` and every break so\nfar has been in the adapter layer. That is a track record, not a guarantee.\n\n## License\n\nMIT — see [LICENSE](https://github.com/JayaSaiKishanChapparam/altara/blob/main/LICENSE).\n","readmeFilename":"README.md"}