diff --git a/assets/js/howtos.js b/assets/js/howtos.js
index c784766d422..0a6b41240c1 100644
--- a/assets/js/howtos.js
+++ b/assets/js/howtos.js
@@ -98,9 +98,9 @@ let refinementLists = [customRefinementList({
items: [
{ label: "Data Management", value: "data" },
{ label: "Machine Learning", value: "ml" },
- { label: "Core", value: "core" },
+ { label: "Control hardware", value: "core" },
{ label: "Fleet Management", value: "fleet" },
- { label: "Registry", value: "registry" },
+ { label: "Integrate other hardware", value: "registry" },
{ label: "Mobility", value: "mobility" },
],
}),
diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss
index 54b8d8ca7bc..06e30a0254a 100644
--- a/assets/scss/_styles_project.scss
+++ b/assets/scss/_styles_project.scss
@@ -18,7 +18,7 @@ a.footnote-ref::after {
/* START Adjust Heading sizes*/
.td-navbar {
- background: black !important;
+ background-color: rgb(19,20,20) !important;
}
/* This ensures there is no padding added to the top logo bar */
@@ -35,7 +35,7 @@ a.footnote-ref::after {
font-size: 0.833rem;
line-height: 1.667em;
letter-spacing: 0.1875rem;
- padding: 5px 10px;
+ padding: 5px 8px;
text-decoration: none;
text-transform: uppercase;
white-space: nowrap;
@@ -44,6 +44,11 @@ a.footnote-ref::after {
}
}
+.td-navbar .navbar-brand svg {
+ height: 16px;
+ margin: 0;
+}
+
.td-navbar .nav-link {
font-family: Space Mono, sans-serif;
font-weight: 400;
@@ -2556,3 +2561,118 @@ div.explanation > .explanationvisual > .gif {
opacity: 0;
transition: opacity 250ms ease-out;
}
+
+// Top level nav START
+nav {
+ display: flex;
+ flex-direction: column;
+}
+
+.navcontainer {
+ min-width: 100%;
+ display: flex;
+}
+
+.td-topbar-sections {
+ margin-right: auto !important;
+ margin-left: 0 !important;
+ line-height: unset !important;
+}
+
+.td-topbar-sections > ul {
+ padding: 0;
+ padding-left: 1.25rem;
+ margin: 0.25rem 0 0 0;
+ border-left: 1px solid white;
+}
+
+.td-topbar-sections > ul > li {
+ padding-right: 1.5rem;
+ display: inline-block;
+ text-transform: uppercase;
+ font-family: Roboto Mono Variable,Roboto Mono,ui-monospace,monospace;
+ font-size: .875rem;
+ line-height: 1.25rem;
+}
+
+.td-topbar-sections > ul > li > a {
+ color: white;
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+
+.td-topbar-sections > ul > li > a:hover {
+ text-decoration: none;
+}
+
+.td-navbar {
+ min-height: 3.5rem;
+}
+
+.navsectiontop.active-path {
+ border-bottom: 1px solid white;
+}
+
+#navsearch {
+ min-width: 250.633px;
+}
+
+span.section-overview {
+ display: none
+}
+
+@media (min-width: 768px) {
+ .td-sidebar-nav__section ul.ul-1 {
+ padding-top: 0.5rem
+ }
+
+ .ul-1 > li.nav-fold.hide-if-desktop {
+ display: none;
+ }
+
+ .menu-toggle.open-on-desktop {
+ display: none;
+ }
+
+ li.nav-fold.open-on-desktop > span > ul > li {
+ display: block !important;
+ }
+
+ li.nav-fold.open-on-desktop.header-only > span > a {
+ text-transform: uppercase;
+ font-family: Space Mono,sans-serif;
+ color: #aaa;
+ margin-top: 1rem;
+ }
+
+ li.nav-fold.open-on-desktop.header-only:first-child > span > a {
+ margin-top: 0.5rem;
+ }
+
+ li.nav-fold.open-on-desktop.header-only * li {
+ text-transform: unset;
+ }
+
+ li.open-on-desktop > span > ul.ul-2 {
+ padding-left: 0;
+ }
+
+ li.open-on-desktop.header-only > span > ul.ul-3 {
+ padding-left: 0;
+ }
+
+ span.section-overview-title {
+ display: none
+ }
+
+ span.section-overview {
+ display: block
+ }
+
+}
+
+a.tree-root {
+ display: none;
+}
+
+// Top level nav END
diff --git a/docs/_index.md b/docs/_index.md
index 3f400b11b22..777c00cc76a 100644
--- a/docs/_index.md
+++ b/docs/_index.md
@@ -5,6 +5,7 @@ description: "Viam integrates with hardware and software on any device. Use AI,
weight: 1
no_list: true
type: "docs"
+layout: "landing"
noToc: true
hide_feedback: true
sitemap:
@@ -17,918 +18,3 @@ noedit: true
date: "2024-09-17"
updated: "2024-10-11"
---
-
-
-
-## Program any device
-
-To get started, install Viam on any device and create a configuration that describes connected hardware as {{< glossary_tooltip term_id="component" text="components" >}}. Then you can control your device and any attached physical hardware securely **from anywhere in the world**. Or from local networks.
-
-{{< tabs class="horizontalheaders program" navheader="Examples">}}
-{{% tab name="Drive a base" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-async def moveInSquare(base):
- for _ in range(4):
- # Move forward 500mm at 500mm/s
- await base.move_straight(velocity=500, distance=500)
- # Spin 90 degrees at 100 degrees/s
- await base.spin(velocity=100, angle=90)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-func moveInSquare(ctx context.Context, base base.Base, logger logging.Logger) {
- for i := 0; i < 4; i++ {
- // Move forward 500mm at 500mm/s
- base.MoveStraight(ctx, 600, 500.0, nil)
- // Spin 90 degrees at 100 degrees/s
- base.Spin(ctx, 90, 100.0, nil)
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="TypeScript" %}}
-
-```ts
-async function moveInSquare(baseClient: VIAM.BaseClient) {
- for (let i = 0; i < 4; i++) {
- // Move forward 500mm at 500mm/s
- await baseClient.moveStraight(500, 500);
- // Spin 90 degrees at 100 degrees/s
- await baseClient.spin(90, 100);
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="Flutter" %}}
-
-```dart
-Future
moveSquare() async {
- for (var i=0; i<4; i++) {
- // Move forward 500mm at 500mm/s
- await base.moveStraight(500, 500);
- // Spins the rover 90 degrees at 100 degrees/s
- await base.spin(90, 100);
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-void move_in_square(std::shared_ptr base) {
- for (int i = 0; i < 4; ++i) {
- // Move forward 500mm at 500mm/s
- base->move_straight(500, 500);
- // Spins the rover 90 degrees at 100 degrees/s
- base->spin(90, 100);
- }
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-You can use any robotic base with Viam. Configure it as a base component. Then you can drive it using the base API.
-
-[Drive a base →](/how-tos/drive-rover/)
-
-
-
-
-{{}}
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="Control motor" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-async def spin_motor(motor):
- # Turn the motor at 35% power forwards
- await motor.set_power(power=0.35)
- # Let the motor spin for 3 seconds
- time.sleep(3)
- # Stop the motor
- await motor.stop()
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-func spinMotor(ctx context.Context, motor motor.Motor, logger logging.Logger) {
- // Turn the motor at 35% power forwards
- err = motor.SetPower(context.Background(), 0.35, nil)
- // Let the motor spin for 3 seconds
- time.Sleep(3 * time.Second)
- // Stop the motor
- err = motor.Stop(context.Background(), nil)
-}
-```
-
-{{% /tab %}}
-{{% tab name="TypeScript" %}}
-
-```ts
-async function spinMotor(motorClient: VIAM.MotorClient) {
- // Turn the motor at 35% power forwards
- await motorClient.setPower(0.35);
- // Let the motor spin for 3 seconds
- const sleep = (ms: number) =>
- new Promise((resolve) => setTimeout(resolve, ms));
- await sleep(3000);
- // Stop the motor
- await motorClient.stop();
-}
-```
-
-{{% /tab %}}
-{{% tab name="Flutter" %}}
-
-```dart
-Future
spinMotor() async {
- // Turn the motor at 35% power forwards
- await motorClient.setPower(0.35);
- // Let the motor spin for 3 seconds
- await Future.delayed(Duration(seconds: 3));
- // Stop the motor
- await motorClient.stop();
-}
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-void spin_motor(std::shared_ptr motor) {
- // Turn the motor at 35% power forwards
- motor->set_power(0.35);
- // Let the motor spin for 3 seconds
- sleep(3);
- // Stop the motor
- motor->stop();
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-You can use any motor with Viam. Configure it as a motor component. Then you can operate it using the motor API.
-
-[Control a motor →](/how-tos/control-motor/)
-
-
-
-
-{{}}
-
-
-
-
-{{% /tab %}}
-{{% tab name="Get sensor reading" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-# Get the readings provided by the sensor.
-co_2_monitor = Sensor.from_robot(machine, "co2-monitor")
-co_2_monitor_return_value = await co_2_monitor.get_readings()
-print(f"co2-monitor get_readings return value: {co_2_monitor_return_value}")
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-// Get the readings provided by the sensor.
-co2Monitor, err := sensor.FromRobot(machine, "co2-monitor")
-co2MonitorReturnValue, err := co2Monitor.Readings(
- context.Background(), map[string]interface{}{})
-logger.Infof("co2-monitor return value: %+v", co2MonitorReturnValue)
-```
-
-{{% /tab %}}
-{{% tab name="TypeScript" %}}
-
-```ts
-// Get the readings provided by the sensor.
-const co2MonitorClient = new VIAM.SensorClient(machine, "co2-monitor");
-const co2MonitorReturnValue = await co2MonitorClient.getReadings();
-console.log("co2-monitor return value:", co2MonitorReturnValue);
-```
-
-{{% /tab %}}
-{{% tab name="Flutter" %}}
-
-```dart
-// Get the readings provided by the sensor.
-final co2Monitor = Sensor.fromRobot(client, "co2-monitor");
-var readings = await co2Monitor.readings();
-print(readings);
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-// Get the readings provided by the sensor.
-auto co2monitor = machine->resource_by_name
("co2-monitor");
-auto co2monitor_get_readings_return_value = co2monitor->get_readings();
-std::cout << "co2-monitor get_readings return value " << co2monitor_get_readings_return_value << "\n";
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-You can use any physical sensor or anything else that provides measurements with Viam. Configure it as a sensor component. Then you can get sensor readings using the sensor API.
-
-[Collect sensor data →](/how-tos/collect-sensor-data/)
-
-
-
-
-{{% /tab %}}
-{{% tab name="Move an arm" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-# Command a joint position move: move the forearm of the arm slightly up
-cmd_joint_positions = JointPositions(values=[0, 0, -30.0, 0, 0, 0])
-await my_arm_component.move_to_joint_positions(
- positions=cmd_joint_positions)
-
-# Generate a simple pose move +100mm in the +Z direction of the arm
-cmd_arm_pose = await my_arm_component.get_end_position()
-cmd_arm_pose.z += 100.0
-await my_arm_component.move_to_position(pose=cmd_arm_pose)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-// Command a joint position move: move the forearm of the arm slightly up
-cmdJointPositions := &armapi.JointPositions{Values: []float64{0.0, 0.0, -30.0, 0.0, 0.0, 0.0}}
-err = myArmComponent.MoveToJointPositions(context.Background(), cmdJointPositions, nil)
-
-// Generate a simple pose move +100mm in the +Z direction of the arm
-currentArmPose, err := myArmComponent.EndPosition(context.Background(), nil)
-adjustedArmPoint := currentArmPose.Point()
-adjustedArmPoint.Z += 100.0
-cmdArmPose := spatialmath.NewPose(adjustedArmPoint, currentArmPose.Orientation())
-
-err = myArmComponent.MoveToPosition(context.Background(), cmdArmPose, nil)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-You can use any robotic arm with Viam.
-Configure it as an arm component. Then you can move it using the arm API.
-
-[Move a robotic arm →](/how-tos/move-robot-arm/)
-
-
-
-
-{{}}
-
-
-
-
-{{% /tab %}}
-{{% tab name="Operate custom hardware" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-my_button = Generic.from_robot(robot=machine, name="my_button")
-
-# Use a custom command to push the button 5
-command = {"cmd": "push_button", "button": 5}
-result = await my_button.do_command(command)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-myButton, err := generic.FromRobot(machine, "my_button")
-
-// Use a custom command to push the button 5
-command := map[string]interface{}{"cmd": "push_button", "button": 5}
-result, err := myButton.DoCommand(context.Background(), command)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Using the Viam Registry you can create _{{< glossary_tooltip term_id="resource" text="resources" >}}_ for additional hardware types or models and then deploy them to your machines.
-You can use an existing component or service type or create generic resources.
-
-[Create a module →](/how-tos/hello-world-module/)
-
-
-
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-
-## Make your devices better and smarter
-
-
- Pick and choose from additional services. Make your devices understand their environment, interact with it, collect data, and more:
-
-
-
-{{< tabs class="horizontalheaders services" navheader="Services">}}
-{{% tab name="Computer Vision" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-# Get image from camera stream on construction site
-cam = Camera.from_robot(machine, "construction-site-cam")
-img = await cam.get_image()
-
-# Use machine learning model to gather information from the image
-hardhat_detector = VisionClient.from_robot(machine, "hardhat_detector")
-detections = await hardhat_detector.get_detections(img)
-
-# Check whether a person is detected not wearing a hardhat
-for d in detections:
- if d.confidence > 0.8 and d.class_name == "NO-Hardhat":
- print("Violation detected.")
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-// Get image from camera stream on construction site
-myCamera, err := camera.FromRobot(machine, "construction-site-cam")
-camStream, err := myCamera.Stream(context.Background())
-img, release, err := camStream.Next(context.Background())
-defer release()
-
-// Use machine learning model to gather information from the image
-visService, err := vision.FromRobot(machine, "hardhat_detector")
-detections, err := visService.Detections(context.Background(), img, nil)
-
-// Check whether a person is detected not wearing a hardhat
-for i := 0; i < len(detections); i++ {
- if (detection[i].confidence > 0.8) && (detection[i].class_name == "NO-Hardhat") {
- logger.Info("Violation detected.")
- }
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Computer vision enables your machine to use connected cameras to interpret the world around it.
-With inferences about a machine's surroundings, you can program machines to act based on this input.
-
-[Try the vision service →](/tutorials/projects/helmet/)
-
-
-
-
-{{}}
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="Data Management" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Captured Data" %}}
-
-{{
}}
-
-{{% /tab %}}
-{{% tab name="Query Data" %}}
-
-```python
-# Tag data from the my_camera component
-my_filter = create_filter(component_name="my_camera")
-tags = ["frontview", "trainingdata"]
-res = await data_client.add_tags_to_binary_data_by_filter(tags, my_filter)
-
-# Query sensor data by filter
-my_data = []
-my_filter = create_filter(
- component_name="sensor-1",
- start_time=Timestamp('2024-10-01 10:00:00', tz='US/Pacific'),
- end_time=Timestamp('2024-10-12 18:00:00', tz='US/Pacific')
-)
-tabular_data, count, last = await data_client.tabular_data_by_filter(
- my_filter, last=None)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Sync sensor data, images, and any other binary or timeseries data from all your machines to the cloud. There, you can query and visualize it.
-
-Intermittent internet connectivity? Your data will sync whenever internet is available.
-
-[Learn about Data Management →](/services/data/)
-
-
-
-
-{{% /tab %}}
-{{% tab name="Motion" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-# Add a table obstacle to a WorldState
-table_origin = Pose(x=-202.5, y=-546.5, z=-19.0)
-table_dimensions = Vector3(x=635.0, y=1271.0, z=38.0)
-table_object = Geometry(center=table_origin,
- box=RectangularPrism(dims_mm=table_dimensions))
-obstacles_in_frame = GeometriesInFrame(reference_frame="world",
- geometries=[table_object])
-world_state = WorldState(obstacles=[obstacles_in_frame])
-
-# Destination pose to move to
-dest_in_frame = PoseInFrame(
- reference_frame="world",
- pose=Pose(x=510.0, y=0.0, z=526.0, o_x=0.7, o_y=0.0, o_z=-0.7, theta=0.0))
-
-# Move arm to destination pose
-motion_service = MotionClient.from_robot(robot, "builtin")
-await motion_service.move(
- component_name=Arm.get_resource_name("myArm"),
- destination=dest_in_frame, world_state=world_state)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-// Add a table obstacle to a WorldState
-obstacles := make([]spatialmath.Geometry, 0)
-tableOrigin := spatialmath.NewPose(
- r3.Vector{X: 0.0, Y: 0.0, Z: -10.0},
- &spatialmath.OrientationVectorDegrees{OX: 0.0, OY: 0.0, OZ: 1.0, Theta: 0.0},
-)
-tableDimensions := r3.Vector{X: 2000.0, Y: 2000.0, Z: 20.0}
-tableObj, err := spatialmath.NewBox(tableOrigin, tableDimensions, "table")
-obstacles = append(obstacles, tableObj)
-obstaclesInFrame := referenceframe.NewGeometriesInFrame(referenceframe.World, obstacles)
-worldState, err := referenceframe.NewWorldState([]*referenceframe.GeometriesInFrame{obstaclesInFrame}, nil)
-
-// Destination pose to move to
-destinationPose := spatialmath.NewPose(
- r3.Vector{X: 510.0, Y: 0.0, Z: 526.0},
- &spatialmath.OrientationVectorDegrees{OX: 0.7071, OY: 0.0, OZ: -0.7071, Theta: 0.0},
-)
-destPoseInFrame := referenceframe.NewPoseInFrame(
- referenceframe.World, destinationPose)
-
-// Move arm to destination pose
-motionService, err := motion.FromRobot(robot, "builtin")
-_, err = motionService.Move(context.Background(), arm.Named("myArm"), destPoseInFrame, worldState, nil, nil)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-The motion service enables your machine to plan and move relative to itself, other machines, and the world.
-
-[Try the motion service →](/tutorials/services/plan-motion-with-arm-gripper/)
-
-
-
-
-{{}}
-
-
-
-
-{{% /tab %}}
-{{% tab name="Navigation" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-my_nav = NavigationClient.from_robot(robot=robot, name="my_nav_service")
-
-# Create a new waypoint at the specified latitude and longitude
-location = GeoPoint(latitude=40.76275, longitude=-73.96)
-
-# Add waypoint to the service's data storage
-await my_nav.add_waypoint(point=location)
-
-my_nav = NavigationClient.from_robot(robot=robot, name="my_nav_service")
-
-# Set the service to operate in waypoint mode and begin navigation
-await my_nav.set_mode(Mode.ValueType.MODE_WAYPOINT)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-myNav, err := navigation.FromRobot(robot, "my_nav_service")
-
-// Create a new waypoint at the specified latitude and longitude
-location = geo.NewPoint(40.76275, -73.96)
-
-// Add waypoint to the service's data storage
-err := myNav.AddWaypoint(context.Background(), location, nil)
-
-myNav, err := navigation.FromRobot(robot, "my_nav_service")
-
-// Set the service to operate in waypoint mode and begin navigation
-mode, err := myNav.SetMode(context.Background(), Mode.MODE_WAYPOINT, nil)
-```
-
-{{% /tab %}}
-{{% tab name="Viam app" %}}
-
-{{< imgproc src="/services/navigation/navigation-control-card.png" alt="An example control interface for a navigation service in the Viam app Control Tab." resize="1200x" class="imgzoom aligncenter" >}}
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Use the navigation service to autonomously navigate a machine to defined waypoints.
-
-[Try the navigation service →](/tutorials/services/navigate-with-rover-base/)
-
-
-
-
-{{% /tab %}}
-{{% tab name="Custom Logic" %}}
-
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-my_twilio_svc = Generic.from_robot(robot=machine, name="my_twilio_svc")
-
-# Use a custom command to send a text message with Twilio
-command = {"to": "+1 234 567 8901", "body": "Hello world!"}
-result = await my_twilio_svc.do_command(command)
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-myTwilioSvc, err := generic.FromRobot(machine, "my_twilio_svc")
-
-// Use a custom command to send a text message with Twilio
-command := map[string]interface{}{"to": "+1 234 567 8901", "body": "Hello world!"}
-result, err := myTwilioSvc.DoCommand(context.Background(), command)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Using the Viam Registry you can turn services and your own custom business logic into _{{< glossary_tooltip term_id="module" text="modules" >}}_. You can then deploy your modules to your machines.
-
-[Create a module →](/how-tos/create-module/)
-
-
-
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-
-## Go from one machine to thousands
-
-
- When you connect machines to the cloud you get fleet management tools that let you scale. Go from one prototype to thousands of machines you can manage and operate from one place using the Viam Cloud.
-
-
-
-{{< tabs class="horizontalheaders platform" navheader="Capabilities">}}
-{{% tab name="Deployment" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Fragment" %}}
-
-```json
-// Reusable configuration for using a software package
-{
- "services": [
- {
- "name": "speech-1",
- "namespace": "viam-labs",
- "type": "speech",
- "model": "viam-labs:speech:speechio"
- }
- ],
- "modules": [
- {
- "type": "registry",
- "name": "viam-labs_speech",
- "module_id": "viam-labs:speech",
- // Specific version to deploy
- "version": "0.5.2"
- }
- ]
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Manage hardware and software for multiple machines using a built-in tool called _{{< glossary_tooltip term_id="fragment" text="fragments" >}}_.
-You can make changes to some or all of your machines in one go.
-
-[Deploy packages across devices →](/how-tos/deploy-packages/)
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="Provisioning" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Shell" %}}
-
-```sh {class="command-line" data-prompt="$" data-output="3-5,6,7"}
-# Create configuration for provisioning machines with a fragment
-echo "{
- "manufacturer": "Company",
- "model": "SmartRover",
- "fragment_id": "11d1059b-eaed-4ad8-9fd8-d60ad7386aa2"
-}" >> viam-provisioning.json
-
-# Get and run the script to install viam on a board.
-wget https://storage.googleapis.com/packages.viam.com/apps/viam-agent/preinstall.sh
-chmod 755 preinstall.sh
-sudo ./preinstall.sh
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Provisioning allows you to complete part of the machine setup during the manufacturing process. The rest of the first-time setup happens once the machine is taken into operation.
-This way, machines automatically get the latest updates.
-
-[Learn about provisioning →](/fleet/provision/)
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="Observability" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Viam app" %}}
-
-{{< imgproc src="/fleet/dashboard.png" alt="Dashboard view of machine status information" resize="1200x" class="imgzoom aligncenter" >}}
-
-{{% /tab %}}
-{{% tab name="Python" %}}
-
-```python
-# Get all machines in a location
-machines = await cloud.list_robots(location_id="abcde1fghi")
-
-for m in machines:
- # Connect and get status information or latest logs
- machine_parts = await cloud.get_robot_parts(m.id)
- main_part = next(filter(lambda part: part.main_part, machine_parts), None)
-
- try:
- # Get status for machine
- machine = await connect(main_part.fqdn)
- status = await machine.get_machine_status()
- except ConnectionError:
- # If no connection can be made, get last logs
- logs = await cloud.get_robot_part_logs(
- robot_part_id=main_part.id, num_log_entries=5)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Get status information and logs from all your deployed machines.
-
-[Learn about Platform APIs →](/appendix/apis/#platform-apis)
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="ML Training" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Viam app" %}}
-
-{{< imgproc src="/tutorials/data-management/train-model.png" alt="The data tab showing the train a model pane" resize="1200x" class="imgzoom" >}}
-
-{{% /tab %}}
-{{% tab name="Python" %}}
-
-```python
-# Start a training job to create a classification model based on the dataset
-job_id = await ml_training_client.submit_training_job(
- org_id="abbc1c1c-d2e3-5f67-ab8c-de912345f678",
- dataset_id="12ab3cd4e56f7abc89de1fa2",
- model_name="recognize_gestures",
- model_version="1",
- model_type=ModelType.MODEL_TYPE_MULTI_LABEL_CLASSIFICATION,
- tags=["follow", "stop"]
-)
-
-# Get status information for training job
-job_metadata = await ml_training_client.get_training_job(
- id=job_id)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Build machine learning models based on your machines' data. You can pick from different training algorithms or create your own.
-
-[Train and deploy ML models →](/how-tos/train-deploy-ml/)
-
-
-
-
-
-{{% /tab %}}
-{{% tab name="Collaboration" %}}
-
-
-
-{{< tabs >}}
-{{% tab name="Viam app" %}}
-
-{{
}}
-
-{{% /tab %}}
-{{% tab name="Python" %}}
-
-```python
-# Create a new machine
-new_machine_id = await cloud.new_robot(
- name="new-machine", location_id="abcde1fghi")
-
-# Get organization associated with authenticated user / API key
-org_list = await cloud.list_organizations()
-
-# Create a new API key with owner access for the new machine
-auth = APIKeyAuthorization(
- role="owner",
- resource_type="robot",
- resource_id=new_machine_id
-)
-api_key, api_key_id = await cloud.create_key(
- org_list[0].id, [auth], "key_for_new_machine")
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-
-
-Viam allows you to organize and manage any number of machines. When collaborating with others, you can assign permissions using Role-Based Access Control (RBAC).
-
-[Learn about access control →](/cloud/rbac/)
-
-
-
-
-
-{{% /tab %}}
-{{< /tabs >}}
diff --git a/docs/ai/_index.md b/docs/ai/_index.md
new file mode 100644
index 00000000000..4c6ebf513dd
--- /dev/null
+++ b/docs/ai/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Leverage AI"
+title: "Leverage AI"
+weight: 500
+layout: "docs"
+type: "docs"
+no_list: true
+open_on_desktop: true
+overview: true
+---
diff --git a/docs/ai/act.md b/docs/ai/act.md
new file mode 100644
index 00000000000..4adb7aea523
--- /dev/null
+++ b/docs/ai/act.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Act based on inferences"
+title: "Act based on inferences"
+weight: 70
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/advanced/_index.md b/docs/ai/advanced/_index.md
new file mode 100644
index 00000000000..233056f4cda
--- /dev/null
+++ b/docs/ai/advanced/_index.md
@@ -0,0 +1,8 @@
+---
+linkTitle: "Advanced"
+title: "Advanced"
+weight: 200
+layout: "empty"
+type: "docs"
+empty_page: true
+---
diff --git a/docs/ai/advanced/conditional-sync.md b/docs/ai/advanced/conditional-sync.md
new file mode 100644
index 00000000000..9d8fae77468
--- /dev/null
+++ b/docs/ai/advanced/conditional-sync.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Upload external data"
+title: "Upload external data for training"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/alert.md b/docs/ai/alert.md
new file mode 100644
index 00000000000..8f26dda2ebc
--- /dev/null
+++ b/docs/ai/alert.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Alert on inferences"
+title: "Alert on inferences"
+weight: 60
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/create-dataset.md b/docs/ai/create-dataset.md
new file mode 100644
index 00000000000..060ff51f244
--- /dev/null
+++ b/docs/ai/create-dataset.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Create a dataset"
+title: "Create a dataset"
+weight: 10
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/deploy.md b/docs/ai/deploy.md
new file mode 100644
index 00000000000..d8cc3a5953a
--- /dev/null
+++ b/docs/ai/deploy.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Deploy model"
+title: "Deploy a model"
+weight: 40
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/reference/_index.md b/docs/ai/reference/_index.md
new file mode 100644
index 00000000000..a11cc4cbac0
--- /dev/null
+++ b/docs/ai/reference/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Reference"
+title: "Reference"
+weight: 300
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/appendix/apis/ml-training-client.md b/docs/ai/reference/ml-training-client.md
similarity index 99%
rename from docs/appendix/apis/ml-training-client.md
rename to docs/ai/reference/ml-training-client.md
index 1401bd2168e..9adb316b30e 100644
--- a/docs/appendix/apis/ml-training-client.md
+++ b/docs/ai/reference/ml-training-client.md
@@ -1,7 +1,7 @@
---
title: "Work with ML Training Jobs with Viam's ML Training API"
linkTitle: "ML Training Client"
-weight: 10
+weight: 30
type: "docs"
description: "Use the ML training client API to manage ML training jobs taking place in Viam's cloud app."
tags: ["cloud", "sdk", "viam-server", "networking", "apis", "ml model", "ml"]
diff --git a/docs/services/ml/_index.md b/docs/ai/reference/ml.md
similarity index 99%
rename from docs/services/ml/_index.md
rename to docs/ai/reference/ml.md
index 60ed3d08fcd..af14cdaa7c5 100644
--- a/docs/services/ml/_index.md
+++ b/docs/ai/reference/ml.md
@@ -1,7 +1,7 @@
---
title: "ML Model Service"
-linkTitle: "ML Model"
-weight: 30
+linkTitle: "ML Model Service"
+weight: 10
type: "docs"
tags: ["data management", "ml", "model training"]
aliases:
diff --git a/docs/services/vision/_index.md b/docs/ai/reference/vision/_index.md
similarity index 99%
rename from docs/services/vision/_index.md
rename to docs/ai/reference/vision/_index.md
index 4599b314dfc..93b39080c02 100644
--- a/docs/services/vision/_index.md
+++ b/docs/ai/reference/vision/_index.md
@@ -1,6 +1,6 @@
---
title: "Vision Service"
-linkTitle: "Computer Vision"
+linkTitle: "Vision Service"
weight: 20
type: "docs"
description: "The vision service enables your machine to use its on-board cameras to intelligently see and interpret the world around it."
diff --git a/docs/services/vision/color_detector.md b/docs/ai/reference/vision/color_detector.md
similarity index 100%
rename from docs/services/vision/color_detector.md
rename to docs/ai/reference/vision/color_detector.md
diff --git a/docs/services/vision/detector_3d_segmenter.md b/docs/ai/reference/vision/detector_3d_segmenter.md
similarity index 100%
rename from docs/services/vision/detector_3d_segmenter.md
rename to docs/ai/reference/vision/detector_3d_segmenter.md
diff --git a/docs/services/vision/mlmodel.md b/docs/ai/reference/vision/mlmodel.md
similarity index 100%
rename from docs/services/vision/mlmodel.md
rename to docs/ai/reference/vision/mlmodel.md
diff --git a/docs/services/vision/obstacles_depth.md b/docs/ai/reference/vision/obstacles_depth.md
similarity index 100%
rename from docs/services/vision/obstacles_depth.md
rename to docs/ai/reference/vision/obstacles_depth.md
diff --git a/docs/services/vision/obstacles_distance.md b/docs/ai/reference/vision/obstacles_distance.md
similarity index 100%
rename from docs/services/vision/obstacles_distance.md
rename to docs/ai/reference/vision/obstacles_distance.md
diff --git a/docs/services/vision/obstacles_pointcloud.md b/docs/ai/reference/vision/obstacles_pointcloud.md
similarity index 100%
rename from docs/services/vision/obstacles_pointcloud.md
rename to docs/ai/reference/vision/obstacles_pointcloud.md
diff --git a/docs/ai/run-inference.md b/docs/ai/run-inference.md
new file mode 100644
index 00000000000..9587691af18
--- /dev/null
+++ b/docs/ai/run-inference.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Run inference"
+title: "Run inference on a model"
+weight: 50
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/train-tflite.md b/docs/ai/train-tflite.md
new file mode 100644
index 00000000000..0149e8e9041
--- /dev/null
+++ b/docs/ai/train-tflite.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Train TFlite model"
+title: "Train a TFlite model"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/ai/train.md b/docs/ai/train.md
new file mode 100644
index 00000000000..4d8c06f95b9
--- /dev/null
+++ b/docs/ai/train.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Train other models"
+title: "Train other models"
+weight: 30
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/appendix/_index.md b/docs/appendix/_index.md
deleted file mode 100644
index 37f744a50b1..00000000000
--- a/docs/appendix/_index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: "Appendix"
-linkTitle: "Appendix"
-weight: 900
-empty_node: true
-layout: "empty"
-notoc: true
-type: "docs"
-description: "Reference and Background Material"
-canonical: "/appendix/changelog/"
----
diff --git a/docs/appendix/apis/_index.md b/docs/appendix/apis/_index.md
deleted file mode 100644
index b02f0167d56..00000000000
--- a/docs/appendix/apis/_index.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-title: "Viam's Client APIs"
-linkTitle: "APIs"
-weight: 20
-type: "docs"
-description: "Access and control your machine or fleet with the SDKs' client libraries for the resource and robot APIs."
-icon: true
-images: ["/services/icons/sdk.svg"]
-tags: ["client", "sdk", "viam-server", "networking", "apis", "robot api"]
-aliases:
- - /program/sdks/
- - /program/apis/
- - /build/program/apis/
-no_list: true
-date: "2024-10-01"
-# updated: "" # When the content was last entirely checked
----
-
-Every Viam {{< glossary_tooltip term_id="resource" text="resource" >}} exposes an [application programming interface (API)](https://en.wikipedia.org/wiki/API) described through [protocol buffers](https://developers.google.com/protocol-buffers).
-
-The API methods provided by the SDKs for each of these resource APIs wrap gRPC client requests to the machine when you execute your program, providing you a convenient interface for accessing information about and controlling the {{< glossary_tooltip term_id="resource" text="resources" >}} you have [configured](/configure/) on your machine.
-
-## Platform APIs
-
-{{< cards >}}
-{{% manualcard link="/appendix/apis/fleet/" title="Fleet Management API" %}}
-
-Create and manage organizations, locations, and machines, get logs from individual machines, and manage fragments and permissions.
-
-{{% /manualcard %}}
-{{% manualcard link="/appendix/apis/data-client/" title="Data Client API" %}}
-
-Upload, download, filter, tag or perform other tasks on data like images or sensor readings.
-
-{{% /manualcard %}}
-{{% manualcard link="/appendix/apis/robot/" title="Machine Management API" %}}
-
-Manage your machines: connect to your machine, retrieve status information, and send commands remotely.
-
-{{% /manualcard %}}
-{{% manualcard link="/appendix/apis/ml-training-client/" title="ML Training Client API" %}}
-
-Submit and manage ML training jobs running on the Viam app.
-
-{{% /manualcard %}}
-{{% manualcard link="/appendix/apis/billing-client/" title="Billing Client API" %}}
-
-Retrieve billing information from the Viam app.
-
-{{% /manualcard %}}
-
-{{< /cards >}}
-
-## Component APIs
-
-These APIs provide interfaces for controlling and getting information from the {{< glossary_tooltip term_id="component" text="components" >}} of a machine:
-
-{{< cards >}}
-{{< card link="/appendix/apis/components/arm/" customTitle="Arm API" noimage="True" >}}
-{{< card link="/appendix/apis/components/base/" customTitle="Base API" noimage="True" >}}
-{{< card link="/appendix/apis/components/board/" customTitle="Board API" noimage="True" >}}
-{{< card link="/appendix/apis/components/camera/" customTitle="Camera API" noimage="True" >}}
-{{< card link="/appendix/apis/components/encoder/" customTitle="Encoder API" noimage="True" >}}
-{{< card link="/appendix/apis/components/gantry/" customTitle="Gantry API" noimage="True" >}}
-{{< card link="/appendix/apis/components/generic/" customTitle="Generic API" noimage="True" >}}
-{{< card link="/appendix/apis/components/gripper/" customTitle="Gripper API" noimage="True" >}}
-{{< card link="/appendix/apis/components/input-controller/" customTitle="Input controller API" noimage="True" >}}
-{{< card link="/appendix/apis/components/motor/" customTitle="Motor API" noimage="True" >}}
-{{< card link="/appendix/apis/components/movement-sensor/" customTitle="Movement sensor API" noimage="True" >}}
-{{< card link="/appendix/apis/components/power-sensor/" customTitle="Power sensor API" noimage="True" >}}
-{{< card link="/appendix/apis/components/sensor/" customTitle="Sensor API" noimage="True" >}}
-{{< card link="/appendix/apis/components/servo/" customTitle="Servo API" noimage="True" >}}
-{{< /cards >}}
-
-## Service APIs
-
-These APIs provide interfaces for controlling and getting information from the services you configured on a machine.
-
-{{< cards >}}
-{{% card link="/appendix/apis/services/data/" customTitle="Data management service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/vision/" customTitle="Vision service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/ml/" customTitle="ML model service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/motion/" customTitle="Motion service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/navigation/" customTitle="Navigation service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/generic/" customTitle="Generic service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/slam/" customTitle="SLAM service API" noimage="True" %}}
-{{% card link="/appendix/apis/services/base-rc/" customTitle="Base Remote Control service API" noimage="True" %}}
-{{< /cards >}}
diff --git a/docs/appendix/apis/components/_index.md b/docs/appendix/apis/components/_index.md
deleted file mode 100644
index 9c8eba83262..00000000000
--- a/docs/appendix/apis/components/_index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-linkTitle: "Component APIs"
-title: "Component APIs"
-weight: 5
-empty_node: true
-layout: "empty"
-canonical: "/appendix/apis/"
-type: "docs"
----
diff --git a/docs/appendix/apis/components/arm.md b/docs/appendix/apis/components/arm.md
deleted file mode 100644
index 8448d550ef1..00000000000
--- a/docs/appendix/apis/components/arm.md
+++ /dev/null
@@ -1,63 +0,0 @@
----
-title: "Arm API"
-linkTitle: "Arm"
-weight: 10
-type: "docs"
-description: "Give commands to your arm components for linear motion planning, including self-collision prevention and obstacle avoidance."
-icon: true
-images: ["/icons/components/arm.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The arm API allows you to give commands to your [arm components](/components/arm/) for linear motion planning, including self-collision prevention and obstacle avoidance.
-
-The arm component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/arm-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your arm and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have an arm called `"my_arm"` configured as a component of your machine.
-If your arm has a different name, change the `name` in the code.
-
-Import the arm package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.arm import Arm
-# To use move_to_position:
-from viam.proto.common import Pose
-# To use move_to_joint_positions:
-from viam.proto.component.arm import JointPositions
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/arm"
- // To use MoveToPosition:
- "go.viam.com/rdk/referenceframe"
- "go.viam.com/rdk/spatialmath"
- // To use MoveToJointPositions ("armapi" name optional, but necessary if importing other packages called "v1"):
- armapi "go.viam.com/api/component/arm/v1"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/arm.md" >}}
diff --git a/docs/appendix/apis/components/base.md b/docs/appendix/apis/components/base.md
deleted file mode 100644
index 31203c21f88..00000000000
--- a/docs/appendix/apis/components/base.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Base API"
-linkTitle: "Base"
-weight: 20
-type: "docs"
-description: "Give commands for moving all configured components attached to a mobile platform as a whole without needing to send commands to individual components."
-icon: true
-images: ["/icons/components/base.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The base API allows you to give commands to your [base components](/components/base/) for moving all configured components attached to a platform as a whole without needing to send commands to individual components.
-
-The base component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/base-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your base and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a wheeled base called `"my_base"` configured as a component of your machine.
-If your base has a different name, change the `name` in the code.
-
-Import the base package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.base import Base
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/base"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/base.md" >}}
diff --git a/docs/appendix/apis/components/board.md b/docs/appendix/apis/components/board.md
deleted file mode 100644
index 20321ad6018..00000000000
--- a/docs/appendix/apis/components/board.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-title: "Board API"
-linkTitle: "Board"
-weight: 30
-type: "docs"
-description: "Give commands for setting GPIO pins to high or low, setting PWM, and working with analog and digital interrupts."
-icon: true
-images: ["/icons/components/board.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The board API allows you to give commands to your [board components](/components/board/) for setting GPIO pins to high or low, setting PWM, and working with analog and digital interrupts.
-
-The board component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/board-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your board and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code will create a connection to your machine as a client.
-Then control your machine programmatically by getting your `board` component from the machine with `FromRobot` and adding API method calls, as shown in the following examples.
-
-The following examples assume you have a board called `"my_board"` configured as a component of your machine.
-If your board has a different name, change the `name` in the code.
-
-Import the board package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.board import Board
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/board"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/board.md" >}}
diff --git a/docs/appendix/apis/components/camera.md b/docs/appendix/apis/components/camera.md
deleted file mode 100644
index 389a0f6ae80..00000000000
--- a/docs/appendix/apis/components/camera.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-title: "Camera API"
-linkTitle: "Camera"
-weight: 40
-type: "docs"
-description: "Give commands for getting images or point clouds."
-icon: true
-images: ["/icons/components/camera.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The camera API allows you to give commands to your [camera components](/components/camera/) for getting images or point clouds.
-
-The API for camera components allows you to:
-
-- Request single images or a stream in 2D color, or display z-depth.
-- Request a point cloud.
- Each 3D point cloud image consists of a set of coordinates (x,y,z) representing depth in mm.
-
-The camera component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/camera-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your camera and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a camera called `"my_camera"` configured as a component of your machine.
-If your camera has a different name, change the `name` in the code.
-
-Import the camera package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.camera import Camera
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/camera"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/camera.md" >}}
diff --git a/docs/appendix/apis/components/encoder.md b/docs/appendix/apis/components/encoder.md
deleted file mode 100644
index f360c18b954..00000000000
--- a/docs/appendix/apis/components/encoder.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Encoder API"
-linkTitle: "Encoder"
-weight: 50
-type: "docs"
-description: "Give commands for getting the position of a motor or a joint in ticks or degrees."
-icon: true
-images: ["/icons/components/encoder.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The encoder API allows you to give commands to your [encoder components](/components/encoder/) for getting the position of a motor or a joint in ticks or degrees.
-
-The encoder component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/encoder-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your encoder and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have an encoder called `"my_encoder"` configured as a component of your machine.
-If your encoder has a different name, change the `name` in the code.
-
-Import the encoder package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.encoder import Encoder
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/encoder"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/encoder.md" >}}
diff --git a/docs/appendix/apis/components/gantry.md b/docs/appendix/apis/components/gantry.md
deleted file mode 100644
index 5d474ee2bcf..00000000000
--- a/docs/appendix/apis/components/gantry.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Gantry API"
-linkTitle: "Gantry"
-weight: 60
-type: "docs"
-description: "Give commands for coordinated control of one or more linear actuators."
-icon: true
-images: ["/icons/components/gantry.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The gantry API allows you to give commands to your [gantry components](/components/gantry/) for coordinated control of one or more linear actuators.
-
-The gantry component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/gantry-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your gantry and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a gantry called `"my_gantry"` configured as a component of your machine.
-If your gantry has a different name, change the `name` in the code.
-
-Import the gantry package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.gantry import Gantry
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/gantry"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/gantry.md" >}}
diff --git a/docs/appendix/apis/components/generic.md b/docs/appendix/apis/components/generic.md
deleted file mode 100644
index 1503914b0f0..00000000000
--- a/docs/appendix/apis/components/generic.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-title: "Control your generic component with the generic API"
-linkTitle: "Generic"
-weight: 70
-type: "docs"
-description: "Give commands for running custom model-specific commands using DoCommand on your generic components."
-icon: true
-images: ["/icons/components/generic.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The generic API allows you to give commands to your [generic components](/components/generic/) for running model-specific commands using [`DoCommand`](/appendix/apis/components/generic/#docommand).
-
-The generic component supports the following method:
-
-{{< readfile "/static/include/components/apis/generated/generic_component-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your generic component and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code will create a connection to your machine as a client.
-Then control your machine programmatically by getting your `generic` component from the machine with `FromRobot` and adding API method calls, as shown in the following examples.
-
-The following examples assume you have a board called "my_board" configured as a component of your machine.
-If your board has a different name, change the `name` in the code.
-
-Import the generic component package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.generic import Generic
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/generic"
-)
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-#include
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/generic_component.md" >}}
diff --git a/docs/appendix/apis/components/gripper.md b/docs/appendix/apis/components/gripper.md
deleted file mode 100644
index 35000b696a3..00000000000
--- a/docs/appendix/apis/components/gripper.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Control your gripper with the gripper API"
-linkTitle: "Gripper"
-weight: 80
-type: "docs"
-description: "Give commands for opening and closing a gripper device."
-icon: true
-images: ["/icons/components/gripper.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The gripper API allows you to give commands to your [gripper components](/components/gripper/) for opening and closing a device.
-
-The gripper component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/gripper-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your gripper and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a gripper called `"my_gripper"` configured as a component of your machine.
-If your gripper has a different name, change the `name` in the code.
-
-Import the gripper package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.gripper import Gripper
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/gripper"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/gripper.md" >}}
diff --git a/docs/appendix/apis/components/input-controller.md b/docs/appendix/apis/components/input-controller.md
deleted file mode 100644
index 3bd12e87292..00000000000
--- a/docs/appendix/apis/components/input-controller.md
+++ /dev/null
@@ -1,574 +0,0 @@
----
-title: "Input controller API"
-linkTitle: "Input Controller"
-titleMustBeLong: true
-weight: 90
-type: "docs"
-description: "Give commands to register callbacks for events, allowing you to use input devices to control your machines."
-icon: true
-images: ["/icons/components/controller.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The input controller API allows you to give commands to your [input controller components](/components/input-controller/) for configuring callbacks for events, allowing you to configure input devices to control your machines.
-
-The input controller component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/input_controller-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your controller and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have an input controller called `"my_controller"` configured as a component of your machine.
-If your input controller has a different name, change the `name` in the code.
-
-Import the input controller package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.input import Control, Controller, EventType
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/input"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/input_controller.md" >}}
-
-## API types
-
-The `input` API defines the following types:
-
-### Event object
-
-Each `Event` object represents a singular event from the input device, and has four fields:
-
-1. `Time`: `time.Time` the event occurred.
-2. `Event`: `EventType` indicating the type of event (for example, a specific button press or axis movement).
-3. `Control`: `Control` indicating which [Axis](#axis-controls), [Button](/appendix/apis/components/input-controller/#button-controls), or Pedal on the controller has been changed.
-4. `Value`: `float64` indicating the position of an [Axis](/appendix/apis/components/input-controller/#axis-controls) or the state of a [Button](/appendix/apis/components/input-controller/#button-controls) on the specified control.
-
-#### EventType field
-
-A string-like type indicating the specific type of input event, such as a button press or axis movement.
-
-- To select for events of all type when registering callback function with [RegisterControlCallback](/appendix/apis/components/input-controller/#registercontrolcallback), you can use `AllEvents` as your `EventType`.
-- The registered function is then called in addition to any other callback functions you've registered, every time an `Event` happens on your controller.
- This is useful for debugging without interrupting normal controls, or for capturing extra or unknown events.
-
-Registered `EventTypes` definitions:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python {class="line-numbers linkable-line-numbers"}
-ALL_EVENTS = "AllEvents"
-"""
-Callbacks registered for this event will be called in ADDITION to other
-registered event callbacks.
-"""
-
-CONNECT = "Connect"
-"""
-Sent at controller initialization, and on reconnects.
-"""
-
-DISCONNECT = "Disconnect"
-"""
-If unplugged, or wireless/network times out.
-"""
-
-BUTTON_PRESS = "ButtonPress"
-"""
-Typical key press.
-"""
-
-BUTTON_RELEASE = "ButtonRelease"
-"""
-Key release.
-"""
-
-BUTTON_HOLD = "ButtonHold"
-"""
-Key is held down. This will likely be a repeated event.
-"""
-
-BUTTON_CHANGE = "ButtonChange"
-"""
-Both up and down for convenience during registration, not typically emitted.
-"""
-
-POSITION_CHANGE_ABSOLUTE = "PositionChangeAbs"
-"""
-Absolute position is reported via Value, a la joysticks.
-"""
-
-POSITION_CHANGE_RELATIVE = "PositionChangeRel"
-"""
-Relative position is reported via Value, a la mice, or simulating axes with
-up/down buttons.
-"""
-```
-
-See [the Python SDK Docs](https://python.viam.dev/autoapi/viam/components/input/input/index.html#viam.components.input.EventType) for the most current version of supported `EventTypes`.
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go {class="line-numbers linkable-line-numbers"}
- // Callbacks registered for this event will be called in ADDITION to other registered event callbacks.
-AllEvents EventType = "AllEvents"
-
-// Sent at controller initialization, and on reconnects.
-Connect EventType = "Connect"
-
-// If unplugged, or wireless/network times out.
-Disconnect EventType = "Disconnect"
-
-// Typical key press.
-ButtonPress EventType = "ButtonPress"
-
-// Key release.
-ButtonRelease EventType = "ButtonRelease"
-
-// Key is held down. This will likely be a repeated event.
-ButtonHold EventType = "ButtonHold"
-
-// Both up and down for convenience during registration, not typically emitted.
-ButtonChange EventType = "ButtonChange"
-
-// Absolute position is reported via Value, a la joysticks.
-PositionChangeAbs EventType = "PositionChangeAbs"
-
-// Relative position is reported via Value, a la mice, or simulating axes with up/down buttons.
-PositionChangeRel EventType = "PositionChangeRel"
-```
-
-See [the Viam RDK](https://github.com/viamrobotics/rdk/blob/main/components/input/input.go) for the most current version of supported `EventTypes`.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### Control field
-
-A string representing the physical input location, like a specific axis or button, of your `Controller` that the [Event Object](#event-object) is coming from.
-
-Registered `Control` types are defined as follows:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python {class="line-numbers linkable-line-numbers"}
-# Axes
-ABSOLUTE_X = "AbsoluteX"
-ABSOLUTE_Y = "AbsoluteY"
-ABSOLUTE_Z = "AbsoluteZ"
-ABSOLUTE_RX = "AbsoluteRX"
-ABSOLUTE_RY = "AbsoluteRY"
-ABSOLUTE_RZ = "AbsoluteRZ"
-ABSOLUTE_HAT0_X = "AbsoluteHat0X"
-ABSOLUTE_HAT0_Y = "AbsoluteHat0Y"
-
-# Buttons
-BUTTON_SOUTH = "ButtonSouth"
-BUTTON_EAST = "ButtonEast"
-BUTTON_WEST = "ButtonWest"
-BUTTON_NORTH = "ButtonNorth"
-BUTTON_LT = "ButtonLT"
-BUTTON_RT = "ButtonRT"
-BUTTON_LT2 = "ButtonLT2"
-BUTTON_RT2 = "ButtonRT2"
-BUTTON_L_THUMB = "ButtonLThumb"
-BUTTON_R_THUMB = "ButtonRThumb"
-BUTTON_SELECT = "ButtonSelect"
-BUTTON_START = "ButtonStart"
-BUTTON_MENU = "ButtonMenu"
-BUTTON_RECORD = "ButtonRecord"
-BUTTON_E_STOP = "ButtonEStop"
-
-# Pedals
-ABSOLUTE_PEDAL_ACCELERATOR = "AbsolutePedalAccelerator"
-ABSOLUTE_PEDAL_BRAKE = "AbsolutePedalBrake"
-ABSOLUTE_PEDAL_CLUTCH = "AbsolutePedalClutch"
-```
-
-See [the Python SDK Docs](https://python.viam.dev/autoapi/viam/components/input/input/index.html#viam.components.input.Control) for the most current version of supported `Control` types.
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go {class="line-numbers linkable-line-numbers"}
-// Axes.
-AbsoluteX Control = "AbsoluteX"
-AbsoluteY Control = "AbsoluteY"
-AbsoluteZ Control = "AbsoluteZ"
-AbsoluteRX Control = "AbsoluteRX"
-AbsoluteRY Control = "AbsoluteRY"
-AbsoluteRZ Control = "AbsoluteRZ"
-AbsoluteHat0X Control = "AbsoluteHat0X"
-AbsoluteHat0Y Control = "AbsoluteHat0Y"
-
-// Buttons.
-ButtonSouth Control = "ButtonSouth"
-ButtonEast Control = "ButtonEast"
-ButtonWest Control = "ButtonWest"
-ButtonNorth Control = "ButtonNorth"
-ButtonLT Control = "ButtonLT"
-ButtonRT Control = "ButtonRT"
-ButtonLT2 Control = "ButtonLT2"
-ButtonRT2 Control = "ButtonRT2"
-ButtonLThumb Control = "ButtonLThumb"
-ButtonRThumb Control = "ButtonRThumb"
-ButtonSelect Control = "ButtonSelect"
-ButtonStart Control = "ButtonStart"
-ButtonMenu Control = "ButtonMenu"
-ButtonRecord Control = "ButtonRecord"
-ButtonEStop Control = "ButtonEStop"
-
-// Pedals.
-AbsolutePedalAccelerator Control = "AbsolutePedalAccelerator"
-AbsolutePedalBrake Control = "AbsolutePedalBrake"
-AbsolutePedalClutch Control = "AbsolutePedalClutch"
-```
-
-See [GitHub](https://github.com/viamrobotics/rdk/blob/main/components/input/input.go) for the most current version of supported `Control` types.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Axis controls
-
-{{% alert title="Support Notice" color="note" %}}
-Currently, only `Absolute` axes are supported.
-
-`Relative` axes, reporting a relative change in distance, used by devices like mice and trackpads, will be supported in the future.
-{{% /alert %}}
-
-Analog devices like joysticks and thumbsticks which return to center/neutral on their own use `Absolute` axis control types.
-
-These controls report a `PositionChangeAbs` [EventType](#eventtype-field).
-
-**Value:** A `float64` between `-1.0` and `+1.0`.
-
-- `1.0`: Maximum position in the positive direction.
-- `0.0`: Center, neutral position.
-- `-1.0`: Maximum position in the negative direction.
-
-#### AbsoluteXY axes
-
-If your input controller has an analog stick, this is what the stick's controls report as.
-
-Alternatively, if your input controller has _two_ analog sticks, this is what the left joystick's controls report as.
-
-| Name | `-1.0` | `0.0` | `1.0` |
-| ----------- | ------------- | ------- | --------------- |
-| `AbsoluteX` | Stick Left | Neutral | Stick Right |
-| `AbsoluteY` | Stick Forward | Neutral | Stick Backwards |
-
-#### AbsoluteR-XY axes
-
-If your input controller has _two_ analog sticks, this is what the right joystick's controls report as.
-
-| Name | `-1.0` | `0.0` | `1.0` |
-| ------------ | ------------- | ------- | --------------- |
-| `AbsoluteRX` | Stick Left | Neutral | Stick Right |
-| `AbsoluteRY` | Stick Forward | Neutral | Stick Backwards |
-
-- For `Y` axes, the positive direction is "nose up," and indicates _pulling_ back on the joystick.
-
-#### Hat/D-Pad axes
-
-If your input controller has a directional pad with analog buttons on the pad, this is what those controls report as.
-
-
-| Name | `-1.0` | `0.0` | `1.0` |
-| ---- | ------ | ----- | ----- |
-| `AbsoluteHat0X` | Left DPAD Button Press | Neutral | Right DPAD Button Press |
-| `AbsoluteHat0Y` | Up DPAD Button Press | Neutral | Down DPAD Button Press |
-
-#### Z axes (analog trigger sticks)
-
-{{% alert title="Info" color="info" %}}
-Devices like analog triggers and gas or brake pedals use `Absolute` axes, but they only report position change in the positive direction.
-The neutral point of the axes is still `0.0`.
-{{% /alert %}}
-
-| Name | `-1.0` | `0.0` | `1.0` |
-| ------------ | ------ | ------- | ------------ |
-| `AbsoluteZ` | | Neutral | Stick Pulled |
-| `AbsoluteRZ` | | Neutral | Stick Pulled |
-
-`Z` axes are usually not present on most controller joysticks.
-
-If present, they are typically analog trigger sticks, and unidirectional, scaling only from `0` to `1.0` as they are pulled, as shown above.
-
-`AbsoluteZ` is reported if there is one trigger stick, and `AbsoluteZ` (left) and `AbsoluteRZ` (right) is reported if there are two trigger sticks.
-
-Z axes can be present on flight-style joysticks, reporting _yaw_, or left/right rotation, as shown below.
-This is not common.
-
-| Name | `-1.0` | `0.0` | `1.0` |
-| ------------ | -------------- | ------- | --------------- |
-| `AbsoluteZ` | Stick Left Yaw | Neutral | Stick Right Yaw |
-| `AbsoluteRZ` | Stick Left Yaw | Neutral | Stick Right Yaw |
-
-### Button controls
-
-Button Controls report either `ButtonPress` or `ButtonRelease` as their [EventType](#eventtype-field).
-
-**Value:**
-
-- `0`: released
-- `1`: pressed
-
-#### Action buttons (ABXY)
-
-If your input controller is a gamepad with digital action buttons, this is what the controls for these buttons report as.
-
-{{% alert title="Tip" color="tip" %}}
-As different systems label the actual buttons differently, we use compass directions for consistency.
-
-- `ButtonSouth` corresponds to "B" on Nintendo, "A" on XBox, and "X" on Playstation.
-- `ButtonNorth` corresponds to "X" on Nintendo, "Y" on XBox, and "Triangle" on Playstation.
- {{% /alert %}}
-
-
-| Diamond 4-Action Button Pad | Rectangle 4-Action Button Pad |
-| - | - |
-| Name Description `ButtonNorth` Top `ButtonSouth` Bottom `ButtonEast` Right `ButtonWest` Left
| Name Description `ButtonNorth` Top-left `ButtonSouth` Bottom-right `ButtonEast` Top-right `ButtonWest` Bottom-left
|
-
-
-| Horizontal 3-Action Button Pad | Vertical 3-Action Button Pad |
-| - | - |
-| Name Description `ButtonWest` Left `ButtonSouth` Center `ButtonEast` Right
| Name Description `ButtonWest` Top `ButtonSouth` Center `ButtonEast` Bottom
|
-
-
-| Horizontal 2-Action Button Pad | Vertical 2-Action Button Pad |
-| - | - |
-| Name Description `ButtonEast` Right `ButtonSouth` Left
| Name Description `ButtonEast` Top `ButtonSouth` Bottom
|
-
-#### Trigger buttons (bumpers)
-
-If your input controller is a gamepad with digital trigger buttons, this is what the controls for those buttons report as.
-
-
-| 2-Trigger Button Pad | 4-Trigger Button Pad |
-| - | - |
-| Name Description `ButtonLT` Left `ButtonRT` Right
| Name Description `ButtonLT` Top-left `ButtonRT` Top-right `ButtonLT2` Bottom-left `ButtonRT2` Bottom-right
|
-
-#### Digital buttons for sticks
-
-If your input controller is a gamepad with "clickable" thumbsticks, this is what thumbstick presses report as.
-
-| Name | Description |
-| -------------- | ------------------------------- |
-| `ButtonLThumb` | Left or upper button for stick |
-| `ButtonRThumb` | Right or lower button for stick |
-
-#### Miscellaneous buttons
-
-Many devices have additional buttons.
-If your input controller is a gamepad with these common buttons, this is what the controls for those buttons report as.
-
-| Name | Description |
-| -------------- | --------------------------------------------------- |
-| `ButtonSelect` | Select or - |
-| `ButtonStart` | Start or + |
-| `ButtonMenu` | Usually the central "Home" or Xbox/PS "Logo" button |
-| `ButtonRecord` | Recording |
-| `ButtonEStop` | Emergency Stop (on some industrial controllers) |
-
-## Usage examples
-
-### Control a wheeled base with a Logitech G920 steering wheel controller
-
-The following Python code is an example of controlling a wheeled {{% glossary_tooltip term_id="base" text="base"%}} with a Logitech G920 steering wheel controller, configured as a `gamepad` input controller.
-
-```python {id="python-example" class="line-numbers linkable-line-numbers"}
-import asyncio
-
-from viam.components.base import Base
-from viam.components.input import Control, Controller, EventType
-from viam.proto.common import Vector3
-from viam.robot.client import RobotClient
-from viam.rpc.dial import Credentials, DialOptions
-
-turn_amt = 0
-modal = 0
-cmd = {}
-
-
-async def connect_robot(host, api_key, api_key_id):
- opts = RobotClient.Options.with_api_key(
- api_key=api_key,
- api_key_id=api_key_id
- )
- return await RobotClient.at_address(host, opts)
-
-
-def handle_turning(event):
- global turn_amt
- turn_amt = -event.value
- print("turning:", turn_amt)
-
-
-def handle_brake(event):
- if event.value != 0:
- print("braking!:", event.value)
- global cmd
- cmd = {"y": 0}
- print("broke")
-
-
-def handle_accelerator(event):
- print("moving!:", event.value)
- global cmd
- accel = (event.value - 0.1) / 0.9
- if event.value < 0.1:
- accel = 0
-
- cmd = {"y": accel}
-
-
-def handle_clutch(event):
- print("moving!:", event.value)
- global cmd
- accel = (event.value - 0.1) / 0.9
- if event.value < 0.1:
- accel = 0
-
- cmd = {"y": -accel}
-
-
-async def handleController(controller):
- resp = await controller.get_events()
- # Show the input controller's buttons/axes
- print(f'Controls:\n{resp}')
-
- if Control.ABSOLUTE_PEDAL_ACCELERATOR in resp:
- controller.register_control_callback(
- Control.ABSOLUTE_PEDAL_ACCELERATOR,
- [EventType.POSITION_CHANGE_ABSOLUTE],
- handle_accelerator)
- else:
- print("Accelerator Pedal not found! Exiting! Are your steering wheel" +
- " and pedals hooked up?")
- exit()
-
- if Control.ABSOLUTE_PEDAL_BRAKE in resp:
- controller.register_control_callback(
- Control.ABSOLUTE_PEDAL_BRAKE,
- [EventType.POSITION_CHANGE_ABSOLUTE],
- handle_brake)
- else:
- print("Brake Pedal not found! Exiting!")
- exit()
-
- if Control.ABSOLUTE_PEDAL_CLUTCH in resp:
- controller.register_control_callback(
- Control.ABSOLUTE_PEDAL_CLUTCH,
- [EventType.POSITION_CHANGE_ABSOLUTE],
- handle_clutch)
- else:
- print("Accelerator Pedal not found! Exiting! Are your steering wheel" +
- " and pedals hooked up?")
- exit()
-
- if Control.ABSOLUTE_X in resp:
- controller.register_control_callback(
- Control.ABSOLUTE_X,
- [EventType.POSITION_CHANGE_ABSOLUTE],
- handle_turning)
- else:
- print("Wheel not found! Exiting!")
- exit()
-
- while True:
- await asyncio.sleep(0.01)
- global cmd
- if "y" in cmd:
- res = await modal.set_power(
- linear=Vector3(x=0, y=cmd["y"], z=0),
- angular=Vector3(x=0, y=0, z=turn_amt))
- cmd = {}
- print(res)
-
-
-async def main():
- # ADD YOUR MACHINE REMOTE ADDRESS and API KEY VALUES.
- # These can be found in app.viam.com's CONNECT tab's Code sample page.
- # Toggle 'Include API key' to show the API key values.
- g920_robot = await connect_robot(
- "robot123example.locationxyzexample.viam.com", "API_KEY", "API_KEY_ID")
- modal_robot = await connect_robot(
- "robot123example.locationxyzexample.viam.com", "API_KEY", "API_KEY_ID")
-
- g920 = Controller.from_robot(g920_robot, 'wheel')
- global modal
- modal = Base.from_robot(modal_robot, 'modal-base-server:base')
-
- await handleController(g920)
-
- await g920_robot.close()
- await modal_robot.close()
-
-if __name__ == '__main__':
- asyncio.run(main())
-```
-
-### Drive a robot with four wheels and a skid steer platform
-
-The following Go code is part of an example of using an input controller to drive a robot with four wheels & a skid steer platform.
-
-The `motorCtl` callback function controls 5 motors: left front & back `FL` `BL`, right front & back `FL` `BL`, and a `winder` motor that raises and lowers a front-end like a bulldozer.
-
-The `event.Control` logic is registered as a callback function to determine the case for setting the power of each motor from which button is pressed on the input controller.
-
-```go {id="go-example" class="line-numbers linkable-line-numbers"}
-// Define a single callback function
-motorCtl := func(ctx context.Context, event input.Event) {
- if event.Event != input.PositionChangeAbs {
- return
- }
-
- speed := float32(math.Abs(event.Value))
-
- // Handle input events, commands to set the power of motor components (SetPower method)
- switch event.Control {
- case input.AbsoluteY:
- motorFL.SetPower(ctx, speed, nil)
- motorBL.SetPower(ctx, speed, nil)
- case input.AbsoluteRY:
- motorFR.SetPower(ctx, speed * -1, nil)
- motorBR.SetPower(ctx, speed * -1, nil)
- case input.AbsoluteZ:
- motorWinder.SetPower(ctx, speed, nil)
- case input.AbsoluteRZ:
- motorWinder.SetPower(ctx, speed * -1, nil)
- }
-}
-
-// Registers callback from motorCtl for a selected set of axes
-for _, control := range []input.Control{input.AbsoluteY, input.AbsoluteRY, input.AbsoluteZ, input.AbsoluteRZ} {
- err = g.RegisterControlCallback(ctx, control, []input.EventType{input.PositionChangeAbs}, motorCtl)
-}
-```
diff --git a/docs/appendix/apis/components/motor.md b/docs/appendix/apis/components/motor.md
deleted file mode 100644
index 75e8e0fe82c..00000000000
--- a/docs/appendix/apis/components/motor.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Motor API"
-linkTitle: "Motor"
-weight: 100
-type: "docs"
-description: "Give commands to operate a motor or get its current status."
-icon: true
-images: ["/icons/components/motor.svg"]
-date: "2024-10-10"
-# updated: "" # When the content was last entirely checked
----
-
-The motor API allows you to give commands to your [motor components](/components/motor/) for operating a motor or getting its current status.
-
-The motor component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/motor-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your motor and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a motor called `"my_motor"` configured as a component of your machine.
-If your motor has a different name, change the `name` in the code.
-
-Import the motor package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.motor import Motor
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/motor"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/motor.md" >}}
diff --git a/docs/appendix/apis/components/movement-sensor.md b/docs/appendix/apis/components/movement-sensor.md
deleted file mode 100644
index 4be1c5ef6dd..00000000000
--- a/docs/appendix/apis/components/movement-sensor.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-title: "Movement sensor API"
-linkTitle: "Movement Sensor"
-weight: 110
-type: "docs"
-description: "Give commands for getting the current GPS location, linear velocity and acceleration, angular velocity and acceleration and heading."
-icon: true
-images: ["/icons/components/imu.svg"]
-date: "2022-10-10"
-# updated: "" # When the content was last entirely checked
----
-
-The movement sensor API allows you to give commands to your [movement sensor components](/components/movement-sensor/) for getting a GPS location, linear velocity and acceleration, angular velocity and acceleration and heading.
-
-Different movement sensors provide different data, so be aware that not all of the methods below are supported by all movement sensors.
-
-{{< alert title="Tip" color="tip" >}}
-You can run `GetProperties` on your sensor for a list of its supported methods.
-{{< /alert >}}
-
-
-
-
-{{< readfile "/static/include/components/apis/movement-sensor.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your movement sensor and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a movement sensor called `"my_movement_sensor"` configured as a component of your machine.
-If your movement sensor has a different name, change the `name` in the code.
-
-Import the movement sensor package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.movement_sensor import MovementSensor
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/movementsensor"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/movement_sensor.md" >}}
diff --git a/docs/appendix/apis/components/power-sensor.md b/docs/appendix/apis/components/power-sensor.md
deleted file mode 100644
index 0cd6ade9e48..00000000000
--- a/docs/appendix/apis/components/power-sensor.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Power sensor API"
-linkTitle: "Power Sensor"
-weight: 120
-type: "docs"
-description: "Commands for getting measurements of voltage, current, and power consumption."
-icon: true
-images: ["/icons/components/power-sensor.svg"]
-date: "2022-10-10"
-# updated: "" # When the content was last entirely checked
----
-
-The power sensor API allows you to give commands to your [power sensor components](/components/power-sensor/) for getting measurements of voltage, current, and power consumption.
-
-The power sensor component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/power_sensor-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your power sensor and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code will create a connection to your machine as a client.
-Once connected, you can control your machine programmatically by adding API method calls as shown in the following examples.
-
-The following examples assume you have a power sensor called `"my_power_sensor"` configured as a component of your machine.
-If your power sensor has a different name, change the `name` in the code.
-
-Import the power sensor package for the SDK you are using:
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.power_sensor import PowerSensor
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/powersensor"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/power_sensor.md" >}}
diff --git a/docs/appendix/apis/components/sensor.md b/docs/appendix/apis/components/sensor.md
deleted file mode 100644
index c28665efce2..00000000000
--- a/docs/appendix/apis/components/sensor.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Sensor API"
-linkTitle: "Sensor"
-weight: 130
-type: "docs"
-description: "Commands for getting sensor readings."
-icon: true
-images: ["/icons/components/sensor.svg"]
-date: "2022-10-10"
-# updated: "" # When the content was last entirely checked
----
-
-The sensor API allows you to get measurements from your [sensor components](/components/sensor/).
-
-The sensor component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/sensor-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your sensor and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a sensor called `"my_sensor"` configured as a component of your machine.
-If your sensor has a different name, change the `name` in the code.
-
-Import the sensor package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.sensor import Sensor
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/sensor"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/sensor.md" >}}
diff --git a/docs/appendix/apis/components/servo.md b/docs/appendix/apis/components/servo.md
deleted file mode 100644
index c586b34c98c..00000000000
--- a/docs/appendix/apis/components/servo.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: "Servo API"
-linkTitle: "Servo"
-weight: 140
-type: "docs"
-description: "Commands for controlling the angular position of a servo precisely or getting its current status."
-icon: true
-images: ["/icons/components/servo.svg"]
-date: "2022-10-10"
-# updated: "" # When the content was last entirely checked
----
-
-The servo API allows you to give commands to your [servo components](/components/servo/) for controlling the angular position of a servo precisely or getting its current status.
-
-The servo component supports the following methods:
-
-{{< readfile "/static/include/components/apis/generated/servo-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your servo and the rest of your machine, go to your machine's page on the [Viam app](https://app.viam.com),
-Navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume you have a servo called `"my_servo"` configured as a component of your machine.
-If your servo has a different name, change the `name` in the code.
-
-Import the servo package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.components.servo import Servo
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/components/servo"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/components/apis/generated/servo.md" >}}
diff --git a/docs/appendix/apis/services/SLAM.md b/docs/appendix/apis/services/SLAM.md
deleted file mode 100644
index 619a882b4bc..00000000000
--- a/docs/appendix/apis/services/SLAM.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: "SLAM service API"
-linkTitle: "SLAM"
-weight: 60
-type: "docs"
-tags: ["slam", "services"]
-description: "Give commands to get a machine's position within a map."
-icon: true
-images: ["/services/icons/slam.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The SLAM service API allows you to get a machine's position within a map.
-
-The [SLAM service](/services/slam/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/slam-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following code examples assume that you have a machine configured with a SLAM service called `"my_slam_service"`.
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.slam import SLAMClient
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/slam"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/slam.md" >}}
diff --git a/docs/appendix/apis/services/_index.md b/docs/appendix/apis/services/_index.md
deleted file mode 100644
index fb20e2665fc..00000000000
--- a/docs/appendix/apis/services/_index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-linkTitle: "Service APIs"
-title: "Service APIs"
-weight: 5
-empty_node: true
-layout: "empty"
-canonical: "/appendix/apis/"
-type: "docs"
----
diff --git a/docs/appendix/apis/services/base-rc.md b/docs/appendix/apis/services/base-rc.md
deleted file mode 100644
index 3f5970ccf1a..00000000000
--- a/docs/appendix/apis/services/base-rc.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: "Base Remote Control service API"
-linkTitle: "Base Remote Control"
-weight: 70
-type: "docs"
-tags: ["base", "services", "rover", "input controller", "remote control"]
-description: "Give commands to get a list of inputs from the controller that are being monitored for that control mode."
-icon: true
-images: ["/services/icons/base-rc.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The base remote control service API allows you to get a list of inputs from the controller that are being monitored for that control mode.
-
-The [SLAM service](/services/slam/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/base_remote_control-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-{{< tabs >}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/baseremotecontrol"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/base_remote_control.md" >}}
diff --git a/docs/appendix/apis/services/data.md b/docs/appendix/apis/services/data.md
deleted file mode 100644
index 2dc20cd47ed..00000000000
--- a/docs/appendix/apis/services/data.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: "Data Management Service API"
-linkTitle: "Data Management"
-weight: 10
-type: "docs"
-description: "Give commands to your data management service to sync data stored on the machine it is deployed on to the cloud."
-icon: true
-images: ["/icons/components/arm.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The data management service API allows you to sync data stored on the machine it is deployed on to the cloud.
-
-The [data management service](/services/data/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/data_manager-table.md" >}}
-
-The data client API supports a separate set of methods that allow you to upload and export data to and from the Viam app.
-For information about that API, see [Data Client API](/appendix/apis/data-client/).
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume that you have a machine configured with an `data_manager` service.
-
-{{< tabs >}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/datamanager"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/data_manager.md" >}}
diff --git a/docs/appendix/apis/services/generic.md b/docs/appendix/apis/services/generic.md
deleted file mode 100644
index 292de7b1a67..00000000000
--- a/docs/appendix/apis/services/generic.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: "Generic service API"
-linkTitle: "Generic"
-weight: 60
-type: "docs"
-tags: ["generic", "services"]
-description: "Give commands to your generic components for running model-specific commands using DoCommand."
-icon: true
-images: ["/icons/components/generic.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The generic service API allows you to give commands to your [generic services](/services/generic/) for running model-specific commands using [`DoCommand`](/appendix/apis/services/generic/#docommand).
-
-The generic service supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/generic_service-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.generic import Generic
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/generic"
-)
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-#include
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/generic_service.md" >}}
diff --git a/docs/appendix/apis/services/ml.md b/docs/appendix/apis/services/ml.md
deleted file mode 100644
index bea271dcb53..00000000000
--- a/docs/appendix/apis/services/ml.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-title: "ML model service API"
-linkTitle: "ML Model"
-weight: 30
-type: "docs"
-tags: ["data management", "ml", "model training"]
-description: "Give commands to your ML model service to make inferences based on a provided ML model."
-icon: true
-images: ["/services/icons/ml.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The ML model service API allows you to make inferences based on a provided ML model.
-
-The [ML Model service](/services/ml/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/mlmodel-table.md" >}}
-
-## Establish a connection
-
-{{< alert title="Viam Python SDK Support" color="note" >}}
-
-To use the ML model service from the [Viam Python SDK](https://python.viam.dev/), install the Python SDK using the `mlmodel` extra:
-
-```sh {class="command-line" data-prompt="$"}
-pip install 'viam-sdk[mlmodel]'
-```
-
-{{< /alert >}}
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume that you have a machine configured with an `MLModel` service called `"my_mlmodel_service"`, and that you have installed the `mlmodel` extra for the Python SDK.
-If your ML model service has a different name, change the `name` in the code.
-
-Import the mlmodel package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.mlmodel import MLModelClient
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/mlmodel"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/mlmodel.md" >}}
diff --git a/docs/appendix/apis/services/motion.md b/docs/appendix/apis/services/motion.md
deleted file mode 100644
index cce2557dece..00000000000
--- a/docs/appendix/apis/services/motion.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: "Motion Service API"
-linkTitle: "Motion"
-weight: 40
-type: "docs"
-description: "Give commands to move a machine based on a SLAM map or GPS coordinates or to move a machine's components form one location to another."
-icon: true
-images: ["/icons/components/arm.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The motion service API allows you to give commands to your [motion service](/services/motion/) for moving a machine based on a SLAM map or GPS coordinates or for moving a machine's components from one location to another.
-
-The motion service supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/motion-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-Because the motion service is enabled by default, you don't give it a `"name"` while configuring it.
-Use the name `"builtin"` to access the built-in motion service in your code with methods like [`FromRobot()`](/appendix/apis/services/motion/#fromrobot) that require a `ResourceName`.
-
-Import the motion package for the SDK you are using:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.motion import MotionClient
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/motion"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/motion.md" >}}
diff --git a/docs/appendix/apis/services/navigation.md b/docs/appendix/apis/services/navigation.md
deleted file mode 100644
index 558c9d18e0b..00000000000
--- a/docs/appendix/apis/services/navigation.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: "Navigation service API"
-linkTitle: "Navigation"
-weight: 50
-type: "docs"
-tags: ["navigation", "services", "base", "rover"]
-description: "Give commands to define waypoints and move your machine along those waypoints while avoiding obstacles."
-icon: true
-images: ["/services/icons/navigation.svg"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The navigation service API allows you to define waypoints and move your machine along those waypoints while avoiding obstacles.
-
-The [navigation service](/services/navigation/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/navigation-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following code examples assume that you have a machine configured with a `Navigation` service.
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.navigation import NavigationClient
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/navigation"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/navigation.md" >}}
diff --git a/docs/appendix/apis/services/vision.md b/docs/appendix/apis/services/vision.md
deleted file mode 100644
index 272129784c1..00000000000
--- a/docs/appendix/apis/services/vision.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: "Vision service API"
-linkTitle: "Vision"
-weight: 20
-type: "docs"
-tags: ["vision", "computer vision", "CV", "services"]
-description: "Give commands to get detections, classifications, or point cloud objects, depending on the ML model the vision service is using."
-icon: true
-images: ["/services/icons/vision.svg"]
-tags: ["vision", "computer vision", "CV", "services"]
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The vision service API allows you to get detections, classifications, or point cloud objects, depending on the ML model the vision service is using.
-
-The [vision service](/services/vision/) supports the following methods:
-
-{{< readfile "/static/include/services/apis/generated/vision-table.md" >}}
-
-## Establish a connection
-
-To get started using Viam's SDKs to connect to and control your machine, go to your machine's page on the [Viam app](https://app.viam.com), navigate to the **CONNECT** tab's **Code sample** page, select your preferred programming language, and copy the sample code.
-
-{{% snippet "show-secret.md" %}}
-
-When executed, this sample code creates a connection to your machine as a client.
-
-The following examples assume that you have a machine configured with a [camera](/components/camera/) and a vision service [detector](/services/vision/#detections), [classifier](/services/vision/#classifications) or [segmenter](/services/vision/#segmentations).
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-from viam.services.vision import VisionClient
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-import (
- "go.viam.com/rdk/services/vision"
-)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## API
-
-{{< readfile "/static/include/services/apis/generated/vision.md" >}}
diff --git a/docs/appendix/changelog.md b/docs/appendix/changelog.md
deleted file mode 100644
index 50acc90a32e..00000000000
--- a/docs/appendix/changelog.md
+++ /dev/null
@@ -1,1229 +0,0 @@
----
-title: "Changelog"
-linkTitle: "Changelog"
-weight: 20
-draft: false
-type: "docs"
-description: "A log of added features, improvements, and changes over time."
-aliases:
- - "/appendix/release-notes/"
- - "/components/camera/single-stream/"
- - "/components/camera/dual-stream/"
- - "/components/camera/align-color-depth-extrinsics/"
- - "/components/camera/align-color-depth-homography/"
- - "/components/board/customlinux/"
- - "/components/board/jetson/"
- - "/components/board/pca9685/"
- - "/components/board/ti/"
- - "/components/gripper/softrobotics/"
- - "/components/motor/encoded-motor/"
- - "/components/motor/gpiostepper/"
- - "/components/motor/roboclaw/"
- - "/components/movement-sensor/adxl345/"
- - "/components/movement-sensor/dual-gps-rtk/"
- - "/components/movement-sensor/gps-nmea-rtk-pmtk/"
- - "/components/movement-sensor/gps-nmea-rtk-serial/"
- - "/components/movement-sensor/gps-nmea/"
- - "/components/movement-sensor/wheeled-odometry/"
- - "/components/power-sensor/ina219/"
- - "/components/power-sensor/ina226/"
- - "/components/sensor/bme280/"
- - "/components/sensor/ds18b20/"
- - "/components/sensor/sensirion-sht3xd/"
-layout: "changelog"
-outputs:
- - rss
- - html
-date: "2024-09-18"
-# updated: "" # When the content was last entirely checked
----
-
-
-
-{{% changelog date="2024-11-12" color="added" title="Builtin models moved to modules" %}}
-
-The following resource models have moved to modules.
-
-
-| Resource | Model |
-| -------- | ----- |
-| board | [`customlinux`](https://github.com/viam-modules/customlinux/) |
-| board | [`jetson`](https://github.com/viam-modules/nvidia) |
-| board | [`pca9685`](https://github.com/viam-modules/pca/tree/main) |
-| board | [`odroid`](https://github.com/viam-modules/hardkernel) |
-| board | [`ti`](https://github.com/viam-modules/texas-instruments) |
-| board | [`pi`](https://github.com/viam-modules/raspberry-pi) |
-| board | [`orange-pi`](https://github.com/viam-modules/orange-pi) |
-| board | [`upboard`](https://github.com/viam-modules/up) |
-| motor | [`tmc5072`](https://github.com/viam-modules/analog-devices) |
-| motor | [`28byj-48`](https://github.com/viam-modules/uln2003) |
-| encoder | [`ams-as5048`](https://github.com/viam-modules/ams/) |
-| movement sensor | [`adxl345`](https://github.com/viam-modules/analog-devices) |
-| movement sensor | [`dual-gps-rtk`](https://github.com/viam-modules/gps/) |
-| movement sensor | [`gps-nmea-rtk-pmtk`](https://github.com/viam-modules/gps/) |
-| movement sensor | [`gps-nmea-rtk-serial`](https://github.com/viam-modules/gps/) |
-| movement sensor | [`gps-nmea`](https://github.com/viam-modules/gps/) |
-| movement sensor | [`imu-wit`](https://github.com/viam-modules/wit-motion) |
-| movement sensor | [`imu-wit-hwt905`](https://github.com/viam-modules/wit-motion) |
-| movement sensor | [`mpu6050`](https://github.com/viam-modules/tdk-invensense) |
-| power sensor | [`ina219`](https://github.com/viam-modules/texas-instruments) |
-| power sensor | [`ina226`](https://github.com/viam-modules/texas-instruments) |
-| sensor | [`bme280`](https://github.com/viam-modules/bosch) |
-| sensor | [`sensirion-sht3xd`](https://github.com/viam-modules/sensirion) |
-| sensor | [`pi`](https://github.com/viam-modules/raspberry-pi) |
-| ML model | [`TFLite CPU`](https://app.viam.com/module/viam/tflite_cpu) |
-
-The following models were removed:
-
-
-| Resource | Model |
-| -------- | ----- |
-| gripper | `softrobotics` |
-| motor | `encoded-motor` |
-| motor | `gpiostepper` |
-| motor | `roboclaw` |
-| sensor | `ds18b20` |
-
-{{% /changelog %}}
-
-{{% changelog date="2024-11-05" color="added" title="MoveThroughJointPositions to arm interface" %}}
-The [arm interface](/appendix/apis/components/arm/) now includes a [MoveThroughJointPositions](https://pkg.go.dev/go.viam.com/rdk/components/arm#Arm) method that moves an arm through an ordered array of joint positions.
-{{% /changelog %}}
-
-{{% changelog date="2024-10-16" color="added" title="Set data retention policies" %}}
-
-You can now set how long data collected by a component should remain stored in the Viam Cloud in the component's data capture configuration.
-For more information, see [Data management service](/services/data/).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-09-20" color="added" title="Pi models moved to module" %}}
-
-The Raspberry Pi 4, 3, and Zero 2 W boards are now supported by [`viam:raspberry-pi:rpi`](https://github.com/viam-modules/raspberry-pi).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-08-26" color="added" title="ESP32 cameras" %}}
-
-`viam-micro-server` now supports cameras on ESP32s.
-For more information, see [Configure an esp32-camera](/components/camera/esp32-camera/).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-08-26" color="changed" title="Micro-RDK now called viam-micro-server" %}}
-
-The lightweight version of `viam-server` that is built from the micro-RDK is now referred to as `viam-micro-server`.
-For more information, see [viam-micro-server](/architecture/viam-micro-server/).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-08-26" color="added" title="Provisioning" %}}
-
-You can now configure provisioning for machines with the Viam Agent.
-For more information, see [Configure provisioning with viam-agent](/how-tos/provision-setup/).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-08-16" color="added" title="Data capture for vision" %}}
-
-Data capture is now possible for the vision service.
-For more information, see [Supported components and services](/services/data/#supported-components-and-services).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-08-01" color="added" title="Create custom training scripts" %}}
-
-You can now upload custom training scripts to the Viam Registry and use them to train machine learning models.
-For more information, see [Create custom training scripts](/how-tos/create-custom-training-scripts/).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-07-19" color="changed" title="Operators can now view data" %}}
-
-The operator role now has view permissions for the data in the respective resource a user has access to.
-For more information, see [Data and machine learning permissions](/cloud/rbac/#data-and-machine-learning).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-06-14" color="changed" title="Python get_robot_part_logs parameters" %}}
-
-The `errors_only` parameter has been removed from [`get_robot_part_logs()`](/appendix/apis/fleet/#getrobotpartlogs) and replaced with `log_levels`.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-05-28" color="changed" title="Return type of analog Read" %}}
-
-The board analog API [`Read()`](/appendix/apis/components/board/#readanalogreader) method now returns an `AnalogValue` struct instead of a single int.
-The struct contains an int representing the value of the reading, min and max range of values, and the precision of the reading.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-05-28" color="added" title="CaptureAllFromCamera and GetProperties to vision API" %}}
-
-The vision service now supports two new methods: [`CaptureAllFromCamera`](/appendix/apis/services/vision/#captureallfromcamera) and [`GetProperties`](/appendix/apis/services/vision/#getproperties).
-
-{{% /changelog %}}
-
-{{% changelog date="2024-05-14" color="changed" title="Renamed GeoObstacle to GeoGeometry" %}}
-
-The motion service API parameter `GeoObstacle` has been renamed to `GeoGeometry`.
-This affects users of the [`MoveOnGlobe()`](/appendix/apis/services/motion/#moveonglobe) method.
-
-{{% /changelog %}}
-
-{{< changelog date="2024-05-09" color="changed" title="Return type of GetImage" >}}
-
-The Python SDK introduced a new image container class called [`ViamImage`](https://python.viam.dev/autoapi/viam/components/camera/index.html#viam.components.camera.ViamImage).
-The camera component's [`GetImage()`](/appendix/apis/components/camera/#getimage) method now returns a `ViamImage` type, and the vision service's [`GetDetections()`](/appendix/apis/services/vision/#getdetections) and [`GetClassifications()`](/appendix/apis/services/vision/#getclassifications) methods take in `ViamImage` as a parameter.
-
-You can use the helper functions `viam_to_pil_image` and `pil_to_viam_image` provided by the Python SDK to convert the `ViamImage` into a [`PIL Image`](https://omz-software.com/pythonista/docs/ios/Image.html) and vice versa.
-
-{{< expand "Click for an example of using the ViamImage -> PIL Image helper functions." >}}
-
-```python {class="line-numbers linkable-line-numbers"}
-from viam.media.utils.pil import pil_to_viam_image, viam_to_pil_image
-
-# Get the ViamImage from your camera.
-frame = await my_camera.get_image()
-
-# Convert "frame" to a PIL Image representation.
-pil_frame = viam_to_pil_image(frame)
-
-# Use methods from the PIL Image class to get size.
-x, y = pil_frame.size[0], pil_frame.size[1]
-# Crop image to get only the left two fifths of the original image.
-cropped_pil_frame = pil_frame.crop((0, 0, x / 2.5, y))
-
-# Convert back to ViamImage.
-cropped_frame = pil_to_viam_image(cropped_pil_frame)
-
-# Get detections from your vision service.
-detections = await detector.get_detections(cropped_frame)
-```
-
-{{< /expand >}}
-{{< /changelog >}}
-
-{{% changelog date="2024-05-08" color="removed" title="WriteAnalog from Go SDK" %}}
-
-The `WriteAnalog()` method has been removed from the Go SDK.
-Use [`AnalogByName()`](/appendix/apis/components/board/#analogbyname) followed by [`Write()`](/appendix/apis/components/board/#writeanalog) instead.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-30" color="changed" title="Python SDK data retrieval behavior" %}}
-
-[`tabular_data_by_filter()`](/appendix/apis/data-client/#tabulardatabyfilter) and [`binary_data_by_filter()`](/appendix/apis/data-client/#binarydatabyfilter) now return paginated data.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-30" color="changed" title="Renamed AnalogReader to Analog" %}}
-
-`AnalogReader` has been renamed to `Analog`.
-The functionality remains the same, but code that uses analogs must be updated.
-`AnalogReaderByName()` and `AnalogReaderNames()` have become [`AnalogByName()`](/appendix/apis/components/board/#analogbyname) and `AnalogNames()` (since deprecated), respectively.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-30" color="added" title="Part online and part offline triggers" %}}
-
-You can now configure [triggers](/configure/triggers/) to execute actions when a {{< glossary_tooltip term_id="part" text="machine part" >}} comes online or goes offline.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-30" color="removed" title="Status from Board API" %}}
-
-Viam has removed support for the following board API methods: `Status()`, `AnalogStatus()`, `DigitalInterruptStatus()`, `Close()`, `Tick()`, `AddCallback()`, and `RemoveCallback()`.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-19" color="removed" title="Removed and replaced camera models" %}}
-
-Viam has removed support for following builtin camera models: `single_stream`, `dual_stream`, `align_color_depth_extrinsics`, and `align_color_depth_homography`.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-17" color="changed" title="Updated GetCloudMetadata response" %}}
-
-In addition to the existing returned metadata, the [`GetCloudMetadata`](/appendix/apis/robot/#getcloudmetadata) method now returns `machine_id` and `machine_part_id` as well.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-04-16" color="improved" title="Viam app interface" %}}
-
-the [Viam app](https://app.viam.com) machine page UI has been updated significantly.
-In addition to other improvements, your component, service, and other resource config cards are all displayed on one page instead of in separate tabs.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-03-01" color="added" title="Additional ML models" %}}
-
-Viam has added support for the TensorFlow, PyTorch, and ONNX ML model frameworks, expanding upon the existing support for TensorFlow Lite models.
-You can now upload your own ML model(/registry/ml-models/) using any of these frameworks for use with the Vision service.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-03-01" color="added" title="Ultrasonic sensor for `viam-micro-server`" %}}
-
-You can now use the [ultrasonic sensor component](/components/sensor/ultrasonic-micro-rdk/) with [`viam-micro-server`](/installation/viam-micro-server-setup/#install-viam-micro-server) to integrate an [HC-S204](https://www.sparkfun.com/products/15569) ultrasonic distance sensor into a machine running `viam-micro-server`.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-03-01" color="added" title="Edit a machine configuration that uses a fragment" %}}
-
-You can now edit the configuration of an existing machine that has been configured with a fragment by using [the `fragment_mods` object](/fleet/fragments/#modify-the-config-of-a-machine-that-uses-a-fragment) in your configuration.
-You can use the `fragment_mods` objects to be able to deploy a fragment to a fleet of machines, but still be able to make additional per-machine edits as needed.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-03-01" color="added" title="Dual GPS movement sensor" %}}
-
-You can now use the [dual GPS movement sensor component](https://github.com/viam-modules/gps) to integrate a movement sensor that employs two GPS sensors into your machine.
-The dual GPS movement sensor calculates a compass heading from both GPS sensors, and returns the midpoint position between the two sensors as its position.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-03-01" color="added" title="Viam Agent" %}}
-
-You can now use the [Viam Agent](/fleet/provision/) to provision your machine or fleet of machines during deployment.
-The Viam Agent is a software provisioning manager that you can install on your machine which manages your `viam-server` installation, including installation and ongoing updates, as well as providing flexible deployment configuration options, such as pre-configured WiFi network credentials.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-02-12" color="added" title="Generic service" %}}
-
-You can now use the [generic service](/services/generic/) to define new, unique types of services that do not already have an [appropriate API](/appendix/apis/#service-apis) defined for them.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-02-12" color="added" title="ML models in the registry" %}}
-
-You can now upload [machine learning (ML) models](/registry/ml-models/) to the Viam Registry, in addition to modules.
-You may upload models you have trained yourself using the Viam app, or models you have trained outside of the App.
-When uploading, you have the option to make your model available to the general public for reuse.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-01-31" color="added" title="Sensor-controlled base" %}}
-
-Viam has added a [sensor-controlled base](/components/base/sensor-controlled/) component model, which supports a robotic base that receives feedback control from a movement sensor.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-01-31" color="added" title="Visualize captured data" %}}
-
-You can now [visualize your data](/how-tos/sensor-data-visualize/) using many popular third-party visualization tools, including Grafana, Tableau, Google’s Looker Studio, and more.
-You can visualize any data, such as sensor readings, that you have [synced](/services/data/) to the Viam app from your machine.
-
-See [Visualize data with Grafana](/tutorials/services/visualize-data-grafana/) for a full walkthrough focused on Grafana specifically.
-
-{{% /changelog %}}
-
-{{% changelog date="2024-01-31" color="added" title="Use triggers to trigger actions" %}}
-
-You can now configure [triggers](/configure/triggers/) (previously called webhooks) to execute actions when certain types of data are sent from your machine to the cloud.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-12-31" color="added" title="Filtered camera module" %}}
-
-Viam has added a [`filtered-camera` module](https://app.viam.com/module/erh/filtered-camera) that selectively captures and syncs only the images that match the detections of an ML model.
-For example, you could train an ML model that is focused on sports cars, and only capture images from the camera feed when a sports car is detected in the frame.
-
-Check out [this guide](/how-tos/image-data/) for more information.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-12-31" color="added" title="Raspberry Pi 5 Support" %}}
-
-You can now run `viam-server` on a [Raspberry Pi 5](/components/board/pi5/) with the new board model [`pi5`](/components/board/pi5/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-12-31" color="added" title="Role-based access control" %}}
-
-Users can now have [access to different fleet management capabilities](/cloud/rbac/) depending on whether they are an owner or an operator of a given organization, location, or machine.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-11-30" color="added" title="Authenticate with location API key" %}}
-
-You can now use [API keys for authentication](/sdks/#authentication).
-API keys allow you to assign the minimum required permissions for usage.
-Location secrets, the previous method of authentication, is deprecated and will be removed in a future release.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-11-30" color="added" title="Queryable sensor data" %}}
-
-Once you have added the data management service and synced data, such as sensor readings, to the Viam app, you can now run queries against both captured data as well as its metadata using either SQL or MQL.
-
-For more information, see [Query Data with SQL or MQL](/how-tos/sensor-data-query-with-third-party-tools/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-11-30" color="changed" title="Model training from datasets" %}}
-
-To make it easier to iterate while training machine learning models from image data, you now train models from [datasets](/fleet/dataset/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-11-30" color="improved" title="Manage users access" %}}
-
-You can now manage users access to machines, locations, and organizations.
-For more information, see [Access Control](/cloud/rbac/)
-
-{{% /changelog %}}
-
-{{% changelog date="2023-10-31" color="added" title="Test an ML model in browser" %}}
-
-After you upload and train a machine learning model, you can test its results in the **Data** tab.
-
-This allows you to refine models by iteratively tagging more images for training based on observed performance.
-
-For more information, see [Test classification models with existing images in the cloud](/services/vision/mlmodel/#existing-images-in-the-cloud).
-
-To use this update, the classifier must have been trained or uploaded after September 19, 2023.
-The current version of this feature exclusively supports classification models.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-10-31" color="added" title="PLC support" %}}
-
-The Viam platform now supports the [Revolution Pi line of PLCs](https://revolutionpi.com/) from KUNBUS in the form of a [module](https://app.viam.com/module/viam-labs/viam-revolution-pi).
-This collaboration allows you to leverage the Raspberry Pi-based Revolution Pi, which runs on Linux and has a [specially designed I/O modules](https://www.raspberrypi.com/products/compute-module-4/?variant=raspberry-pi-cm4001000) for streamlined interaction with industrial controls, eliminating the need for additional components.
-
-Read the [Viam PLC Support](https://www.viam.com/post/viam-plc-support-democratizing-access-to-smart-ot-and-ics) blog post for a step-by-step guide on using a PLC with Viam.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-10-31" color="improved" title="SLAM map creation" %}}
-
-The [Cartographer-module](/services/slam/cartographer/) now runs in Viam's cloud for creating or updating maps.
-This enhancement allows you to:
-
-- Generate larger maps without encountering session timeouts
-- Provide IMU input to improve map quality
-- Save maps to the **SLAM library**
-- Create or update maps using previously captured LiDAR and IMU data
-- Deploy maps to machines
-
-{{% /changelog %}}
-
-{{% changelog date="2023-09-30" color="added" title="Modular registry" %}}
-
-The [Modular Registry](/registry/) enables you to use, create, and share custom modules, extending the capabilities of Viam beyond the components and services that are natively supported.
-
-You can:
-
-- Publish modules on the registry
-- Add modules to any machine's configuration with a few clicks
-- Select the desired module version for deployment, make changes at your convenience, and deploy the updates to a single machine or an entire fleet.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-09-30" color="added" title="Mobile app" %}}
-
-You can use a [mobile application](/fleet/control/#control-interface-in-the-viam-mobile-app), available for download now in the [Apple](https://apps.apple.com/us/app/viam-robotics/id6451424162) and [Google Play](https://play.google.com/store/apps/details?id=com.viam.viammobile&hl=en&gl=US) app stores, to connect to and control your Viam-powered machines directly from your mobile device.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-09-30" color="added" title="Power sensor component" %}}
-
-You now have the capability to use a [power sensor component](/components/power-sensor/) to monitor the voltage, current, and power consumption within your machine's system.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-09-30" color="added" title="Filter component’s data before the cloud" %}}
-Viam has written a module that allows you to filter data based on specific criteria before syncing it to [Viam's cloud](/services/data/).
-It equips machines to:
-
-- Remove data that is not of interest
-- Facilitate high-interval captures while saving data based on your defined metrics
-- Prevent the upload of unnecessary data
-
-To learn more, see [this tutorial](/tutorials/configure/pet-photographer/) on creating and configuring a data filtration module.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-08-31" color="added" title="Configure a custom Linux board" %}}
-
-You can now use boards like the [Mediatek Genio 500 Pumpkin](https://ologicinc.com/portfolio/mediateki500/) that run Linux operating systems with the [`customlinux` board model](https://github.com/viam-modules/customlinux/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-08-31" color="improved" title="Image inspection for ML training" %}}
-
-This update enables you to get a closer examination of your image and streamline your image annotation experience by making it easier to add bounding boxes and labels in the **Data** tab.
-
-With the latest improvements, you can now:
-
-- Navigate between images using the arrow keys in the main image view
-- Expand images for a more detailed inspection by clicking the expand button on the right image panel
-- Move between full-screen images effortlessly with the <> arrow buttons or arrow keys
-- Return to the standard view by using the escape key or collapse button
-
-{{% /changelog %}}
-
-{{% changelog date="2023-08-31" color="added" title="Duplicate component button" %}}
-
-You now have the ability to duplicate any config component, service, module, remote, or process.
-
-To use this feature:
-
-- Click on the duplicate component icon at the top right of any resource
-- Optionally, you can modify the component name to distinguish it
-- Adjust any attributes, such as motor pin numbers
-
-{{% /changelog %}}
-
-{{% changelog date="2023-07-31" color="added" title="Apple SSO authentication" %}}
-
-Viam now supports sign-up/log-in through Apple Single Sign-On.
-
-Note that currently, accounts from different SSO providers are treated separately, with no account merging functionality.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-07-31" color="improved" title="Arm component API" %}}
-
-Arm models now support the [`GetKinematics` method](/appendix/apis/components/arm/#getkinematics) in the arm API, allowing you to request and receive kinematic information.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="added" title="View sensor data within Viam" %}}
-
-You can now [view your sensor data](https://app.viam.com/data/view?view=sensors) directly in the Viam app to verify data creation and accuracy.
-If you depend on sensor data to plan and control machine operations, this feature increases access to data and supports a more efficient workflow.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="added" title="Session management in the Python SDK" %}}
-
-The Python SDK now includes sessions, a safety feature that automatically cancels operations if the client loses connection to your machine.
-
-[Session management](/appendix/apis/sessions/) helps you to ensure safer operation of your machine when dealing with actuating controls.
-Sessions are enabled by default, with the option to [disable sessions](/appendix/apis/sessions/#disable-default-session-management).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="added" title="Connect an ODrive motor controller as a Viam module" %}}
-
-You can integrate and control ODrive motor controllers with Viam using the [`odrive` module from the Viam Registry](https://github.com/viamrobotics/odrive).
-
-See the [Odrive module readme](https://github.com/viamrobotics/odrive) to learn how to connect and use an ODrive motor controller with Viam, and view the sample configurations.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="added" title="Implement custom robotic arms as Viam modules" %}}
-
-When prototyping a robotic arm, you can now facilitate movement without creating your own motion planning.
-This update enables you to implement custom models of an arm component as a [modular resource](/registry/) by coding three endpoints of the [Arm API](/appendix/apis/components/arm/#api):
-
-- `getJointPositions`
-- `movetoJointPositions`
-- `GetKinematics`
-
-Then, use the [motion planning service](/services/motion/) to specify poses, and Viam handles the rest.
-
-For more information, see this [tutorial on creating a custom arm](/registry/examples/custom-arm/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="added" title="Apply a crop transform to camera views" %}}
-
-You can now apply a [crop transform](/components/camera/transform/) to the views of your connected cameras in the Viam app.
-
-This feature enables you to focus on a specific area of your camera feed.
-
-For example, crop a video stream of a busy street to just the sidewalk.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="improved" title="Gantry component" %}}
-
-To better control gantries with Viam, you can now:
-
-- Specify speed values when calling the `MovetoPosition` method on [Gantry components](/components/gantry/).
- This allows you to define the speed at which each axis moves to the desired position, providing enhanced precision and control over the gantry's movement.
-- Set a home position for Gantry components to facilitate position resetting or maintain consistent starting points.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-06-30" color="improved" title="Optimized Viam-trained object detection models" %}}
-
-This update for object detection models [trained with the machine learning service](/how-tos/train-deploy-ml/) brings significant improvements, including:
-
-- 76% faster model inference for camera streams
-- 64% quicker model training for object detection
-- 46% reduction in compressed model size
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="added" title="TypeScript SDK beta release" %}}
-
-The beta release of the [TypeScript SDK](https://github.com/viamrobotics/viam-typescript-sdk/) allows you to create a web interface to work with your machine, as well as create custom components and services.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="added" title="Train object detection ML models" %}}
-
-You now have the capability to directly [train object detection models](/how-tos/train-deploy-ml/) in addition to image classification models from within the Viam app.
-
-This update allows you to:
-
-- Add labels by drawing bounding boxes around specific objects in your images or a single image.
-- Create a curated subset of data for training by filtering images based on labels or tags.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="added" title="Permissions for organizations in Viam" %}}
-
-Now when you invite collaborators to join your organization, you can assign permissions to members by setting one of these roles:
-
-- **Owner**: These members can see and edit [every tab on the machine page](/cloud/machines/#navigating-the-machine-page), as well as manage users in the app.
- This role is best for those on your team who are actively engineering and building machines.
-
-- **Operator**: These members can only see and use the [remote control tab](/fleet/control/).
- This role is best for those on your team who are teleoperating or remotely controlling machines.
-
-For more information about assigning permissions and collaborating with others on Viam, see [Fleet Management](/fleet/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="improved" title="Control RoboClaw motor controllers with the driver" %}}
-
-When using a RoboClaw motor controller without encoders connected to your motors, you now have more direct control over the RoboClaw’s functionality within Viam or through the motor API.
-
-For example, in the Viam app, you can now set **Go For** values for these motors, utilizing a time-based estimation for the number of revolutions.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="improved" title="Camera webcam names and setting framerates" %}}
-
-The updates to the camera component have improved the process of connecting to and using cameras with your machines.
-
-The latest updates enable you to:
-
-- View readable webcam names in the **video path** of your camera component.
-- Specify your preferred framerate by selecting the desired value in the newly added **framerate field** on the **CONFIGURE** tab.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="improved" title="Additions to code samples in the Viam app" %}}
-
-The updated code samples now includes:
-
-- Options for C++ and TypeScript
-- The ability to hide or display your machines' [secrets](/appendix/apis/)
-
-Access these samples in the **Code sample** tab on your machine's page to connect to your machine in various languages.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-05-31" color="improved" title="Delete data in bulk in the Viam app" %}}
-
-You can manage the data synced to Viam's cloud with the new capability for bulk data deletion on the **Data** tab.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-04-25" color="changed" title="Vision service" %}}
-
-{{% alert title="Important: Breaking Change" color="note" %}}
-
-The [vision service](/services/vision/) became more modular in RDK [v0.2.36](https://github.com/viamrobotics/rdk/releases/tag/v0.2.36), API [v0.1.118](https://github.com/viamrobotics/api/releases/tag/v0.1.118), and Python SDK [v0.2.18](https://github.com/viamrobotics/viam-python-sdk/releases/tag/v0.2.18).
-
-Find more information on each of the changes below.
-
-{{% /alert %}}
-
-
-
-#### Use individual vision service instances
-
-You need to create **an individual vision service instance** for each detector, classifier, and segmenter model.
-You can no longer be able to create one vision service and register all of your detectors, classifiers, and segmenters within it.
-
-{{%expand "Click for details on how to migrate your code." %}}
-
-#### API calls
-
-Change your existing API calls to get the new vision service instance for your detector, classifier, or segmenter model directly from the `VisionClient`:
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-Change your existing API calls to get the new vision service instance for your detector, classifier, or segmenter model directly from the `VisionClient`:
-
-```python {class="line-numbers linkable-line-numbers"}
-my_object_detector = VisionClient.from_robot(robot, "find_objects")
-img = await cam.get_image()
-detections = await my_object_detector.get_detections(img)
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```python {class="line-numbers linkable-line-numbers"}
-vision = VisionServiceClient.from_robot(robot)
-img = await cam.get_image()
-detections = await vision.get_detections(img, "find_objects")
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### Color detector configurations
-
-You can replace existing color detectors by [configuring new ones in the UI](/services/vision/color_detector/) or you can update the [JSON configuration of your machines](/configure/#the-configure-tab):
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-```json
-"services": [
- {
- "name": "blue_square",
- "type": "vision",
- "model": "color_detector",
- "attributes": {
- "segment_size_px": 100,
- "detect_color": "#1C4599",
- "hue_tolerance_pct": 0.07,
- "value_cutoff_pct": 0.15
- }
- },
- {
- "name": "green_triangle",
- "type": "vision",
- "model": "color_detector",
- "attributes": {
- "segment_size_px": 200,
- "detect_color": "#62963F",
- "hue_tolerance_pct": 0.05,
- "value_cutoff_pct": 0.20
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```json
-"services": [
- {
- "name": "vision",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "segment_size_px": 100,
- "detect_color": "#1C4599",
- "hue_tolerance_pct": 0.07,
- "value_cutoff_pct": 0.15
- },
- "name": "blue_square",
- "type": "color_detector"
- },
- {
- "parameters": {
- "segment_size_px": 200,
- "detect_color": "#62963F",
- "hue_tolerance_pct": 0.05,
- "value_cutoff_pct": 0.20
- },
- "name": "green_triangle",
- "type": "color_detector"
- }
- ]
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### TFLite detector configurations
-
-You can replace existing TFLite detectors by [configuring new ones in the UI](/services/vision/mlmodel/) or you can update the [JSON configuration of your machines](/configure/#the-configure-tab):
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-```json
-"services": [
- {
- "name": "person_detector",
- "type": "mlmodel",
- "model": "tflite_cpu",
- "attributes": {
- "model_path": "/path/to/file.tflite",
- "label_path": "/path/to/labels.tflite",
- "num_threads": 1
- }
- },
- {
- "name": "person_detector",
- "type": "vision",
- "model": "mlmodel",
- "attributes": {
- "mlmodel_name": "person_detector"
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```json
-"services": [
- {
- "name": "vision",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "model_path": "/path/to/file.tflite",
- "label_path": "/path/to/labels.tflite",
- "num_threads": 1
- },
- "name": "person_detector",
- "type": "tflite_detector"
- }
- ]
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### TFLite Classifier configurations
-
-You can replace existing TFLite classifiers by [configuring new ones in the UI](/services/vision/mlmodel/) or you can update the [JSON configuration of your machines](/configure/#the-configure-tab):
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-```json
-"services": [
- {
- "name": "fruit_classifier",
- "type": "mlmodel",
- "model": "tflite_cpu",
- "attributes": {
- "model_path": "/path/to/classifier_file.tflite",
- "label_path": "/path/to/classifier_labels.txt",
- "num_threads": 1
- }
- },
- {
- "name": "fruit_classifier",
- "type": "vision",
- "model": "mlmodel",
- "attributes": {
- "mlmodel_name": "fruit_classifier"
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```json
-"services": [
- {
- "name": "vision",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "model_path": "/path/to/classifier_file.tflite",
- "label_path": "/path/to/classifier_labels.txt",
- "num_threads": 1
- },
- "name": "fruit_classifier",
- "type": "tflite_classifier"
- }
- ]
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### Radius Clustering 3D segmenter configurations
-
-You can replace existing Radius Clustering 3D segmenters by [configuring new ones in the UI](/services/vision/obstacles_pointcloud/) or you can update the [JSON configuration of your machines](/configure/#the-configure-tab):
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-```json
-"services": [
- {
- "name": "rc_segmenter",
- "type": "vision",
- "model": "obstacles_pointcloud"
- "attributes": {
- "min_points_in_plane": 1000,
- "min_points_in_segment": 50,
- "clustering_radius_mm": 3.2,
- "mean_k_filtering": 10
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```json
-"services": [
- {
- "name": "vision",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "min_points_in_plane": 1000,
- "min_points_in_segment": 50,
- "clustering_radius_mm": 3.2,
- "mean_k_filtering": 10
- },
- "name": "rc_segmenter",
- "type": "radius_clustering_segmenter"
- }
- ]
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### Detector to 3D segmenter configurations
-
-You can replace existing Radius Clustering 3D segmenters by [configuring new ones in the UI](/services/vision/detector_3d_segmenter/) or you can update the [JSON configuration of your machines](/configure/#the-configure-tab):
-
-{{< tabs >}}
-{{% tab name="New Way" %}}
-
-```json
-"services": [
- {
- "name": "my_segmenter",
- "type": "vision",
- "model": "detector_3d_segmenter"
- "attributes": {
- "detector_name": "my_detector",
- "confidence_threshold_pct": 0.5,
- "mean_k": 50,
- "sigma": 2.0
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{% tab name="Old Way" %}}
-
-```json
-"services": [
- {
- "name": "vision",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "detector_name": "my_detector",
- "confidence_threshold_pct": 0.5,
- "mean_k": 50,
- "sigma": 2.0
- },
- "name": "my_segmenter",
- "type": "detector_segmenter"
- }
- ]
- }
- },
- ... // other services
-]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-{{% /expand%}}
-
-#### Add and remove models using the machine config
-
-You must add and remove models using the [machine config](/configure/).
-You will no longer be able to add or remove models using the SDKs.
-
-#### Add machine learning vision models to a vision service
-
-The way to add machine learning vision models is changing.
-You will need to first register the machine learning model file with the [ML model service](/services/ml/) and then add that registered model to a vision service.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="added" title="Machine learning for image classification models" %}}
-
-You can now [train](/how-tos/train-deploy-ml/) and [deploy](/services/ml/) image classification models with the [data management service](/services/data/) and use your machine's image data directly within Viam.
-Additionally, you can upload and use existing [machine learning models](/registry/ml-models/) with your machines.
-For more information on using data synced to the cloud to train machine learning models, read [Train a model](/how-tos/train-deploy-ml/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="added" title="Motion planning with new `constraint` parameter" %}}
-
-A new parameter, [`constraint`](/services/motion/constraints/), has been added to the [Motion service API](/appendix/apis/services/motion/#api), allowing you to define restrictions on the machine's movement.
-The constraint system also provides flexibility to specify that obstacles should only impact specific frames of a machine.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="added" title="Fragments in machine configuration" %}}
-
-You can now access {{< glossary_tooltip term_id="fragment" text="fragments" >}} in your machine configuration.
-The configurations you added will now show up automatically in the **Builder** view on your machine's **CONFIGURE** tab.
-This makes it easier to monitor what fragments you've added to your machine and how they're configured.
-
-For more information, see [Fragments](/configure/#fragments).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="improved" title="Sticky GPS keys" %}}
-
-GPS keys you enter are now saved in your local storage.
-This ensures that when you reload the page, your GPS keys remain accessible.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="improved" title="More reliable camera streams" %}}
-
-The camera component's streams are smoother and more reliable with recent improvements.
-
-Additionally, camera streams automatically restart if you momentarily lose internet connection.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-03-31" color="improved" title="UI updates to Logs and History" %}}
-
-The latest UI updates enable you to:
-
-- Load a previous configuration for reverting changes made in the past
-- Search logs by filtering keywords or log levels such as _info_ or _error_ messages
-- Change your timestamp format to **ISO** or **Local** depending on your preference.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-02-28" color="added" title="Rover reuse in Try Viam" %}}
-
-You now have the option to reuse a machine config from a previous Try Viam session.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-02-28" color="added" title="Dynamic code samples" %}}
-
-The Viam app **Code sample** tab now dynamically updates as you add resources to your machine's config.
-The code samples instantiate each resource and include examples of how to call a `Get` method on it.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-02-28" color="added" title="TypeScript SDK" %}}
-
-Find more information in the [TypeScript SDK docs](https://ts.viam.dev/).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-02-28" color="added" title="Frame system visualizer" %}}
-
-When adding [frames](/services/frame-system/) to your machine's config in the Viam app, you can now use the **Frame System** subtab of the **CONFIGURE** tab to more easily visualize the relative positions of frames.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-02-28" color="added" title="Support for microcontrollers" %}}
-
-`viam-micro-server` is a lightweight version of `viam-server` that can run on an ESP32.
-Find more information in the [`viam-micro-server` installation docs](/installation/viam-micro-server-setup/#install-viam-micro-server).
-
-{{% /changelog %}}
-
-{{% changelog date="2023-01-31" color="added" title="Remote control power input" %}}
-
-On your machine's **CONTROL** tab on the [Viam app](https://app.viam.com/), you can now set the power of a [base](/components/base/).
-The base control UI previously always sent 100% power to the base's motors.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-01-31" color="added" title="New encoder model: AMS AS5048" %}}
-
-The [AMS AS5048](https://github.com/viam-modules/ams) is now supported.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-01-31" color="added" title="GetLinearAcceleration method" %}}
-
-The movement sensor API now includes a [GetLinearAcceleration](/appendix/apis/components/movement-sensor/#getlinearacceleration) method.
-
-{{% /changelog %}}
-
-{{% changelog date="2023-01-31" color="added" title="Support for capsule geometry" %}}
-
-The [motion service](/services/motion/) now supports capsule geometries.
-
-The UR5 arm model has been improved using this new geometry type.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="added" title="Modular resources" %}}
-
-You can now implement your own custom {{< glossary_tooltip term_id="resource" text="resources" >}} as [_modular resources_](/registry/).
-
-{{% alert title="Important: Breaking Change" color="note" %}}
-
-All users need to update to the latest version of the RDK (V3.0.0) to access machines using the Viam app.
-
-{{% /alert %}}
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="added" title="URDF kinematic file support" %}}
-
-You can now supply kinematic information using URDF files when implementing your own arm models.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="added" title="New movement sensor models" %}}
-
-There are two new movement sensor {{< glossary_tooltip term_id="model" text="models" >}}:
-
-- [ADXL345](https://github.com/viam-modules/analog-devices): A 3-axis accelerometer
-- [MPU-6050](https://github.com/viam-modules/tdk-invensense): A 6-axis accelerometer and gyroscope
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="improved" title="Camera performance and reliability" %}}
-
-- Improved server-side logic to choose a mime type based on the camera image type, unless a specified mime type is supplied in the request.
- **The default mime type for color cameras is now JPEG**, which improves the streaming rate across every SDK.
-- Added discoverability when a camera reconnects without changing video paths.
- This now triggers the camera discovery process, where previously users would need to manually restart the RDK to reconnect to the camera.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="improved" title="Motion planning with remote components" %}}
-
-The [motion service](/services/motion/) is now agnostic to the networking topology of a machine.
-
-- Kinematic information is now transferred over the robot API.
- This means that the motion service is able to get kinematic information for every component on the machine, regardless of whether it is on a main or remote viam-server.
-- Arms are now an input to the motion service.
- This means that the motion service can plan for a machine that has an arm component regardless of whether the arm is connected to a main or {{< glossary_tooltip term_id="remote-part" text="remote-part" >}} instance of `viam-server`.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="improved" title="Motion planning path smoothing" %}}
-
-- RRT\* paths now undergo rudimentary smoothing, resulting in improvements to path quality with negligible change to planning performance.
-- Plan manager now performs direct interpolation for any solution within some factor of the best score, instead of only in the case where the best inverse kinematics solution could be interpolated.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-12-28" color="improved" title="Data synchronization reliability" %}}
-
-Previously, data synchronization used bidirectional streaming.
-Now is uses a simpler unary approach that is more performant on batched unary calls, is easier to load balance, and maintains ordered captures.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-28" color="changed" title="Camera configuration" %}}
-
-**Changed** the configuration schemes for the following camera models:
-
-- Webcam
-- FFmpeg
-- Transform
-- Join pointclouds
-
-For information on configuring any camera model, see [Camera Component](/components/camera/).
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="added" title="New servo model" %}}
-
-A new [servo model called `gpio`](/components/servo/gpio/) supports servos connected to non-Raspberry Pi boards.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="added" title="RTT indicator in the app" %}}
-
-A badge in the Viam app now displays RTT (round trip time) of a request from your client to the machine.
-Find this indicator of the time to complete one request/response cycle on your machine's **CONTROL** tab, in the **Operations & Sessions** card.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="added" title="Python 3.8 support" %}}
-
-The Python SDK now supports Python 3.8, in addition to 3.9 and 3.10.
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="added" title="New parameter: `extra`" %}}
-
-A new API method parameter, `extra`, allows you to extend {{< glossary_tooltip term_id="modular-resource" text="modular resource" >}} functionality by implementing the new field according to whatever logic you choose.
-`extra` has been added to the following APIs: arm, data management, gripper, input controller, motion, movement sensor, navigation, pose tracker, sensor, SLAM, vision.
-
-{{% alert title="IMPORTANT: Breaking change" color="note" %}}
-
-Users of the Go SDK _must_ update code to specify `extra` in the arguments that pass into each request.
-
-`extra` is an optional parameter in the Python SDK.
-
-{{% /alert %}}
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="added" title="Service dependencies" %}}
-
-`viam-server` now initializes and configures resources in the correct order.
-For example, if the SLAM service depends on a LiDAR, it will always initialize the LiDAR before the SLAM service.
-
-{{% alert title="IMPORTANT: Breaking change" color="note" %}}
-
-If you are using the SLAM service, you now need to specify sensors used by the SLAM service in the `depends_on` field of the SLAM configuration.
-Other service configurations are not affected.
-
-{{% /alert %}}
-
-{{% /changelog %}}
-
-{{% changelog date="2022-11-15" color="removed" title="Width and height fields from camera API" %}}
-
-Removed `width` and `height` from the response of the [`GetImage`](/appendix/apis/components/camera/#getimage) method in the camera API.
-This does not impact any existing camera models.
-If you write a custom camera model, you no longer need to implement the `width` and `height` fields.
-
-{{% /changelog %}}
diff --git a/docs/appendix/contributing.md b/docs/appendix/contributing.md
deleted file mode 100644
index 669d5d41299..00000000000
--- a/docs/appendix/contributing.md
+++ /dev/null
@@ -1,893 +0,0 @@
----
-title: "Contributing to the Docs"
-linkTitle: "Contributing to the docs"
-weight: 99
-type: "docs"
-description: "Learn about our style guide and how to work with hugo to contribute to these docs."
-toc_hide: true
----
-
-Thank you for wanting to help us make the docs better.
-Every contribution is appreciated.
-
-{{< alert title="Note" color="note" >}}
-Before you start, please review this document and our [Code of Conduct](https://www.viam.com/community-guidelines).
-{{< /alert >}}
-
-## Goals
-
-The Viam documentation aims to:
-
-- Educate users (explain concepts, provide an overview of what is possible)
-- Help users accomplish tasks (performing an action, building a thing)
-
-We do that by providing concise and well-structured documentation to users.
-When users stumble, we provide avenues for feedback, so we can take action and prevent other users from running into similar issues.
-
-## Voice
-
-We aim to be friendly but not colloquial, direct, and concise.
-
-Here are a few additional pointers:
-
-| Subject | Judgment |
-| -------------------- | ------------- |
-| Emoji ✨ | No |
-| Exclamation marks | Use sparingly |
-| Rhetorical questions | No |
-
-## Audience
-
-We write for a technical audience that spans from entry-level to expert.
-However, common tools and concepts such as version control, moving files with ssh, JSON are beyond the scope of our docs.
-To make the content as accessible as possible we will, where possible, include actions to be taken and text that guides the user as to what they are achieving when performing these actions.
-
-For example, when copying a file to another machine with ssh, we would describe the action with words like "Use ssh to move the file onto the other machine" alongside the command to move the file.
-Explaining ssh goes beyond the scope of our docs.
-Where needed, we will link to supporting documentation but not provide supporting documentation ourselves where it would duplicate existing external documentation.
-Use your judgment to determine when we need to explain more and when we need to link to supporting content.
-When in doubt, ask during review.
-
-## Project structure
-
-All documentation is in the [docs folder](https://github.com/viamrobotics/docs/tree/main/docs).
-For information about Hugo and how to develop locally, see the [README](https://github.com/viamrobotics/docs/blob/main/README.md).
-
-## Content types
-
-When creating a new piece of content, decide which one of the four content types the content should be.
-Note this in a comment in the front matter of the file.
-
-The docs use the [Diátaxis Framework](https://diataxis.fr/) as the basis of the content structure with the following four content types:
-
-- **Explanation (conceptual)**: An understanding-oriented piece of content.
- This content provides background knowledge on a topic and tends to be referenced in how-to guides and tutorials.
- For example the [`viam-server` page](/architecture/viam-server/) or the [Registry page](/registry/).
- It’s useful to have a real or imagined "Why?" question to serve as a prompt.
-
- {{< expand "Click to view template" >}}
-
- ```md
- # Concept
-
- Introductory paragraph.
- Possibly containing further subsections or links to relevant conceptual information.
-
- ## Subconcept
-
- Paragraphs containing explanation. Add imagery as needed.
-
- - Provide context and address potential points of confusion. - Add real or hypothetical examples.
-
- Possibly more Subconcept sections.
-
- ### Do x with subconcept (optional)
-
- Information on potential ways to apply the concept (possibly linking to how-tos or containing how-tos).
-
- ## Next steps
-
- Links to related content.
- ```
-
- {{< /expand >}}
-
-- **How-to Guide (procedural)**: A task-oriented piece of content that directs a reader to perform actions step by step to complete a task, like instructions to sauté onions.
- Generally starts with a description of the task and things to consider, and then provides a set of numbered steps to follow.
- For example, the [Installation page](/installation/viam-server-setup/) or the [Find module page](/registry/modular-resources/).
-
- {{< expand "Click to view template" >}}
-
- ```md
- # Do This Task
-
- Description of task and considerations. Possibly containing further subsections.
-
- ## Do x
-
- 1. Ordered list of actions to perform. Written in imperative form. Add imagery as needed.
-
- (possibly more Do X sections)
-
- ## Next steps
-
- Links to related content.
- ```
-
- {{< /expand >}}
-
-- **Tutorial**: A learning-oriented piece of content that functions as a lesson for the reader.
- A tutorial helps readers to learn and apply skills by doing something meaningful and attainable, like a recipe to cook a full meal.
-
- {{< expand "Click to view template" >}}
-
- ```md
- # Do X with Y
-
- Outline the why.
- Tell the story of the machine.
- Explain the machine's use and origin.
-
- ## Requirements
-
- What does the reader need to already know.
- What will you be using (hardware/software).
-
- ## Build X
-
- Build steps.
-
- ## Configure your X
-
- Configuration steps.
-
- ## Program your X
-
- Code and directions.
-
- ## Next steps
-
- Link to other tutorials with cards or text.
-
- {{* cards */>}}
- {{%/* card link="/tutorials/get-started/blink-an-led" */%}}
- {{* /cards */>}}
- ```
-
- For the full template see [template.md](https://github.com/viamrobotics/docs/blob/main/docs/tutorials/template.md).
-
- {{< /expand >}}
-
-- **Reference**: A concise, information-oriented piece of content that generally starts with an overview/introduction and then a list of some kind (configuration options, API methods, etc.).
- Examples include the [API pages](/appendix/apis/) as well as [component and service pages](/components/arm/).
-
- Example template: [Component template](https://github.com/viamrobotics/docs/blob/main/docs/components/component/_index.md).
-
- {{< expand "Click to view template" >}}
-
- ```md
- # Product, Feature or API Name
-
- Description or introduction.
- Possibly containing further subsections.
-
- ## List or table of items (heading optional as needed)
-
- - Unordered list of options
-
- (possibly more information for each option)
-
- ## Next steps
-
- Links to related content.
- ```
-
- {{< /expand >}}
-
-## Style guide
-
-All docs are written in [Hugo Markdown](https://www.markdownguide.org/tools/hugo/).
-Most Markdown formatting is supported.
-For a brief introduction to Markdown, check out this [Markdown Cheatsheet](https://gist.github.com/npentrel/e1dd14816f7c7724edf70ab2a2ed2952).
-Some additional formatting options are supported with [Hugo Shortcodes](https://gohugo.io/content-management/shortcodes/).
-
-We follow the [Rackspace Style Guide](https://web.archive.org/web/20200829151826/https://developer.rackspace.com/docs/style-guide/) with many rules encoded in Vale rules.
-
-Additional we enforce the following substitutions:
-
-
-
-| Do not say | Instead say |
-| ---------- | ----------- |
-| web app, cloud app | Viam app or Viam platform |
-| viam app, Viam App | Viam app |
-| Viam-server, Viam server, Viam-Server | viam-server |
-| Config Tab, Config tab, Configure Tab | CONFIGURE tab |
-| Vision service, Vision Service | vision service |
-| Motion service, Motion Service | motion service |
-| slam service, Slam service, SLAM Service | SLAM service |
-| Data Management Service, Data Management service | data management service |
-| in the website | on the website |
-| on the app | in the app |
-| user of an org | member of an org |
-| main part and child part, main part and non-main part | main part and sub-part |
-| subpart | sub-part |
-| drop down | dropdown |
-| drop-down | dropdown |
-| RPLIDAR, Rplidar | RPlidar |
-| compute parts | computer |
-| microprocessor | Raspberry Pi or Jetson or another specific term |
-
-
-
-### Vale linting
-
-{{< alert title="Tip" color="tip" >}}
-We recommend you work in Visual Studio Code and install the [Vale extension](https://marketplace.visualstudio.com/items?itemName=errata-ai.vale-server) to use the vale linter.
-{{< /alert >}}
-
-When you open a PR, your changes will be checked against a few style rules.
-To run this check locally, follow the instructions in the [Vale Readme](https://github.com/viamrobotics/docs/blob/main/.github/vale/README.md).
-
-### `markdownlint`
-
-We recommend you work in Visual Studio Code and install the [markdownlint extension](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint).
-
-### UI elements
-
-Use **bold** text for UI elements, such as tabs and buttons.
-
-### Example values
-
-Use examples that resemble real data. For emails this could be `amanda@viam.com`.
-
-When using placeholders in code examples, follow the [Google developer documentation style guide's rules for formatting placeholders](https://developers.google.com/style/placeholders).
-
-### Images and screenshots
-
-Use screenshots in introductory materials and where the surrounding text is not enough to direct the reader. Be aware that screenshots tend to get outdated quickly and come with a maintenance burden.
-
-Rules for images:
-
-- **Place images in the `assets` folder.** The folder uses the same content structure as the docs. Your images should be in the folder the page that uses it is in. However, there is no need to duplicate an image into multiple places if you use it in multiple pages.
-- All images require alt text.
-- All images **should** be smaller than 1MB. Hugo throws a warning during local builds (such as `make serve-prod`) if an image exceeds this size. Use an image compressor like [TinyPNG](https://tinypng.com/). This is to reduce the overall page and repo size.
-
-#### Remove EXIF data automatically
-
-{{< alert title="Important" color="note" >}}
-
-To ensure that you do not accidentally add `EXIF` data on images, please install [exiftool](https://exiftool.org/install.html) and add the following lines to the `.git/hooks/pre-commit` file in your local repository.
-
-```sh {class="command-line" data-prompt="$"}
-if [ "git diff --name-only | grep -EI '.*(png|jpg|jpeg)$' | wc -l" ];
-then
-list= $(git diff --diff-filter=d --name-only | grep -EI ".*(png|jpg|jpeg)$")
-for item in $list
-do
-exiftool -all= $item
-done
-fi
-```
-
-If you don't already have a `.git/hooks/pre-commit` file in your `docs` git repo directory, you can copy the existing `pre-commit.sample` file in that directory as `pre-commit` to use the sample template, or create a new `pre-commit` file in that directory with the above content.
-If you create a new file, you must also make it executable with: `chmod 755 /path/to/my/.git/hooks/pre-commit`.
-
-With this configuration in place, each commit you make will remove EXIF data from any image files (with extension `.png`, `.jpg`, or `.jpeg`) that are part of your commit.
-{{< /alert >}}
-
-#### Image markup
-
-If the image is supposed to take up the full width of the page use the regular markdown syntax: `![alt text](path)`.
-
-```md
-![Raspberry Pi](/installation/thumbnails/raspberry-pi-4-b-2gb.png)
-```
-
-If the image is smaller use the `imgproc` shortcode with an appropriate resize value.
-
-```md
-
-
-{ {} }
-
-{ {} }
-
-{ {} }
-```
-
-![Raspberry Pi](/installation/thumbnails/raspberry-pi-4-b-2gb.png)
-
-{{}}
-
-{{}}
-
-The `imgproc` shortcode will:
-
-- convert the image into the `webp` format (which is more efficient) and resize the image
-- resize the image in the current format and set that image as a backup in case `webp` is not supported. This does reduce file size when the website is being served. However, the source file should still be smaller than 1MB to minimize overall page and repo size. For more information on the resize options see [Image Processing](https://gohugo.io/content-management/image-processing/).
-
-Only specify `declaredimensions` if the image is **not** responsive (if it doesn't resize). The only images that you'd want to use declaredimensions on are the ones that take up the same space on mobile as on desktop.
-
-An example of this are the small board icons on the front page which should never be a different size than they are.
-The pictures in cards, however, need to resize because they change size based on the available screen space.
-
-Screenshot should most often be added with normal markdown syntax. Then they'll take up the max size they can on a big screen but be smaller on mobile. If you want to resize a large image, use the largest size the image can take up as the image to `resize` the image to.
-
-{{< alert title="Note" color="note" >}}
-You cannot directly use the ` ` html tag for images in the assets folder because the images, once built, are renamed.
-If you really need to use html directly, place the image in the `static` folder.
-{{< /alert >}}
-
-### GIFs and videos
-
-We encourage the use of GIFs and Videos.
-Our docs have two kinds of videos:
-
-- Regular videos with video controls and audio
-- GIF-like videos that do not have video controls or audio and function like GIFs
-
-#### Regular videos
-
-For regular videos that should use the video shortcode as follows:
-
-```md
-
-
-{ {} }
-```
-
-{{}}
-
-We use `webm` and `mp4` source files for videos because they are generally smaller.
-The poster is an image that gets loaded as a preview.
-
-{{% expand "Click to see the commands for converting videos to these formats" %}}
-
-To create the `webm` and mp4 files use these commands:
-
-{{< tabs >}}
-{{% tab name="macOS" %}}
-
-```sh {id="video-conversion-macos" class="command-line" data-prompt="$"}
-ffmpeg -i PATH_TO_GIF_OR_VID -vcodec libx264 -vf "format=yuv420p,scale=720:-2" -b:v 300k PATH_TO_GIF_OR_VID.mp4
-ffmpeg -i PATH_TO_GIF_OR_VID -c:v libvpx-vp9 -b:v 0 -crf 41 my-animation.webm
-```
-
-{{% /tab %}}
-{{% tab name="Linux" %}}
-
-```sh {class="command-line" data-prompt="$"}
-ffmpeg -i PATH_TO_GIF_OR_VID -vcodec libx264 -vf "format=yuv420p,scale=720:-2" -b:v 300k PATH_TO_GIF_OR_VID.mp4
-ffmpeg -i PATH_TO_GIF_OR_VID -c:v libvpx-vp9 -b:v 0 -crf 41 my-animation.webm
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-The first command:
-
-- uses the `libx264` codec
-- uses the `yuv420p` pixel format
-- scales the video to `720px` width
-- changes the bitrate to `300k` - you can change this value but check that the result is usable and reasonably small
-
-The second command:
-
-- uses the `libvpx-vp9` codec
-- `-crf 41` sets the quality level.
- Valid values are 0-63.
- Lower numbers are higher quality
-
-To create a preview image use this command:
-
-{{< tabs >}}
-{{% tab name="macOS" %}}
-
-```sh {class="command-line" data-prompt="$"}
-ffmpeg -ss 00:00:05 -i PATH_TO_GIF_OR_VID.mp4 -frames:v 1 PATH_TO_GIF_OR_VID.jpg
-```
-
-{{% /tab %}}
-{{% tab name="Linux" %}}
-
-```sh {class="command-line" data-prompt="$"}
-ffmpeg -ss 00:00:05 -i PATH_TO_GIF_OR_VID.mp4 -frames:v 1 PATH_TO_GIF_OR_VID.jpg
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-The command takes a screenshot at `00:00:05`.
-
-{{% /expand%}}
-
-#### GIF-like videos
-
-GIF-like videos on our pages are generally used to show robot actions.
-We do not use the GIF file format within our docs because it uses a lot of bandwidth - more than videos - and the [best practice](https://developer.chrome.com/en/docs/lighthouse/performance/efficient-animated-content/) is to not use them.
-
-Instead, we use a video div with two sources:
-
-```md
-
-
-{ {}}
-```
-
-{{}}
-
-**Place the files into the `static` directory.**
-
-{{% expand "Click to see instructions for creating the video files" %}}
-To create the `webm` and `mp4` source files, you need to convert the video/gif you have.
-**The resulting `webm` and `mp4` file should always be less than 1MB.**
-A good first thing to do is to upload the video to [Ezgif](https://ezgif.com) and reduce the file size by:
-
-- cutting the video
-- cropping the video
-- changing the size
-- (on GIFs) changing the quality
-- (on GIFs) using the optimize function to remove every second frame and then adjusting the speed
-- (on GIFs) using the frames editor to remove frames that are similar and holding the previous frame longer instead
-
-Once you have a gif that is reasonably small, run these commands:
-
-{{< tabs >}}
-{{% tab name="macOS" %}}
-
-```sh {class="command-line" data-prompt="$"}
-ffmpeg -i PATH_TO_GIF_OR_VID -vcodec libx264 -vf "format=yuv420p,scale=400:-2" -b:v 300k -an PATH_TO_GIF_OR_VID.mp4
-ffmpeg -i PATH_TO_GIF_OR_VID -c:v libvpx-vp9 -b:v 0 -crf 41 my-animation.webm
-```
-
-{{% /tab %}}
-{{% tab name="Linux" %}}
-
-```sh {class="command-line" data-prompt="$"}
-ffmpeg -i PATH_TO_GIF_OR_VID -vcodec libx264 -vf "format=yuv420p,scale=400:-2" -b:v 300k -an PATH_TO_GIF_OR_VID.mp4
-ffmpeg -i PATH_TO_GIF_OR_VID -c:v libvpx-vp9 -b:v 0 -crf 41 my-animation.webm
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-The first command:
-
-- uses the `libx264` codec
-- uses the `yuv420p` pixel format
-- scales the video to `400px` width - if you are working with screenshots that need to be bigger, adjust this number.
-- changes the bitrate to `300k` - you can change this value but check that the result is usable
-- removes the audiotrack with `-an`
-
-The second command:
-
-- uses the `libvpx-vp9` codec
-- `-crf 41` sets the quality level.
- Valid values are 0-63.
- Lower numbers are higher quality
-
-{{< alert title="Caution" color="caution" >}}
-
-Some MP4 files aren't natively supported on iPhones depending on the [video codec used](https://confluence.atlassian.com/confkb/unable-to-play-embedded-mp4-videos-on-ipad-or-iphone-in-confluence-305037325.html).
-If you add an MP4 file, test it on an iPhone with the deployed link on the PR.
-
-{{< /alert >}}
-
-{{< alert title="Important" color="note" >}}
-The gif can and should be used only in the frontmater `images` variable and only if close in size to 1MB.
-The `images` variable sets it to be the preview image on social platforms (for example it will be the preview when you share a link on slack).
-Link previews do not support `webm` and `mp4` but they do support gifs.
-{{< /alert >}}
-{{% /expand%}}
-
-{{% expand "Click to see instructions for creating video commands for your terminal" %}}
-
-If you'd like to use commands like `webm2mp4` add this to your `.zshrc`:
-
-```sh {class="command-line" data-prompt="$"}
-function webm2gif() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -t 8 -i ${vdirname}/${vfname}webm -vf "fps=5,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 ${vdirname}/${vfname}gif
-}
-
-function mp42gif() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -t 8 -i ${vdirname}/${vfname}mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 ${vdirname}/${vfname}gif
-}
-
-function gif2webm() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}gif -c vp9 -b:v 0 -crf 41 -an ${vdirname}/${vfname}webm
-}
-
-function gif2mp4() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}gif -vcodec libx264 -vf "format=yuv420p,scale=400:-2" -b:v 300k -an ${vdirname}/${vfname}mp4
-}
-
-function gif2mp4-withsound() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}gif -vcodec libx264 -vf "format=yuv420p,scale=-2:720" -b:v 300k ${vdirname}/${vfname}mp4
-}
-
-function mp42webm() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}mp4 -c vp9 -b:v 0 -crf 41 -an ${vdirname}/${vfname}webm
-}
-
-function mp42webm-withsound() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}mp4 -c vp9 -b:v 0 -crf 41 ${vdirname}/${vfname}webm
-}
-
-function webm2mp4() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}webm -vcodec libx264 -vf "format=yuv420p,scale=400:-2" -b:v 300k -an ${vdirname}/${vfname}mp4
-}
-
-function webm2mp4-withsound() {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -i ${vdirname}/${vfname}webm -vcodec libx264 -vf "format=yuv420p,scale=-2:720" -b:v 300k ${vdirname}/${vfname}mp4
-}
-
-function mp42jpg {
-vid=$1
-ext=${vid##*.}
-vdirname=`dirname $vid`
-vfname=`basename $vid $ext`
-ffmpeg -ss 00:00:05 -i ${vdirname}/${vfname}mp4 -frames:v 1 ${vdirname}/${vfname}jpg
-}
-```
-
-{{< alert title="Important" color="note" >}}
-The `2gif` commands only turn the first 5 seconds of a video into a low res gif.
-{{< /alert >}}
-
-{{% /expand%}}
-
-{{% alert title="Note" color="note" %}}
-
-If you use `videos` to add a video preview for a page (such as to a tutorial), you should also add a .gif version of the video to the front matter.
-Hugo uses the GIF as a link preview image that gets displayed on external sites when someone shares the link, for example on Slack or Twitter.
-
-Why?
-
-- GIFs take more bandwidth than MP4 and WEBM videos, so on our page, we prefer to use MP4 and WEBM.
-- Link previews using `og:image` only support GIFs
-- Automatic conversion between the formats is possible but we also need to make sure that the resulting GIFs are presentable and under 1MB.
-
-{{% /alert %}}
-
-## Formatting guide
-
-### Front matter
-
-Each file that generates a page in Hugo starts with front matter that looks like this:
-
-```markdown
----
-title: "Build a line-following robot with only a rover and a webcam"
-linkTitle: "Line Follower"
-weight: 90
-type: "docs"
-description: "Instructions for building a line-following robot that uses a webcam to track lines."
-# SME: "SME Name"
----
-```
-
-- The `description` gets used for previews.
-- The `weight` determines the ordering of pages in the side navigation bar.
-
-#### Prod/Draft/Future pages
-
-Add `draft: true` to the Front Matter to set a page to Draft.
-You can commit and push the page and it won’t display in production.
-Add `future: true` to the Front Matter to begin building a page to production on a certain date (for example, a release date).
-
-### File names
-
-File names are kebab-case, with hyphens, such as `upload-model.md`.
-
-### One sentence per line
-
-To make reviews easier, each new sentence should begin on a new line.
-
-### Add hyperlinks (sparingly)
-
-Where related resources would be helpful to a reader, link them. However:
-
-- Links are an opportunity for a reader to get lost or get distracted. If that happens, a link is not helpful. Placing links near the end of a section/page can help avoid this.
-- Avoid a page becoming a sea of blue hyperlinks. Excessive linking can make a page harder to view and read.
-
-{{< alert title="Important" color="note" >}}
-Links should always have descriptive text. Never write "Click here" with `here` as the link text. Instead use "To learn more about X, read PAGE NAME" with the page name as the link text.
-{{< /alert >}}
-
-When linking to an image or another page within the docs please use relative links (`appendix/contributing/`) or (`/appendix/contributing/`).
-
-{{< alert title="Note" color="note" >}}
-You **must** add a trailing slash on links.\*\*
-This is enforced with `htmltest`.
-{{< /alert >}}
-
-### Glossary
-
-We have built a glossary into our docs. Jargon and product-specific concepts should have an entry in the `appendix/glossary` folder. You can use a glossary entry on any page like this:
-
-```md
-
-
-This text will have additional information on hover for the
-word { {< glossary_tooltip term_id="smart-machine" text="smart machine" >} }.
-```
-
-### Reusable text snippets
-
-If you need to use the same text in multiple locations, for example when cautioning users to disconnect power before changing connections or providing a commonly used instruction set or procedure, you can use reusable snippets.
-
-The following is an example of the secret-share.md alert added using the snippet shortcode:
-
-{{% figure src="/general/snippet-shortcode.png" alt="Snippet shortcode usage." title="Snippet Shortcode Usage" %}}
-
-{{% snippet "secret-share.md" %}}
-
-### Including another file
-
-{{< readfile "/static/include/sample.md" >}}
-
-Section content before this line is contained in an included file: /static/include/sample.md
-
-### Tab Panels
-
-{{< tabs name="TabPanelExample" >}}
-{{% tab name="Support"%}}
-**Supported**
-
-- Markdown and HTML images
- - Images should be included with the imgproc shortcode.
- You cannot directly use the ` ` html tag for images in the assets folder because the images, once built, are renamed.
- If you really need to use html directly, place the image in the static folder.
-- Alert Shortcode
-- PRISM syntax highlighting (the three backticks)
-- "codelang" highlighting (add codelang="language" to tab element).
- It's very ugly, needs css work, and is not recommended at this time.
-
-### Not supported
-
-- Footnotes
-- Expanders
-
-### Example usage
-
-```md
-# remove spaces
-
-{ {} }
-```
-
-{{}}
-
-{{% /tab %}}
-{{% tab name="Examples" %}}
-
-
-
What is Rendered?
-
It renders vanilla HTML and markdown, Alerts, and images.
- For example, these two images:
-
-- **Markdown Image Example**
- ![expand example](/general/expander-markdown.png)
-- **HTML Image Example** (with border)
- {{
}}
-
-
-
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Code with syntax highlighting
-
-Line numbering is off by default.
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "word": "Three backticks and the language name enables Prism syntax highlighting."
-}
-```
-
-With just line 6 highlighted.
-See [the prism line highlight extension](https://prismjs.com/plugins/line-highlight/) for more info:
-
-```python {class="line-numbers linkable-line-numbers" data-line="6"}
-while (True):
- # When True, sets the LED pin to high or on.
- await led.set(True)
- print('LED is on')
-
- await asyncio.sleep(1)
-
- # When False, sets the pin to low or off.
- await led.set(False)
- print('LED is off')
-
- await asyncio.sleep(1)
-```
-
-With linked lines and lines 8-10 highlighted.
-
-```python {id="some-python-unique-id" class="linkable-line-numbers" data-line="8-10"}
-while (True):
- # When True, sets the LED pin to high or on.
- await led.set(True)
- print('LED is on')
-
- await asyncio.sleep(1)
-
- # When False, sets the pin to low or off.
- await led.set(False)
- print('LED is off')
-
- await asyncio.sleep(1)
-```
-
-### Alert shortcodes
-
-{{< alert title="Important" color="note" >}}
-This is an alert.
-{{< /alert >}}
-
-#### How to use notes, cautions, and warnings
-
-**Info/Tip**: Use to convey helpful information or clarification.
-They both use the same color.
-
-**Note/Important/Stability Notice**: These call attention to something important.
-When creating alerts about important messages, set the title attribute as `title="Important"`.
-If you want to include a more detailed title or message, use `title="Important: $message"` to provide additional context.
-
-**Caution**: Provide notice that a certain action or event could damage hardware or cause data loss.
-
-**Warning**: Use to notify the reader of an issue to avoid loss of life, personal injury, and health hazards.
-Electrical and physical safety fall into this category.
-
-{{< alert title="Tip" color="tip" >}}
-The "title" and "color" keywords and the names of colors ("tip," "note," and so on) are case sensitive.
-If you use uppercase, alerts will not have a title and the color border will be incorrect.
-{{< /alert >}}
-
-{{< figure src="/general/alert-markdown.png" alt="The shortcodes used to display Alerts." title="Shortcodes for Alerts" >}}
-
-{{< alert title="Tip" color="tip" >}}
-Provide a tip.
-{{< /alert >}}
-
-{{< alert title="Info" color="info" >}}
-Use to expand on something from the body text or to provide additional information.
-{{< /alert >}}
-
-{{< alert title="Important" color="note" >}}
-This is to call the reader's attention to something important.
-{{< /alert >}}
-
-{{< alert title="Stability Notice" color="note" >}}
-Let the reader know that a feature is experimental and that breaking changes are likely to occur.
-{{< /alert >}}
-
-{{< alert title="Caution" color="caution" >}}
-This provides notices that a certain action or event could damage hardware or cause data loss.
-{{< /alert >}}
-
-{{< alert title="Warning" color="warning" >}}
-Use to notify the reader of information to avoid loss of life, personal injury, and health hazards.
-{{< /alert >}}
-
-### Using expanders
-
-Expanders allow to you add long sections of code to your topic and hide them until the reader decides to view it.
-
-Within the expander, you can still use most other shortcodes and syntax highlighting from Prism functions properly.
-The shortcode displays your expander's title in a light blue bar to make it noticeable.
-
-**Screen Capture of an Expander**
-{{}}
-
-#### Usage
-
-1. Add the shortcode tags.
- Make sure that the title is suitable for your use.
-1. Drop in the material you want to hide until the reader wants it.
-
-{{}}
-
-{{%expand "Click to view the source" %}}
-
-
-Add the text to hide here.
-
-**Prism syntax highlighting works in expanders, as do most other shortcodes.**
-
-```python
-print("Code snippets work")
-```
-
-{{% /expand%}}
-
-### Figures
-
-The figure shortcode enhances the existing figure and figurecaption html tags.
-Figure supports the standard html attributes associated with the html img and figure tags, as well as an **attr** element for attribution text and **attrlink** if you wish to add a link to the attribution text.
-
-{{< figure src="/general/figure-shortcode.png" alt="The shortcode used to display an image, its caption, and its attribution." title="Figure Shortcode" >}}
-
-This shortcode places the caption (that is the "title") above the table.
-The **title** is set in 12pt italic with a green underline.
-
-Figure styles the Attribution text as body text.
-
-### Footnotes
-
-To add a footnote:
-
-```md
-"Some completely[^f] random text."
-
-[^f]: this is the text for the footnote
-```
-
-You can place the footnote text immediately beneath the paragraph where you put the marker.
-Hugo will place it at the bottom of the page.
-
-## Pull requests
-
-If you are making a small change, like fixing a typo or editing a few lines of text, you do not need to create an issue.
-However, if you plan to make bigger changes, we ask that you create an issue and discuss the change with us in advance.
-
-To get started:
-
-1. Fork the official repo into your personal GitHub.
-2. Clone the forked repo to your local system.
-3. Add the remote path for the 'official' repository: `git remote add upstream git@github.com:viamrobotics/docs.git`
-
-When you are ready to contribute changes to the docs:
-
-1. Make sure you are on the main branch: `git switch main`
-2. Sync your forked main branch with the official repo: `git pull upstream main`
-3. Create a new branch for your changes: `git switch -c my-new-feature`
-4. Edit some docs...
-5. Commit your changes: `git commit -am 'Add some feature'`
-6. Make sure your local branch is still up-to-date with the official repo: `git pull upstream main`
-7. Push to the branch: `git push origin my-new-feature`
-8. Submit a pull request
-
-## Questions
-
-If you have questions or would like to chat, please find us on the [Community Discord](https://discord.gg/viam).
diff --git a/docs/appendix/learning-resources.md b/docs/appendix/learning-resources.md
deleted file mode 100644
index 91aa005e23d..00000000000
--- a/docs/appendix/learning-resources.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: "Learning Resources"
-linkTitle: "Learning Resources"
-description: "A collection of links to external sources discussing robotics topics and basic information that we believe users may find helpful."
-type: "docs"
-draft: true
----
-
-## Overview
-
-The following sections contain links that we think you will find useful during your journey into robotics.
-
-## Basic electronics
-
-### Hobby servos
-
-Hobby servos are a type of actuator comprising a small motor with built-in closed-loop control.
-They are useful for precise positioning, usually limited to a 180 degree range of angles.
-Continuous rotation servos are also available that maintain a speed rather than a position.
-
-#### Mechanism
-
-Hobby servos contain a small electric motor, a series of gears, and a potentiometer attached to the shaft to act as an encoder.
-It also contains a closed-loop position control circuit that takes a [Pulse Width Modulation (PWM)](https://en.wikipedia.org/wiki/Pulse-width_modulation) signal input and holds the shaft at a certain angle based on that input.
-
-A typical servo will take PWM pulses ranging from 1ms to 2ms long, and map this range to a 180 degree range of possible positions.
-A 1.5ms signal will hold the servo in the middle or "neutral" position, 1ms will move it to 90 degrees from there in one direction, and 2ms will move it 90 degrees from neutral in the opposite direction.
-Note that some servos have a different PWM range, mapping to a different set of angles.
-
-#### Hardware requirements
-
-Unlike [motors](/components/motor/), servos do not require a motor driver chip.
-
-A typical servo control setup comprises the following:
-
-- A Raspberry Pi (or other [board](/components/board/))
-- A servo
-- An appropriate power supply
- - If the servo will not be under any significant load and thus won’t draw much current, you may be able to get away with powering it off 5V (if that’s its required voltage) from the Pi pins.
- However it is advisable to power it directly from a power supply that can meet its peak current needs so as not to inadvertently power cycle the Pi or other components.
-
-#### Wiring
-
-{{% alert title="Caution" color="caution" %}}
-Always disconnect devices from power before plugging, unplugging or moving wires or otherwise modifying electrical circuits.
-{{% /alert %}}
-
-Here's an example of how a servo might be wired to a Raspberry Pi:
-
-![A diagram showing the signal wire of a servo connected to pin 16 on a Raspberry Pi. The servo's power wires are connected to a 4.8V power supply.](/components/servo/servo-wiring.png)
-
-### Resistors
-
-[Online Resistor Color Code Calculator](https://goodcalculators.com/resistor-color-code-calculator/) - Enter the desired resistor value in Ohms, kOhms, or MOhms, and press enter and this site displays the color bands for that resistor value.
-
-#### Resistor value chart
-
-![Chart of standard colors to values for electronic components. An example resistor with green, red, and orange bands is shown. The value is 52 times 10 to the third power, or 52,000 Ohms.](/internals/vector/resistor.png)
-
-You can easily learn resistor color markings without referring to a chart by remembering this jingle:
-
-"Badly Burnt Resistors On Your Ground Bus Void General Warranty."
-
-Now, equate the jingle to the colors in this order:
-Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Gray, White
-
-And their values on a resistor:
-0, 1, 2, 3, 4, 5, 6, 7, 8, 9
-
-- The bands 1 and 2 indicate the first two significant digits on a resistor.
-- Band 3 is a multiplier on four-band resistors.
- For example, a resistor with brown, green, orange bands representing, 1, 5, and 3, respectively, which equates to 15 times ten to the third, or 15,000 Ohms, or 15 kOhms.
-- On resistors with four bands, the band 4 indicates tolerance, with gold being +/- 5% and silver being +/- 10%.
-- On five-band resistors, band 3 becomes an additional significant digit, band 4 becomes the multiplier, and band 5 becomes the tolerance band.
-- Six-band resistors are read identically to five-band resistors, their difference being that the sixth band indicates the resistor's temperature coefficient.
-
-### LEDs (light-emitting diodes)
-
-Light-emitting diodes come in a variety of form factors:
-![Image of various Light Emitting Diode form factors.](/internals/vector/verschiedene-leds.jpg)
-LEDs commonly have two leads, although specialty LEDs are available that are capable of simultaneously displaying two colors or of displaying a blended shade. These specialty LEDs have 4-6 leads and 2-4 LED junctions.
-
-LEDs work by applying a voltage with a positive and negative polarity to the leads in such a manner that the positive voltage is attached to the anode of the LED and the negative voltage lead is attached to the LED's cathode. On a two-pin LED, the longer pin is the anode and the short pin is the cathode.
-
-LEDs require current-limiting resistors to avoid destroying the LED junction during an over-current situation. Always include a current-limiting resistor in basic LED circuits. The following schematic illustrates this circuit:
-
-![This image displays a schematic showing the arrangement of a DC voltage source with the positive lead to the LED's anode, the LED's cathode connected to a one end of a current-limiting resistor and the other end of the voltage drop resistor connected to the negative lead of the voltage source, completing the circuit.](/internals/vector/led-circuit2.png)
diff --git a/docs/appendix/try-viam/_index.md b/docs/appendix/try-viam/_index.md
deleted file mode 100644
index ca20ff51403..00000000000
--- a/docs/appendix/try-viam/_index.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: "Try Viam"
-linkTitle: "Try Viam"
-childTitleEndOverwrite: "Try Viam"
-weight: 85
-type: "docs"
-description: "Try Viam by taking over a Viam Rover in our robotics lab."
-videos: ["/appendix/try-viam/rover.webm", "/appendix/try-viam/rover.mp4"]
-videoAlt: "Rover reservation management page"
-images: ["/appendix/try-viam/rover.gif"]
-no_list: true
-aliases:
- - "/getting-started/try-viam/"
- - "/tutorials/viam-rover/"
- - /get-started/try-viam/tutorials/
- - "/appendix/try-viam/tutorials/"
- - "/try-viam/"
- - "/get-started/try-viam/"
- - "/appendix/try-viam-faq/"
- - "/try-viam/faq/"
- - "get-started/try-viam/faq/"
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-Viam is a general {{< glossary_tooltip term_id="smart-machine" text="smart machine">}} platform that can run on any hardware.
-The easiest way to try Viam is to [rent and remotely configure and control a Viam Rover](https://app.viam.com/try) located on-site at Viam in New York:
-
-
-
- {{}}
- 1. Click on TRY in Viam
- Log into the Viam app and go to the TRY tab . Don’t have a Viam account? Follow the instructions to sign up for an account.
-
-
-
- {{}}
- 2. Reserve your slot
- If no one’s using a Viam Rover, you’ll take over immediately.
-Otherwise, you’ll see an estimated time for the next slot, and we’ll send you an email when it’s your turn.
-See detailed instructions .
-
-
-
- {{}}
- 3. Get started with Viam
- Try a Viam Rover in our robotics lab. Drive or program the rover to see how you can build a machine with Viam. You can also try services like computer vision.
-
-
-
-
-## Next steps
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{% card link="/appendix/try-viam/rover-resources/" %}}
-{{< /cards >}}
diff --git a/docs/appendix/try-viam/reserve-a-rover.md b/docs/appendix/try-viam/reserve-a-rover.md
deleted file mode 100644
index cc81f783603..00000000000
--- a/docs/appendix/try-viam/reserve-a-rover.md
+++ /dev/null
@@ -1,144 +0,0 @@
----
-title: "Reserve a Viam Rover"
-linkTitle: "Reserve a Viam Rover"
-weight: 10
-type: "docs"
-description: "Reserve a Viam Rover located on-site at Viam in NYC."
-images: ["/appendix/try-viam/try-viam-reserve-preview.png"]
-imageAlt: "Rover reservation page"
-tags: ["try viam", "app"]
-aliases:
- - "/try-viam/reserve-a-rover/"
- - "/get-started/try-viam/reserve-a-rover/"
-toc_hide: true
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-_Try Viam_ is a way to try out the Viam platform without setting up any hardware yourself.
-You can take over a Viam Rover in our robotics lab to play around!
-
-Watch this tutorial video for a walkthrough of Try Viam, including [how to reserve a Viam Rover](#using-the-reservation-system), [navigate the Viam platform](/fleet/), and [drive the rover](/components/base/wheeled/#test-the-base):
-
-{{}}
-
-## Using the reservation system
-
-### Create a reservation
-
-{{< readfile "/static/include/try-viam/create-a-reservation.md" >}}
-
-### Access your rover rental
-
-Once your reservation starts and the system has configured your rover, click **TRY MY ROVER** from the [**TRY VIAM** page](https://app.viam.com/try) or, if you were queuing, click **Take Me to My Rover** in the confirmation email.
-
-{{}}
-
-{{}}
-
-### Limitations
-
-When using a rented Viam rover, adding [modules](/registry/) is disabled for security purposes.
-
-### Extend your reservation
-
-{{< readfile "/static/include/try-viam/extend-a-reservation.md" >}}
-
-### Cancel my reservation
-
-{{< readfile "/static/include/try-viam/cancel-a-reservation.md" >}}
-
-## Next steps
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{< /cards >}}
-
-## FAQ
-
-Try Viam allows you to try the Viam platform without setting up any hardware yourself.
-You can take over and play around with a Viam Rover in our robotics lab from anywhere in the world!
-
-### How do I make a reservation to take over a Viam Rover?
-
-{{< readfile "/static/include/try-viam/create-a-reservation.md" >}}
-
-### My machine had an error, a system crash, or is physically stuck
-
-1. Please notify Viam support on [our Community Discord](https://discord.gg/viam).
-2. Use the **Add Viam Support** button on your machine's Location page to give Viam Support access to your _location_.
- Refer to [Managing Locations and sub-locations](/cloud/locations/).
-
-### Can I extend my time?
-
-Sure!
-
-{{< readfile "/static/include/try-viam/extend-a-reservation.md" >}}
-
-### Can I cancel my reservation/session?
-
-Yes.
-
-{{< readfile "/static/include/try-viam/cancel-a-reservation.md" >}}
-
-### How can I reuse my borrowed rover?
-
-After using Try Viam, your machine config stays in your Viam account.
-You can access your machine page, write code to control it, and modify its config after your reservation time ends.
-
-When you next borrow a rover you can choose to configure it with a previous rover configuration from your account or create a new rover with the standard starting config.
-
-{{< alert title="Tip" color="tip" >}}
-You can also reuse your code for the rover for other machines that you configure with Viam in the future.
-{{< /alert >}}
-
-### What happens to my borrowed rover after the rental session?
-
-1. On session expiration, Viam removes the "live" status from the machine.
-2. Viam then removes your config from the physical machine in preparation for its next rental.
-3. The Rover Rental Location and the final config of all previous rental rovers remain visible to your organization.
- You can continue modifying the configurations as desired.
-
-### I accidentally deleted my machine
-
-Unfortunately, there is no recovery path for a deleted machine.
-If you delete your machine and have a current reservation, click **Cancel Reservation** and then request a new reservation.
-
-### Can I rename my machine or change the location?
-
-You can rename your machine or change the location.
-If you change the location, you must refresh the page.
-
-### Which organization does this machine e belong to?
-
-Your machine belongs to the [organization](/cloud/organizations/) you were in when you made the request.
-
-### Can I share this Location with a friend to work on the machine together?
-
-Sure, you can [invite other users to your organization](/cloud/locations/) to collaborate on your machine.
-As members of your organization, those users have full control of your machine.
-Another collaboration option is to use screen sharing in a Zoom or Webex session.
-
-### How many active rentals can I have?
-
-You can only borrow one rover at a time.
-You cannot join the queue for another reservation while you have an active rental session.
-If you would like to, you can [extend your reservation](/appendix/try-viam/reserve-a-rover/#can-i-extend-my-time).
-
-### I loved my experience - can I play around more?
-
-Yes! You can borrow the rover as many times as you’d like.
-Here are some tutorials which you can follow:
-
-- [Drive with the Viam SDK](/how-tos/drive-rover/)
-- [Detect a Color](/how-tos/detect-color/)
-
-If you want to get your own Viam Rover, [you can](https://viam.com/resources/rover).
-
-### Why can't I use the rover's microphone?
-
-For security reasons, Viam has disabled the microphone on rover rentals.
-The microphone on [Viam Rovers shipped to you](/appendix/try-viam/rover-resources/) functions normally.
-
-{{< snippet "social.md" >}}
diff --git a/docs/appendix/try-viam/rover-resources/_index.md b/docs/appendix/try-viam/rover-resources/_index.md
deleted file mode 100644
index ab27d19ee18..00000000000
--- a/docs/appendix/try-viam/rover-resources/_index.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-title: "Your own Viam Rover"
-linkTitle: "Your own Viam Rover"
-weight: 80
-simple_list: true
-type: docs
-tags: ["rover", "viam rover"]
-images: ["/appendix/try-viam/rover-resources/viam-rover/box-contents.jpg"]
-imageAlt: "A Viam Rover in a box"
-aliases:
- - "/viam-rover-resources/"
- - "/rover-resources/"
- - "/try-viam/rover-resources/"
- - "/get-started/try-viam/rover-resources/"
-description: If you want a convenient mobile base for robotics projects, order a Viam rover and set it up.
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-{{< alert title="Tip" color="tip" >}}
-If you want a convenient mobile {{% glossary_tooltip term_id="base" text="base"%}} for a variety of robotics projects, you can now [order your own Viam rover](https://www.viam.com/resources/rover).
-{{< /alert >}}
-
-
-
-
-
-
- The Viam Rover 2 arrives preassembled with two encoded motors with suspension, a webcam with a microphone unit, a 6 axis IMU, power management and more.
- It is primarily designed for use with a Raspberry Pi 4.
- Featuring an anodized aluminum chassis with expandable mounting features, the rover can comfortably navigate indoor environments with a 20 lb payload.
- You can customize your rover by mounting sensors , LiDAR , and arms .
-
-
-
-
-
-{{< alert title="Important" color="note" >}}
-You must purchase the following hardware separately:
-
-- A Raspberry Pi 4
-- Four 18650 batteries or RC-type battery (with charger)
-- A MicroSD card and an adapter/reader
-
-{{< /alert >}}
-
-### Next steps
diff --git a/docs/appendix/try-viam/rover-resources/rover-tutorial-1.md b/docs/appendix/try-viam/rover-resources/rover-tutorial-1.md
deleted file mode 100644
index 1a00e5d5751..00000000000
--- a/docs/appendix/try-viam/rover-resources/rover-tutorial-1.md
+++ /dev/null
@@ -1,296 +0,0 @@
----
-title: "Unbox and Set Up your Viam Rover 1"
-linkTitle: "Unbox and Set Up your Viam Rover 1"
-weight: 15
-type: "docs"
-tags: ["rover", "tutorial"]
-images: ["/appendix/try-viam/rover-resources/viam-rover/box-contents.jpg"]
-imageAlt: "A Viam Rover 1 in a box"
-description: "A list of the contents of the Viam Rover 1 kit, instructions for wiring your rover, and links for additional hardware."
-aliases:
- - "/rover-resources/rover-tutorial/"
- - "/try-viam/rover-resources/rover-tutorial/"
- - "/get-started/try-viam/rover-resources/rover-tutorial/"
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-{{% alert title="Tip" color="tip" %}}
-A new version of the Viam Rover is now available, the [Viam Rover 2](https://www.viam.com/resources/rover).
-If you have purchased a Viam Rover 2, follow [these instructions](/appendix/try-viam/rover-resources/rover-tutorial/) instead.
-{{% /alert %}}
-
-The [Viam Rover 1](https://www.viam.com/resources/rover) arrives preassembled with two encoded motors with suspension, a webcam with a microphone unit, and a 3D accelerometer module.
-
-{{< alert title="Important" color="note" >}}
-You must purchase the following hardware separately:
-
-- A Raspberry Pi 4
-- Four 18650 batteries (with charger)
-- A MicroSD card and an adapter/reader
- {{< /alert >}}
-
-{{}}
-
-This guide covers what's inside the kit, describes each component, provides instructions for wiring your rover, and includes links for additional hardware.
-
-## What's inside the kit
-
-1. One assembled Viam Rover 1.
-
- {{}}
-
-1. Four M2.5 screws for mounting your Raspberry Pi.
-
- {{}}
-
-1. Two spare stiffer suspension springs.
- You can swap them out with the springs that come with the rover if you need stiffer suspension for higher payload applications.
-
- {{}}
-
-1. Three different Allen wrenches (1.5 mm, 2 mm, and 2.5 mm) to unscrew the top and mount the Raspberry Pi.
-
- {{}}
-
-1. Ten female-to-female jumper wires.
- All of the wires' colors correspond to the included wiring diagram.
- Six are for the motor controller and four are for the accelerometer.
-
- {{}}
-
-All together, your kit looks like this:
-
-{{}}
-
-## Rover components
-
-### Dual drive motors with suspension and integrated motor encoders
-
-{{}}
-
-The motors come with integrated encoders.
-For information on encoders, see [Encoder Component](/components/encoder/).
-For more information on encoded DC motors, see [Encoded Motors](/components/motor/encoded-motor/).
-
-The kit also includes stiffer suspension springs that you can substitute for the ones on the rover.
-Generally, a stiff suspension helps with precise steering control.
-In contrast, a soft suspension allows the wheels to move up and down to absorb small bumps on the rover's path.
-
-### Motor driver
-
-{{}}
-
-The kit comes with an L298N driver dual H-Bridge DC motor driver.
-L298 is a high voltage and high current motor drive chip, and H-Bridge is typically used to control the rotating direction and speed of DC motors.
-
-### 720p webcam, with integrated microphone
-
-{{}}
-
-The webcam that comes with the kit is a standard USB camera device and the rover has a custom camera mount for it.
-For more information, see [Camera Component](/components/camera/).
-
-### 3D accelerometer
-
-{{}}
-
-The [ADXL345](https://github.com/viam-modules/analog-devices/) sensor manufactured by Analog Devices is a digital 3-axis accelerometer that can read acceleration up to ±16g for high-resolution (13-bit) measurements.
-You can access it with a SPI (3-wire or 4-wire) or I2 C digital interface.
-
-In Viam, you can configure it as a [movement sensor component](/components/movement-sensor/).
-
-### Buck converter
-
-{{}}
-
-A buck converter is a DC-to-DC power converter and you use it to step down voltage from its input to its output.
-The 5A mini560 step-down module has high conversion efficiency and low heat generation.
-
-### Toggle switch
-
-{{}}
-
-The toggle switch comes wired to the rover and you use it to turn the power on and off.
-
-### Battery pack
-
-{{}}
-
-The rover comes with a battery holder.
-You must purchase four 18650 batteries (and a charger) separately.
-The battery holder also has a female jack for an external DC power supply.
-
-#### Four 18650 batteries with a charger
-
-An 18650 battery is a lithium-ion rechargeable battery.
-We recommend the button-top type, though either button or flat top can work.
-We have used batteries approximately 67.5mm in length, but the battery housing includes a spring to accommodate most batteries of that approximate length.
-Any brand is suitable as long as you comply with the battery safety requirements.
-
-Check the [safety](#safety) section for more information.
-
-## Safety
-
-Read all instructions fully before using this product.
-
-This product is not a toy and is not suitable for children under 12.
-
-Switch the rover off when not in use.
-
-{{< alert title="Warning" color="warning" >}}
-Lithium-ion batteries may pose a flammable hazard.
-This product requires four 18650 lithium-ion batteries.
-Refer to the battery manufacturer’s operating instructions to ensure safe operation of the Viam Rover 1.
-Dispose of lithium-ion batteries per manufacturer instructions.
-{{< /alert >}}
-
-{{< alert title="Caution" color="caution" >}}
-Damage may occur to the Raspberry Pi and/or Viam Rover 1 if wired incorrectly.
-Refer to the manufacturer’s instructions for correct wiring.
-{{< /alert >}}
-
-Disclaimer: This product is preliminary and experimental in nature, and is provided "AS IS" without any representation or warranty of any kind.
-Viam does not make any promise or warranty that the product will meet your requirements or be error free.
-Some states do not allow the exclusion or disclaimer of implied warranties, so the above exclusions may not apply to you.
-
-## Setup
-
-This is the recommended order to assemble your rover:
-
-1. [Install Raspberry Pi OS on the microSD card.](#install-raspberry-pi-os)
-2. [Unscrew the top of the rover and screw the Pi to the base.](#attach-the-raspberry-pi-to-the-rover)
-3. [Connect the components.](#connect-the-wires)
-4. [Screw the top of the rover back on and turn the rover on.](#turn-the-rover-on)
-5. [Install `viam-server` and connect to the Viam app.](#connect-to-the-viam-app)
-
-### Install Raspberry Pi OS
-
-Install a 64-bit Raspberry Pi OS onto your Pi following our [Raspberry Pi installation guide](/installation/prepare/rpi-setup/). Follow all steps as listed, including the final step, [Enable communication protocols](/installation/prepare/rpi-setup/#enable-communication-protocols), which is required to enable the accelerometer on your rover.
-
-### Attach the Raspberry Pi to the Rover
-
-Once you have installed Raspberry Pi OS and `viam-server`, put your SD card in the slot on your Pi.
-To be able to attach the Raspberry Pi, unscrew the top of the rover with the biggest Allen key.
-Then use the smallest Allen key and the provided M2.5 screws to attach the Raspberry Pi to your rover in the designated spots.
-The following image shows the four mounting holes for the Pi, circled in red:
-
-{{}}
-
-{{< alert title="Tip" color="tip" >}}
-The rover's design allows you to reach the SD card slot at all times, so you can remove or reinsert the SD card without removing the top of the rover.
-{{< /alert >}}
-
-### Connect the wires
-
-{{< alert title="Tip" color="tip" >}}
-To make it easier for you to see which pin is which, you can print out this [Raspberry Pi Leaf](/appendix/try-viam/viam-raspberry-leaf-8.5x11.pdf) which has labels for the pins and carefully push it onto the pins or fold or cut it so you can hold it up to the Raspberry Pi pins.
-If you use A4 paper, use this [Raspberry Pi Leaf](/appendix/try-viam/viam-raspberry-leaf-A4.pdf) instead.
-
-If you are having trouble punching the pins through, you can pre-punch the pin holes with a pen.
-Only attach the paper when the Pi is unplugged.
-To make attaching the paper easier, use a credit card or a small screwdriver.
-{{< /alert >}}
-
-Wire your Pi to the buck converter, the acceleration tilt module, and the DC motor driver:
-
-![Closeup of the wiring diagram, showcasing the Pi, motor driver, accelerometer, and buck converter, wired according to the table below.](/appendix/try-viam/rover-resources/viam-rover/rover-wiring-diagram.png)
-
-The following pinout corresponds to the diagram:
-
-
-| Component | Component Pin | Raspberry Pi Pin | Wire Color |
-| --------- | --- | ---------------- | ---------- |
-| Buck Converter | GND | 39 | black |
-| Buck Converter | 5V | 4 | red |
-| Acceleration Tilt Module | GND | 34 | black |
-| Acceleration Tilt Module | 3.3V power | 17 | red |
-| Acceleration Tilt Module | SDA | 3 | maroon |
-| Acceleration Tilt Module | SCL | 5 | pink |
-| DC Motor Driver | En B | 22 | gray |
-| DC Motor Driver | In 4 | 18 | yellow |
-| DC Motor Driver | In 3 | 16 | white |
-| DC Motor Driver | In 2 | 13 | green |
-| DC Motor Driver | In 1 | 11 | blue |
-| DC Motor Driver | En A | 15 | purple |
-| DC Motor Driver | GND | 6 | black |
-| DC Motor Driver | Encoder Left | 35 | yellow |
-| DC Motor Driver | 3.3V power | 1 | red |
-| DC Motor Driver | Encoder Right | 37 | white |
-
-{{< alert title="Tip" color="tip" >}}
-En A and En B pins have little plastic jumpers that you need to remove before wiring.
-
-The motor driver on the Viam Rover 1 has 8 pins and 6 wires.
-You must wire it with the outside row pins:
-
-{{}}
-{{< /alert >}}
-
-Then connect the camera's USB cable to the Pi.
-
-![Wiring diagram showcasing the Pi, motors, driver, camera, and all other rover components.](/appendix/try-viam/rover-resources/viam-rover/rover-wiring-diagram-full.png)
-
-![the Pi, motors, driver, and all other rover components](/appendix/try-viam/rover-resources/viam-rover/rover-with-pi.jpg)
-
-### Turn the rover on
-
-Once you have wired up all the components, reattach the top of the rover and fasten the screws.
-Insert the batteries and turn the rover on.
-If the Pi has power, the lights on the Raspberry Pi will light up.
-
-### Connect to the Viam app
-
-While the Pi boots, go to the [Viam app](https://app.viam.com/robots) and add a new machine.
-Navigate to the **CONFIGURE** tab and find your machine's card.
-An alert will be present directing you to **Set up your machine part**.
-Click **View setup instructions** to open the setup instructions.
-Follow the instructions to install `viam-server` on **Linux / Aarch64**.
-
-{{< glossary_tooltip term_id="RDK" text="RDK" >}} type.
-`ssh` into your Pi and follow the setup instructions to install and run `viam-server` on the machine.
-
-To configure your rover so you can start driving it, [add the Viam Fragment to your Machine](/appendix/try-viam/rover-resources/rover-tutorial-fragments/).
-
-## Next steps
-
-Before you can use your Viam rover with the Viam platform you need to configure your rover:
-
-{{< cards >}}
-{{% card link="/appendix/try-viam/rover-resources/rover-tutorial-fragments/" %}}
-{{< /cards >}}
-
-After you have configured your rover, follow one of these tutorials:
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{% card link="/tutorials/services/navigate-with-rover-base/" %}}
-{{< /cards >}}
-
-### Rover build
-
-If you want to learn more about the rover, you can find the CAD files and bill-of-materials (BOM) on [GitHub](https://github.com/viamrobotics/Rover-VR1).
-
-### Extensibility
-
-Due to the aluminum chassis and its expandable mounting features, you can extend the Viam Rover 1.
-With it, you can customize your rover by mounting additional sensors, lidar, robot arms, or other components.
-The following are just a few ideas, but you can expand or modify the rover kit with any components you want:
-
-- For GPS navigation, we support NMEA (using serial and I2 C) and RTK.
- Make and model don't make a difference as long as you use these protocols.
- See [Movement Sensor Component](/components/movement-sensor/) for more information.
-- For [LiDAR laser range scanning](/services/slam/cartographer/), we recommend RPlidar (including A1, which is a sub-$100 LIDAR).
-- For robot arms, we tried the [Yahboom DOFBOT robotics arm](https://category.yahboom.net/products/dofbot-jetson_nano) with success.
-
-### Mount an RPlidar to the rover
-
-If you are mounting an RPlidar to your rover, be sure to position the RPlidar so that it faces forward in the direction of travel, facing in the same direction as the included webcam.
-For example, if you are using the [RPlidar A1](https://www.slamtec.com/en/Lidar/A1) model, mount it to the Rover so that the pointed end of the RPlidar mount housing points in the direction of the front of the Rover.
-This ensures that the generated {{< glossary_tooltip term_id="slam" text="SLAM" >}} map is oriented in the expected direction relative to the Rover, with the top of the generated map corresponding to the direction the RPlidar is facing when you initiate mapping.
-
-If you need a mount plate for your RPlidar A1 or A3 model, you can 3D print an adapter plate using the following:
-
-- [RPlidar A1 adapter STL](https://github.com/viamrobotics/Rover-VR1/blob/master/CAD/RPIidarA1_adapter.STL)
-- [RPlidar A3 adapter STL](https://github.com/viamrobotics/Rover-VR1/blob/master/CAD/RPIidarA3_adapter.STL)
diff --git a/docs/appendix/try-viam/rover-resources/rover-tutorial-fragments.md b/docs/appendix/try-viam/rover-resources/rover-tutorial-fragments.md
deleted file mode 100644
index 29b51f3d83d..00000000000
--- a/docs/appendix/try-viam/rover-resources/rover-tutorial-fragments.md
+++ /dev/null
@@ -1,213 +0,0 @@
----
-title: "Configure your Viam Rover with a Fragment"
-linkTitle: "Configure your Viam Rover"
-weight: 20
-type: "docs"
-tags: ["rover", "tutorial"]
-description: "Configure your rover by adding the Viam-provided configuration fragment to your rover."
-aliases:
- - "/try-viam/rover-resources/rover-tutorial-fragments/"
- - "/get-started/try-viam/rover-resources/rover-tutorial-fragments/"
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-To be able to drive your rover, you need to configure it.
-Viam provides reusable {{% glossary_tooltip term_id="fragment" text="*fragments*" %}} for [Viam rovers](https://www.viam.com/resources/rover).
-
-## Prerequisites
-
-- An assembled Viam Rover.
- For assembly instructions, see [Unbox and Set Up your Viam Rover](../rover-tutorial/)
-- The board is connected to the [Viam app](https://app.viam.com).
- To add your Pi to the Viam app, refer to [the rover setup guide](/appendix/try-viam/rover-resources/rover-tutorial/#control-your-rover-on-the-viam-app).
-
-## Add the fragment
-
-Follow the appropriate instructions for the model of rover and board you have:
-
-{{< tabs >}}
-{{% tab name="Viam Rover 2 (RPi 5)" %}}
-
-Navigate to your machine in the [Viam app](https://app.viam.com/robots).
-In the left-hand menu of the **CONFIGURE** tab, click the **+** (Create) icon next to the machine {{< glossary_tooltip term_id="part" text="part" >}} you want to add the fragment to.
-
-Select **Insert fragment**.
-Now, you can see the available fragments to add.
-Select [`ViamRover2-2024-rpi5`](https://app.viam.com/fragment/11d1059b-eaed-4ad8-9fd8-d60ad7386aa2/json) and click **Insert fragment** again to add the fragment to your machine configuration:
-
-{{}}
-
-Click **Save** in the upper right corner of the page to save your new configuration.
-
-The fragment adds the following components to your machine's JSON configuration:
-
-- A [board component](/components/board/) named `local` representing the Raspberry Pi.
-- Two [motors](/components/motor/gpio/) (`right` and `left`)
- - The configured pin numbers correspond to where the motor drivers are connected to the board.
-- Two [encoders](/components/encoder/single/), one for each motor
-- A wheeled [base](/components/base/), an abstraction that coordinates the movement of the right and left motors
- - Width between the wheel centers: 356 mm
- - Wheel circumference: 381 mm
- - Spin slip factor: 1
-- A webcam [camera](/components/camera/webcam/)
-- An [accelerometer](https://github.com/viam-modules/tdk-invensense/)
-- A [power sensor](https://github.com/viam-modules/texas-instruments/)
-
-For information about how to configure components yourself when you are not using the fragment, click the links on each component above.
-To see the configured pin numbers and other values specific to this fragment, [view it in the app](https://app.viam.com/fragment?id=7c413f24-691d-4ae6-a759-df3654cfe4c8).
-
-{{% /tab %}}
-{{% tab name="Viam Rover 2 (RPi 4)" %}}
-
-Navigate to your machine in the [Viam app](https://app.viam.com/robots).
-In the left-hand menu of the **CONFIGURE** tab, click the **+** (Create) icon next to the machine {{< glossary_tooltip term_id="part" text="part" >}} you want to add the fragment to.
-
-Select **Insert fragment**.
-Now, you can see the available fragments to add.
-Select [`ViamRover2-2024-rpi4-a`](https://app.viam.com/fragment/7c413f24-691d-4ae6-a759-df3654cfe4c8/json) and click **Insert fragment** again to add the fragment to your machine configuration:
-
-{{}}
-
-Click **Save** in the upper right corner of the page to save your new configuration.
-
-The fragment adds the following components to your machine's JSON configuration:
-
-- A [board component](/components/board/) named `local` representing the Raspberry Pi.
-- Two [motors](/components/motor/gpio/) (`right` and `left`)
- - The configured pin numbers correspond to where the motor drivers are connected to the board.
-- Two [encoders](/components/encoder/single/), one for each motor
-- A wheeled [base](/components/base/), an abstraction that coordinates the movement of the right and left motors
- - Width between the wheel centers: 356 mm
- - Wheel circumference: 381 mm
- - Spin slip factor: 1
-- A webcam [camera](/components/camera/webcam/)
-- An [accelerometer](https://github.com/viam-modules/tdk-invensense/)
-- A [power sensor](https://github.com/viam-modules/texas-instruments/)
-
-For information about how to configure components yourself when you are not using the fragment, click the links on each component above.
-To see the configured pin numbers and other values specific to this fragment, [view it in the app](https://app.viam.com/fragment?id=7c413f24-691d-4ae6-a759-df3654cfe4c8).
-
-{{% /tab %}}
-{{% tab name="Viam Rover 1 (RPi 4)" %}}
-
-Navigate to your machine in the [Viam app](https://app.viam.com/robots).
-In the left-hand menu of the **CONFIGURE** tab, click the **+** (Create) icon next to the machine {{< glossary_tooltip term_id="part" text="part" >}} you want to add the fragment to.
-
-Select **Insert fragment**.
-Now, you can see the available fragments to add.
-Select [`ViamRover202210b`](https://app.viam.com/fragment/3e8e0e1c-f515-4eac-8307-b6c9de7cfb84/json) and click **Insert fragment** again to add the fragment to your machine configuration:
-
-{{}}
-
-Click **Save** in the upper right corner of the page to save your configuration.
-
-The fragment adds the following components to your machine's JSON configuration:
-
-- A [board component](/components/board/) named `local` representing the Raspberry Pi
- - An I2 C bus for connection to the accelerometer.
-- Two [motors](/components/motor/gpio/) (`right` and `left`)
- - The configured pin numbers correspond to where the motor drivers are connected to the board.
-- Two [encoders](/components/encoder/single/), one for each motor
-- A wheeled [base](/components/base/), an abstraction that coordinates the movement of the right and left motors
- - Width between the wheel centers: 260 mm
- - Wheel circumference: 217 mm
- - Spin slip factor: 1
-- A webcam [camera](/components/camera/webcam/)
-- An [accelerometer](https://github.com/viam-modules/analog-devices/)
-
-{{% alert title="Info" color="info" %}}
-
-This particular motor driver has pins labeled "ENA" and "ENB."
-Typically, this would suggest that they should be configured as enable pins, but on this specific driver these function as PWM pins, so we configure them as such.
-
-{{% /alert %}}
-
-For information about how you would configure a component yourself if you weren't using the fragment, click the links on each component above.
-To see the configured pin numbers and other values specific to this fragment, [view it in the app](https://app.viam.com/fragment?id=3e8e0e1c-f515-4eac-8307-b6c9de7cfb84).
-
-{{% /tab %}}
-{{% tab name="Viam Rover 2 (Jetson Nano)" %}}
-
-Navigate to your machine in the [Viam app](https://app.viam.com/robots).
-In the left-hand menu of the **CONFIGURE** tab, click the **+** (Create) icon next to the machine {{< glossary_tooltip term_id="part" text="part" >}} you want to add the fragment to.
-
-Select **Insert fragment**.
-Now, you can see the available fragments to add.
-Select [`ViamRover2-2024-jetson-nano-a`](https://app.viam.com/fragment/747e1f43-309b-4311-b1d9-1dfca45bd097/json) and click **Insert fragment** again to add the fragment to your machine configuration.
-
-{{}}
-
-Click **Save** in the upper right corner of the page to save your new configuration.
-
-The fragment adds the following components to your machine's JSON configuration:
-
-- A [board component](/components/board/) named `local` representing the Jetson.
-- Two [motors](/components/motor/gpio/) (`right` and `left`)
- - The configured pin numbers correspond to where the motor drivers are connected to the board.
-- Two [encoders](/components/encoder/single/), one for each motor
-- A wheeled [base](/components/base/), an abstraction that coordinates the movement of the right and left motors
- - Width between the wheel centers: 356 mm
- - Wheel circumference: 381 mm
- - Spin slip factor: 1
-- A webcam [camera](/components/camera/webcam/)
-- An [accelerometer](https://github.com/viam-modules/tdk-invensense/)
-- A [power sensor](https://github.com/viam-modules/texas-instruments/)
-
-For information about how to configure components yourself when you are not using the fragment, click the links on each component above.
-To see the configured pin numbers and other values specific to this fragment, [view it in the app](https://app.viam.com/fragment?id=747e1f43-309b-4311-b1d9-1dfca45bd097).
-
-{{% /tab %}}
-{{% tab name="Viam Rover 2 (Jetson Orin Nano)" %}}
-
-Navigate to your machine in the [Viam app](https://app.viam.com/robots).
-In the left-hand menu of the **CONFIGURE** tab, click the **+** (Create) icon next to the machine {{< glossary_tooltip term_id="part" text="part" >}} you want to add the fragment to.
-
-Select **Insert fragment**.
-Now, you can see the available fragments to add.
-Select [`ViamRover2-2024-nano-orin-a`](https://app.viam.com/fragment/6208e890-8400-4197-bf0f-e8ddeca4e157/json) and click **Insert fragment** again to add the fragment to your machine configuration:
-
-{{}}
-
-Click **Save** in the upper right corner of the page to save your new configuration.
-
-The fragment adds the following components to your machine's JSON configuration:
-
-- A [board component](/components/board/) named `local` representing the Jetson.
-- Two [motors](/components/motor/gpio/) (`right` and `left`)
- - The configured pin numbers correspond to where the motor drivers are connected to the board.
-- Two [encoders](/components/encoder/single/), one for each motor
-- A wheeled [base](/components/base/), an abstraction that coordinates the movement of the right and left motors
- - Width between the wheel centers: 356 mm
- - Wheel circumference: 381 mm
- - Spin slip factor: 1
-- A webcam [camera](/components/camera/webcam/)
-- An [accelerometer](https://github.com/viam-modules/tdk-invensense/)
-- A [power sensor](https://github.com/viam-modules/texas-instruments/)
-
-For information about how to configure components yourself when you are not using the fragment, click the links on each component above.
-To see the configured pin numbers and other values specific to this fragment, [view it in the app](https://app.viam.com/fragment?id=6208e890-8400-4197-bf0f-e8ddeca4e157).
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## See the components on the configuration page
-
-Adding a fragment to your machine adds the configuration to your machine.
-The components and services included in the fragment will now appear as cards on the **CONFIGURE** tab, along with a card for your fragment:
-
-{{}}
-
-## Modify the config
-
-The fragment you added is read-only, but if you need to modify your rover's config you can [overwrite sections of the fragment](/how-tos/one-to-many/#modify-a-fragment).
-
-## Next steps
-
-After you have configured your rover, follow one of these tutorials:
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{% card link="/tutorials/services/navigate-with-rover-base/" %}}
-{{< /cards >}}
diff --git a/docs/appendix/try-viam/rover-resources/rover-tutorial/_index.md b/docs/appendix/try-viam/rover-resources/rover-tutorial/_index.md
deleted file mode 100644
index 0718c9ad673..00000000000
--- a/docs/appendix/try-viam/rover-resources/rover-tutorial/_index.md
+++ /dev/null
@@ -1,434 +0,0 @@
----
-title: "Unbox and Set Up your Viam Rover 2"
-linkTitle: "Unbox and Set Up your Viam Rover 2"
-weight: 10
-type: "docs"
-tags: ["rover", "tutorial"]
-images: ["/appendix/try-viam/rover-resources/viam-rover-2/box-contents.png"]
-imageAlt: "A Viam Rover 2 in a box"
-description: "A list of the contents of the Viam Rover 2 kit, instructions for wiring your rover, and links for additional hardware."
-no_list: true
-aliases:
- - "/get-started/try-viam/rover-resources/rover-tutorial"
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-{{% alert title="Tip" color="tip" %}}
-Another version of the Viam Rover was sold until January 2024.
-If you have purchased a Viam Rover 1, follow [these instructions](/appendix/try-viam/rover-resources/rover-tutorial-1/) instead.
-{{% /alert %}}
-
-The [Viam Rover 2](https://www.viam.com/resources/rover) arrives preassembled with two encoded motors with suspension, a webcam with a microphone unit, a 6 axis IMU, power management and more.
-It is primarily designed for use with a Raspberry Pi 4.
-You can use it with [other types of boards](#motherboard) with some additional setup.
-
-{{< alert title="Important" color="note" >}}
-You must purchase the following hardware separately:
-
-- A Raspberry Pi 4
-- Four 18650 batteries (with charger) or a RC type battery with dimensions no greater than 142mm x 47mm x 60mm (LxWxH) (with charger)
-- A MicroSD card and an adapter/reader
- {{< /alert >}}
-
-This guide covers what's inside the kit and provides instructions for [setting up your rover](#setup).
-
-{{< alert title="Note" color="note" >}}
-The design for this rover is open source.
-Find the details on [GitHub](https://github.com/viamrobotics/Viam-Rover-2).
-{{< /alert >}}
-
-## What's inside the kit
-
-1. One assembled Viam Rover.
-
- {{}}
-
-1. Four M2.5 screws for mounting your Raspberry Pi.
-
- {{}}
-
-1. Two spare stiffer suspension springs.
- You can swap them out with the springs that come with the rover if you need stiffer suspension for higher payload applications.
-
- {{}}
-
-1. Three different Allen wrenches (1.5 mm, 2 mm, and 2.5 mm) to unscrew the top and mount the Raspberry Pi.
-
- {{}}
-
-1. Four extenders to increase the height of the rover to house larger internal single-board computers (such as a Jetson Orin Nano).
-
- {{}}
-
-1. Ribbon cable for connecting the Raspberry Pi 4 to the Viam Rover 2 printed circuit board.
-
- {{}}
-
-All together, your kit looks like this:
-
-{{}}
-
-## Rover components
-
-### Dual drive motors with suspension and integrated motor encoders
-
-{{}}
-
-The motors come with integrated encoders.
-For information on encoders, see [Encoder Component](/components/encoder/).
-For more information on encoded DC motors, see [Encoded Motors](/components/motor/encoded-motor/).
-
-The kit also includes stiffer suspension springs that you can substitute for the ones on the rover.
-Generally, a stiff suspension helps with precise steering control.
-In contrast, a soft suspension allows the wheels to move up and down to absorb small bumps on the rover's path.
-
-### Motor driver
-
-{{}}
-
-The kit comes with an L298N driver dual H-Bridge DC motor driver.
-L298 is a high voltage and high current motor drive chip, and H-Bridge is typically used to control the rotating direction and speed of DC motors.
-
-### 720p webcam with integrated microphone
-
-{{}}
-
-The webcam that comes with the kit is a standard USB camera device and the rover has a custom camera mount for it.
-For more information, see [Camera Component](/components/camera/).
-
-### Motherboard
-
-{{}}
-
-The Viam Rover 2 uses a motherboard to which all ancillary components (buck converter, motor driver, IMU, INA219) are mounted.
-This board includes an auxiliary Raspberry Pi 4 pinout that dupont connectors can be connected to, an auxiliary power input terminal, 5V, 3.3V and Ground pins.
-
-The motherboard also incorporates hole patterns for the following alternative single-board computers:
-
-- Jetson Nano and Orin Nano
-- Rock Pi S
-- Raspberry Pi Zero 2W
-- Raspberry Pi 5
-- Orange Pi Zero 2
-
-See [Alternative Board Configurations](#alternative-board-configurations) for a diagram of this.
-Note that these boards require additional parts to be purchased and will not work out of the box with the Viam Rover 2.
-
-### 6DOF IMU
-
-{{}}
-
-The MPU6050 sensor is a digital 6-axis accelerometer or gyroscope that can read acceleration and angular velocity.
-You can access it through the I2C digital interface.
-You configure it with Viam on your machine as a [movement sensor](https://github.com/viam-modules/tdk-invensense/).
-
-### INA219 power monitoring unit
-
-{{}}
-
-The INA219 unit measures the voltage and current from the power supply.
-You can use it to measure battery life status and power consumption.
-It connects to the Raspberry Pi 4 through the I2C bus.
-You configure it with Viam on your machine as a [power sensor](https://github.com/viam-modules/texas-instruments/).
-
-### DC-DC 5V converter
-
-{{}}
-
-The DC-to-DC power converter, or, buck converter, steps down voltage from its input to its output.
-The OKY3502-4 has a USB output that can provide an additional 5V supply to auxiliary components.
-
-### Switch and low voltage cutoff circuit
-
-{{}}
-
-A slide switch is connected to the rover.
-Use it to turn the power on and off.
-
-{{}}
-
-Mounted above the switch is a low voltage cutoff circuit that can be set to turn off power to the rover when the input voltage drops below a pre-set threshold.
-This can be helpful for preventing batteries fully discharging which can damage lithium ion batteries.
-
-### Battery holders
-
-The Viam Rover 2 comes with two battery holder options.
-The rover nominally operates with four 18650 batteries, but a higher capacity RC-type battery can be mounted into the rear of the rover.
-
-{{% alert title="Note" color="note" %}}
-With either battery option, you must purchase a charger separately.
-{{% /alert %}}
-
-#### 18650 battery pack
-
-{{}}
-
-18650 batteries are the nominal power supply recommended for use with the Viam Rover 2.
-An 18650 battery is a lithium-ion rechargeable battery.
-We recommend the button-top type, though either button or flat top can work.
-Any brand is suitable as long as you comply with the battery safety requirements.
-
-#### Mount for RC-type battery
-
-{{}}
-
-You can mount a larger capacity RC-type battery into the rover.
-You must wire the appropriate connector into the switch circuit.
-
-RC-batteries are lithium-ion rechargeable batteries.
-Caution should always be taken when using such batteries, always comply with the battery safety requirements.
-Check the [safety](#safety) section for more information.
-
-## Safety
-
-Read all instructions fully before using this product.
-
-This product is not a toy and is not suitable for children under 12.
-
-Switch the rover off when not in use.
-
-{{< alert title="Warning" color="warning" >}}
-Lithium-ion batteries may pose a flammable hazard.
-This product requires four 18650 lithium-ion batteries OR an RC-type battery.
-DO NOT connect multiple power sources simultaneously.
-Refer to the battery manufacturer’s operating instructions to ensure safe operation of the Viam Rover.
-Dispose of lithium-ion batteries per manufacturer instructions.
-{{< /alert >}}
-
-{{< alert title="Caution" color="caution" >}}
-Damage may occur to the Raspberry Pi and/or Viam Rover if wired incorrectly.
-Refer to the manufacturer’s instructions for correct wiring.
-{{< /alert >}}
-
-Disclaimer: This product is preliminary and experimental in nature, and is provided "AS IS" without any representation or warranty of any kind.
-Viam does not make any promise or warranty that the product will meet your requirements or be error free.
-Some states do not allow the exclusion or disclaimer of implied warranties, so the above exclusions may not apply to you.
-
-## Setup
-
-{{% alert title="Important" color="tip" %}}
-If you wish to use a Jetson Nano or Jetson Orin Nano, follow [this guide](./jetson-rover-setup/) instead.
-{{% /alert %}}
-
-### Install Raspberry Pi OS
-
-{{% alert title="Tip" color="tip" %}}
-If you are using another board, you can skip this step.
-{{% /alert %}}
-
-Install a 64-bit Raspberry Pi OS onto your Pi following our [Raspberry Pi installation guide](/installation/prepare/rpi-setup/).
-Follow all steps as listed, including the final step, [Enable communication protocols](/installation/prepare/rpi-setup/#enable-communication-protocols), which is required to enable [the accelerometer](#6dof-imu) on your rover.
-Once you have installed Raspberry Pi OS and `viam-server`, put your SD card in the slot on your Pi.
-
-### Add the power supply
-
-You can power the Viam Rover 2 using 18650 batteries or RC-type batteries.
-18650 batteries are the nominal power supply recommended for use with the rover, but RC-type batteries are higher capacity.
-
-{{< tabs >}}
-{{% tab name="18650 Batteries" %}}
-
-{{}}
-
-The Viam Rover 2 arrives with the 18650 battery pack wired into the power input terminal block.
-The battery pack works with batteries 67.5 mm in length, but the battery housing includes a spring to accommodate most batteries of that approximate length.
-
-- Turn the rover over so that you can see the battery housing.
-- Place four 18650 batteries (taking care to ensure correct polarity orientation) inside the battery pack to provide power to the rover, which can be turned on and off through the power switch.
-
-{{% alert title="Tip" color="tip" %}}
-Ensure that the batteries are making contact with the terminals inside the battery pack.
-Some shorter batteries might need to be pushed along to ensure that contact is being made.
-{{% /alert %}}
-
-{{% /tab %}}
-{{% tab name="RC-Type Battery" %}}
-
-{{}}
-
-For users who prefer a higher capacity battery option, the Viam Rover 2 can house RC-type batteries that do not exceed the following dimensions:- 142mm x 47mm x 60mm (LxWxH).
-Using a RC-type battery requires some re-wiring of the Viam Rover 2 which should only be undertaken by users who are comfortable handling electrical assemblies.
-Improper configuration of the power supply could result in damage to the battery and poses a fire hazard.
-A 4-S RC-type battery is recommended (14.8V).
-We make no recommendations regarding specific RC battery brands.
-
-To change the rover's power supply configuration for a RC-battery:
-
-1. Ensure the 18650 battery holder contains no batteries
-2. Unscrew the 18650 battery leads from the power input terminal.
- Move these wires out of the way.
-3. Screw in a power lead that matches that of the selected battery.
- Common options include: EC-type connectors, XT-connectors or T-plugs.
- Ensure lead is long enough to reach the battery.
-4. Ensure that the polarity is correct (the polarity is marked on the PCB).
- **Failure to do so may result in permanent damage to your Viam Rover 2 when powered on.**
-5. Ensure that there is no short between the terminals (for example, due to a stray strand of wire). Use a multimeter to check continuity across the terminal to verify this.
- Failure to do so may result in damage to the battery and may pose a fire hazard.
-6. Place the battery in the receptacle between the two caster wheels:
- {{}}
- Connect the battery to the lead that is wired into the power input terminal.
- Although not necessary, slots in the bottom plate of the rover allow a velcro strap to be placed around the battery to secure it.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-{{% alert title="Caution" color="caution" %}}
-DO NOT connect both power supplies at the same time.
-These suggestions are alternative configurations.
-Connecting multiple batteries together may result in damage to the batteries and rover, it may also pose a fire hazard.
-{{% /alert %}}
-
-### Configure the low voltage cutoff circuit
-
-Now that you have connected your power supply to your rover, you need to configure the [low voltage cutoff circuit](#switch-and-low-voltage-cutoff-circuit).
-You must configure two settings:
-
-1. The low voltage cutoff
-2. The reconnect voltage
-
-The reconnect voltage is the voltage increment above the cutoff point that is needed for the power to reconnect.
-For both 18650 and RC-type battery inputs, the nominal voltage is 14.8V, so you should set the low voltage threshold to 14.7.
-You can adjust this value if using a battery that has an alternative nominal voltage.
-
-To set the low voltage cutoff and reconnect voltage:
-
-1. Turn on the circuit using the switch.
- The LED indicator should indicate a current voltage level of 14.8-16V depending on the battery charge status:
-
- {{}}
-
-2. Hold down the left button until the LED display starts flashing with the low cutoff value.
- The factory default low cutoff value is 12V.
-3. Use the left (+) and right (-) buttons to set the voltage to 14.7V (or whatever you want the cutoff to be).
-4. Wait for the indicator to stop flashing.
-5. Hold down the right button until the LED display starts flashing with the reconnect voltage value. The factory default reconnect voltage is 2.0V.
-6. Use the left (+) and right (-) buttons to set the reconnect voltage to 0.2V.
-7. Wait for the indicator to stop flashing.
-
-Your voltage cutoff circuit is now configured.
-When the voltage drops below 14.8V (or reaches the cutoff point you chose), a relay will disconnect the motherboard.
-A minimum voltage of 14.9V will be needed to reconnect the power (that is, after charging the batteries).
-
-### Connect the ribbon cable, Pi, and camera
-
-{{% alert title="Tip" color="tip" %}}
-If you are using another board, follow the instructions in [Alternative board configurations](#alternative-board-configurations) in place of this step.
-{{% /alert %}}
-
-To be able to attach the Raspberry Pi, unscrew the top of the rover with the biggest Allen key.
-Then use the smallest Allen key and the provided M2.5 screws to attach the Raspberry Pi to your rover through the standoffs on the motherboard.
-The Raspberry Pi 4 should be mounted such that the USB ports are to the right, as viewed from above.
-
-Use the ribbon cable to connect the Raspberry Pi 4 to the motherboard.
-The ribbon cable comes connected to the motherboard out of the box, wrap it over the top of the Raspberry Pi 4 and connect with the GPIO pins as shown:
-
-{{}}
-
-{{}}
-
-Also, connect the webcam's USB lead to any USB port on your Pi.
-
-Assuming you are using a Raspberry Pi 4, you can skip the following section and move to [Screw the top plate back on and switch the rover on](#screw-the-top-plate-back-on-and-switch-the-rover-on).
-
-### Alternative board configurations
-
-This guide assumes you are using a Raspberry Pi 4, but you can use [different boards](#motherboard) with your Viam Rover 2 with some modifications while attaching the boards.
-
-{{% alert title="Tip" color="tip" %}}
-If you are using a Jetson board, you should be following [this guide](./jetson-rover-setup/).
-{{% /alert %}}
-
-Reference the appropriate alternative hole pattern provided on the motherboard:
-
-{{}}
-
-Detach the motherboard, unscrew the standoffs, and move them to the correct holes.
-Then, use the smallest Allen key and the provided M2.5 screws to attach your board to your rover through these standoffs.
-
-{{< expand "Raspberry Pi Zero 2W" >}}
-If you are using a Raspberry Pi Zero 2W, you should be able to connect your ribbon cable straight to the board.
-If not, you will have to take off the ribbon cable and use [dupont connectors](https://www.amazon.com/IWISS-1550PCS-Connector-Headers-Balancer/dp/B08X6C7PZM/) to wire a connection from the motherboard to the single-board computer's GPIO pins.
-{{< /expand >}}
-
-{{< expand "Raspberry Pi 5" >}}
-If you are using a Raspberry Pi 5, use the same screw placements as for the Raspberry Pi 4.
-The hardware setup is the same.
-The only difference is in the [configuration](/appendix/try-viam/rover-resources/rover-tutorial-fragments/).
-{{< /expand >}}
-
-Then connect the webcam's USB lead to any USB port on your board.
-
-If you need to increase the height of your rover to accommodate your board being larger than a Raspberry Pi 4, place the [height extender standoffs](#whats-inside-the-kit) now.
-
-### Screw the top plate back on and switch the rover on
-
-Screw the top plate back on with the biggest Allen key and use the power switch to turn the rover on.
-Wait a second for the low voltage cutoff relay to trip and provide power to the rover motherboard.
-If the Pi has power, the lights on the Raspberry Pi will light up.
-
-### Enable I2 C on your Pi
-
-Enable the I2 C protocol on your Pi to get readings from the power sensor when controlling your rover.
-
-1. SSH into your Pi.
- Launch the configuration tool by running the following command:
-
- ```sh {class="command-line" data-prompt="$"}
- sudo raspi-config
- ```
-
-2. Use your keyboard to select **Interface Options**, and press return.
- Select **I2C** enabled.
-
-3. Then, to apply the changes, restart your Raspberry Pi if it hasn't already prompted you to do so.
-
- ```sh {class="command-line" data-prompt="$"}
- sudo reboot
- ```
-
-### Control your rover on the Viam app
-
-If you followed the instructions in the [Pi installation guide](/installation/prepare/rpi-setup/), you should have already made an account on the [Viam app](https://app.viam.com), installed `viam-server` on the board, and added a new machine.
-
-If not, add a new machine in the [Viam app](https://app.viam.com) and follow the {{< glossary_tooltip term_id="setup" text="setup instructions" >}} until your machine is connected.
-
-To configure your rover so you can start driving it, [add a Viam Rover 2 Fragment to your machine](/appendix/try-viam/rover-resources/rover-tutorial-fragments/).
-
-## Next steps
-
-Before you can use your Viam rover with the Viam platform you need to configure your rover:
-
-{{< cards >}}
-{{% card link="/appendix/try-viam/rover-resources/rover-tutorial-fragments/" %}}
-{{< /cards >}}
-
-After you have configured your rover, follow one of these tutorials:
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{% card link="/tutorials/services/navigate-with-rover-base/" %}}
-{{< /cards >}}
-
-### Extensibility
-
-Due to the aluminum chassis and its expandable mounting features, you can extend the Viam Rover.
-With it, you can customize your rover by mounting additional sensors, lidar, robot arms, or other components.
-The following are just a few ideas, but you can expand or modify the rover kit with any components you want:
-
-- For GPS navigation, we support NMEA (using serial and I2 C) and RTK.
- Make and model don't make a difference as long as you use these protocols.
- See [Movement Sensor Component](/components/movement-sensor/) for more information.
-- For [LiDAR laser range scanning](/services/slam/cartographer/), we recommend RPlidar (including A1, which is a sub-$100 LIDAR).
-- For robot arms, we tried the [Yahboom DOFBOT robotics arm](https://category.yahboom.net/products/dofbot-jetson_nano) with success.
-
-### Mount an RPlidar to the rover
-
-If you are mounting an RPlidar to your rover, be sure to position the RPlidar so that it faces forward in the direction of travel, facing in the same direction as the included webcam.
-For example, if you are using the [RPlidar A1](https://www.slamtec.com/en/Lidar/A1) model, mount it to the Rover so that the pointed end of the RPlidar mount housing points in the direction of the front of the Rover.
-This ensures that the generated {{< glossary_tooltip term_id="slam" text="SLAM" >}} map is oriented in the expected direction relative to the Rover, with the top of the generated map corresponding to the direction the RPlidar is facing when you initiate mapping.
-
-If you need a mount plate for your RPlidar A1 model, you can 3D print an adapter plate using the following:
-
-- [RPlidar A1 adapter STL](https://github.com/viamrobotics/Viam-Rover-2/blob/main/CAD/RPIidar_adapter_v2.STL)
diff --git a/docs/appendix/try-viam/rover-resources/rover-tutorial/jetson-rover-setup.md b/docs/appendix/try-viam/rover-resources/rover-tutorial/jetson-rover-setup.md
deleted file mode 100644
index 189e228db6e..00000000000
--- a/docs/appendix/try-viam/rover-resources/rover-tutorial/jetson-rover-setup.md
+++ /dev/null
@@ -1,168 +0,0 @@
----
-title: "Set up your Rover 2 with a Jetson"
-linkTitle: "Set Up your Rover 2 with a Jetson"
-weight: 10
-type: "docs"
-tags: ["rover", "tutorial"]
-images: ["/appendix/try-viam/rover-resources/viam-rover-2/box-contents.png"]
-imageAlt: "A Viam Rover 2 in a box"
-description: "Instructions for setting up a Viam Rover 2 with a Jetson Nano or Jetson Orin Nano."
-aliases:
- - /get-started/try-viam/rover-resources/rover-tutorial/jetson-rover-setup/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The [Viam Rover 2](https://www.viam.com/resources/rover) arrives preassembled with two encoded motors with suspension, a webcam with a microphone unit, a 6 axis IMU, power management and more.
-It is primarily designed for use with a Raspberry Pi 4, but you can use it with a larger Jetson board with some additional setup.
-
-This guide provides supplemental instructions for setting up your rover with a Jetson Nano.
-
-{{< tabs >}}
-{{% tab name="Jetson Nano" %}}
-
-{{% alert title="Important" color="tip" %}}
-You must purchase the following hardware separately:
-
-- Four 18650 batteries (with charger) or a RC type battery with dimensions no greater than 142mm x 47mm x 60mm (LxWxH) (with charger)
-- A MicroSD card and an adapter/reader
-- A longer 40 pin ribbon cable: female-female
-- 4 25 mm female-female standoffs
-- WiFi board: either [a board that directly interfaces with the Nano](https://www.amazon.com/Wireless-AC8265-Wireless-Developer-Support-Bluetooth/dp/B07V9B5C6M/) or [a USB based device](https://www.amazon.com/wireless-USB-WiFi-Adapter-PC/dp/B07P5PRK7J/)
-- Electrical tape
-
-The ribbon cable you purchase must meet these requirements:
-
-- Female-female
-- 2.54 mm spacing
-- Both connectors facing the same direction
-- Pin continuity order to be 12-12
-- Recommended length ~200 mm
- {{% /alert %}}
-
-## Safety
-
-Read all instructions fully before using this product.
-
-This product is not a toy and is not suitable for children under 12.
-
-Switch the rover off when not in use.
-
-{{< alert title="Warning" color="warning" >}}
-Lithium-ion batteries may pose a flammable hazard.
-This product requires four 18650 lithium-ion batteries OR an RC-type battery.
-DO NOT connect multiple power sources simultaneously.
-Refer to the battery manufacturer’s operating instructions to ensure safe operation of the Viam Rover.
-Dispose of lithium-ion batteries per manufacturer instructions.
-{{< /alert >}}
-
-{{< alert title="Caution" color="caution" >}}
-Damage may occur to the board and/or Viam Rover if wired incorrectly.
-Refer to the manufacturer’s instructions for correct wiring.
-{{< /alert >}}
-
-Disclaimer: This product is preliminary and experimental in nature, and is provided "AS IS" without any representation or warranty of any kind.
-Viam does not make any promise or warranty that the product will meet your requirements or be error free.
-Some states do not allow the exclusion or disclaimer of implied warranties, so the above exclusions may not apply to you.
-
-## Setup
-
-1. Install the WiFi board/device on the Nano. Follow the manufacturer's instructions to do so.
-2. Power the Jetson Nano with a power supply and [prepare the device and install `viam-server`](/installation/prepare/jetson-nano-setup/).
-3. Switch back to the main guide and complete these two steps:
- [Add the power supply](/appendix/try-viam/rover-resources/rover-tutorial/#add-the-power-supply) and [Configure the low-voltage cutoff circuit](/appendix/try-viam/rover-resources/rover-tutorial/#configure-the-low-voltage-cutoff-circuit).
-4. Unscrew the top of the rover with the biggest Allen key.
-5. Take the [height extenders](/appendix/try-viam/rover-resources/rover-tutorial/#whats-inside-the-kit) provided in your kit.
- Apply them to the rover chassis posts.
-6. Unscrew the standoffs in the motherboard and relocate them to the Jetson board hole pattern: {{}}
-7. Connect the ribbon cable to the motherboard and Jetson Nano.
- The ribbon cable needs to be routed towards the front of the rover and flip back to the pins on the Jetson Nano, as pictured: {{}}
-8. Use the smallest Allen key and the provided M2.5 screws to attach your board to your rover through these standoffs. The USB ports should be facing the left-hand side of the rover, when viewed from above: {{}}
-9. Connect the webcam's USB lead to any USB port on your board.
-10. Flip the power switch to turn your rover on.
-
-{{% /tab %}}
-{{% tab name="Jetson Orin Nano" %}}
-
-{{% alert title="Important" color="tip" %}}
-You must purchase the following hardware separately:
-
-- A 4S RC type battery with dimensions no greater than 142mm x 47mm x 60mm (LxWxH) (with charger)
-- A MicroSD card and an adapter/reader
-- A longer ribbon cable: female-female (ensure that the contacts are correct)
-- 4 25 mm female-female standoffs
-- WiFi board: either [a board that directly interfaces with the Nano](https://www.amazon.com/Wireless-AC8265-Wireless-Developer-Support-Bluetooth/dp/B07V9B5C6M/) or [a USB based device](https://www.amazon.com/wireless-USB-WiFi-Adapter-PC/dp/B07P5PRK7J/)
-- A wired DC jack connector with the same polarity as the Jetson Orin Nano power input
-- Electrical tape
-
-The ribbon cable you purchase must meet these requirements:
-
-- Female-female
-- 2.54 mm spacing
-- Both connectors facing the same direction
-- Pin continuity order to be 12-12
-- Recommended length ~200 mm
- {{% /alert %}}
-
-## Safety
-
-Read all instructions fully before using this product.
-
-This product is not a toy and is not suitable for children under 12.
-
-Switch the rover off when not in use.
-
-{{< alert title="Warning" color="warning" >}}
-Lithium-ion batteries may pose a flammable hazard.
-This product requires four 18650 lithium-ion batteries OR an RC-type battery.
-DO NOT connect multiple power sources simultaneously.
-Refer to the battery manufacturer’s operating instructions to ensure safe operation of the Viam Rover.
-Dispose of lithium-ion batteries per manufacturer instructions.
-{{< /alert >}}
-
-{{< alert title="Caution" color="caution" >}}
-Damage may occur to the Jetson Orin Nano and/or Viam Rover if wired incorrectly.
-Refer to the manufacturer’s instructions for correct wiring.
-{{< /alert >}}
-
-Disclaimer: This product is preliminary and experimental in nature, and is provided "AS IS" without any representation or warranty of any kind.
-Viam does not make any promise or warranty that the product will meet your requirements or be error free.
-Some states do not allow the exclusion or disclaimer of implied warranties, so the above exclusions may not apply to you.
-
-## Setup
-
-1. Power the Jetson Orin Nano with a power supply and [prepare the device and install `viam-server`](/installation/prepare/jetson-nano-setup/).
-2. Switch back to the main guide and complete these two steps:
- [Add the power supply](/appendix/try-viam/rover-resources/rover-tutorial/#add-the-power-supply) and [Configure the low-voltage cutoff circuit](/appendix/try-viam/rover-resources/rover-tutorial/#configure-the-low-voltage-cutoff-circuit).
-3. Unscrew the top of the rover with the biggest Allen key.
-4. Take the [height extenders](/appendix/try-viam/rover-resources/rover-tutorial/#whats-inside-the-kit) provided in your kit.
- Apply them to the rover chassis posts.
-5. Unscrew the standoffs in the motherboard and relocate them to the Jetson board hole pattern: {{}}
-6. **IMPORTANT:** Disconnect the 5V buck converter. Unlike other boards, the Jetson Orin Nano requires a 7-20V input, which means that the board must be powered directly from the battery.
- **Before commencing, ensure that everything is powered off.**
- It is recommended that you clip the buck converter wires completely and place electrical tape over the exposed contacts, as pictured:
- {{}}
- {{}}
-7. Connect the ribbon cable to the motherboard and Jetson Orin Nano.
-8. Use the smallest Allen key and the provided M2.5 screws to attach your board to your rover through these standoffs. The USB ports should be facing the left-hand side of the rover, when viewed from above: {{}}
-9. Connect a WiFi adapter or a board that directly interfaces to the underside of the Jetson Orin Nano.
-10. Connect the webcam's USB lead to any USB port on your board.
-11. Flip the power switch to turn your rover on.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Control your rover on the Viam app
-
-If you followed the instructions in the [Jetson installation guide](/installation/prepare/jetson-nano-setup/), you should have already made an account on the [Viam app](https://app.viam.com), installed `viam-server` on the board, and added a new machine.
-
-To configure your rover so you can start driving it, [add a Viam Rover 2 Fragment to your machine](/appendix/try-viam/rover-resources/rover-tutorial-fragments/).
-
-## Next steps
-
-After adding the appropriate fragment, follow one of these tutorials with your borrowed or owned rover:
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{< /cards >}}
diff --git a/docs/appendix/try-viam/try-viam-tutorial.md b/docs/appendix/try-viam/try-viam-tutorial.md
deleted file mode 100644
index 80d34339c29..00000000000
--- a/docs/appendix/try-viam/try-viam-tutorial.md
+++ /dev/null
@@ -1,235 +0,0 @@
----
-title: "Control A Rented Viam Rover"
-linkTitle: "Control A Rented Viam Rover"
-weight: 39
-type: "docs"
-description: "Remotely control a Viam Rover located on-site at Viam in New York."
-images: ["/appendix/try-viam/rover-resources/viam-rover/rover-front.jpg"]
-imageAlt: "The front of the assembled Viam Rover"
-tags: ["try viam", "app"]
-no_list: true
-draft: true
-aliases:
- - "/try-viam/try-viam-tutorial/"
- - "/get-started/try-viam/try-viam-tutorial/"
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-_Try Viam_ is a way to try out the Viam platform without setting up any hardware yourself.
-You can take over a Viam Rover in our robotics lab to play around!
-
-The rental rover is made up of a chassis with a Raspberry Pi 4B single-board computer, two motors, encoders, and a camera.
-The Try Viam area also has an overhead camera to provide a view of the rental rover, allowing you to view its movements in real time.
-
-Watch this tutorial video for a walkthrough of Try Viam, including [how to reserve a Viam Rover](/appendix/try-viam/reserve-a-rover/#using-the-reservation-system), [navigate the Viam platform](/fleet/), and [drive the rover](#control-tab):
-
-{{}}
-
-## **CONTROL** tab
-
-Click on the rover name at the top to go to the rental rover's **CONTROL** tab where you can drive the machine and interact with each of the machine's components.
-
-At the top of the page you can see the randomly assigned name of the rover, the host, and the IP address.
-
-![The top banner of a Try Viam rover machine page. The randomly generated name for this rover is 'silent-forest'](appendix/try-viam/try-viam/bannerinfo.png)
-
-The **CONTROL** tab contains panels for each of the rover's components:
-
-- the base,
-- the left and right motors,
-- the web game pad,
-- the board, and
-- two cameras.
-
-The order of these components may vary.
-
-{{}}
-
-### Base control
-
-The [base component](/components/base/) is the platform that the other parts of a mobile machine attach to.
-
-Click the `viam_base` component to expand the base control pane to reveal the camera feed and driving interfaces.
-
-![The viam_base component panel on the CONTROL tab. The Keyboard Disabled toggle is grey and not yet enabled.](appendix/try-viam/try-viam/initial-base-control.png)
-
-#### Camera views
-
-In the `viam_base` component panel, select the `cam` for the front-facing camera and the `overhead-cam:overheadcam` for an overhead view of your rover.
-We recommend enabling both cameras so you can have a better sense of what's happening in the space.
-
-![The viam_base component panel showing both the 'cam' and 'overheadcam' camera feeds enabled.](appendix/try-viam/try-viam/enable-both-cameras.png)
-
-You can also view and control the camera streams from the individual camera components on the [**CONTROL** page](/cloud/machines/#control).
-
-#### Movement control
-
-To move your rover, click on **viam_base**.
-You can use the **W**, **A**, **S**, and **D** buttons to move forward, turn left, move backwards, and turn right.
-
-If you enable the keyboard toggle, you can also control the rover's movement with the **W**, **A**, **S**, and **D** keys and the arrow keys on your keyboard.
-
-{{% alert title="Tip" color="tip" %}}
-
-Each time you show or hide a camera, **Keyboard Enabled** automatically toggles to **Keyboard Disabled**.
-
-If you change your camera configurations, you must re-enable your keyboard control to control your rover again.
-This behavior is for safety purposes.
-
-{{% /alert %}}
-
-##### Discrete movement control
-
-If you go from the from **Keyboard** to the **Discrete** tab, you can choose between:
-
-- Different movement modes: `Straight` or `Spin`
-- Different movement types: `Continuous` or `Discrete`
-
- In _continuous_ movement mode you can set a speed at which the rover will move indefinitely in the specified direction.
- In _discrete_ movement mode you can set a speed at which to move and a distance to cover before stopping.
-
-- Directions: `Forwards` and `Backwards`.
-
-![The DISCRETE tab of the viam_base component panel. Movement mode, movement type, and direction mode toggles are shown as well as a speed (mm/sec) field and a distance field (the latter of which is greyed out because the movement type toggle is set to continuous instead of discrete movement).](appendix/try-viam/try-viam/discrete.png)
-
-### Camera control
-
-While you can view the camera streams [from the base component panel](#camera-views), you can access more features on each individual [camera component](/components/camera/) panel. In these panels, you can:
-
-- Set the refresh frequency
-- Export screenshots
-- View point cloud data (for machines with depth cameras)
-
-**cam Stream**:
-
-![The front-facing camera panel (for the component named 'cam').](appendix/try-viam/try-viam/cam-panel.png)
-
-**overhead-cam:overheadcam Stream**:
-
-![The overhead camera panel (for the component named 'overhead-cam').](appendix/try-viam/try-viam/overhead-cam-panel.png)
-
-### Motor control
-
-The [motor components](/components/motor/) enable you to move the base.
-The motors are named `left` and `right`, corresponding to their location on the rover base.
-Their initial state is **Idle**.
-You can click on each motor panel and make the motor **RUN** or **STOP**.
-
-![The left and right motor panels on the CONTROL tab.](appendix/try-viam/try-viam/left-right-panels.png)
-
-Run each motor at a different power level to go faster or slower, and toggle rotation directions to go forwards or backwards.
-You can also see their current positions (based on encoder readings) in real time:
-
-![The left motor running at 20% power and forwards and right motor running at 80% power and backwards.](appendix/try-viam/try-viam/motors-running.png)
-
-{{}}
-
-#### Board control
-
-The [board component](/components/board/) is the signal wire hub of a machine which allows you to control the states of individual GPIO pins on the board.
-
-For the Viam Rover, the board component is named `local` and controls a Raspberry Pi on the Viam Rover.
-With it, you can control the states of individual GPIO pins on the board.
-
-![The board panel in the CONTROL tab, including fields to get and set GPIO pin states.](appendix/try-viam/try-viam/board-panel.png)
-
-#### Web gamepad control
-
-The [web gamepad component](/components/input-controller/webgamepad/) is disabled by default, but if you have a compatible gamepad, you can enable the **Enabled** toggle.
-
-## Learn about machine configuration
-
-On the Viam app, navigate to the **Components** subtab, under **CONFIGURE**.
-There you can view the configuration for each component in the machine: attributes, component dependencies, pin assignments, and more.
-
-![The CONFIG tab in Builder mode (as opposed to Raw JSON). The board component panel and right motor panel are visible.](appendix/try-viam/try-viam/config-builder.png)
-
-### Board configuration
-
-The [board component](/components/board/) is the signal wire hub of a machine.
-Configuring a board component allows you to control the states of individual GPIO pins to command the electrical signals sent through and received by the board.
-For the Viam Rover, the board component is a Raspberry Pi with **Name** `local`, **Type** `board`, and **Model** `viam:raspberry-pi:rpi`.
-
-### Encoder configuration
-
-An [encoder](/components/encoder/) is a device that is used to sense angular position, direction and/or speed of rotation.
-In this case, the encoders on the left and right motors are `Lenc` and `Renc` and configure the pins to `le` and `re`.
-
-{{< alert title="Important" color="note" >}}
-When configuring encoded motors for your own robot, you must configure the encoders before the motors because the motors depend on the encoders.
-{{< /alert >}}
-
-![The right encoder config panel with the board attribute set to 'local' and the pins struct containing 'i' set to 're'.](appendix/try-viam/try-viam/right-encoder.png)
-
-### Motor configuration
-
-Both [motors](/components/motor/) on this rover use the model `gpio` which is the model for basic DC motors that are connected to and controlled by the configured board.
-
-The attributes section lists the board the motor is wired to, and since the rover's motors are encoded the user interface also shows the encoded motor attributes: the encoder name, motor ramp rate limit, encoder ticks per rotation, and max RPM limit.
-
-You can click **{}** (Switch to Advanced) on the top right of the component's card to view the attributes field in raw JSON format.
-The attributes pane contains the current JSON configuration for this component.
-Click **Switch to Builder** to return to the default graphical user interface.
-
-### Base configuration
-
-The [base component](/components/base/) is the platform that the other parts of a mobile robot attach to.
-By configuring a base component, the individual components are organized to produce coordinated movement and you gain an interface to control the movement of the whole physical base of the robot without needing to send separate commands to individual motors.
-The base's type is `base` and its model is `wheeled` which configures a robot with wheels on its base, like the Viam Rover.
-The **left** and **right** attributes configure the motors on the left and right side of the rover, which are named `left` and `right`, respectively.
-
-The **Wheel Circumference** (in millimeters) is 217.
-The **Width** is the distance between wheel centerlines, 260mm in this case.
-The **Spin Slip Factor** of 1.76 is used in steering calculations to account for slippage of the wheels against the ground while turning.
-
-![The base configuration panel, showing right and left motors, wheel circumference set to 217, width set to 260mm, and spin slip factor set to 1.76.](appendix/try-viam/try-viam/base-config.png)
-
-### Camera configuration
-
-The [camera component](/components/camera/) configures the webcam that is plugged into the Raspberry Pi of the rover.
-The camera component has the **Type** `camera`, the **Model** `webcam`, and the **Video Path** is `video0`.
-
-For more information on choosing the correct video path, refer to our [webcam documentation](/components/camera/webcam/).
-
-![The video path in the webcam configuration panel is set to 'video0'.](appendix/try-viam/try-viam/camera-config.png)
-
-### Gamepad configuration
-
-The [web gamepad](/components/input-controller/webgamepad/) component has the **Type** `input_controller` and the **Model** `webgamepad`.
-
-![The gamepad configuration panel. No attributes are configured.](appendix/try-viam/try-viam/gamepad-config.png)
-
-If you connect a generic gamepad controller to your computer, you can use it to control your machine.
-
-If you are configuring your own machine, be aware that using the gamepad requires a service.
-To see how the service is configured, navigate to the **Services** section under the **CONFIGURE** tab.
-The **Services** subtab contains the "Base Remote Control" service which uses three attributes:
-
-- **base**: `viam_base`
-- **control_mode**: `joystickControl`
-- **input_controller**: `WebGamepad`
-
-The names for **base** and **input_controller** correspond to the naming scheme from the **Components** tab.
-
-![The base remote control service named 'base_rc' on the Services subtab of the CONFIG tab.](appendix/try-viam/try-viam/base-rc.png)
-
-### Raw JSON
-
-The 'Builder' configuration mode provides a user-friendly, guided experience for you.
-In the background, the Viam app translates the Viam machine configuration into JSON.
-You can view the complete JSON for your rover by clicking on **Raw JSON** at the top left of the **CONFIGURE** tab.
-
-![The CONFIG tab with the mode toggled to Raw JSON. A section of the full raw JSON config is displayed but one would have to scroll to see all of it.](appendix/try-viam/try-viam/raw-json.png)
-
-You can [copy this `JSON` config between rental rovers](/appendix/try-viam/reserve-a-rover/#how-can-i-reuse-my-borrowed-rover).
-
-## Next steps
-
-If you have questions, check out our [FAQ](/appendix/try-viam/reserve-a-rover/) or join our [Discord Community](https://discord.gg/viam), where you can ask questions and meet other people working on robots.
-
-{{< cards >}}
-{{% card link="/how-tos/drive-rover/" %}}
-{{% card link="/how-tos/detect-color/" %}}
-{{% card link="/appendix/try-viam/rover-resources/" %}}
-{{< /cards >}}
diff --git a/docs/architecture/_index.md b/docs/architecture/_index.md
deleted file mode 100644
index 9df6084c7cf..00000000000
--- a/docs/architecture/_index.md
+++ /dev/null
@@ -1,210 +0,0 @@
----
-title: "Viam Architecture"
-linkTitle: "Architecture"
-weight: 409
-type: "docs"
-description: "How a machine running on Viam is structured, from on-device to cloud communications."
-imageAlt: "Viam architecture"
-images: ["/viam/machine-components.png"]
-tags: ["components", "services", "communication"]
-menuindent: true
-date: "2024-08-13"
-# updated: "" # When the content was last entirely checked
----
-
-This page provides an overview of how a machine is structured, including on-device and cloud communications:
-
-- [`viam-server` and `viam-micro-server`](#viam-server-and-viam-micro-server)
-- [Components, services and modules](#components-services-modules)
-- [Communication flow and security](#communication)
-- [How data flows in Viam](#data-management-flow)
-- [Basic machine example](#basic-machine-example)
-- [Structure of more complex machines](#complex-machines-with-multiple-parts)
-
-{{}}
-
-## `viam-server` and `viam-micro-server`
-
-`viam-server` is the open-source executable binary that runs on your machine's SBC or other computer.
-
-`viam-server` does the following locally:
-
-- Runs drivers for your hardware
-- Runs motion planning and vision services
-- Runs {{< glossary_tooltip term_id="module" text="modules" >}}
-- Manages local connections between all these resources
-- Captures and stores data
-
-When `viam-server` can connect to the cloud, it also:
-
-- Automatically pulls configuration updates you make in the Viam app
-- Gets new versions of software packages
-- Uploads and syncs image and sensor data
-- Handles requests from client code you write with [SDKs](/sdks/)
-- Allows you to remotely monitor and control your machine from the Viam app
-
-`viam-server` can use the internet, wide area networks (WAN) or local networks (LAN) to establish peer-to-peer connections between two {{< glossary_tooltip term_id="machine" text="machines" >}}, or to a client application.
-
-[`viam-micro-server`](/installation/viam-micro-server-setup/#install-viam-micro-server) is the lightweight version of `viam-server` that you can run on ESP32 microcontrollers.
-It supports a limited set of {{< glossary_tooltip term_id="resource" text="resources" >}} and can connect with the cloud as well as with devices running `viam-server`.
-
-## Components, services, modules
-
-A {{< glossary_tooltip term_id="component" text="component" >}} represents a physical piece of hardware in your {{< glossary_tooltip term_id="machine" text="machine" >}}, and the software that directly supports that hardware.
-
-A {{< glossary_tooltip term_id="service" text="service" >}} is a software package that adds complex capabilities such as motion planning or object detection to your machine.
-
-Viam has many built-in components and services that run within `viam-server`.
-
-A [_modular resource_](/registry/) is a custom component or service, not built into `viam-server` but rather provided by a _module_ that you or another user have created.
-A module runs as a process managed by `viam-server` on your machine, communicating over UNIX sockets, and `viam-server` manages its lifecycle.
-
-{{}}
-
-{{< expand "Click for an example" >}}
-
-Imagine you have a wheeled rover with two motors, a GPS unit, and a camera, controlled by a single-board computer (SBC) such as a Raspberry Pi.
-
-The motors, GPS, and camera each require software drivers so that the board can send signals to them and receive signals from them.
-These drivers are called _{{< glossary_tooltip term_id="component" text="components" >}}_.
-There is also a _component_ for the board itself that allows Viam software to communicate with the pins on the board.
-
-If you configure a [base component](/components/base/), you can specify the size of the wheels attached to the motors, and how wide the rover base is, so `viam-server` can calculate how to coordinate the motion of the rover base.
-
-If your rover includes a piece of hardware (such as a particular sensor) that is not yet supported as a built-in in by Viam, check the registry for a contributed {{< glossary_tooltip term_id="module" text="module" >}} or write your own module to integrate it into your machine.
-
-Say you want your machine to navigate intelligently between GPS coordinates.
-Instead of writing code from scratch, you can use Viam's built-in navigation service by adding it to your configuration, specifying how the GPS and any additional movement sensors are oriented with respect to your hardware.
-Since your configuration includes information about the wheeled base of your rover as well as how that base is oriented in relation to your GPS and other sensors, `viam-server` can use the motion and navigation services to calculate how much power to send to each motor to get it to a point on the map.
-
-If you want to add some other high-level software functionality beyond the built-in services (for example, your own flavor of navigation service), you can add your own service with a module.
-
-{{< /expand >}}
-
-## Communication
-
-
-
-Viam uses peer-to-peer communication, where all machines running `viam-server` or [`viam-micro-server`](/installation/viam-micro-server-dev/) (the version of `viam-server` for microcontrollers) communicate directly with each other as well as with the cloud.
-This peer-to-peer connectivity is enabled by sending [gRPC commands over WebRTC connections](/architecture/machine-to-machine-comms/#low-level-inter-robotsdk-communication).
-
-On startup, `viam-server` establishes a {{< glossary_tooltip term_id="webrtc" text="WebRTC" >}} connection with the [Viam app](https://app.viam.com).
-`viam-server` pulls its configuration from the app, caches it locally, and initializes all components and services based on that configuration.
-
-If [sub-parts or remote parts](#complex-machines-with-multiple-parts) are configured, communications are established between the `viam-server` instances on each of them.
-
-If you have client code running on a separate computer, that code sends API requests to `viam-server` using gRPC over WebRTC.
-If a WebRTC connection cannot be established, the request is sent directly over gRPC.
-When a built-in service communicates with a component, for example when the vision service requests an image from a camera, `viam-server` handles that request as well.
-
-When you control your machine or view its camera streams or sensor outputs from the Viam app **CONTROL** tab, those connections happen over WebRTC.
-The Viam app uses the same API endpoints as your SDK client code (in fact, it uses the Viam TypeScript SDK), with `viam-server` handling requests.
-
-{{% alert title="Protobuf APIs" color="info" %}}
-All Viam APIs are defined with the [Protocol Buffers (protobuf)](https://protobuf.dev/) framework.
-{{% /alert %}}
-
-For more details, see [Machine-to-Machine Communication](/architecture/machine-to-machine-comms/).
-
-### Security
-
-TLS certificates automatically provided by the Viam app ensure that all communication is authenticated and encrypted.
-
-Viam uses API keys with [role-based access control (RBAC)](/cloud/rbac/) to control access to machines from client code.
-
-## Data management flow
-
-{{}}
-
-
-Data is captured and synced to the Viam Cloud as follows:
-
-1. Data collected by your resources, such as sensors and cameras, is first stored locally in a specified directory (defaults to ~/.viam/capture ).
- You control what data to capture, how often to capture it, and where to store it using the configuration in the Viam app.
-
- - You can also sync data from other sources by putting it into folders you specify.
-
-
-1. `viam-server` syncs data to the cloud at your specified interval, and deletes the data from the local directory.
-
-1. You can view your data from the Viam app or query it using Viam SDKs, MQL, or SQL.
-
-If a device has intermittent internet connectivity, data is stored locally until the machine can reconnect to the cloud.
-
-For more information, see [Data management service](/services/data/).
-
-## Basic machine example
-
-
-{{}}
-
-
-Imagine you have a simple device consisting of a temperature sensor connected to the GPIO pins of a single-board computer (SBC).
-You want to capture sensor data at regular intervals, and sync it to the cloud.
-Here is how this works in Viam:
-
-- You configure your machine in the Viam app with a sensor {{< glossary_tooltip term_id="component" text="component" >}} and the data management {{< glossary_tooltip term_id="service" text="service" >}}.
-- `viam-server` runs on the SBC, managing all communications between hardware and the cloud using gRPC over {{< glossary_tooltip term_id="webrtc" text="WebRTC" >}}.
- On startup, `viam-server` uses credentials stored locally to establish a connection with the Viam app and fetches its configuration.
-- Sensor data is cached in a local folder, then synced to the cloud at a configurable interval.
-- You can use the tools in the Viam app to remotely view sensor data as well as to change your machine's configuration, to view logs, and more.
-
-Now imagine you want to run code to turn on a fan when the temperature sensor reads over 100 degrees Fahrenheit:
-
-- Configure the fan motor as a motor component and wire the fan motor relay to the same board as the sensor.
-- Write your script using one of the Viam [SDKs](/sdks/), for example the Viam Python SDK, using the sensor API and motor API.
-- You then run this code either locally on the SBC, or on a separate server.
- See [Run code](/sdks/#run-code) for more options.
- Your code connects to the machine, authenticating with API keys, and uses the [sensor API](/components/sensor/#api) to get readings and the [motor API](/components/motor/#api) to turn the motor on and off.
-
- ![A desktop computer (client in this case) sends commands to robot 1 (server) with gRPC over wifi.](/build/program/sdks/robot-client.png)
-
-Now, imagine you want to change to a different model of temperature sensor from a different brand:
-
-- You power down your device, disconnect the old sensor from your SBC and connect the new one.
-- You update your configuration in the Viam app to indicate what model you are using, and how it's connected (imagine this one uses USB instead of GPIO pins).
-- You turn your device back on, and `viam-server` automatically fetches the config updates.
-- You do not need to change your control code, because the API is the same for all models of sensor.
-
-## Complex machines with multiple parts
-
-In Viam, a _{{< glossary_tooltip term_id="part" text="part" >}}_ is an organizational concept consisting of one instance of `viam-server` (or `viam-micro-server`) running on a SBC or other computer, and all the hardware and software that the `viam-server` instance controls.
-
-Many simple {{< glossary_tooltip term_id="machine" text="machines" >}} consist of only one part: just one computer running `viam-server` with configured components and services.
-If you have a more complex situation with multiple computers and associated hardware working together, you have two options for organization:
-
-- One complex {{< glossary_tooltip term_id="machine" text="machine" >}} consisting of multiple parts, working together.
-- Multiple individual machines (each made up of one or more parts), linked by a {{< glossary_tooltip term_id="remote-part" text="remote" >}} connection.
-
-These two options are very similar: in both cases, the parts communicate with each other securely and directly using gRPC/{{< glossary_tooltip term_id="webrtc" text="WebRTC" >}}.
-Any given part can be a remote part of multiple machines, whereas a part can only be a sub-part of one machine.
-In other words, remote connections allow sharing of resources across multiple machines, whereas main parts and sub-parts are a way to hierarchically organize one machine.
-
-Connecting parts (either as main part and sub-part, or as part and remote part) means that you can write control code that establishes a connection with the main part and controls all parts in a coordinated way.
-This streamlines authentication because you do not need to provide multiple sets of API keys as you would if you were using separate API clients.
-However, in some high-bandwidth cases it is better to establish a direct connection from an API client to a part, because connections to remotes and to sub-parts use the main part's bandwidth.
-
-{{< expand "Multi-part and remote examples" >}}
-
-- **Compute power example:** Imagine you have a robotic arm with a camera on it, connected to a SBC such as a Raspberry Pi.
- You want to use the Viam motion service to control the arm, and you want to use the vision service on the output from the camera, but the SBC does not have the compute power to plan complex motion and also interpret camera output quickly.
- You can set up a second {{< glossary_tooltip term_id="part" text="part" >}} on a server, as a sub-part of the same machine, and offload the heavy compute to that part.
-
-- **One weather station to many boats:** Imagine you have one weather station collecting data, and multiple boats (perhaps some in different {{< glossary_tooltip term_id="organization" text="organizations" >}}) whose behavior depends on that weather data.
- You can set up a remote connection from each of the `viam-server` instances running on the boats to the `viam-server` instance on the weather station and get that data more directly, without having to wait for the data to sync to the cloud.
-
-- **One camera to many rovers:** Imagine you have a fleet of rovers in a factory.
- One camera has an overhead view of the entire factory floor.
- The camera is set up as one machine.
- Each of the rovers is a separate machine, and they can each have the camera configured as a remote so that they can access the overhead camera stream.
-
-{{< /expand >}}
-
-See [Parts, Sub-parts and Remotes](/architecture/parts/) for more details.
-
-## Next steps
-
-This page has provided an overview of the architecture of just one machine.
-For information on organizing a fleet of many machines, see [Cloud Organization Hierarchy](/fleet/).
-
-For more details on the architecture of a single machine, see the following:
diff --git a/docs/architecture/machine-to-machine-comms.md b/docs/architecture/machine-to-machine-comms.md
deleted file mode 100644
index 5db1661d11b..00000000000
--- a/docs/architecture/machine-to-machine-comms.md
+++ /dev/null
@@ -1,117 +0,0 @@
----
-title: "Machine-to-Machine Communication: End-to-End Flow"
-linkTitle: "Machine-to-Machine Communication"
-weight: 60
-type: "docs"
-description: "Explanation of how a machine and its parts interact at the communication layer."
-aliases:
- - "/internals/robot-to-robot-comms/"
- - "/internals/machine-to-machine-comms/"
-toc_hide: true
----
-
-When building a smart machine application in the [Viam app](https://app.viam.com), a user typically begins by configuring their machine which can consist of one or more {{< glossary_tooltip term_id="part" text="parts" >}}.
-Next they will test that it is wired up properly using the Viam app's Control page.
-Once they've ensured everything is wired up properly, they will build their main application and the business logic for their machine using one of Viam's language SDKs.
-This SDK-based application is typically run on either the main part of the machine or a separate computer dedicated to running the business logic for the machine.
-
-Below, we describe the flow of information through a Viam-based multipart machine and then get into the specifics of what backs these connections and communications APIs.
-
-## High-level inter-robot/SDK communication
-
-To begin, let's define our machine's topology:
-
-![robot communication diagram](/internals/robot-to-robot-comms/robot-communication-diagram.png)
-
-This machine is made of two parts and a separate SDK-based application, which we'll assume is on a third machine, though it could just as easily run on the main part without any changes.
-
-- The first and main part, RDK Part 1, consists of a Raspberry Pi and a single USB connected camera called Camera.
-
-- The second and final part, RDK Part 2, consists of a Raspberry Pi connected to a robotic arm over ethernet and a gantry over GPIO.
-
-RDK Part 1 will establish a bidirectional gRPC/{{< glossary_tooltip term_id="webrtc" >}} connection to RDK Part 2.
-RDK Part 1 is considered the controlling peer (client).
-RDK Part 2 is consider the controlled peer (server).
-
-Let's suppose our SDK application uses the camera to track the largest object in the scene and instructs the arm to move to that same object.
-
-Since RDK Part 1 is the main part and has access to all other parts, the application will connect to it using the SDK.
-Once connected, it will take the following series of actions:
-
-
-Get segmented point clouds from the camera and the object segmentation service.
-
-Find the largest object by volume.
-
-Take the object's center pose and tell the motion service to move the arm to that point.
-
-Go back to 1.
-
-Let's breakdown how these steps are executed.
-
-
-Get segmented point clouds from the camera and the object segmentation service:
-
-![robot communication diagram](/internals/robot-to-robot-comms/getobjectpointcloud-flow.png)
-
-
-The SDK will send a GetObjectPointClouds request with Camera being referenced in the message to RDK Part 1's Object Segmentation Service.
-
-RDK Part 1 will look up the camera referenced, call the GetPointCloud method on it.
-
-The Camera will return the PointCloud data to RDK Part
-
-RDK Part 1 will use a point cloud segmentation algorithm to segment geometries in the PointCloud.
-{{% alert title="Important" color="note" %}}
-The points returned are respective to the reference frame of the camera.
-This will become important in a moment.
-{{% /alert %}}
-The set of segmented point clouds and their bounding geometries are sent back to the SDK-based application.
-
-
-Find the largest object by volume:
-
-The application will iterate over the geometries of the segmented point clouds returned to it and find the object with the greatest volume and record its center pose.
-
-
-Take the object's center pose and tell the motion service to move the arm to that point:
-
-![motion service move flow](/internals/robot-to-robot-comms/motion-service-move-flow.png)
-
-
-The SDK application will send a Move request for the arm to the motion service on RDK Part 1 with the destination set to the center point determined by the application.
-
-RDK Part 1's motion service will break down the Move request and perform the necessary frame transforms before sending the requests along to the relevant components.
-This is where the frame system comes into play.
-Our center pose came from the camera but we want to move the arm to that position even though the arm lives in its own frame.
-The frame system logic in the RDK automatically handles the transformation logic between these two reference frames while also handling understanding how the frame systems are connected across the two parts.
-
-Having computed the pose in the reference frame of the arm, the motion service takes this pose, and sends a plan on how to move the arm in addition to the gantry to achieve this new goal pose to RDK Part 2.
-The plan consists of a series of movements that combine inverse kinematics, mathematics, and constraints based motion planning to get the arm and gantry to their goal positions.
-
-In executing the plan, which is being coordinated on RDK Part 1, Part 1 will send messages to the Arm and Gantry on RDK Part 2.
-RDK Part 2 will be unaware of the actual plan and instead will only receive distinct messages to move the components individually.
-
-The arm and gantry connected to RDK Part 2 return an acknowledgement of the part Move requests to RDK Part 2.
-
-RDK Part 2 returns an acknowledgement of the Motion Move request to RDK Part 1.
-
-RDK Part 1 returns an acknowledgement of the Motion Move request to the SDK application.
-
-
-## Low-level inter-robot/SDK communication
-
-All component and service types in the RDK, and the Viam API for that matter, are represented as [Protocol Buffers (protobuf)](https://developers.google.com/protocol-buffers) services.
-protobuf is a battle tested Interface Description Language (IDL) that allows for specifying services, their methods, and the messages that comprise those methods.
-Code that uses protobuf is autogenerated and compiles messages into a binary form.
-
-[gRPC](https://grpc.io/) is responsible for the transport and communication of protobuf messages when calling protobuf methods.
-It generally works over a TCP, TLS backed HTTP2 connection operating over framing see [gRPC's HTTP2 documentation](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md) for more.
-
-The RDK uses protobuf and gRPC to enable access and control to its components and services.
-That means if there are two arms in a machine configuration, there is only one Arm service that handles the Remote Procedure Calls (RPC) for all arms configured.
-
-In addition to gRPC, the RDK uses [WebRTC](https://webrtcforthecurious.com/) video and audio streams and data channels to enable peer to peer (P2P) communication between machine parts as well as SDKs and the Remote Control interface.
-
-An outline of how WebRTC is used lives on [Go.dev](https://pkg.go.dev/go.viam.com/utils@v0.0.3/rpc#hdr-Connection), but in short, an RDK is always waiting on the Viam app ([app.viam.com](https://app.viam.com)) to inform it of a connection requesting to be made to it whereby it sends details about itself and how to connect on a per connection basis.
-Once a connection is made, the Viam app is no longer involved in any packet transport and leaves it up to the two peers to communicate with each other.
diff --git a/docs/architecture/parts.md b/docs/architecture/parts.md
deleted file mode 100644
index d86ac5dc172..00000000000
--- a/docs/architecture/parts.md
+++ /dev/null
@@ -1,136 +0,0 @@
----
-title: "Machine Architecture: Parts"
-linkTitle: "Parts, Sub-parts, Remotes"
-weight: 40
-type: "docs"
-description: "Connect multiple machine parts to each other as sub-parts or remotes."
-tags: ["server", "components", "services"]
-aliases:
- - /manage/parts-and-remotes/
- - /build/configure/parts-and-remotes/
- - /configure/parts/
- - /build/configure/parts/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-When {{< glossary_tooltip term_id="machine" text="smart machines" >}} communicate with each other, they can share resources and operate collaboratively.
-This document explains how to establish secure connections between machines.
-
-## Machine parts
-
-Machines are organized into _parts_, where each part represents a computer (a single-board computer, desktop, laptop, or other computer) running [`viam-server`](/installation/viam-server-setup/), the hardware {{< glossary_tooltip term_id="component" text="components" >}} attached to it, and any {{< glossary_tooltip term_id="service" text="services" >}} or other {{< glossary_tooltip term_id="resource" text="resources" >}} running on it.
-
-Every smart machine has a main part which is automatically created when you create the machine.
-Multi-part machines also have one or more _sub-parts_ representing additional computers running `viam-server`.
-
-There are two ways to link machine parts:
-
-- **Sub-part**: If you have multiple computers within the _same machine_, use one as the main part and [connect each additional part to it as a sub-part](#configure-a-sub-part).
- Any given part can only be a sub-part of one main part.
-
-
- Click for an example.
- Imagine you have a system of five cameras in different places along an assembly line, each attached to its own single-board computer, and you want to run an object detector on the streams from all of them.
- You have one main computer with greater compute power set up as the main part.
- You set up each of the single-board computers as a sub-part.
- This allows the main part to access all the camera streams and run object detection on all of them.
- You could also set this up with each single-board computer being a remote part instead of a sub-part, but it is slightly easier to configure sub-parts because you do not need to add the address of each part to your machine's config.
- Additionally, configuring a discrete system of parts as one multi-part machine helps keep your fleet more clearly organized in the Viam app.
-
-
-- **Remote part**: To connect multiple computers that are parts of _different machines_ in the same or different organizations, [add one machine part as a remote part of the other machine or machines](#configure-a-remote-part).
- A part can be a remote part of any number of other parts.
-
-
- Click for an example.
- If you have one camera connected to a computer in a warehouse that many machines should be able to share, you can configure the camera as a remote part of each machine that needs it.
-
-
-Connections between machines are established using the best network path available.
-
-When you configure a remote part or a sub-part, the main machine part can access all the components and services configured on the remote machine part as though they were entities of the main machine part.
-This is a one-way connection: the main machine part can access the resources of the remote machine part, but the remote machine cannot access the resources of the machine part remoting into it.
-
-When a part starts up, it attempts to connect to any remotes and sub-parts.
-If it cannot connect to them, the part will still successfully start up.
-
-![Example of a remote and a two part machine where the main (and only) part of machine 1 remotes into the main part of machine 2, and thus has access to all resources of machine 2.](/build/configure/parts/remotes-diagram.png)
-
-## Configuration
-
-### Configure a sub-part
-
-You can make a multi-part machine by first configuring one part which is the "main" part, and then configuring one or more sub-parts.
-The main part will be able to access the resources of its sub-parts.
-Sub-parts will _not_ have access to the resources of the main part.
-
-The Viam app automatically creates the main part for you when you create a new {{< glossary_tooltip term_id="machine" text="machine" >}}.
-To add a new sub-part:
-
-1. Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-2. Click the **+** (Create) icon next to the name of your main part, then click **Sub-part** from the menu:
-
- {{}}
-
-To rename or delete a sub-part, or to make it the main part, click the **...** icon to open the Actions menu:
-
-{{}}
-
-### Configure a remote part
-
-To establish a connection between a part of one machine and a part of a second machine, add one as a remote part in the other machine part's config:
-
-1. Go to the Viam app machine page of the smart machine part to which you wish to establish the remote connection.
- This is the machine part whose resources will be accessible to the other machine part.
-2. Navigate to the **CONNECT** tab.
-3. Click **Configure as a remote part** in the left-hand menu.
-4. Toggle the **Include API key** switch on, then copy the entire JSON snippet including the name, address, and authentication credentials of the remote part.
-
- {{% snippet "show-secret.md" %}}
-
-5. Go to the Viam app machine page of the machine part from which you want to establish a remote connection.
- This is the machine part that will be able to access the resources of the other machine part.
-6. Navigate to the **CONFIGURE** tab, click the **+** (Create) icon next to the machine part's name in the left side menu.
-
- {{}}
-
-7. Click **Remote part**.
-8. Find the newly-created remote part in the left hand menu.
- Click it to navigate to its configuration card.
-9. Delete the auto-populated JSON from the new remote's config area and replace it by pasting the remote config you copied in step 4 into the empty field.
-
- {{}}
-
-10. Click **Save** in the upper right corner of the page to save your config.
-
-## Using remote parts and sub-parts with the Viam SDKs
-
-Once your sub-part or remote part is configured, you can access all the components and services configured on the sub-part or remote machine part as though they were resources of your main machine part.
-The only difference is that the names of the components have the remote machine part name prepended to them.
-For example, instead of calling
-
-```python
-servo = Servo.from_robot(robot=robot, name='my_servo')
-```
-
-you need to call
-
-{{< tabs >}}
-{{% tab name="Sub-part" %}}
-
-```python
-servo = Servo.from_robot(robot=robot, name='my-sub-part-name:my_servo')
-```
-
-{{% /tab %}}
-{{% tab name="Remote Part" %}}
-
-```python
-servo = Servo.from_robot(robot=robot, name='my-other-robot-main:my_servo')
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-For an example that controls a motor that is a component of a sub-part, see [the Mock Robot tutorial](/tutorials/configure/build-a-mock-robot/#control-a-sub-part-using-the-viam-sdk).
diff --git a/docs/architecture/viam-micro-server.md b/docs/architecture/viam-micro-server.md
deleted file mode 100644
index fb3bb4efdf0..00000000000
--- a/docs/architecture/viam-micro-server.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: "viam-micro-server"
-linkTitle: "viam-micro-server"
-weight: 90
-type: docs
-images: ["/installation/thumbnails/esp32-espressif.png"]
-imageAlt: "E S P 32 - espressif"
-description: "Set up the Espressif ESP32 for development with `viam-micro-server`."
-date: "2024-09-03"
-# updated: "" # When the content was last entirely checked
-# SMEs: Nicolas M., Gautham V., Andrew M.
----
-
-`viam-micro-server` is the lightweight version of [`viam-server`](/architecture/viam-server/) which can run on resource-limited embedded systems (ESP32) that cannot run the fully-featured `viam-server`.
-`viam-micro-server` is built from the open-source [micro-RDK](https://github.com/viamrobotics/micro-rdk/).
-
-## Hardware requirements
-
-{{% readfile "/static/include/micro-rdk-hardware.md" %}}
-
-## Support
-
-[Client API](/appendix/apis/) usage with the micro-RDK currently supports the following {{< glossary_tooltip term_id="resource" text="resources" >}}:
-
-{{< cards >}}
-{{% relatedcard link="/components/base/" %}}
-{{% relatedcard link="/components/board/" %}}
-{{% relatedcard link="/components/camera/" %}}
-{{% relatedcard link="/components/encoder/" %}}
-{{% relatedcard link="/components/movement-sensor/" %}}
-{{% relatedcard link="/components/motor/" %}}
-{{% relatedcard link="/components/sensor/" %}}
-{{% relatedcard link="/components/servo/" %}}
-{{% relatedcard link="/components/generic/" %}}
-{{% relatedcard link="/services/data/" %}}
-{{< /cards >}}
-
-Click on each supported resource to see available models, API methods, and configuration info.
-
-## Next steps
-
-To use `viam-micro-server`, follow the installation guide.
-If you want to access camera functionality, extend the functionality of `viam-micro-server, or customize it see the development setup guide.
-
-{{< cards >}}
-{{% card link="/installation/viam-server-setup/" %}}
-{{% card link="/installation/viam-micro-server-dev/" %}}
-{{< /cards >}}
diff --git a/docs/architecture/viam-server.md b/docs/architecture/viam-server.md
deleted file mode 100644
index fd10bec57a3..00000000000
--- a/docs/architecture/viam-server.md
+++ /dev/null
@@ -1,121 +0,0 @@
----
-title: "viam-server"
-linkTitle: "viam-server"
-weight: 80
-type: "docs"
-description: "viam-server is the open-source, on-machine portion of the Viam platform."
-tags: ["server", "rdk"]
-aliases:
- - "/product-overviews/rdk"
- - "/build/program/rdk"
- - /internals/rdk/
- - /architecture/rdk/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The `viam-server` executable runs on a computer and manages hardware, software, and data for a machine.
-`viam-server` is built from the open-source [Robot Development Kit (RDK)](https://github.com/viamrobotics/rdk).
-If you are working with microcontrollers, [`viam-micro-server`](/architecture/viam-micro-server/) is a lightweight version of `viam-server` which can run on resource-limited embedded systems that cannot run the fully-featured `viam-server`.
-
-To use Viam with a machine, you create a configuration specifying which hardware and software the machine consists of.
-`viam-server` then manages and runs the drivers for the configured {{< glossary_tooltip term_id="resource" text="resources" >}}.
-
-Overall, _viam-server_ manages:
-
-- [Communication](#communication)
-- [Dependency management](#dependency-management)
-- [Start-up](#start-up)
-- [Reconfiguration](#reconfiguration)
-- [Logging](#logging)
-- [Shutdown](#shutdown)
-
-## Communication
-
-`viam-server` handles all {{< glossary_tooltip term_id="grpc" text="gRPC" >}} and {{< glossary_tooltip term_id="webrtc" >}} communication for connecting machines to the cloud or for connecting to other parts of your machine.
-
-## Dependency management
-
-`viam-server` handles dependency management between resources.
-
-## Start-up
-
-`viam-server` ensures that any configured {{< glossary_tooltip term_id="module" text="modules" >}}, {{< glossary_tooltip term_id="resource" text="built-in resources" >}} and {{< glossary_tooltip term_id="modular-resource" text="modular resources" >}}, and processes are loaded on startup.
-
-After start-up, `viam-server` manages:
-
-- the configured processes,
-- the connections to hardware,
-- the running services, and
-- the {{< glossary_tooltip term_id="module" text="modules" >}} that provide the {{< glossary_tooltip term_id="modular-resource" text="modular resources" >}}.
-
-### Reconfiguration
-
-When you or your collaborators change the configuration of a machine in the Viam app, `viam-server` automatically synchronizes the configuration to your machine and updates the running resources within 15 seconds.
-This means you can add, modify, and remove a modular resource instance from a running machine.
-
-You can see configuration changes made by yourself or by your collaborators by selecting **History** on the right side of your machine part's card on the **CONFIGURE** tab.
-You can also revert to an earlier configuration from the History tab.
-
-#### Maintenance window
-
-If you only want to apply configuration updates under certain conditions, you can create a sensor with your conditions.
-The sensor must return a true value when it is safe to update and a false value otherwise.
-
-Add the following configuration to your machine's JSON configuration:
-
-```json
-// components: [ ... ],
-// services: [ ... ],
-maintenance : {
- "sensor_name" : string,
- "maintenance_allowed_key" : string
-}
-```
-
-
-| Attribute | Type | Required? | Description |
-| --------- | ---- | --------- | ----------- |
-| `sensor_name` | string | **Required** | The full name of the sensor that provides the information if it is safe to update a machine's configuration. For example `rdk:component:sensor/sensor1`. |
-| `maintenance_allowed_key` | string | **Required** | The key of the key value pair for the reading returned by the sensor. |
-
-### Logging
-
-Log messages written appear under the [**LOGS** tab](/cloud/machines/#logs) for the machine running the module.
-
-#### Debugging
-
-The default log level for `viam-server` and any running resources is `"Info"`.
-
-You can enable debug level logs in two ways:
-
-- Start `viam-server` with the `-debug` option.
-- Add `"debug": true` to the machine's configuration:
-
- ```json
- {
- "debug": true,
- "components": [{ ... }]
- }
- ```
-
-To enable debug level logs for specific resources you can add the `log_configuration` option to the resources' JSON configuration:
-
-```json
-"log_configuration": {
- "level": "Debug"
-},
-"attributes": { ... }
-```
-
-### Shutdown
-
-During machine shutdown, `viam-server` handles modular resource instances similarly to built-in resource instances - it signals them for shutdown in topological (dependency) order.
-
-## Next steps
-
-{{< cards >}}
-{{% card link="/appendix/apis/" %}}
-{{% card link="/registry/" customTitle="Viam Registry" %}}
-{{% card link="/installation/viam-server-setup/" canonical="/installation/viam-micro-server-setup/#install-viam-micro-server" %}}
-{{< /cards >}}
diff --git a/docs/cloud/_index.md b/docs/cloud/_index.md
deleted file mode 100644
index cf949ff3c59..00000000000
--- a/docs/cloud/_index.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: "Cloud Organization Hierarchy"
-linkTitle: "Cloud Organization Hierarchy"
-weight: 430
-type: "docs"
-description: "Configure, control, debug, and manage your machines from the cloud at app.viam.com on your own or with a team."
-tags: ["fleet management", "cloud", "app"]
-images: ["/fleet/fleet.svg"]
-no_list: true
-menuindent: true
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-Viam fleet management allows you to organize, manage, and control any number of machines alone or in collaboration with others.
-You can manage and control your fleet of {{< glossary_tooltip term_id="machine" text="smart machines" >}} from the [Viam app](https://app.viam.com), using the [CLI](/cli/), or using the [fleet management API](/appendix/apis/fleet/).
-
-## Work with groups of machines
-
-To organize your fleet you use:
-
-
-
-{{< cards >}}
-{{% manualcard link="/cloud/organizations/" %}}
-
-#### Organizations
-
-The highest level grouping, generally used for different companies.
-
-{{% /manualcard %}}
-{{% manualcard link="/cloud/locations/" %}}
-
-#### Locations
-
-A virtual grouping of devices up with up to three levels of nesting that can represent a grouping of machines that are co-located in a building, like a factory, or a grouping of machines that are thousands of miles apart and are grouped together by function or as an organizational unit.
-
-An organization can have multiple locations.
-{{% /manualcard %}}
-{{% manualcard link="/cloud/machines/" %}}
-
-#### Machines
-
-A grouping of {{< glossary_tooltip term_id="component" text="components" >}} and {{< glossary_tooltip term_id="service" text="services" >}} across one {{< glossary_tooltip term_id="part" text="part" >}} or more parts working closely together to complete tasks.
-Each machine resides in a location.
-
-{{% /manualcard %}}
-{{< /cards >}}
-
-
-
-{{}}
-
-
-
-The organization structure enables you to:
-
-- configure groups of machines with reusable {{< glossary_tooltip term_id="fragment" text="fragments" >}} that [configure](/configure/) a set of resources for each machine that uses the fragment.
-- deploy [code packages](/registry/) or [machine learning models](/services/ml/), without manually copying files by uploading it to Viam's cloud and deploying it to your fleet
-- control a machine with code, the app's [**CONTROL** tab](/cloud/machines/#control), or the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app)
-- obtain health metrics, such as status, uptime, version, or [logs](machines/#logs)
-- perform debugging
-
-All of this is possible when you are close to your machine, as well as remotely from anywhere in the world.
-
-## Use Viam for collaboration
-
-When you create a Viam account, Viam automatically creates an organization for you.
-You can use this organization as your collaboration hub by inviting collaborators to your organization.
-You can also add additional organizations as desired at any time.
-
-To facilitate collaboration, you can grant individual collaborators or entire organizations granular permissions for individual machines or entire locations.
-This allows you flexibility to manage internal machines, sell devices to external customers and keep managing them, and collaborate with different partners or companies on groups of machines.
-For more information, see [Permissions](/cloud/rbac/#permissions).
-
-### Configuration
-
-When you or your collaborators change the configuration of a machine or a group of machines in the Viam app, `viam-server` automatically synchronizes the configuration and updates the running resources within 15 seconds.
-This means everyone who has access can change a fleet's [configuration](machines/#configure), even while your machines are running.
-
-You can see configuration changes made by yourself or by your collaborators by selecting **History** on the right side of your machine part's card on the **CONFIGURE** tab.
-You can also revert to an earlier configuration from the History tab.
-
-{{< alert title="Simultaneous config edits" color="caution" >}}
-If you edit a config while someone else edits the same config, the person who saves last will overwrite any prior changes that aren't reflected in the new config.
-
-Before editing a config, we recommend you refresh the page to ensure you have all the latest changes.
-{{< /alert >}}
-
-Machine [configuration](machines/#configure) and machine [code](/sdks/) is intentionally kept separate, allowing you to keep track of versioning and debug issues separately.
-
-## Next steps
-
-To learn about configuring and provisioning many machines, see [Deploy a Large Fleet](/fleet/).
-
-To learn about monitoring and remotely controlling the machines in your fleet, see [Control Interface](/fleet/control/).
-
-Check out the following tutorial for an example of organizing a fleet into locations, configuring multiple machines, and syncing data from all of them:
-
-{{< cards >}}
-{{% card link="/tutorials/control/air-quality-fleet/" %}}
-{{< /cards >}}
diff --git a/docs/cloud/account.md b/docs/cloud/account.md
deleted file mode 100644
index 00c22c3baef..00000000000
--- a/docs/cloud/account.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: "Account Management"
-linkTitle: "Accounts"
-weight: 80
-type: "docs"
-description: "Log in and out of your Viam account."
-tags: ["fleet management", "cloud", "app"]
-no_list: true
-aliases:
- - /fleet/account/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-the [Viam app](https://app.viam.com/) is a web UI for managing and building machines.
-
-## Create account and log In
-
-To get started on the Viam app, you must log in as an authorized user.
-Viam support sign up using Google, GitHub, Apple, and email.
-
-Navigate to [the main page](https://app.viam.com/).
-If you haven't created an account yet, click **Sign Up** to create a new account using your preferred Single Sign On method or your email address and a password.
-If you already have an account, click **Log In** to log in using your Single Sign On credentials or your email address and password.
-
-If you forget your password to the app, click **Forgot password** and enter your email address to obtain instructions to reset your password.
-
-{{< alert title="Info" color="info" >}}
-Accounts created from separate authentication sources are unique to each other.
-{{< /alert >}}
-
-
-
-## Sign out
-
-To log out or sign out of the [Viam app](https://app.viam.com/), click on your profile icon in the upper right corner of your browser window.
-Click **Sign out** to sign out of accessing all organizations, locations, and machines your credentials manage.
diff --git a/docs/cloud/locations.md b/docs/cloud/locations.md
deleted file mode 100644
index 542ad414164..00000000000
--- a/docs/cloud/locations.md
+++ /dev/null
@@ -1,116 +0,0 @@
----
-title: "Manage Locations and Sub-locations"
-linkTitle: "Locations"
-weight: 30
-type: "docs"
-no_list: true
-description: A location is a virtual grouping of machines that allows you to organize machines and manage access to your fleets.
-tags: ["fleet management", "cloud", "app"]
-aliases:
- - /manage/fleet/locations/
- - /fleet/locations/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-In Viam, every machine belongs to a location.
-A location is a virtual grouping of machines that allows you to organize machines and manage access.
-Generally, a location defines a group of machines that are geographically close to each other.
-If you are familiar with Google Drive, you can think of a location as similar to a folder within a shared drive.
-
-For example, an organization called Good Robots Inc has two warehouses across New York and Oregon.
-Good Robots Inc can organize its machines into two locations based on their physical presence in a warehouse.
-
-You can also use locations as proxies for environments such as "Production" and "Testing" or other groupings.
-Locations do not have to correspond with physical locations.
-
-Each machine you add to Viam belongs to a location.
-Each location belongs to an organization.
-
-{{< alert title="Limit" color="note" >}}
-By default, you can create up to 100 locations in an organization.
-If you need to create more locations, [contact support](mailto:support@viam.com).
-{{< /alert >}}
-
-{{}}
-
-You can access your locations on the Viam app on the **FLEET** tab's [**LOCATIONS** subtab](https://app.viam.com/fleet/locations).
-
-## Add a location
-
-When you create a new organization, Viam automatically creates a new location for you.
-You can create additional locations by typing a new location name in the **New Location** field in the left side navigation bar on the **FLEET** page's [**LOCATIONS** subtab](https://app.viam.com/fleet/locations/) and clicking **Add**.
-
-Click a location's name to display the list of machines associated with that location.
-
-## Create a sub-location
-
-To create a sub-location you must first create the sub-location as a location and then choose a parent location:
-
-1. Create a location and add at least one machine to it.
-2. At the bottom of the location's page, use the **New Parent Location** dropdown to choose a parent location.
-3. Click **Change**.
-
-You can nest locations up to three levels deep.
-
-To move a sub-location to the top level of locations, select **Root** from the **New Parent Location** dropdown and then click **Change**.
-
-## Share a location
-
-A location always belongs to the organization it was created in.
-Members of the organization have access to all locations in the organization by default.
-
-For more information on the permissions the roles assign for each resource, see [Permissions](/cloud/rbac/#locations).
-
-You can share a location beyond its organization by sharing a location with an additional organization:
-
-### Share a location with an additional organization
-
-Share your location with another organization you belong to by selecting the organization from the **Add Organization** dropdown menu and clicking **Share**.
-
-To share your location with an organization you are not a member of, select the location or enter the organization ID (a string like `1ab2c3d1-1234-123a-abcd-abcdef123456`) and click **Share**.
-Members of the org can find the org ID on their org settings page.
-
-{{% alert title="Note" color="info" %}}
-
-Once you share a _nested_ location (sub-location), its parent location cannot be changed.
-
-{{% /alert %}}
-
-#### Remove an organization from a shared location
-
-You can remove any organization except the primary owner from the shared list by clicking the **X** to the right of the location in the shared list.
-
-
-
-#### Rotate a secret key
-
-If you ever need to rotate this key, click on the **Generate Key** button to generate a new key.
-
-Viam supports flexible key rotation with up to two keys in use at one time.
-After generating a new secret key, update all references to the key in your code as soon as possible and then remove the old key.
-
-### Share a location with Viam support
-
-If you request support, you must share your location with the Viam Support team.
-To do so, navigate to the location you need support with and click, **Add Viam support**.
-
-Once you have received support, you can remove Viam Support from your location by clicking **Remove Viam support**.
-
-## Delete a location
-
-You can delete a location that is _empty of machines_ by clicking the trash can icon next to the location name at the top of the page for that location.
-The icon will not appear if there are any machines in the location.
diff --git a/docs/cloud/machines.md b/docs/cloud/machines.md
deleted file mode 100644
index d48e0c91f5b..00000000000
--- a/docs/cloud/machines.md
+++ /dev/null
@@ -1,138 +0,0 @@
----
-title: "Manage Machines"
-linkTitle: "Machines"
-weight: 10
-type: "docs"
-description: "A machine is an organizational concept, consisting of either one or multiple parts working closely together to complete tasks."
-tags: ["fleet management", "cloud", "app"]
-images: ["/fleet/app-usage/create-machine.png"]
-aliases:
- - /fleet/robots/
- - /manage/fleet/machines/
- - /fleet/machines/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-A _machine_ is an organizational concept, consisting of either one {{< glossary_tooltip term_id="part" text="part" >}} , or multiple _parts_ working closely together to complete tasks.
-The machine represents the configuration and entry point for one or more computers (and the components they control) coupled into one logical grouping of parts that work together to complete tasks.
-A machine usually reflects a physical device, from a camera collecting images, to a wheeled rover, or an articulated arm on a factory floor.
-A machine always has a main part that receives client requests, and any number of other parts.
-
-## Add a new machine
-
-Add a new machine in the [Viam app](https://app.viam.com) by clicking **+ Add machine**, providing a name in the **New machine** field and clicking **Add machine** again.
-
-![The 'First Location' page on the Viam app with a new machine name in the New machine field and the Add Machine button next to the field highlighted.](/fleet/app-usage/create-machine.png)
-
-Click the name of a machine to go to that machine's page, where you'll find a variety of tools for working with your machine.
-
-## Navigating the machine page
-
-Next to the machine name, there is an indicator of the machine's status.
-Click on the **status** dropdown to open a menu with information about each {{< glossary_tooltip term_id="part" text="part" >}} of your machine.
-Once you connect to the `viam-server` instance on a part, this display includes its OS, Host, `viam-server` version, IP addresses, and what time it was last online or remote address (if live):
-
-![The machine page with part menu expanded](/fleet/app-usage/machine-page.png)
-
-### Set up a new machine
-
-
-
-To connect to the `viam-server` instance on a part, follow the setup instructions.
-Open the part status dropdown menu in the top left corner of the page, next to the machine's name.
-Click **View setup instructions** to open the setup instructions.
-
-Select your system's architecture and select the version of the {{< glossary_tooltip term_id="RDK" text="RDK" >}} to use.
-Then, follow the instructions on the page to connect and set up your machine.
-
-{{% alert title="Tip" color="tip" %}}
-If your machine is controlled by a microcontroller, install the [**viam-micro-server**](/installation/viam-micro-server-setup/#install-viam-micro-server) instead of full `viam-server`.
-{{% /alert %}}
-
-More in-depth information on installing `viam-server` can be found in our [Installation Guide](/installation/viam-server-setup/#install-viam-server).
-
-Once all parts of your machine are set up and connected to the app, the part status display at the top left corner of the page turns green.
-Now, you can manage your machine with one of four tabs: **CONFIGURE**, **CONTROL**, **LOGS**, and **CONNECT**:
-
-{{}}
-
-### CONFIGURE
-
-The configuration of a machine describes the {{< glossary_tooltip term_id="resource" text="resources" >}} that it has access to.
-When a {{< glossary_tooltip term_id="part" text="machine part" >}} that is managed with the Viam app first comes online, it requests its configuration from the [Viam app](https://app.viam.com).
-Once the machine has a configuration, it caches it locally and can use the configuration for up to 60 days.
-The machine checks for new configurations every 15 seconds and changes its configuration automatically when a new configuration is available.
-
-After connecting your machine, go to the **CONFIGURE** tab, and start adding {{< glossary_tooltip term_id="component" text="components" >}}, {{< glossary_tooltip term_id="service" text="services" >}}, and other {{< glossary_tooltip term_id="resource" text="resources" >}}.
-
-
-
-The Viam app keeps a record of your configuration changes, allowing you to revert to earlier configurations if needed.
-To see the history of the configuration of a machine part, click on **History** on the right side of its card on the **CONFIGURE** tab.
-
-For more information, see the [configuration documentation](/configure/#the-configure-tab).
-
-{{< alert title="Tip" color="tip" >}}
-If you are managing a large fleet, you can use {{< glossary_tooltip term_id="fragment" text="fragments" >}} when [configuring your fleet](/fleet/fragments/).
-{{< /alert >}}
-
-### CONTROL
-
-Once you have configured components and services for your machine, you can visually test and remotely operate them from the **CONTROL** tab in the [Viam app](https://app.viam.com) or the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app).
-
-{{}}
-
-You can also switch between different machine parts by selecting the part from the left-hand menu.
-
-For more information, see [Control machines](/fleet/control/).
-
-### LOGS
-
-To make debugging issues with your machines easier, each machine automatically sends its logs to the cloud.
-You can access your logs from the **LOGS** tab in the [Viam app](https://app.viam.com) and filter your logs for specific keywords or log levels:
-
-{{}}
-
-You can click on the part names in the left-hand menu to switch logs between parts. You can also change your timestamp format to ISO or Local depending on your preference.
-
-To view logs in the Viam mobile app:
-
-1. Select an organization clicking on the menu icon in the top left corner and tapping an organization.
-2. Tap the **Locations** tab and tap on a location and then on a machine.
-3. Click the menu button marked "**...**" in the upper right corner.
-4. Click **View Logs**.
-
-### CONNECT
-
-#### Code sample
-
-To start programming your machine, go to the **CONNECT** tab and select the **Code sample** page.
-This has sample code snippets you can copy and paste into your control code to connect to your machine.
-
-{{% snippet "show-secret.md" %}}
-
-For more information on the SDKs, see [Write control code with Viam's SDKs](/appendix/apis/).
-
-#### Configure as remote part
-
-On the **CONNECT** tab, there is also a page called **Configure as remote part**.
-This page has instructions for how to configure a {{< glossary_tooltip term_id="part" text="part" >}} of your machine as a [remote part](/architecture/parts/) of another machine.
-
-#### API keys
-
-Your machine and the Viam app communicate securely using [WebRTC](https://pkg.go.dev/go.viam.com/utils@v0.0.3/rpc#hdr-Connection) with unique secrets.
-The **API keys** page of the **CONNECT** tab allows you to access, generate, and delete your [API keys](/cloud/rbac/#api-keys), which grant access to organizations, locations, and machines.
-
-![The Security tab of a machine's page noting the Machine part API keys dropdown menu, with the clipboard icon on the far right and the Generate Key button underneath the dropdown.](/fleet/app-usage/machine-secrets.png)
-
-Copy an API key or API key ID by clicking on the clipboard icon.
-Click **Show details** and **Access settings** to go to your organization settings page, where you can modify the access your API keys provide.
-
-{{% snippet "secret-share.md" %}}
-
-## Delete a machine
-
-To delete a machine, click on the **...** menu in the top right hand corner of its page, select **Delete machine**, and confirm that you're sure.
-
-{{< imgproc alt="The delete machine button and the confirmation checkbox (Sure?) next to it." src="/fleet/app-usage/delete.png" resize="300x" >}}
diff --git a/docs/cloud/organizations.md b/docs/cloud/organizations.md
deleted file mode 100644
index b00e269c448..00000000000
--- a/docs/cloud/organizations.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-title: "Manage Organizations"
-linkTitle: "Organizations"
-weight: 30
-type: "docs"
-description: "An organization is a group of one or more locations that helps you organize and manage access to your fleet."
-tags: ["fleet management", "cloud", "app"]
-aliases:
- - /manage/fleet/organizations/
- - /fleet/organizations/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-An organization is a group of one or more locations that helps you organize your fleet.
-
-An organization is the highest level grouping in the Viam platform, which generally represents a company, or other institution.
-You can also use organizations for departments or other entities that can have one or more [locations](/cloud/locations/).
-If you are familiar with Google Drive, you can think of an organization as a shared drive.
-
-{{}}
-
-When you or another user registers for an account with Viam, they become a member of an organization.
-If the user was invited to an organization, they become a part of that organization.
-If the user registered without invitation, an organization and a {{< glossary_tooltip term_id="location" text="location" >}} is automatically created for the user.
-
-A user can create more organizations at any time.
-
-Any member of an organization can invite new users to that organization.
-
-For example, you may have an account with one organization for your personal smart machines at home and another organization for the smart machines at work.
-
-{{}}
-
-You organization is shown in the upper right corner of the [Viam app](https://app.viam.com).
-If you click on the organization dropdown, the app displays your name, email, and a list of organizations you belong to.
-
-{{< imgproc alt="The org dropdown showing an example user's name, email, Sign out button, list of organizations, and org settings button." src="/fleet/app-usage/my-org.png" resize="400x" declaredimensions=true >}}
-
-If you used an email invite to sign up, you have two organizations to begin with: the organization that invited you and a personal organization for other projects.
-
-Click an organization's name to navigate to its list of locations.
-
-### Create a new organization
-
-To create a new organization, click on the Org's **Settings** in the top right of the navigation bar.
-Then enter the name for your new organization in the **New Organization** field in the upper left of the page.
-
-### Invite someone to an organization
-
-To invite a user to your organization, click on the Org's **Settings** in the top right of the navigation bar.
-In the members section of the page, click on **Grant access** and enter their email address.
-Then select the resource that you would like to grant the user access to and the designated role and click **Invite**.
-
-{{< imgproc alt="The user invitation menu on the Organization settings page." src="/fleet/app-usage/invite-user.png" resize="900x" declaredimensions=true >}}
-
-You can grant a user access to the following resources:
-
-- an {{< glossary_tooltip term_id="organization" text="organization" >}}
-- a {{< glossary_tooltip term_id="location" text="location" >}}
-- a {{< glossary_tooltip term_id="machine" text="machine" >}}
-
-For more information on the permissions the roles assign for each resource, see [Permissions](/cloud/rbac/#permissions).
-
-#### Use the mobile app
-
-You can also use the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app) to invite users to your organization, on the go. Navigate to Home on the mobile app, and select your organization. Click the gear icon in the upper right corner to access the mobile organization settings page. On the settings page enter an email address, select a role, and tap **Grant Access**.
-
-### Create a namespace for your organization
-
-When uploading [custom modules](/registry/) to the Viam Registry, you must set a namespace for your organization to associate your module with.
-
-To create a new namespace for your organization, click on the Org's **Settings** in the top right of the navigation bar, then click the **Set a public namespace** button.
-Enter a name or use the suggested name for your namespace, and then click **Set namespace**.
-Consider the following as you chose a namespace:
-
-- A namespace may only contain letters, numbers, and the dash (`-`) character.
-- Once set, a namespace _cannot be changed_: choose your namespace carefully!
-- You must pick a unique namespace that is not already in use by another organization.
-- As you enter your namespace, a message will appear to the right of the text box indicating whether the namespace is available, or whether an invalid character is detected.
-
-{{< imgproc alt="The namespace creation menu on the Organization settings page." src="/fleet/app-usage/create-namespace.png" resize="700x" declaredimensions=true >}}
-
-### Leave an organization
-
-To leave an organization, click on the Org's **Settings** in the top right of the navigation bar.
-Then click **Leave organization**.
-
-### Delete an organization
-
-To delete an organization, click on the Org's **Settings** in the top right of the navigation bar.
-Then click **Delete organization**.
-
-If the organization to delete contains any locations, you must delete them before you can delete the organization.
diff --git a/docs/cloud/rbac.md b/docs/cloud/rbac.md
deleted file mode 100644
index c12b44a26a9..00000000000
--- a/docs/cloud/rbac.md
+++ /dev/null
@@ -1,210 +0,0 @@
----
-title: "Role-Based Access Control"
-linkTitle: "Manage Access"
-description: "Fleet and data management permissions."
-weight: 50
-type: "docs"
-tags: ["data management", "cloud", "app", "fleet management"]
-aliases:
- - /fleet/rbac/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
-# SME: Devin Hilly
----
-
-Role-Based Access Control (RBAC) is a way to enforce security in the [Viam app](https://app.viam.com) by assigning organization members roles that confer permissions.
-Users can have access to different fleet management capabilities depending on whether they are an owner or an operator of a given {{< glossary_tooltip term_id="organization" text="organization" >}}, {{< glossary_tooltip term_id="location" text="location" >}}, or {{< glossary_tooltip term_id="machine" text="machine" >}}.
-
-- **Owner**: Can see and edit [every tab on the machine page](/cloud/machines/#navigating-the-machine-page).
- Can manage users in the app.
-- **Operator**: Can see and use only the [**CONTROL**](/fleet/control/) tab.
- Cannot see or edit the [**CONFIGURE**](/cloud/machines/#configure), [**LOGS**](/cloud/machines/#logs), or **CONNECT** tabs.
-
-For more detailed information on the permissions each role confers for different resources, see [Permissions](/cloud/rbac/#permissions).
-
-## Change a user's access
-
-If you have the **Owner** role, you can [invite new users](/cloud/organizations/#invite-someone-to-an-organization) and change the roles assigned to an organization member on a per machine, location, or organization level.
-
-To view the roles each organization member has, click on the organization dropdown in the top navigation bar and click on **Settings**.
-
-{{}}
-
-### Limit access
-
-To limit the access of a user, first open the access settings for the user by clicking on the user.
-Then either change the role of the user from owner to operator with the dropdown or click on **Limit access** and change the resource the user has access.
-
-You can also remove the user by clicking on **Remove user**.
-
-{{< imgproc alt="The user invitation menu on the Organization settings page." src="/fleet/app-usage/limit-access.png" resize="800x" declaredimensions=true >}}
-
-For more information on the permissions the roles assign for each resource, see [Permissions](/cloud/rbac/#permissions).
-
-### Grant additional access
-
-To grant additional access to a user, first open the access settings for the user by clicking on the user.
-Then either change the role of the user from operator to owner with the dropdown or click on **Grant additional access** and change the resource the user has access.
-
-{{< imgproc alt="The user invitation menu on the Organization settings page." src="/fleet/app-usage/grant-access.png" resize="800x" declaredimensions=true >}}
-
-For more information on the permissions the roles assign for each resource, see [Permissions](/cloud/rbac/#permissions).
-
-{{< alert title="Note" color="note" >}}
-The option to grant additional access is only visible if you can grant the user additional access.
-{{< /alert >}}
-
-### Use the mobile app
-
-You can also use the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app) to grant or revoke organization owner or operator access to users on the go.
-Navigate to your organizations on the mobile app by swiping left to right or clicking on the menu in the top left corner.
-Click the gear icon associated with the organization where you want to manage access or invite new people.
-
-## API keys
-
-API keys grant access to organizations, locations, and machines.
-If at the organization level, they grant access to all locations and machines contained within that organization.
-If at the location level, they grant access to all of the machines contained within that location.
-
-To view all API keys in use for your organization and the locations and machines inside it, click on the organization dropdown in the top navigation bar and click on **Settings**.
-
-View a table with each key, ID, name (if assigned), time created, and entities it provides access to:
-
-{{}}
-
-In each row, click the copy icon to copy the API key and key ID.
-Click the duplicate icon to duplicate the API key.
-Click the trash can icon to delete the API key.
-
-### Add an API key
-
-Click **Generate key** to generate a new key.
-Optionally, give the key a name of your choice.
-Click on the **Resource** menu and choose what organization, location, or machine you want the key to grant access to.
-For **Role**, assign either an **Owner** or **Operator** role.
-See [Permissions](#permissions) for information about the privilege each role entails at each resource level.
-
-### View an API key's details
-
-To view the role of an API key and what it grants access to, click on **Show details** in the key's row of the key table's **Resources** column:
-
-{{}}
-
-### Change an API key's access
-
-To edit an API key, click on **Show details** in the key's row of the key table's **Resources** column.
-
-To edit the role, click on the dropdown menu next to the role and select **Owner** or **Operator**.
-See [Permissions](#permissions) for information about the privilege each role entails at each resource level.
-
-To change the entities it is able to access, click **+ Grant additional access**.
-Select which organization, location, or machine you want the key to grant access to.
-Click **Choose** to confirm your selection.
-
-## Permissions
-
-The following sections describe the permissions for each user role when it comes to managing machines, locations, organizations, fragments, and data.
-
-### Machines
-
-Permissions for managing {{< glossary_tooltip term_id="machine" text="machines" >}} are as follows:
-
-
-| Permissions | Org owner | Org operator | Location owner | Location operator | Machine owner | Machine operator |
-| ----------- | --------- | ------------ | -------------- | ----------------- | ------------- | ---------------- |
-| Control the machine from the **CONTROL** tab | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
-| See all tabs (such as **CONFIGURE** and **LOGS**) | **Yes** | No | **Yes** | No | **Yes** | No |
-| Edit machine name | **Yes** | No | **Yes** | No | **Yes** | No |
-| Delete the machine | **Yes** | No | **Yes** | No | **Yes** | No |
-| Add a new {{< glossary_tooltip term_id="part" text="part" >}} | **Yes** | No | **Yes** | No | **Yes** | No |
-| Edit {{< glossary_tooltip term_id="part" text="part" >}} name | **Yes** | No | **Yes** | No | **Yes** | No |
-| Restart the machine | **Yes** | No | **Yes** | No | **Yes** | No |
-| Edit a machine config (including data capture and sync) | **Yes** | No | **Yes** | No | **Yes** | No |
-
-### Locations
-
-Permissions for managing {{< glossary_tooltip term_id="location" text="locations" >}} are as follows:
-
-
-| Permissions | Org owner | Org operator | Location owner | Location operator | Machine owner | Machine operator |
-| ----------- | --------- | ------------ | -------------- | ----------------- | ------------- | ---------------- |
-| Edit location info (rename, delete location) | **Yes** | No | **Yes** for this and any child locations | No | No | No |
-| Create a new machine | **Yes** | No | **Yes** in this and any child locations | No | No | No |
-| Move the location (to new parent location) | **Yes** | No | **Yes**, to other locations they have access to | No | No | No |
-| Create a new location in the organization | **Yes** | No | No | No | No | No |
-| Delete location | **Yes** | No | **Yes** | No | No | No |
-| Add/remove Viam support team permissions | **Yes** | No | **Yes** | No | No | No |
-| Add a shared location | **Yes** | No | **Yes** | No | No | No |
-| Remove a shared location | **Yes** | No | **Yes** | No | No | No |
-| Use Try Viam from within the org\* | **Yes** | No | No | No | No | No |
-
-If a user has access to a child location but not its parent location, the user cannot see machines in the parent location.
-
-If a user is an owner of an organization with which a location was shared (that is, a _secondary_ organization owner), that user _can_ share the location with other organizations.
-
-\*Users can only use Try Viam from within an organization they own because doing so creates a new location in the org.
-
-### Organization settings and roles
-
-Only {{< glossary_tooltip term_id="organization" text="organization" >}} owners can edit or delete an organization, or see and edit the organization billing page.
-
-Permissions for managing org settings and user roles are as follows:
-
-
-| Permissions | Org owner | Org operator | Location owner | Location operator | Machine owner | Machine operator |
-| ----------- | --------- | ------------ | -------------- | ----------------- | ------------- | ---------------- |
-| See billing page | **Yes** | No | No | No | No | No |
-| Get billing-related emails | **Yes** | No | No | No | No | No |
-| Edit org name | **Yes** | No | No | No | No | No |
-| Delete the org | **Yes** | No | No | No | No | No |
-| Leave the org | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
-| See their own role | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
-| See other peoples' roles | **Yes** | **Yes** | **Yes\*** | **Yes\*** | **Yes\*** | **Yes\*** |
-| See all org members (including email and date joined) | **Yes** | **Yes** | No | No | No | No |
-| Invite, resend invite, and revoke invite | **Yes** | No | **Yes\*** | No | **Yes\*** | No |
-| Change someone else's role | **Yes** | No | **Yes\*** | No | **Yes\*** | No |
-| Create a new organization | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** | **Yes** |
-| Delete modules | **Yes** | No | No | No | No | No |
-| Make public modules private | **Yes** | No | No | No | No | No |
-
-\*For locations/machines they have access to
-
-### Fragments
-
-Permissions for managing {{< glossary_tooltip term_id="fragment" text="fragments" >}} are as follows:
-
-
-| Permissions | Org owner | Org operator | Location owner | Location operator | Machine owner | Machine operator |
-| ----------- | --------- | ------------ | -------------- | ----------------- | ------------- | ---------------- |
-| Create a new fragment in the {{< glossary_tooltip term_id="organization" text="org" >}} | **Yes** | No | No | No | No | No |
-| See and use fragments in the {{< glossary_tooltip term_id="organization" text="org" >}} | **Yes** | No | **Yes** | No | **Yes** | No |
-| Edit and delete fragments | **Yes** | No | No | No | No | No |
-
-### Data and machine learning
-
-Permissions for [data management](/fleet/data-management/) and [machine learning](/services/ml/) are as follows:
-
-
-| Permissions | Org owner | Org operator | Location owner | Location operator | Machine owner | Machine operator |
-| ----------- | --------- | ------------ | -------------- | ----------------- | ------------- | ---------------- |
-| View data | **Yes** | **Yes** | **Yes\*** | **Yes\*** | **Yes\*\*** | **Yes\*\*** |
-| See data tags | **Yes** | No | Only tags applied to data they have access to | No | Only tags applied to data they have access to | No |
-| Edit data (add tags, delete info) | **Yes** | No | **Yes\*** | No | **Yes\*\*** | No |
-| Train models | **Yes** | No | **Yes** on data they have access to | No | **Yes** on data they have access to | No |
-| Upload organization models/packages | **Yes** | No | **Yes** | No | **Yes** | No |
-| View organization models/packages | **Yes** | No | **Yes** | No | **Yes** | No |
-| Use organization models/packages | **Yes** | No | **Yes** | No | **Yes** | No |
-| Delete organization models/packages | **Yes** | No | No | No | No | No |
-| Export data with the CLI or the app | **Yes** | **Yes** | **Yes\*** | **Yes\*** | **Yes\*\*** | **Yes\*\*** |
-| See dataset names | Can see all names in current org | No | Can see all names in current org | No | Can see all names in current org | No |
-| Click into datasets / load them | Can click into dataset and see all data in it | No | Can see the data in the dataset that they have permission to access | No | Can see the data in the dataset that they have permission to access | No |
-| Create new dataset | **Yes** | No | **Yes** | No | **Yes** | No |
-| Rename dataset | **Yes** | No | No | No | No | No |
-| Delete dataset | **Yes** | No | No | No | No | No |
-| Add images to dataset | **Yes** | No | Can add images they have permissions on | No | Can add images they have permissions on | No |
-| Remove image from dataset | **Yes** | No | Can remove images in the dataset that they can see | No | Can remove images in the dataset that they can see | No |
-| Train on dataset | **Yes** | No | Trains on the portion of the dataset that they have access to | No | Trains on the portion of the dataset that they have access to | No |
-
-\*For data from the location
-
-\*\*For data from the machine
diff --git a/docs/configure/_index.md b/docs/configure/_index.md
deleted file mode 100644
index 85dbe25f768..00000000000
--- a/docs/configure/_index.md
+++ /dev/null
@@ -1,370 +0,0 @@
----
-title: "Machine Configuration"
-linkTitle: "Machine Configuration"
-weight: 429
-type: "docs"
-description: "Before you can program a machine, you must configure its components and services as well as any modules, remotes, processes and frames."
-imageAlt: "Configure a Machine"
-images: ["/viam.svg"]
-tags: ["manage", "components"]
-aliases:
- - /manage/configuration/
- - /build/configure/
- - /build/
-no_list: true
-menuindent: true
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-Before you can program a smart machine, you must configure it.
-
-A machine's configuration defines the _{{< glossary_tooltip term_id="resource" text="resources" >}}_ (hardware and software services) it has access to, as well as any relevant parameters for those resources.
-You can configure the following resources:
-
-- [Components](/configure/#components): _{{< glossary_tooltip term_id="component" text="Components" >}}_ are the hardware of your machine.
-- [Services](/configure/#services): _{{< glossary_tooltip term_id="service" text="Services" >}}_ are the software that runs on your machine.
-- [Processes](/configure/#processes): Processes automatically run specified scripts when the machine boots.
-- [Modules](/configure/#modules): {{< glossary_tooltip term_id="module" text="Modules" >}} provide {{< glossary_tooltip term_id="modular-resource" text="modular resources" >}}, which are a way to add resource types or models that are not built into Viam.
-- [Remote parts](/configure/#remote-parts): Remotes are a way to connect two separate machines so one can access the resources of the other.
-- [Sub-parts](/configure/#sub-parts): Sub-parts are a way to connect two computers inside the same machine.
-- [Fragments](/configure/#fragments): Fragments are a way of sharing and managing identical configuration files (or parts of config files) across multiple machines.
-- [Frames](#frames): Frames hold reference frame information for the relative position of components in space.
-- [Triggers](/configure/#triggers): Triggers allow you to trigger actions when certain types of data are sent from your machine to the cloud, or when the internet connectivity of your machine changes.
-- [Network](/configure/#network): Networking options allow you to configure the bind address for accepting connections.
-
-To start configuring, go to the [Viam app](https://app.viam.com) and create a new machine.
-Open the part status dropdown menu in the top left corner of the page, next to the machine's name.
-Click **View setup instructions** to open the setup instructions.
-Follow the appropriate instructions for your machine's architecture.
-
-The setup steps copy your machine's credentials to your machine.
-When you turn on your machine, `viam-server` starts up and uses the provided credentials to fetch its full config from the [Viam app](https://app.viam.com).
-Once the machine has a configuration, it caches it locally and can use the configuration for up to 60 days.
-Since the configuration is cached locally, your machine does not need to stay connected to the Viam app after it has obtained its configuration file.
-
-If it is online, the machine checks for new configurations every 15 seconds and changes its configuration automatically when a new configuration is available.
-All communication happens securely over HTTPS using secret tokens that are in a machine's configuration.
-
-If your machine will never connect to the internet, you can also create a [local configuration file](/internals/local-configuration-file/) on the machine itself.
-
-{{< alert title="Tip" color="tip" >}}
-On Linux, the configuration is stored at /etc/viam.json by default and `viam-server` uses this configuration if no configuration is specified on startup.
-
-You can store your config file in a custom location if desired.
-See [Run `viam-server`](/installation/manage-viam-server/#run-viam-server) for more information.
-{{< /alert >}}
-
-After you have completed the setup steps and successfully connected to your machine, go to the **CONFIGURE** tab to start adding to the configuration.
-
-## The CONFIGURE tab
-
-The **CONFIGURE** tab on the [Viam app](https://app.viam.com) is the place to configure everything about your machine.
-
-You can switch between **Builder**, **JSON**, and **Frame** mode by clicking on the icon in the upper left-hand corner:
-
-![Mode selector on CONFIGURE tab.](/build/configure/mode-selector.png)
-
-- **Builder** mode provides a graphical interface for configuring your machine resources.
-- **JSON** mode provides a text editing field where you can write and edit the config manually.
-- **Frame** mode provides a graphical interface for configuring and visualizing the relative position of components in space.
- For more information, see the [Frame System documentation](/services/frame-system/).
-
-Regardless of the editing mode you choose, Viam stores the configuration file in [JSON (JavaScript Object Notation)](https://en.wikipedia.org/wiki/JSON).
-
-{{< alert title="Caution: Simultaneous config edits" color="caution" >}}
-If you edit a config while someone else edits the same config, the person who saves last will overwrite any prior changes that aren't reflected in the new config.
-
-Before editing a config, we recommend you refresh the page to ensure you have all the latest changes.
-{{< /alert >}}
-
-If you add components in **Builder** mode and click **Save** in the top right corner of the screen, you can switch to **JSON** and see the JSON that has been generated by the builder.
-
-{{% expand "An example JSON config file for a machine with a board component, motor component, camera component, and vision service configured" %}}
-
-```json
-{
- "components": [
- {
- "name": "local",
- "model": "pi",
- "type": "board",
- "namespace": "rdk",
- "attributes": {},
- "depends_on": []
- },
- {
- "name": "my-motor",
- "model": "gpio",
- "type": "motor",
- "namespace": "rdk",
- "attributes": {
- "pins": {
- "a": "13",
- "b": "15"
- },
- "board": "local",
- "max_rpm": 120
- },
- "depends_on": []
- },
- {
- "name": "my_camera",
- "model": "webcam",
- "type": "camera",
- "namespace": "rdk",
- "attributes": {
- "video_path": "video0"
- }
- }
- ],
- "services": [
- {
- "name": "detector",
- "type": "vision",
- "attributes": {
- "register_models": [
- {
- "parameters": {
- "segment_size_px": 200,
- "hue_tolerance_pct": 0.05,
- "detect_color": "#19FFD9"
- },
- "type": "color_detector",
- "name": "green_detector"
- }
- ]
- }
- }
- ],
- "modules": []
-}
-```
-
-See [Example JSON configuration file](/internals/local-configuration-file/#example-json-configuration-file) for an additional example.
-
-{{% /expand %}}
-
-
-
-### Components
-
-Components represent the pieces of hardware on your machine that you want to control with Viam.
-To add a new component, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Component** or hit **C**.
-Search for and select your desired {{< glossary_tooltip term_id="model" text="model" >}}.
-
-You must configure each component with a type, a model, a name, attributes, and dependencies:
-
-- `type`: The broad component category, such as `motor`, `arm` or `camera`.
- Components of a given type have a common API.
-
-- `model`: Indicates the more specific category of hardware.
- Components of the same model are supported using the same low-level code.
-
-- `name`: Serves as an identifier when accessing the resource from your code, as well as when configuring other resources that are dependent on that resource.
- You can either accept the suggested default name when creating a component or choose a unique name for a component.
- The name must start with a letter or number and only contain letters, numbers, dashes, and underscores with a max length of 60.
-
-- `attributes`: Configure component details such as how the component is wired to the machine, its dimensions, and other specifications; attributes vary widely between models.
- See a {{< glossary_tooltip term_id="component" text="component" >}}'s documentation for more details.
-
-- `depends_on`: Any components that a given component relies upon, and that must be initialized on boot before this component is initialized.
- Many built-in components have convenient implicit dependencies, in which case `depends_on` can be left blank.
- For example, a [`gpio` motor](/components/motor/gpio/) depends on the `board` to which it is wired, but it has a dedicated `board` attribute and `viam-server` will automatically initialize that board before it looks for the motor.
-
-- `log_configuration`: Specify the log level for a resource. The default log level is `"Info"`. For example:
-
- ```json
- "log_configuration": {
- "level": "Debug"
- }
- ```
-
-For specific information on how to configure each supported component type, see the {{< glossary_tooltip term_id="component" text="component" >}}'s documentation:
-
-{{< cards >}}
-{{% relatedcard link="/components/arm" %}}
-{{% relatedcard link="/components/base" %}}
-{{% relatedcard link="/components/board" %}}
-{{% relatedcard link="/components/camera" %}}
-{{% relatedcard link="/components/encoder" %}}
-{{% relatedcard link="/components/gantry" %}}
-{{% relatedcard link="/components/generic" %}}
-{{% relatedcard link="/components/gripper" %}}
-{{% relatedcard link="/components/input-controller" %}}
-{{% relatedcard link="/components/motor" %}}
-{{% relatedcard link="/components/movement-sensor" %}}
-{{% relatedcard link="/components/power-sensor" %}}
-{{% relatedcard link="/components/sensor" %}}
-{{% relatedcard link="/components/servo" %}}
-{{< /cards >}}
-
-Some resources have a **TEST** section on the bottom half of their configuration pane which you can expand and interact with to test out controlling the component.
-You must be running `viam-server` and connected to your machine to use this feature.
-
-{{}}
-
-On the **...** menu in the upper right corner of each resource you can **Duplicate**, **Delete**, and **Disable** or **Enable** it.
-
-{{}}
-
-{{% alert title="Tip" color="tip" %}}
-
-When you configure a component on the **CONFIGURE** tab, it will also appear on the **CONTROL** tab which gives you an interface to interact with it.
-The **Code sample** page on the **CONNECT** tab will also update to include code for some basic interaction with that component using the Viam [SDKs](/appendix/apis/).
-
-{{% /alert %}}
-
-### Services
-
-Services are software packages that make it easier to add complex capabilities such as motion planning or object detection to your machine.
-To add a new service, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Service** or hit **S**.
-Search for and select your desired {{< glossary_tooltip term_id="model" text="model" >}}.
-
-You must configure a service with a `name` and a `type`:
-
-- `type`: specifies which of the Viam services you want to use on your machine, such as the vision service or the motion service.
-- `name`: serves as an identifier when accessing the resource from your code, as well as when configuring other resources that are dependent on that resource.
- You can accept the suggested default name when creating a service or choose a choose any unique name for a service.
- The name must start with a letter or number and can only contain letters, numbers, dashes, and underscores with a max length of 60.
-- `log_configuration`: Specify the log level for a resource. The default log level is `"Info"`. For example:
-
- ```json
- "log_configuration": {
- "level": "Debug"
- }
- ```
-
-The other aspects of configuring a service are highly specific to the type of service, review the docs for the service you are interested in:
-
-{{< cards >}}
-{{% relatedcard link="/services/data/" %}}
-{{% relatedcard link="/services/ml/" alt_title="Machine Learning" %}}
-{{% relatedcard link="/services/motion" %}}
-{{% relatedcard link="/services/navigation" %}}
-{{% relatedcard link="/services/slam" %}}
-{{% relatedcard link="/services/vision" %}}
-{{% relatedcard link="/services/generic" %}}
-{{% relatedcard link="/services/frame-system" %}}
-{{< /cards >}}
-
-Some resources have a **TEST** section on the bottom half of their configuration pane which you can expand and interact with to test out controlling the service.
-You must be running `viam-server` and connected to your machine to use this feature.
-
-You can disable a service without removing it from the configuration by selecting the **...** menu in the upper right corner and selecting **Disable**.
-
-{{% alert title="Tip" color="tip" %}}
-
-When you configure a service on the **CONFIGURE** tab, it will also appear on the **CONTROL** tab which gives you an interface to test and interact with it.
-The **Code sample** page on the **CONNECT** tab will also update to include code for some basic interaction with that service using the Viam [SDKs](/appendix/apis/).
-
-{{% /alert %}}
-
-### Processes
-
-To automatically run a specified command when the machine boots, configure a _{{< glossary_tooltip term_id="process" text="process" >}}_.
-You can configure any command, for example one that executes a binary or a script, to run as a process.
-
-To add a new process, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Process**.
-Find more information in the [processes documentation](/configure/processes/).
-
-### Modules
-
-Modules allow you to add [modular resources](/registry/) to your machines which add resource types or models that are not built into Viam.
-Many models are available in the [registry](https://app.viam.com/registry) and you are able to add them as components or services.
-
-#### Local Modules
-
-To add a module that is not in the registry and is local to your machine, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Local module**.
-Follow the instructions in our [registry documentation](/registry/modular-resources/#configuration) to configure the module.
-
-### Remote parts
-
-Configuring a remote part is a way to connect two separate machines so one can access the resources of the other.
-
-To configure a remote part, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Remote part**.
-Find more information in our [machine parts documentation](/architecture/parts/).
-
-### Sub-parts
-
-Configure a sub-part to connect two computers inside the same machine.
-
-To configure a sub-part, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Sub-part**.
-Find more information in our [machine parts documentation](/architecture/parts/).
-
-### Fragments
-
-You can use fragments to share similar {{< glossary_tooltip term_id="resource" text="resource" >}} configuration files across multiple machines in your fleet.
-For example, if you have multiple machines with the same motor hardware, wired the same way, you can create a fragment to configure that motor and share it easily across all of your machines, without needing to individually configure the motor component for each machine.
-
-To use a fragment, click the **+** icon next to your {{< glossary_tooltip term_id="part" text="machine part" >}} in the left-hand menu of the **CONFIGURE** tab and select **Insert fragment**.
-See [Use Fragments to Configure a Fleet](/fleet/fragments/) for more information on creating and deploying fragments.
-
-### Frames
-
-The frame system holds reference frame information for the relative position of components in space.
-
-Click on the **Frame** mode to visualize and configure the relative positions of components.
-Find more information in the [frame system documentation](/services/frame-system/).
-
-### Triggers
-
-Triggers allow you to trigger actions when certain types of data are sent from your machine to the cloud, or when the internet connectivity of your machine changes.
-For example, you can configure a trigger to send you a notification when your robot's sensor collects a new reading.
-
-See [Configure a Trigger](/configure/triggers/) for more information on triggers.
-
-### Network
-
-Expand a part's configuration card to open its network configuration interface:
-
-{{}}
-
-You can configure the address `viam-server` binds to for accepting connections.
-By default, `viam-server` binds to `0.0.0.0:8080` when managed by the Viam app or when authentication and TLS are enabled.
-You can also set the [heartbeat](/appendix/apis/sessions/#heartbeats) window.
-
-## Configuration History
-
-The Viam app keeps a record of each machine's configuration changes, allowing you to revert to earlier configurations if needed and see who made specific changes.
-
-To see the configuration history for a machine part, click on the **History** link at the top right corner of the machine part's card in the Viam app.
-
-{{}}
-
-To restore to an earlier version of your configuration, click the **Restore version** button next to the desired configuration.
-
-## Troubleshooting
-
-If you run into issues, here are some things to try:
-
-- Check the [**LOGS** tab](/cloud/machines/#logs) to view log messages and errors from `viam-server`.
- You can also [access the local log file](/installation/manage-viam-server/#view-viam-server-logs) on your machine if needed.
-- Make sure all configured components are saved to your config.
- If they aren't, you will see an **Unsaved changes** note next to the **Save** button in the top right corner of the page.
-- Try restarting `viam-server` by navigating to the app's **CONFIGURE** tab in **Builder** mode, clicking the **...** menu on the right side of the machine part's card, and selecting **Restart part**.
- It takes a few minutes for the server to shut down and restart.
-- If you need to revert to an earlier configuration, use the [Configuration History](#configuration-history) to restore to an earlier version.
-- Make sure the issue is not hardware related.
- Some things to check are that the machine has adequate power, all wires are properly connected, and no chips or other hardware components are shorted or overheated.
-- See [Troubleshooting](/appendix/troubleshooting/) for additional troubleshooting steps.
-- {{< snippet "social.md" >}}
-
-## Local setup
-
-Configuring `viam-server` with the Viam app allows you to use Viam's cloud features:
-
-- [Fleet Management](/fleet/)
-- [Data Management](/services/data/)
-- [Machine Learning](/services/ml/)
-
-However, if you are configuring a machine that can never connect to the internet, you can create a [local configuration file](/internals/local-configuration-file/) on your machine.
-A locally-configured machine will not be able to access Viam's cloud features.
-
-## Next steps
-
-After configuring your machine, you can use the [Viam SDKs](/appendix/apis/) to program and control your machine.
-
-If you want to try configuring a machine but don't have any hardware on hand, try the [Build a Mock Robot](/tutorials/configure/build-a-mock-robot/) tutorial.
diff --git a/docs/configure/agent.md b/docs/configure/agent.md
deleted file mode 100644
index 16284b17791..00000000000
--- a/docs/configure/agent.md
+++ /dev/null
@@ -1,347 +0,0 @@
----
-title: "viam-agent"
-linkTitle: "viam-agent"
-weight: 50
-no_list: true
-type: docs
-description: "The viam-agent is a self-updating service manager that maintains the lifecycle for Viam's system services, among them viam-server and provisioning."
-date: "2024-08-16"
-# updated: "" # When the content was last entirely checked
-# SMEs: James, Ale
----
-
-The [`viam-agent`](https://github.com/viamrobotics/agent) is a self-updating service manager that maintains the lifecycle for itself and the following system services:
-
-- `viam-server`: the core of the machine
-- [`agent-provisioning`](#agent-provisioning): device provisioning subsystem that can set up machine configs and manage WiFi networks. For more information see [Provisioning](/fleet/provision/).
-- [`agent-syscfg`](#agent-syscfg): provides various operating system and system configuration tweaks
-
-Among other things, `viam-agent`:
-
-- Installs, runs, and monitors `viam-server`
- You can also use a custom build of `viam-server`, if needed.
-- Provides automatic updates for `viam-server`, the agent itself, and any configured subsystems (such as the `agent-provisioning` subsystem).
-- Allows control of deployed software versions through the Viam app.
-
-{{< alert title="Support notice" color="note" >}}
-Currently, `viam-agent` is only supported on Linux, for amd64 (x86_64) and arm64 (aarch64) CPUs.
-{{< /alert >}}
-
-To provision machines using `viam-agent`, see
-
-{{< cards >}}
-{{% card link="/fleet/provision/" %}}
-{{< /cards >}}
-
-## Installation
-
-You can install `viam-agent` using either an existing machine's part ID and API key, or using an existing machine credentials configuration file at /etc/viam.json .
-
-{{< alert title="Important" color="note" >}}
-Your machine must have `curl` available in order to install `viam-agent`.
-{{< /alert >}}
-
-1. The first step is to add a new machine in the [Viam app](https://app.viam.com).
-2. Navigate to the **CONFIGURE** tab and find your machine's card.
- An alert will be present directing you to **Set up your machine part**:
-
-![Machine setup alert in a newly created machine](/installation/setup-part.png)
-
-Click **View setup instructions** to open the setup instructions.
-Then navigate to the machine part's setup and follow the instructions to install `viam server` with `viam-agent`.
-
-The command will be of the following form:
-
-```sh {class="command-line" data-prompt="$" data-output="1-10"}
-sudo /bin/sh -c "VIAM_API_KEY_ID= VIAM_API_KEY= VIAM_PART_ID=; $(curl -fsSL https://storage.googleapis.com/packages.viam.com/apps/viam-agent/install.sh)"
-```
-
-{{< alert title="Note" color="note" >}}
-
-As an alternative to specifying the `VIAM_API_KEY_ID`, the `VIAM_API_KEY`, and the `VIAM_PART_ID` when running the command, you can also copy the `viam-server` app JSON configuration from the Viam app into /etc/viam.json .
-You can get the machine cloud credentials by clicking the copy icon next to **Machine cloud credentials** in the part status dropdown to the right of your machine's name on the top of the page.
-{{}}
-
-Then run the following command to install `viam-agent`:
-
-```sh {class="command-line" data-prompt="$"}
-sudo /bin/sh -c "$(curl -fsSL https://storage.googleapis.com/packages.viam.com/apps/viam-agent/install.sh)"
-```
-
- {{< /alert >}}
-
-`viam-agent` will install itself as a systemd service named `viam-agent`.
-For information on managing the service, see [Manage `viam-agent`](/installation/manage-viam-agent/).
-
-## Configuration
-
-{{< tabs >}}
-{{% tab name="Config Builder" %}}
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Click the **+** icon next to your machine part in the left-hand menu and select **Agent**.
-
-{{< imgproc src="/configure/agent.png" alt="Configuration of viam-agent" resize="1200x" style="width=600x" >}}
-
-Edit and fill in the attributes as applicable.
-
-{{% /tab %}}
-{{% tab name="JSON (Default)" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "agent": {
- "viam-agent": {
- "release_channel": "stable",
- "pin_version": "",
- "pin_url": ""
- },
- "viam-server": {
- "release_channel": "stable",
- "pin_version": "",
- "pin_url": "",
- "disable_subsystem": false,
- "attributes": {
- "fast_start": false
- }
- },
- "agent-provisioning": {
- "release_channel": "stable",
- "pin_version": "",
- "pin_url": "",
- "disable_subsystem": false,
- "networks": []
- },
- "agent-syscfg": {
- "release_channel": "stable",
- "pin_version": "",
- "pin_url": "",
- "disable_subsystem": false
- }
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="JSON Example" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "agent": {
- "viam-agent": {
- "pin_version": "1.2.3"
- },
- "viam-server": {
- "attributes": {
- "fast_start": true
- }
- },
- "agent-provisioning": {
- "attributes": {
- "hotspot_password": "acme123",
- "networks": [
- {
- "type": "wifi",
- "ssid": "fallbackNetOne",
- "psk": "myFirstPassword",
- "priority": 30
- },
- {
- "type": "wifi",
- "ssid": "fallbackNetTwo",
- "psk": "mySecondPassword",
- "priority": 10
- }
- ]
- }
- },
- "agent-syscfg": {
- "attributes": {
- "logging": {
- "disable": false,
- "system_max_use": "128M",
- "runtime_max_use": "96M"
- },
- "upgrades": {
- "type": "all"
- }
- }
- }
- }
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-Each section primarily controls updates for that subsystem:
-
-### `viam-agent`
-
-
-| Option | Type | Required? | Description |
-| ------ | ---- | --------- | ----------- |
-| `release_channel` | string | Optional | `viam-agent` is semantically versioned and is tested before release. Releases happen infrequently. When set to `"stable"`, `viam-agent` will automatically upgrade when a new version is released. Options: `"stable"` (default). |
-| `pin_version` | string | Optional | Lock the subsystem to a specific version (as provided by the release channel). If set, no automatic upgrades will be performed until the setting is updated to a new version (or removed to revert to the release channel). If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `pin_url` | string | Optional | Ignore normal version selection and directly download from the specified URL. If set, no automatic upgrades will be performed until the setting is updated to a new URL (or removed to revert to the release channel). Typically this is only used for testing/troubleshooting. If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-
-### `viam-server`
-
-
-| Option | Type | Required? | Description |
-| ------ | ---- | --------- | ----------- |
-| `release_channel` | string | Optional | `viam-agent` is semantically versioned and is tested before release. Releases happen infrequently. When set to `"stable"`, `viam-agent` will automatically upgrade when a new version is released. Options: `"stable"` (default), `"latest"`. |
-| `pin_version` | string | Optional | "Lock" the subsystem to a specific version (as provided by the release channel). If set, no automatic upgrades will be performed until the setting is updated to a new version (or removed to revert to the release channel). If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `pin_url` | string | Optional | Ignore normal version selection and directly download from the specified URL. If set, no automatic upgrades will be performed until the setting is updated to a new URL (or removed to revert to the release channel). Typically this is only used for testing/troubleshooting. If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `disable_subsystem` | boolean | Optional | When set to `true` it disables the `viam-server` subsystem. |
-| `attributes` | object | Optional | `fast_start`: If set to `true`, `viam-agent` will not wait for a network connection nor check for updates before starting `viam-server`. See [Fast start mode](#fast-start-mode). |
-
-#### Fast start mode
-
-You can use fast start mode to bypass `viam-agent` waiting for a network connection to be established and checking for updates during initial startup.
-This will result in `viam-server` executing as quickly as possible.
-
-This is useful if you have a device that often starts when offline or on a slow connection, and if having the latest version immediately after start isn't required.
-
-{{< alert title="Note" color="note" >}}
-Period update checks will continue to run afterwards.
-The fast start mode only affects the initial startup sequencing.
-{{< /alert >}}
-
-You can also start `viam-agent` in fast start mode by setting `VIAM_AGENT_FAST_START=1` in your environment.
-
-### `agent-provisioning`
-
-
-| Option | Type | Required? | Description |
-| ------ | ---- | --------- | ----------- |
-| `release_channel` | string | Optional | `agent-provisioning` is semantically versioned and is tested before release. Releases happen infrequently. When set to `"stable"`, `viam-agent` will automatically upgrade when a new version is released. Options: `"stable"` (default), `"latest"`. |
-| `pin_version` | string | Optional | Lock the subsystem to a specific version (as provided by the release channel). If set, no automatic upgrades will be performed until the setting is updated to a new version (or removed to revert to the release channel). If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `pin_url` | string | Optional | Ignore normal version selection and directly download from the specified URL. If set, no automatic upgrades will be performed until the setting is updated to a new URL (or removed to revert to the release channel). Typically this is only used for testing/troubleshooting. If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `disable_subsystem` | boolean | Optional | When set to `true` it disables the `agent-provisioning` subsystem. |
-| `attributes` | object | Optional | You can override all attributes from the [`viam-agent` configuration file](/fleet/provision/#configuration) here. The [`viam-agent` configuration file](/fleet/provision/#configuration) is generally customized by the manufacturer to provide "out of the box" settings. The attributes configured in the machine config in the Viam app can let you as the machine user override those if you wish. For security purposes, you should change the `hotspot_password`. You can also configure `roaming_mode` and add any additional networks you want to configure. `hotspot_password`: Overwrite the password set for the WiFi hotspot a machine creates during provisioning. `networks`: Networks a machine can automatically connect to when roaming mode is enabled. See [Networks](#networks). `roaming_mode`: If enabled, lets the machine connect to additional configured networks. See [Networks](#networks). |
-
-#### Networks
-
-For an already-online device, you can add additional networks to the machine's [`viam-agent` configuration](/configure/agent/#configuration).
-It's primarily useful for a machine that might move between different WiFi networks, so the machine can automatically connect when moved between locations.
-
-To add additional networks add them using the JSON editor for your device's config in the Viam app.
-
-{{< alert title="Important" color="note" >}}
-You must enable `roaming_mode` in the [`agent-provisioning` configuration](#configuration) to allow the machine to connect to the specified networks.
-Note that if you are using the Viam app to add networks to a machine's configuration, the machine will need to be connected to the internet to retrieve the configuration information containing the network credentials before it can use them.
-{{< /alert >}}
-
-If `roaming_mode` is enabled, `agent-provisioning` will try to connect to each specified network in order of `priority` from highest to lowest.
-If the highest-priority network is not available or the machine can connect but internet is not available, `viam-agent` will then attempt to connect to the next-highest network, and so on until all configured networks have been tried.
-
-
-| Name | Type | Description |
-| ---------- | ------ | ----------- |
-| `type` | string | The type of the network. Options: `"wifi"`|
-| `ssid` | string | The network's SSID. |
-| `psk` | string | The network pass key. |
-| `priority` | int | Priority to choose the network with. Values between -999 and 999. Default: `0`. |
-
-The following configuration defines the connection information and credentials for two WiFi networks named `fallbackNetOne` and `fallbackNetTwo`:
-
-```json {class="line-numbers linkable-line-numbers"}
-...
-"agent": {
- "agent-provisioning": {
- ...
- "attributes": {
- ...
- "roaming_mode": true,
- "networks": [
- {
- "type": "wifi",
- "ssid": "fallbackNetOne",
- "psk": "myFirstPassword",
- "priority": 30
- },
- {
- "type": "wifi",
- "ssid": "fallbackNetTwo",
- "psk": "mySecondPassword",
- "priority": 10
- }
- ]
- }
- }
-}
-```
-
-### `agent-syscfg`
-
-`agent-syscfg` is a subsystem (plugin) for `viam-agent` that provides a number of system and operating system configuration helpers.
-
-
-| Option | Type | Required? | Description |
-| ------ | ---- | --------- | ----------- |
-| `release_channel` | string | Optional | `agent-syscfg` is semantically versioned and is tested before release. Releases happen infrequently. When set to `"stable"`, `viam-agent` will automatically upgrade when a new version is released. Options: `"stable"` (default), `"latest"`. |
-| `pin_version` | string | Optional | "Lock" the subsystem to a specific version (as provided by the release channel). If set, no automatic upgrades will be performed until the setting is updated to a new version (or removed to revert to the release channel). If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `pin_url` | string | Optional | Ignore normal version selection and directly download from the specified URL. If set, no automatic upgrades will be performed until the setting is updated to a new URL (or removed to revert to the release channel). Typically this is only used for testing/troubleshooting. If both `pin_url` and `pin_version` is set, `pin_url` will be used. Default: `""`. |
-| `disable_subsystem` | boolean | Optional | When set to `true` it disables the `agent-syscfg` subsystem. |
-| `attributes` | object | Optional | `logging`: parameters for logging`system_max_use`: sets the maximum disk space `journald` will user for persistent log storage. Numeric values are in bytes, with optional single letter suffix for larger units, for example. K, M, or G. Default: `512M`. `runtime_max_use`: sets the runtime/temporary limit. Numeric values are in bytes, with optional single letter suffix for larger units, for example. K, M, or G. Default: `512M`. `disable`: If `false` (default), Viam enforces the given logging configurations. If `true`: Viam does NOT modify logging configuration, and the operating system defaults are used. `upgrades`: using `upgrades` installs the `unattended-upgrades` package, and replace `20auto-upgrades` and `50unattended-upgrades` in /etc/apt/apt.conf.d/ , with the latter's Origins-Pattern list being generated automatically from configured repositories on the system, so custom repos (at the time the setting is enabled) will be included.`type`: Configured unattended upgrades for Debian bullseye and bookworm. Options: `""` (no effect), `"disable"` (disables automatic upgrades), `"security"` (only enables updates from sources with "security" in their codename, ex: `bookworm-security`), `"all"` (enable updates from all configured sources). |
-
-The following configuration allows all upgrades from configured sources and sets the maximum disk space `journald` will user for persistent log storage to 128MB and the runtime limit to 96MB:
-
-```json {class="line-numbers linkable-line-numbers"}
-"agent-syscfg": {
- "release_channel": "stable",
- "attributes": {
- "logging": {
- "disable": false,
- "system_max_use": "128M",
- "runtime_max_use": "96M"
- },
- "upgrades": {
- "type": "all"
- }
- }
-}
-```
-
-## Version management for `viam-agent` and `viam-server`
-
-`viam-agent` automatically updates both itself, its subsystems, and `viam-server` as new updates are released.
-You can configure update behavior for the Agent and `viam-server` using the [Viam app](https://app.viam.com/).
-
-To use a specific version of `viam-agent` and `viam-server`, you can pin the version.
-
-{{< alert title="Important" color="note" >}}
-When `viam-agent` updates itself, you must [restart `viam-agent`](/installation/manage-viam-agent/) or reboot in order to use the new version.
-When you stop or restart `viam-agent`, the agent will stop or restart `viam-server` as well.
-
-When `viam-server` updates itself, you must restart `viam-server` in order to use the new version.
-You can restart `viam-server` from the machine's part status dropdown to the right of your machine’s name on its page in the Viam app.
-
-{{}}
-
-{{< /alert >}}
-
-For more information on managing `viam-agent` see:
-
-{{< cards >}}
-{{% card link="/installation/manage-viam-agent/" %}}
-{{< /cards >}}
-
-## Agent logs
-
-`viam-agent` writes log messages to the [Viam app](https://app.viam.com/).
-You can find these messages on the [**LOGS** tab](/cloud/machines/#logs) of your machine's page.
-
-`viam-agent` only sends messages when your machine is online and connected to the internet.
-If your machine is offline, log messages are queued and are sent to the Viam app once your machine reconnects to the internet.
-
-These log messages include when `viam-server` is stopped and started, the status of agent subsystems, and any errors or warnings encountered during operation.
-
-## Next Steps
-
-To see how to provision machines using `viam-agent`, see:
-
-{{< cards >}}
-{{% card link="/fleet/provision/" %}}
-{{< /cards >}}
diff --git a/docs/configure/processes.md b/docs/configure/processes.md
deleted file mode 100644
index b9c0d2618c9..00000000000
--- a/docs/configure/processes.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-title: "Configure a managed process"
-linkTitle: "Managed Processes"
-weight: 50
-type: "docs"
-description: "Configure a process to run a program when your machine is online."
-tags: ["processes"]
-aliases:
- - /build/configure/processes/
-date: "2022-01-01"
-updated: "2024-11-01"
----
-
-To run a program or control code when your machine is online, configure a _{{< glossary_tooltip term_id="process" text="process" >}}_.
-The process is managed by `viam-server`.
-You can configure processes to run once upon startup or indefinitely.
-
-{{< alert title="In this page" color="note" >}}
-{{% toc %}}
-{{< /alert >}}
-
-## Configure a process
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Click the **+** icon next to your machine part in the left-hand menu and select **Process**.
-
-In the process configuration panel, configure the attributes for your process:
-
-
-| Attribute | Type | Required? | Description |
-| --------- | ---- | --------- | ----------- |
-| Executable (`name`) | string | **Required** | The command you want to execute when your machine connects to the server. On many operating systems, you can find the executable path of commands by running `which `. |
-| Arguments (`args`) | string[] | Optional | Arguments to follow the command. |
-| Working directory (`cwd`) | string | Optional | Where you want the process to execute. Defaults to the directory where `viam-server` executes. |
-| `username` (not available in builder mode) | string | Optional | Run this process as a different user. Example: `"username": "ubuntu"`. |
-| `env` (not available in builder mode) | Map | Optional | Environment variables for the process. Environment variables are encrypted in transit but are stored in plain text in the configuration file that resides on the machine. Example: `"environment": { "SVC_API_KEY":"VALUE" }`. |
-| Logging (`log`) | boolean | Optional | Toggle logging of errors and other messages on or off. Default: `false`. |
-| Execute once (`one_shot`) | boolean | Optional | Toggle whether to execute the command just once or keep running the process indefinitely.If `true`, the process executes once at `viam-server` startup. Until the process completes, `viam-server` startup is blocked and the machine appears offline in the [Viam app](https://app.viam.com). This machine should only be used for quick processes. If `false`, the process continues to run and is restarted if the process crashes or is killed. The process does not block `viam-server`. Default: `false`. |
-
-Click **Save** in the upper right corner of the screen.
-
-### Example
-
-The following example executes the command `python3 my_cool_script.py` in your /home/myName/project/ directory every time a machine boots, and restarts the process if it stops running.
-
-{{< tabs >}}
-{{% tab name="Builder mode" %}}
-
-![The CONFIGURE tab with a process called run-my-code configured. The executable is python3, the argument is my_cool_script.py, and the working directory is /home/myName/project. Logging is turned on and execute once is turned off.](/build/configure/process-fancy.png)
-
-{{% /tab %}}
-{{% tab name="JSON" %}}
-
-```json
-"processes": [
- {
- "id": "run-my-code",
- "log": true,
- "name": "python3",
- "args": [
- "my_cool_script.py"
- ],
- "cwd": "/home/myName/project/"
- }
- ]
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## Set up dependencies
-
-If you are configuring a process that requires dependencies, such as the Viam SDKs, you must install those dependencies so `viam-server` has access to them.
-
-For Python scripts, we recommend you install dependencies into the folder that contains the code you want to execute:
-
-```sh {class="command-line" data-prompt="$"}
-sudo apt install -y python3-pip
-pip3 install --target=machine viam-sdk
-```
diff --git a/docs/configure/triggers.md b/docs/configure/triggers.md
deleted file mode 100644
index 07c29863624..00000000000
--- a/docs/configure/triggers.md
+++ /dev/null
@@ -1,491 +0,0 @@
----
-title: "Configure a Trigger"
-linkTitle: "Triggers"
-weight: 50
-type: "docs"
-description: "Configure a trigger to trigger actions when data is sent from your machine to the cloud, or when your machine's internet connectivity changes."
-tags: ["triggers"]
-aliases:
- - /build/configure/webhooks/
- - /build/configure/triggers/
-date: "2024-10-17"
-# updated: "" # When the content was last entirely checked
----
-
-Triggers allow you to send webhook requests or emails for the following events:
-
-- **Data has been synced to the cloud**: trigger when data from the machine is synced
-- **Part is online**: trigger continuously at a specified interval while the {{< glossary_tooltip term_id="part" text="machine part" >}} is online
-- **Part is offline**: trigger continuously at a specified interval while the machine part is offline
-- **Conditional data ingestion**: trigger any time data is captured from a specified component with a specified method and condition
-
-For example, you can configure a trigger to send you a notification when your robot's sensor collects a new reading.
-
-To configure a trigger:
-
-{{< tabs >}}
-{{% tab name="Builder mode" %}}
-
-1. Go to the **CONFIGURE** tab of your machine on the [Viam app](https://app.viam.com).
- Click the **+** (Create) button in the left side menu and select **Trigger**.
-
- {{}}
-
-2. Name the trigger and click **Create**.
-
-3. Select trigger **Type**.
- For some types you can configure additional attributes:
-
-{{< tabs name="Types of Triggers" >}}
-{{% tab name="Data synced to cloud" %}}
-
-Select the data types for which the Trigger should send requests.
-Whenever data of the specified data types is ingested, a `POST` request will be sent.
-
-{{% /tab %}}
-{{% tab name="Conditional data ingestion" %}}
-
-Select the component you want to capture data from and the method you want to capture data from.
-Then, add any conditions.
-
-These can include a key, a value, and a logical operator.
-For example, a trigger configured to fire when data is captured from the motor `motor-1`'s `IsPowered` method when `is_on` is equal to `True`:
-
-{{}}
-
-For more information, see [Conditions](#conditions).
-
-{{% alert title="Note" color="note" %}}
-You must [configure data capture](/services/data/) for your component to use this trigger.
-{{% /alert %}}
-
-{{% /tab %}}
-{{< /tabs >}}
-
-4. Add **Webhooks** or **Emails**.
-
-{{< tabs name="Notifications types" >}}
-{{% tab name="Webhooks" %}}
-
-Click **Add Webhook**.
-Add the URL of your cloud function or lambda.
-Configure the time between notifications.
-
-![The trigger configured with an example URL in the Viam app.](/build/configure/trigger-configured.png)
-
-{{% /tab %}}
-{{% tab name="Emails" %}}
-
-Click **Add Email**.
-Add the email you wish to be notified whenever this trigger is triggered.
-Configure the time between notifications.
-
-![The trigger configured with an example email in the Viam app.](/build/configure/trigger-configured-email.png)
-
-{{% /tab %}}
-{{< /tabs >}}
-{{% /tab %}}
-{{% tab name="JSON mode" %}}
-
-To configure your trigger by using **JSON** mode instead of **Builder** mode, paste one of the following JSON templates into your JSON config.
-`"triggers"` is a top-level section, similar to `"components"` or `"services"`.
-
-{{< tabs >}}
-{{% tab name="JSON Template: Data Synced" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
- "triggers": [
- {
- "name": "",
- "event": {
- "type": "part_data_ingested",
- "data_ingested": {
- "data_types": ["binary", "tabular", "file"]
- }
- },
- "notifications": [
- {
- "type": "webhook",
- "value": "https://1abcde2ab3cd4efg5abcdefgh10zyxwv.lambda-url.us-east-1.on.aws",
- "seconds_between_notifications":
- }
- ]
- }
- ]
-```
-
-{{% /tab %}}
-{{% tab name="JSON Template: Part Online" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
- "triggers": [
- {
- "name": "",
- "event": {
- "type": "part_online"
- },
- "notifications": [
- {
- "type": "webhook",
- "value": "",
- "seconds_between_notifications":
- }
- ]
- }
- ]
-```
-
-{{% /tab %}}
-{{% tab name="JSON Template: Part Offline" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
- "triggers": [
- {
- "name": "",
- "event": {
- "type": "part_offline"
- },
- "notifications": [
- {
- "type": "webhook",
- "value": "",
- "seconds_between_notifications":
- }
- ]
- }
- ]
-```
-
-{{% /tab %}}
-{{% tab name="JSON Template: Conditional Data Ingestion" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-"triggers": [
- {
- "name": "",
- "event": {
- "type": "conditional_data_ingested",
- "conditional": {
- "data_capture_method": "::",
- "condition": {
- "evals": [
- {
- "operator": "",
- "value":
- }
- ]
- }
- }
- },
- "notifications": [
- {
- "type": "email",
- "value": "",
- "seconds_between_notifications":
- }
- ]
- }
-]
-
-```
-
-{{% /tab %}}
-{{% tab name="JSON Example" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "components": [
- {
- "name": "local",
- "model": "pi",
- "type": "board",
- "namespace": "rdk",
- "attributes": {},
- "depends_on": []
- },
- {
- "name": "my_temp_sensor",
- "model": "bme280",
- "type": "sensor",
- "namespace": "rdk",
- "attributes": {},
- "depends_on": [],
- "service_configs": [
- {
- "type": "data_manager",
- "attributes": {
- "capture_methods": [
- {
- "method": "Readings",
- "additional_params": {},
- "capture_frequency_hz": 0.017
- }
- ]
- }
- }
- ]
- }
- ],
- "triggers": [
- {
- "name": "trigger-1",
- "event": {
- "type": "part_data_ingested",
- "data_ingested": {
- "data_types": ["binary", "tabular", "file"]
- }
- },
- "notifications": [
- {
- "type": "webhook",
- "value": "",
- "seconds_between_notifications": 0
- }
- ]
- }
- ]
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-{{% /tab %}}
-{{< /tabs >}}
-
-The following attributes are available for triggers:
-
-
-| Name | Type | Required? | Description |
-| ---- | ---- | --------- | ----------- |
-| `name` | string | **Required** | The name of the trigger |
-| `event` | object | **Required** | The trigger event object: `type`: The type of the event to trigger on. Options: `part_online`, `part_offline`, `part_data_ingested`, `conditional_data_ingested`. `data_types`: Required with `type` `part_data_ingested`. The data types that trigger the event. Options: `binary`, `tabular`, `file`, `unspecified`. `conditional`: Required with `type` `conditional_data_ingested`. See [Conditions](#conditions) for more information. |
-| `notifications` | object | **Required** | The notifications object: `type`: The type of the notification. Options: `webhook`, `email` `value`: The URL to send the request to or the email address to notify. `seconds_between_notifications`: The interval between notifications in seconds. |
-
-#### Conditions
-
-The `conditional` object for the `conditional_data_ingested` trigger includes the following options:
-
-
-| Name | Type | Required? | Description |
-| ---- | ---- | --------- | ----------- |
-| `data_capture_method` | string | **Required** | The method of data capture to trigger on. Example: `sensor::Readings`. |
-| `condition` | object | Optional | Any additional conditions for the method to fire the trigger. Leave out this object for the trigger to fire any time there is data synced. Options: `evals`:`operator`: Logical operator for the condition. `value`: An object, string, or integer that specifies the value of the method of the condition, along with the key or nested keys of the measurements in data capture. |
-
-Options for `operator`:
-
-| Name | Description |
-| ----- | ------------------------ |
-| `lt` | Less than |
-| `gt` | Greater than |
-| `lte` | Less than or equal to |
-| `gte` | Greater than or equal to |
-| `eq` | Equals |
-| `neq` | Does not equal |
-
-Examples:
-
-{{< tabs >}}
-{{% tab name="1 level of nesting" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-"condition": {
- "evals": [
- {
- "operator": "lt",
- "value": {
- "Line-Neutral AC RMS Voltage": 130
- }
- }
- ]
-}
-```
-
-This eval would trigger for the following sensor reading:
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "readings": {
- "Line-Neutral AC RMS Voltage": 100
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="2 levels of nesting" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-"condition": {
- "evals": [
- {
- "operator": "lt",
- "value": {
- "coordinate": {
- "latitude": 50
- }
- }
- }
- ]
-}
-```
-
-This eval would trigger for the following sensor reading:
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "readings": {
- "coordinate": {
- "latitude": 40
- }
- }
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-5. Write your cloud function or lambda to process the request from `viam-server`.
- You can use your cloud function or lambda to interact with any external API such as, for example, Twilio, PagerDuty, or Zapier.
- The following example function prints the received headers:
-
- {{< tabs >}}
- {{% tab name="Flask" %}}
-
-```python {class="line-numbers linkable-line-numbers" }
-from flask import Flask, request
-
-app = Flask(__name__)
-
-
-@app.route("/", methods=['GET', 'POST'])
-def trigger():
- headers = request.headers
- data = {}
- if request.data:
- data = request.json
- payload = {
- "Org-Id": headers.get('org-id', 'no value'),
- "Organization-Name": headers.get('organization-name', '') or
- data.get('org_name', 'no value'),
- "Location-Id": headers.get('location-id', 'no value'),
- "Location-Name": headers.get('location-name', '') or
- data.get('location_name', 'no value'),
- "Part-Id": headers.get('part-id', 'no value'),
- "Part-Name": headers.get('part-name', 'no value'),
- "Robot-Id": headers.get('robot-id', 'no value'),
- "Machine-Name": headers.get('machine-name', '') or
- data.get('machine_name', 'no value'),
- "Component-Type": data.get('component_type', 'no value'),
- "Component-Name": data.get('component_name', 'no value'),
- "Method-Name": data.get('method_name', 'no value'),
- "Min-Time-Received": data.get('min_time_received', 'no value'),
- "Max-Time-Received": data.get('max_time_received', 'no value'),
- "Data-Type": data.get('data_type', 'no value'),
- "File-Id": data.get('file_id', 'no value'),
- "Trigger-Condition": data.get("trigger_condition", 'no value'),
- "Data": data.get('data', 'no value')
- }
- print(payload)
-
- return payload
-
-
-if __name__ == '__main__':
- app.run(host='0.0.0.0', port=8080)
-```
-
-{{% /tab %}}
-{{% tab name="functions_framework" %}}
-
-```python {class="line-numbers linkable-line-numbers"}
-import functions_framework
-import requests
-import time
-
-
-@functions_framework.http
-def hello_http(request):
- headers = request.headers
- data = {}
- if request.data:
- data = request.json
- payload = {
- "Org-Id": headers.get("org-id", "no value"),
- "Organization-Name": headers.get("organization-name", "")
- or data.get("org_name", "no value"),
- "Location-Id": headers.get("location-id", "no value"),
- "Location-Name": headers.get("location-name", "")
- or data.get("location_name", "no value"),
- "Part-Id": headers.get("part-id", "no value"),
- "Part-Name": headers.get("part-name", "no value"),
- "Robot-Id": headers.get("robot-id", "no value"),
- "Machine-Name": headers.get("machine-name", "")
- or data.get("machine_name", "no value"),
- "Component-Type": data.get("component_type", "no value"),
- "Component-Name": data.get("component_name", "no value"),
- "Method-Name": data.get("method_name", "no value"),
- "Min-Time-Received": data.get("min_time_received", "no value"),
- "Max-Time-Received": data.get("max_time_received", "no value"),
- "Data-Type": data.get("data_type", "no value"),
- "File-Id": data.get('file_id', "no value"),
- "Trigger-Condition": data.get("trigger_condition", "no value"),
- "Data": data.get('data', "no value")
- }
- print(payload)
-
- return 'Received headers: {}'.format(payload)
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## Returned headers
-
-When a trigger occurs, Viam sends a HTTP request to the URL you specified for the trigger:
-
-
-| Trigger type | HTTP Method |
-| ------------ | ----------- |
-| `part_data_ingested` | POST |
-| `conditional_data_ingested` | POST |
-| `part_online` | GET |
-| `part_offline` | GET |
-
-The request includes the following headers:
-
-
-| Header Key | Description | Trigger types |
-| ---------- | ----------- | ------------- |
-| `Org-Id` | The ID of the organization that triggered the request. | all |
-| `Organization-Name` | The name of the organization that triggered the request. | `part_online`, `part_offline` |
-| `Location-Id` | The location of the machine that triggered the request. | all |
-| `Location-Name` | The location of the machine that triggered the request. | `part_online`, `part_offline` |
-| `Part-Id` | The part of the machine that triggered the request. | all |
-| `Machine-Name` | The name of the machine that triggered the request. | `part_online`, `part_offline` |
-| `Robot-Id` | The ID of the machine that triggered the request. | all |
-
-The request body includes the following data:
-
-
-| Data Key | Description | Trigger types |
-| -------- | ----------- | ------------- |
-| `component_name` | The name of the component for which data was ingested. | `part_data_ingested`, `conditional_data_ingested` |
-| `component_type` | The type of component for which data was ingested. | `part_data_ingested`, `conditional_data_ingested` |
-| `method_name` | The name of the method from which data was ingested. | `part_data_ingested`, `conditional_data_ingested` |
-| `min_time_received` | Indicates the earliest time a piece of data was received. | `part_data_ingested` |
-| `max_time_received` | Indicates the latest time a piece of data was received. | `part_data_ingested` |
-| `method_name` | The name of the method that triggered the request. | `conditional_data_ingested` |
-| `machine_name` | The name of the machine that triggered the request. | `part_data_ingested`, `conditional_data_ingested` |
-| `location_name` | The location of the machine that triggered the request. | `part_data_ingested`, `conditional_data_ingested` |
-| `org_name` | The name of the organization that triggered the request. | `part_data_ingested`, `conditional_data_ingested` |
-| `file_id` | The id of the file that was ingested. | `part_data_ingested` |
-| `trigger_condition` | The condition that triggered the request. | `conditional_data_ingested` |
-| `data` | The ingested sensor data. Includes `metadata` with `received_at` and `requested_at` timestamps and `data` in the form `map[string]any`. | `part_data_ingested`, `conditional_data_ingested` (sensor data) |
-
-## Next steps
-
-To see an example project that uses triggers to send email notification, see the [Monitor Job Site Helmet Usage with Computer Vision tutorial](/tutorials/projects/helmet/#configure-a-trigger-on-your-machine).
-
-{{< cards >}}
-{{% card link="/tutorials/projects/helmet/" %}}
-{{< /cards >}}
diff --git a/docs/connect/_index.md b/docs/connect/_index.md
new file mode 100644
index 00000000000..3f50898ccdc
--- /dev/null
+++ b/docs/connect/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Connect devices"
+title: "Connect your devices"
+weight: 100
+layout: "docs"
+type: "docs"
+no_list: true
+open_on_desktop: true
+overview: true
+---
diff --git a/docs/connect/get-started/_index.md b/docs/connect/get-started/_index.md
new file mode 100644
index 00000000000..89edbe1cdc3
--- /dev/null
+++ b/docs/connect/get-started/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Get Started"
+title: "Get Started"
+weight: 100
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/connect/get-started/other-hardware.md b/docs/connect/get-started/other-hardware.md
new file mode 100644
index 00000000000..496dae24f90
--- /dev/null
+++ b/docs/connect/get-started/other-hardware.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Integrate other hardware"
+title: "Integrate other hardware"
+weight: 30
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/internals/robot-to-cloud-comms.md b/docs/connect/get-started/robot-to-cloud-comms.md
similarity index 100%
rename from docs/internals/robot-to-cloud-comms.md
rename to docs/connect/get-started/robot-to-cloud-comms.md
diff --git a/docs/connect/get-started/setup-many.md b/docs/connect/get-started/setup-many.md
new file mode 100644
index 00000000000..0b659609940
--- /dev/null
+++ b/docs/connect/get-started/setup-many.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Set up multiple machines"
+title: "Set up multiple machines"
+weight: 50
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/connect/get-started/setup.md b/docs/connect/get-started/setup.md
new file mode 100644
index 00000000000..2968b54e8f6
--- /dev/null
+++ b/docs/connect/get-started/setup.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Set up a machine"
+title: "Set up a machine"
+weight: 10
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/connect/get-started/software-capabilities.md b/docs/connect/get-started/software-capabilities.md
new file mode 100644
index 00000000000..0565ddedcf4
--- /dev/null
+++ b/docs/connect/get-started/software-capabilities.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Add software capabilities"
+title: "Add software capabilities"
+weight: 40
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/connect/get-started/supported-hardware.md b/docs/connect/get-started/supported-hardware.md
new file mode 100644
index 00000000000..b2160f0f2e3
--- /dev/null
+++ b/docs/connect/get-started/supported-hardware.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Integrate supported hardware"
+title: "Integrate supported hardware"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/connect/reference/_index.md b/docs/connect/reference/_index.md
new file mode 100644
index 00000000000..a11cc4cbac0
--- /dev/null
+++ b/docs/connect/reference/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Reference"
+title: "Reference"
+weight: 300
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/connect/reference/architecture.md b/docs/connect/reference/architecture.md
new file mode 100644
index 00000000000..3aa5578f2bb
--- /dev/null
+++ b/docs/connect/reference/architecture.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Architecture"
+title: "Architecture"
+weight: 10
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/internals/local-configuration-file.md b/docs/connect/reference/local-configuration-file.md
similarity index 99%
rename from docs/internals/local-configuration-file.md
rename to docs/connect/reference/local-configuration-file.md
index 9a26b035e7e..a532ba3a2b2 100644
--- a/docs/internals/local-configuration-file.md
+++ b/docs/connect/reference/local-configuration-file.md
@@ -1,7 +1,7 @@
---
title: "Local Configuration File"
linkTitle: "Local Configuration File"
-weight: 2
+weight: 20
no_list: true
type: docs
icon: true
diff --git a/docs/data/_index.md b/docs/data/_index.md
new file mode 100644
index 00000000000..4770cfafdc2
--- /dev/null
+++ b/docs/data/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Work with data"
+title: "Work with data"
+weight: 400
+layout: "docs"
+type: "docs"
+no_list: true
+open_on_desktop: true
+overview: true
+---
diff --git a/docs/data/data/_index.md b/docs/data/data/_index.md
new file mode 100644
index 00000000000..89a91221fcf
--- /dev/null
+++ b/docs/data/data/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Manage data"
+title: "Manage data"
+weight: 10
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/data/data/advanced/_index.md b/docs/data/data/advanced/_index.md
new file mode 100644
index 00000000000..233056f4cda
--- /dev/null
+++ b/docs/data/data/advanced/_index.md
@@ -0,0 +1,8 @@
+---
+linkTitle: "Advanced"
+title: "Advanced"
+weight: 200
+layout: "empty"
+type: "docs"
+empty_page: true
+---
diff --git a/docs/data/data/advanced/conditional-sync.md b/docs/data/data/advanced/conditional-sync.md
new file mode 100644
index 00000000000..85cf099dc50
--- /dev/null
+++ b/docs/data/data/advanced/conditional-sync.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Conditional sync"
+title: "Conditional sync"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/data/advanced/filter-before-sync.md b/docs/data/data/advanced/filter-before-sync.md
new file mode 100644
index 00000000000..d283ffb4c1b
--- /dev/null
+++ b/docs/data/data/advanced/filter-before-sync.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Filter data"
+title: "Filter data before sync"
+weight: 10
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/data/capture-sync.md b/docs/data/data/capture-sync.md
new file mode 100644
index 00000000000..681aeae47c1
--- /dev/null
+++ b/docs/data/data/capture-sync.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Capture and sync"
+title: "Capture and sync data"
+weight: 10
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/data/export.md b/docs/data/data/export.md
new file mode 100644
index 00000000000..713fa40b326
--- /dev/null
+++ b/docs/data/data/export.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Export data"
+title: "Export data"
+weight: 40
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/data/query.md b/docs/data/data/query.md
new file mode 100644
index 00000000000..1919558fa3c
--- /dev/null
+++ b/docs/data/data/query.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Query data"
+title: "Query data"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/data/visualize.md b/docs/data/data/visualize.md
new file mode 100644
index 00000000000..50e52c5b54c
--- /dev/null
+++ b/docs/data/data/visualize.md
@@ -0,0 +1,9 @@
+---
+linkTitle: "Visualize data"
+title: "Visualize data"
+weight: 20
+layout: "docs"
+type: "docs"
+no_list: true
+description: "TODO"
+---
diff --git a/docs/data/reference/_index.md b/docs/data/reference/_index.md
new file mode 100644
index 00000000000..a11cc4cbac0
--- /dev/null
+++ b/docs/data/reference/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Reference"
+title: "Reference"
+weight: 300
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/appendix/apis/data-client.md b/docs/data/reference/data-client.md
similarity index 99%
rename from docs/appendix/apis/data-client.md
rename to docs/data/reference/data-client.md
index c04d26e03a5..adeb8e6a050 100644
--- a/docs/appendix/apis/data-client.md
+++ b/docs/data/reference/data-client.md
@@ -1,6 +1,6 @@
---
title: "Upload and Retrieve Data with Viam's Data Client API"
-linkTitle: "Data Client"
+linkTitle: "Data Client API"
weight: 10
type: "docs"
description: "Use the data client API to upload and retrieve data directly to the Viam app."
diff --git a/docs/services/data/_index.md b/docs/data/reference/data/_index.md
similarity index 99%
rename from docs/services/data/_index.md
rename to docs/data/reference/data/_index.md
index ea76f012efc..9c266f63da5 100644
--- a/docs/services/data/_index.md
+++ b/docs/data/reference/data/_index.md
@@ -1,6 +1,6 @@
---
title: "Data Management Service"
-linkTitle: "Data Management"
+linkTitle: "Data Management Service"
description: "Configure the data management service to capture data from your components and services and sync it to the cloud."
weight: 10
type: "docs"
diff --git a/docs/dev/_index.md b/docs/dev/_index.md
new file mode 100644
index 00000000000..da9c4a4f2d0
--- /dev/null
+++ b/docs/dev/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Dev tools"
+title: "Dev tools"
+weight: 600
+layout: "docs"
+type: "docs"
+no_list: true
+open_on_desktop: true
+overview: true
+---
diff --git a/docs/cli.md b/docs/dev/cli.md
similarity index 99%
rename from docs/cli.md
rename to docs/dev/cli.md
index 122fcac64f2..a39479cbeb5 100644
--- a/docs/cli.md
+++ b/docs/dev/cli.md
@@ -1,7 +1,7 @@
---
title: "Viam CLI"
linkTitle: "CLI"
-weight: 700
+weight: 10
type: "docs"
no_list: true
description: "Manage and control your machines from the command line."
@@ -9,7 +9,6 @@ aliases:
- "/build/program/cli"
- /manage/cli/
- /fleet/cli/
-menuindent: true
images: ["/platform/cli.png"]
date: "2024-08-23"
# updated: "" # When the content was last entirely checked
diff --git a/docs/how-tos/_index.md b/docs/dev/how-tos/_index.md
similarity index 99%
rename from docs/how-tos/_index.md
rename to docs/dev/how-tos/_index.md
index 4c9e8c2cd7f..7c97a08db8f 100644
--- a/docs/how-tos/_index.md
+++ b/docs/dev/how-tos/_index.md
@@ -1,10 +1,9 @@
---
title: "How-to Guides"
linkTitle: "How-to Guides"
-weight: 200
+weight: 20
type: "docs"
images: ["/registry/module-puzzle-piece.svg"]
-#layout: "howto"
description: "Follow instructions for common tasks and workflows."
no_list: true
notoc: true
diff --git a/docs/dev/reference/_index.md b/docs/dev/reference/_index.md
new file mode 100644
index 00000000000..a11cc4cbac0
--- /dev/null
+++ b/docs/dev/reference/_index.md
@@ -0,0 +1,10 @@
+---
+linkTitle: "Reference"
+title: "Reference"
+weight: 300
+layout: "empty"
+type: "docs"
+empty_page: true
+open_on_desktop: true
+header_only: true
+---
diff --git a/docs/appendix/glossary/api-namespace-triplet.md b/docs/dev/reference/glossary/api-namespace-triplet.md
similarity index 100%
rename from docs/appendix/glossary/api-namespace-triplet.md
rename to docs/dev/reference/glossary/api-namespace-triplet.md
diff --git a/docs/appendix/glossary/attribute.md b/docs/dev/reference/glossary/attribute.md
similarity index 100%
rename from docs/appendix/glossary/attribute.md
rename to docs/dev/reference/glossary/attribute.md
diff --git a/docs/appendix/glossary/base.md b/docs/dev/reference/glossary/base.md
similarity index 100%
rename from docs/appendix/glossary/base.md
rename to docs/dev/reference/glossary/base.md
diff --git a/docs/appendix/glossary/board.md b/docs/dev/reference/glossary/board.md
similarity index 100%
rename from docs/appendix/glossary/board.md
rename to docs/dev/reference/glossary/board.md
diff --git a/docs/appendix/glossary/client-application.md b/docs/dev/reference/glossary/client-application.md
similarity index 100%
rename from docs/appendix/glossary/client-application.md
rename to docs/dev/reference/glossary/client-application.md
diff --git a/docs/appendix/glossary/component.md b/docs/dev/reference/glossary/component.md
similarity index 100%
rename from docs/appendix/glossary/component.md
rename to docs/dev/reference/glossary/component.md
diff --git a/docs/appendix/glossary/fragment.md b/docs/dev/reference/glossary/fragment.md
similarity index 100%
rename from docs/appendix/glossary/fragment.md
rename to docs/dev/reference/glossary/fragment.md
diff --git a/docs/appendix/glossary/frame-system.md b/docs/dev/reference/glossary/frame-system.md
similarity index 100%
rename from docs/appendix/glossary/frame-system.md
rename to docs/dev/reference/glossary/frame-system.md
diff --git a/docs/appendix/glossary/frame.md b/docs/dev/reference/glossary/frame.md
similarity index 100%
rename from docs/appendix/glossary/frame.md
rename to docs/dev/reference/glossary/frame.md
diff --git a/docs/appendix/glossary/gantry.md b/docs/dev/reference/glossary/gantry.md
similarity index 100%
rename from docs/appendix/glossary/gantry.md
rename to docs/dev/reference/glossary/gantry.md
diff --git a/docs/appendix/glossary/grpc.md b/docs/dev/reference/glossary/grpc.md
similarity index 100%
rename from docs/appendix/glossary/grpc.md
rename to docs/dev/reference/glossary/grpc.md
diff --git a/docs/appendix/glossary/index.md b/docs/dev/reference/glossary/index.md
similarity index 100%
rename from docs/appendix/glossary/index.md
rename to docs/dev/reference/glossary/index.md
diff --git a/docs/appendix/glossary/location.md b/docs/dev/reference/glossary/location.md
similarity index 100%
rename from docs/appendix/glossary/location.md
rename to docs/dev/reference/glossary/location.md
diff --git a/docs/appendix/glossary/machine-config.md b/docs/dev/reference/glossary/machine-config.md
similarity index 100%
rename from docs/appendix/glossary/machine-config.md
rename to docs/dev/reference/glossary/machine-config.md
diff --git a/docs/appendix/glossary/machine.md b/docs/dev/reference/glossary/machine.md
similarity index 100%
rename from docs/appendix/glossary/machine.md
rename to docs/dev/reference/glossary/machine.md
diff --git a/docs/appendix/glossary/model-namespace-triplet.md b/docs/dev/reference/glossary/model-namespace-triplet.md
similarity index 100%
rename from docs/appendix/glossary/model-namespace-triplet.md
rename to docs/dev/reference/glossary/model-namespace-triplet.md
diff --git a/docs/appendix/glossary/model.md b/docs/dev/reference/glossary/model.md
similarity index 100%
rename from docs/appendix/glossary/model.md
rename to docs/dev/reference/glossary/model.md
diff --git a/docs/appendix/glossary/modular-resource.md b/docs/dev/reference/glossary/modular-resource.md
similarity index 100%
rename from docs/appendix/glossary/modular-resource.md
rename to docs/dev/reference/glossary/modular-resource.md
diff --git a/docs/appendix/glossary/module.md b/docs/dev/reference/glossary/module.md
similarity index 100%
rename from docs/appendix/glossary/module.md
rename to docs/dev/reference/glossary/module.md
diff --git a/docs/appendix/glossary/mql.md b/docs/dev/reference/glossary/mql.md
similarity index 100%
rename from docs/appendix/glossary/mql.md
rename to docs/dev/reference/glossary/mql.md
diff --git a/docs/appendix/glossary/organization.md b/docs/dev/reference/glossary/organization.md
similarity index 100%
rename from docs/appendix/glossary/organization.md
rename to docs/dev/reference/glossary/organization.md
diff --git a/docs/appendix/glossary/part.md b/docs/dev/reference/glossary/part.md
similarity index 100%
rename from docs/appendix/glossary/part.md
rename to docs/dev/reference/glossary/part.md
diff --git a/docs/appendix/glossary/pin-number.md b/docs/dev/reference/glossary/pin-number.md
similarity index 100%
rename from docs/appendix/glossary/pin-number.md
rename to docs/dev/reference/glossary/pin-number.md
diff --git a/docs/appendix/glossary/process.md b/docs/dev/reference/glossary/process.md
similarity index 100%
rename from docs/appendix/glossary/process.md
rename to docs/dev/reference/glossary/process.md
diff --git a/docs/appendix/glossary/protobuf.md b/docs/dev/reference/glossary/protobuf.md
similarity index 100%
rename from docs/appendix/glossary/protobuf.md
rename to docs/dev/reference/glossary/protobuf.md
diff --git a/docs/appendix/glossary/rdk.md b/docs/dev/reference/glossary/rdk.md
similarity index 100%
rename from docs/appendix/glossary/rdk.md
rename to docs/dev/reference/glossary/rdk.md
diff --git a/docs/appendix/glossary/remote-part.md b/docs/dev/reference/glossary/remote-part.md
similarity index 100%
rename from docs/appendix/glossary/remote-part.md
rename to docs/dev/reference/glossary/remote-part.md
diff --git a/docs/appendix/glossary/resource.md b/docs/dev/reference/glossary/resource.md
similarity index 100%
rename from docs/appendix/glossary/resource.md
rename to docs/dev/reference/glossary/resource.md
diff --git a/docs/appendix/glossary/sdk.md b/docs/dev/reference/glossary/sdk.md
similarity index 100%
rename from docs/appendix/glossary/sdk.md
rename to docs/dev/reference/glossary/sdk.md
diff --git a/docs/appendix/glossary/service.md b/docs/dev/reference/glossary/service.md
similarity index 100%
rename from docs/appendix/glossary/service.md
rename to docs/dev/reference/glossary/service.md
diff --git a/docs/appendix/glossary/setup.md b/docs/dev/reference/glossary/setup.md
similarity index 100%
rename from docs/appendix/glossary/setup.md
rename to docs/dev/reference/glossary/setup.md
diff --git a/docs/appendix/glossary/slam.md b/docs/dev/reference/glossary/slam.md
similarity index 100%
rename from docs/appendix/glossary/slam.md
rename to docs/dev/reference/glossary/slam.md
diff --git a/docs/appendix/glossary/smart-machine.md b/docs/dev/reference/glossary/smart-machine.md
similarity index 100%
rename from docs/appendix/glossary/smart-machine.md
rename to docs/dev/reference/glossary/smart-machine.md
diff --git a/docs/appendix/glossary/sql.md b/docs/dev/reference/glossary/sql.md
similarity index 100%
rename from docs/appendix/glossary/sql.md
rename to docs/dev/reference/glossary/sql.md
diff --git a/docs/appendix/glossary/subtype.md b/docs/dev/reference/glossary/subtype.md
similarity index 100%
rename from docs/appendix/glossary/subtype.md
rename to docs/dev/reference/glossary/subtype.md
diff --git a/docs/appendix/glossary/type.md b/docs/dev/reference/glossary/type.md
similarity index 100%
rename from docs/appendix/glossary/type.md
rename to docs/dev/reference/glossary/type.md
diff --git a/docs/appendix/glossary/viam-agent.md b/docs/dev/reference/glossary/viam-agent.md
similarity index 100%
rename from docs/appendix/glossary/viam-agent.md
rename to docs/dev/reference/glossary/viam-agent.md
diff --git a/docs/appendix/glossary/viam-micro-server.md b/docs/dev/reference/glossary/viam-micro-server.md
similarity index 100%
rename from docs/appendix/glossary/viam-micro-server.md
rename to docs/dev/reference/glossary/viam-micro-server.md
diff --git a/docs/appendix/glossary/viam-robot-api.md b/docs/dev/reference/glossary/viam-robot-api.md
similarity index 100%
rename from docs/appendix/glossary/viam-robot-api.md
rename to docs/dev/reference/glossary/viam-robot-api.md
diff --git a/docs/appendix/glossary/viam-server.md b/docs/dev/reference/glossary/viam-server.md
similarity index 100%
rename from docs/appendix/glossary/viam-server.md
rename to docs/dev/reference/glossary/viam-server.md
diff --git a/docs/appendix/glossary/web-sockets.md b/docs/dev/reference/glossary/web-sockets.md
similarity index 100%
rename from docs/appendix/glossary/web-sockets.md
rename to docs/dev/reference/glossary/web-sockets.md
diff --git a/docs/appendix/glossary/webrtc.md b/docs/dev/reference/glossary/webrtc.md
similarity index 100%
rename from docs/appendix/glossary/webrtc.md
rename to docs/dev/reference/glossary/webrtc.md
diff --git a/docs/sdks/_index.md b/docs/dev/reference/sdks/_index.md
similarity index 99%
rename from docs/sdks/_index.md
rename to docs/dev/reference/sdks/_index.md
index 2208e1f3d7e..36f5926b345 100644
--- a/docs/sdks/_index.md
+++ b/docs/dev/reference/sdks/_index.md
@@ -1,11 +1,10 @@
---
title: "Write control code with Viam SDKs"
linkTitle: "SDKs"
-weight: 650
+weight: 10
type: "docs"
description: "Program and control your machines in the languages you already know like Python, Go, TypeScript, C++, and Flutter."
no_list: true
-menuindent: true
images: ["/general/code.png"]
aliases:
- "product-overviews/sdk-as-client"
diff --git a/docs/sdks/connectivity.md b/docs/dev/reference/sdks/connectivity.md
similarity index 100%
rename from docs/sdks/connectivity.md
rename to docs/dev/reference/sdks/connectivity.md
diff --git a/docs/sdks/cpp.md b/docs/dev/reference/sdks/cpp.md
similarity index 100%
rename from docs/sdks/cpp.md
rename to docs/dev/reference/sdks/cpp.md
diff --git a/docs/sdks/flutter.md b/docs/dev/reference/sdks/flutter.md
similarity index 100%
rename from docs/sdks/flutter.md
rename to docs/dev/reference/sdks/flutter.md
diff --git a/docs/sdks/go.md b/docs/dev/reference/sdks/go.md
similarity index 100%
rename from docs/sdks/go.md
rename to docs/dev/reference/sdks/go.md
diff --git a/docs/sdks/python/_index.md b/docs/dev/reference/sdks/python/_index.md
similarity index 100%
rename from docs/sdks/python/_index.md
rename to docs/dev/reference/sdks/python/_index.md
diff --git a/docs/sdks/python/python-venv.md b/docs/dev/reference/sdks/python/python-venv.md
similarity index 100%
rename from docs/sdks/python/python-venv.md
rename to docs/dev/reference/sdks/python/python-venv.md
diff --git a/docs/sdks/typescript.md b/docs/dev/reference/sdks/typescript.md
similarity index 100%
rename from docs/sdks/typescript.md
rename to docs/dev/reference/sdks/typescript.md
diff --git a/docs/sdks/use-extra-params.md b/docs/dev/reference/sdks/use-extra-params.md
similarity index 100%
rename from docs/sdks/use-extra-params.md
rename to docs/dev/reference/sdks/use-extra-params.md
diff --git a/docs/appendix/troubleshooting.md b/docs/dev/troubleshooting.md
similarity index 99%
rename from docs/appendix/troubleshooting.md
rename to docs/dev/troubleshooting.md
index ad567fdcfc1..80019125cbb 100644
--- a/docs/appendix/troubleshooting.md
+++ b/docs/dev/troubleshooting.md
@@ -1,7 +1,7 @@
---
title: "Troubleshooting"
linkTitle: "Troubleshooting"
-weight: 40
+weight: 50
type: "docs"
description: "A guide to troubleshooting a Viam-based machine or system of machines with fixes to common problems."
date: "2022-01-01"
diff --git a/docs/tutorials/_index.md b/docs/dev/tutorials/_index.md
similarity index 98%
rename from docs/tutorials/_index.md
rename to docs/dev/tutorials/_index.md
index 4037a58f60e..fd1e87318cd 100644
--- a/docs/tutorials/_index.md
+++ b/docs/dev/tutorials/_index.md
@@ -1,7 +1,7 @@
---
title: "Tutorials"
linkTitle: "Tutorials"
-weight: 300
+weight: 30
type: docs
layout: "tutorials"
videos:
diff --git a/docs/tutorials/configure/_index.md b/docs/dev/tutorials/configure/_index.md
similarity index 100%
rename from docs/tutorials/configure/_index.md
rename to docs/dev/tutorials/configure/_index.md
diff --git a/docs/tutorials/configure/build-a-mock-robot.md b/docs/dev/tutorials/configure/build-a-mock-robot.md
similarity index 100%
rename from docs/tutorials/configure/build-a-mock-robot.md
rename to docs/dev/tutorials/configure/build-a-mock-robot.md
diff --git a/docs/tutorials/configure/configure-rover.md b/docs/dev/tutorials/configure/configure-rover.md
similarity index 100%
rename from docs/tutorials/configure/configure-rover.md
rename to docs/dev/tutorials/configure/configure-rover.md
diff --git a/docs/tutorials/configure/pet-photographer.md b/docs/dev/tutorials/configure/pet-photographer.md
similarity index 100%
rename from docs/tutorials/configure/pet-photographer.md
rename to docs/dev/tutorials/configure/pet-photographer.md
diff --git a/docs/tutorials/control/_index.md b/docs/dev/tutorials/control/_index.md
similarity index 100%
rename from docs/tutorials/control/_index.md
rename to docs/dev/tutorials/control/_index.md
diff --git a/docs/tutorials/control/air-quality-fleet.md b/docs/dev/tutorials/control/air-quality-fleet.md
similarity index 100%
rename from docs/tutorials/control/air-quality-fleet.md
rename to docs/dev/tutorials/control/air-quality-fleet.md
diff --git a/docs/tutorials/control/flutter-app.md b/docs/dev/tutorials/control/flutter-app.md
similarity index 100%
rename from docs/tutorials/control/flutter-app.md
rename to docs/dev/tutorials/control/flutter-app.md
diff --git a/docs/tutorials/control/gamepad.md b/docs/dev/tutorials/control/gamepad.md
similarity index 100%
rename from docs/tutorials/control/gamepad.md
rename to docs/dev/tutorials/control/gamepad.md
diff --git a/docs/tutorials/custom/_index.md b/docs/dev/tutorials/custom/_index.md
similarity index 100%
rename from docs/tutorials/custom/_index.md
rename to docs/dev/tutorials/custom/_index.md
diff --git a/docs/tutorials/custom/controlling-an-intermode-rover-canbus.md b/docs/dev/tutorials/custom/controlling-an-intermode-rover-canbus.md
similarity index 100%
rename from docs/tutorials/custom/controlling-an-intermode-rover-canbus.md
rename to docs/dev/tutorials/custom/controlling-an-intermode-rover-canbus.md
diff --git a/docs/tutorials/custom/custom-base-dog.md b/docs/dev/tutorials/custom/custom-base-dog.md
similarity index 100%
rename from docs/tutorials/custom/custom-base-dog.md
rename to docs/dev/tutorials/custom/custom-base-dog.md
diff --git a/docs/tutorials/get-started/_index.md b/docs/dev/tutorials/get-started/_index.md
similarity index 100%
rename from docs/tutorials/get-started/_index.md
rename to docs/dev/tutorials/get-started/_index.md
diff --git a/docs/tutorials/get-started/blink-an-led.md b/docs/dev/tutorials/get-started/blink-an-led.md
similarity index 100%
rename from docs/tutorials/get-started/blink-an-led.md
rename to docs/dev/tutorials/get-started/blink-an-led.md
diff --git a/docs/tutorials/get-started/confetti-bot.md b/docs/dev/tutorials/get-started/confetti-bot.md
similarity index 100%
rename from docs/tutorials/get-started/confetti-bot.md
rename to docs/dev/tutorials/get-started/confetti-bot.md
diff --git a/docs/tutorials/get-started/lazy-susan.md b/docs/dev/tutorials/get-started/lazy-susan.md
similarity index 100%
rename from docs/tutorials/get-started/lazy-susan.md
rename to docs/dev/tutorials/get-started/lazy-susan.md
diff --git a/docs/tutorials/get-started/servo-mousemover.md b/docs/dev/tutorials/get-started/servo-mousemover.md
similarity index 100%
rename from docs/tutorials/get-started/servo-mousemover.md
rename to docs/dev/tutorials/get-started/servo-mousemover.md
diff --git a/docs/tutorials/projects/_index.md b/docs/dev/tutorials/projects/_index.md
similarity index 100%
rename from docs/tutorials/projects/_index.md
rename to docs/dev/tutorials/projects/_index.md
diff --git a/docs/tutorials/projects/air-filtration.md b/docs/dev/tutorials/projects/air-filtration.md
similarity index 100%
rename from docs/tutorials/projects/air-filtration.md
rename to docs/dev/tutorials/projects/air-filtration.md
diff --git a/docs/tutorials/projects/bedtime-songs-bot.md b/docs/dev/tutorials/projects/bedtime-songs-bot.md
similarity index 100%
rename from docs/tutorials/projects/bedtime-songs-bot.md
rename to docs/dev/tutorials/projects/bedtime-songs-bot.md
diff --git a/docs/tutorials/projects/build-an-outdoor-rover.md b/docs/dev/tutorials/projects/build-an-outdoor-rover.md
similarity index 100%
rename from docs/tutorials/projects/build-an-outdoor-rover.md
rename to docs/dev/tutorials/projects/build-an-outdoor-rover.md
diff --git a/docs/tutorials/projects/claw-game.md b/docs/dev/tutorials/projects/claw-game.md
similarity index 100%
rename from docs/tutorials/projects/claw-game.md
rename to docs/dev/tutorials/projects/claw-game.md
diff --git a/docs/tutorials/projects/envvar.md b/docs/dev/tutorials/projects/envvar.md
similarity index 100%
rename from docs/tutorials/projects/envvar.md
rename to docs/dev/tutorials/projects/envvar.md
diff --git a/docs/tutorials/projects/foam-dart-launcher.md b/docs/dev/tutorials/projects/foam-dart-launcher.md
similarity index 100%
rename from docs/tutorials/projects/foam-dart-launcher.md
rename to docs/dev/tutorials/projects/foam-dart-launcher.md
diff --git a/docs/tutorials/projects/guardian.md b/docs/dev/tutorials/projects/guardian.md
similarity index 100%
rename from docs/tutorials/projects/guardian.md
rename to docs/dev/tutorials/projects/guardian.md
diff --git a/docs/tutorials/projects/helmet.md b/docs/dev/tutorials/projects/helmet.md
similarity index 100%
rename from docs/tutorials/projects/helmet.md
rename to docs/dev/tutorials/projects/helmet.md
diff --git a/docs/tutorials/projects/integrating-viam-with-openai.md b/docs/dev/tutorials/projects/integrating-viam-with-openai.md
similarity index 100%
rename from docs/tutorials/projects/integrating-viam-with-openai.md
rename to docs/dev/tutorials/projects/integrating-viam-with-openai.md
diff --git a/docs/tutorials/projects/light-up.md b/docs/dev/tutorials/projects/light-up.md
similarity index 100%
rename from docs/tutorials/projects/light-up.md
rename to docs/dev/tutorials/projects/light-up.md
diff --git a/docs/tutorials/projects/make-a-plant-watering-robot.md b/docs/dev/tutorials/projects/make-a-plant-watering-robot.md
similarity index 100%
rename from docs/tutorials/projects/make-a-plant-watering-robot.md
rename to docs/dev/tutorials/projects/make-a-plant-watering-robot.md
diff --git a/docs/tutorials/projects/modernize-retro-robot.md b/docs/dev/tutorials/projects/modernize-retro-robot.md
similarity index 100%
rename from docs/tutorials/projects/modernize-retro-robot.md
rename to docs/dev/tutorials/projects/modernize-retro-robot.md
diff --git a/docs/tutorials/projects/pet-treat-dispenser.md b/docs/dev/tutorials/projects/pet-treat-dispenser.md
similarity index 100%
rename from docs/tutorials/projects/pet-treat-dispenser.md
rename to docs/dev/tutorials/projects/pet-treat-dispenser.md
diff --git a/docs/tutorials/projects/plant-water.md b/docs/dev/tutorials/projects/plant-water.md
similarity index 100%
rename from docs/tutorials/projects/plant-water.md
rename to docs/dev/tutorials/projects/plant-water.md
diff --git a/docs/tutorials/projects/postman.md b/docs/dev/tutorials/projects/postman.md
similarity index 100%
rename from docs/tutorials/projects/postman.md
rename to docs/dev/tutorials/projects/postman.md
diff --git a/docs/tutorials/projects/rover-typescript.md b/docs/dev/tutorials/projects/rover-typescript.md
similarity index 100%
rename from docs/tutorials/projects/rover-typescript.md
rename to docs/dev/tutorials/projects/rover-typescript.md
diff --git a/docs/tutorials/projects/send-security-photo.md b/docs/dev/tutorials/projects/send-security-photo.md
similarity index 100%
rename from docs/tutorials/projects/send-security-photo.md
rename to docs/dev/tutorials/projects/send-security-photo.md
diff --git a/docs/tutorials/projects/tipsy.md b/docs/dev/tutorials/projects/tipsy.md
similarity index 100%
rename from docs/tutorials/projects/tipsy.md
rename to docs/dev/tutorials/projects/tipsy.md
diff --git a/docs/tutorials/projects/verification-system.md b/docs/dev/tutorials/projects/verification-system.md
similarity index 100%
rename from docs/tutorials/projects/verification-system.md
rename to docs/dev/tutorials/projects/verification-system.md
diff --git a/docs/tutorials/services/_index.md b/docs/dev/tutorials/services/_index.md
similarity index 100%
rename from docs/tutorials/services/_index.md
rename to docs/dev/tutorials/services/_index.md
diff --git a/docs/tutorials/services/color-detection-scuttle.md b/docs/dev/tutorials/services/color-detection-scuttle.md
similarity index 100%
rename from docs/tutorials/services/color-detection-scuttle.md
rename to docs/dev/tutorials/services/color-detection-scuttle.md
diff --git a/docs/tutorials/services/constrain-motion.md b/docs/dev/tutorials/services/constrain-motion.md
similarity index 100%
rename from docs/tutorials/services/constrain-motion.md
rename to docs/dev/tutorials/services/constrain-motion.md
diff --git a/docs/tutorials/services/navigate-with-rover-base.md b/docs/dev/tutorials/services/navigate-with-rover-base.md
similarity index 100%
rename from docs/tutorials/services/navigate-with-rover-base.md
rename to docs/dev/tutorials/services/navigate-with-rover-base.md
diff --git a/docs/tutorials/services/plan-motion-with-arm-gripper.md b/docs/dev/tutorials/services/plan-motion-with-arm-gripper.md
similarity index 100%
rename from docs/tutorials/services/plan-motion-with-arm-gripper.md
rename to docs/dev/tutorials/services/plan-motion-with-arm-gripper.md
diff --git a/docs/tutorials/services/visualize-data-grafana.md b/docs/dev/tutorials/services/visualize-data-grafana.md
similarity index 100%
rename from docs/tutorials/services/visualize-data-grafana.md
rename to docs/dev/tutorials/services/visualize-data-grafana.md
diff --git a/docs/tutorials/services/webcam-line-follower-robot.md b/docs/dev/tutorials/services/webcam-line-follower-robot.md
similarity index 100%
rename from docs/tutorials/services/webcam-line-follower-robot.md
rename to docs/dev/tutorials/services/webcam-line-follower-robot.md
diff --git a/docs/tutorials/template.md b/docs/dev/tutorials/template.md
similarity index 100%
rename from docs/tutorials/template.md
rename to docs/dev/tutorials/template.md
diff --git a/docs/fleet/_index.md b/docs/fleet/_index.md
deleted file mode 100644
index f18f453dd15..00000000000
--- a/docs/fleet/_index.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: "Fleet Tools"
-linkTitle: "Fleet Tools"
-weight: 430
-type: "docs"
-layout: "empty"
-canonical: "/platform/"
-aliases:
- - "/manage/fleet-management"
- - "/manage/app-usage"
- - "/product-overviews/fleet-management/"
- - "/fleet/"
- - /manage/fleet/
- - /manage/
-menuindent: true
-empty_node: true
----
diff --git a/docs/fleet/control.md b/docs/fleet/control.md
deleted file mode 100644
index 06d5906bdfe..00000000000
--- a/docs/fleet/control.md
+++ /dev/null
@@ -1,142 +0,0 @@
----
-title: "Machine Control Interface"
-linkTitle: "Control Interface"
-weight: 30
-type: "docs"
-description: "Use the Viam app control tab or the Viam mobile app to monitor and remotely operate your machines."
-tags: ["fleet management", "control", "app"]
-images: ["/components/base/cropped-control.png"]
-date: "2024-10-22"
-# updated: "" # When the content was last entirely checked
----
-
-Once you have [configured components and services](/configure/) for your machine, you can test, monitor, and remotely operate them from the **CONTROL** tab in the [Viam app](https://app.viam.com) or the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app).
-
-## Control interface in the Viam app
-
-The **CONTROL** tab in the [Viam app](https://app.viam.com) gives you the ability to test, monitor, and operate the machines in your fleet.
-The **CONTROL** tab provides a control interface for each component and service that you have configured for you machine.
-
-For example, if you have configured a base with wheels, you can move your machine's with an arrow pad and control the base's speed by setting its power with a slider.
-If you have configured a camera component, a window in the **CONTROL** tab displays the camera output.
-
-If you use remote control in the [Viam app](https://app.viam.com) UI, all communication to the machine uses [WebRTC](https://pkg.go.dev/go.viam.com/utils@v0.0.3/rpc#hdr-Connection).
-For local communication between [parts](/architecture/parts/#machine-parts) Viam uses gRPC or WebRTC.
-
-{{}}
-
-You can also switch between different machine parts directly from the **CONTROL** tab and control the selected machine part.
-
-For more information on configuring and controlling machine parts, see [Machine Architecture](/architecture/parts/#machine-parts).
-
-### Components
-
-For more detailed information on how to operate and test your resources, expand the relevant resource below:
-
-{{% expand "Arm" %}}
-{{< readfile "/static/include/components/test-control/arm-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Base" %}}
-{{< readfile "/static/include/components/test-control/base-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Board" %}}
-
-## Test `analogs`
-
-{{< readfile "/static/include/components/board/test-board-analogs.md" >}}
-
-## Test `digital_interrupts`
-
-{{< readfile "/static/include/components/board/test-board-digital-interrupts.md" >}}
-{{% /expand%}}
-
-{{% expand "Camera" %}}
-{{< readfile "/static/include/components/camera-view-camera-stream.md" >}}
-{{% /expand%}}
-
-{{% expand "Encoder" %}}
-{{< readfile "/static/include/components/test-control/encoder-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Gantry" %}}
-{{< readfile "/static/include/components/test-control/gantry-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Generic component" %}}
-{{< readfile "/static/include/components/test-control/generic-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Gripper" %}}
-{{< readfile "/static/include/components/test-control/gripper-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Input controller" %}}
-{{< readfile "/static/include/components/test-control/input-controller-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Motor" %}}
-{{< readfile "/static/include/components/test-control/motor-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Movement sensor (GPS)" %}}
-{{< readfile "/static/include/components/test-control/movement-sensor-gps-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Movement sensor (IMU)" %}}
-{{< readfile "/static/include/components/test-control/movement-sensor-imu-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Power sensor" %}}
-{{< readfile "/static/include/components/test-control/power-sensor-control.md" >}}
-{{% /expand%}}
-
-{{% expand "Sensor" %}}
-
-## Test the sensor
-
-{{< readfile "/static/include/components/test-control/sensor-control.md" >}}
-
-{{% /expand%}}
-
-{{% expand "Servo" %}}
-{{< readfile "/static/include/components/test-control/servo-control.md" >}}
-{{% /expand%}}
-
-### Services
-
-The following services also provide control interfaces:
-
-- [SLAM](/services/slam/cartographer/#create-a-new-map): for creating a new SLAM map and for using the motion service to move a machine on a SLAM map
-- [Navigation](/services/navigation/#control-tab-usage): for moving a machine to waypoints on a map
-
-## Control interface in the Viam mobile app
-
-{{}}
-
-In addition to the [Viam app](https://app.viam.com), the fully featured web application where you can access all fleet management tools, there is a Viam mobile app.
-
-The [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app) allows you to test, monitor and remotely operate machines in your fleet.
-It provides a control interface for each component and service that you have configured for you machine.
-
-For example, you can view live camera feeds, adjust components' runtime parameters, and switch between controllable components.
-
-Additionally, the app allows you to:
-
-- see if your machines are online
-- [view a machine's logs](/cloud/machines/#logs)
-- [upload images from your phone to the cloud](/how-tos/upload-data/#upload-images-with-the-viam-mobile-app)
-- [invite people to collaborate with you and modify access](/cloud/rbac/#use-the-mobile-app)
-
-
-
-You can find the mobile app on the [App Store](https://apps.apple.com/vn/app/viam-robotics/id6451424162) and on [Google Play](https://play.google.com/store/apps/details?id=com.viam.viammobile&hl=en&gl=US).
-
-
-
-
-
-
-
-
diff --git a/docs/fleet/data-management.md b/docs/fleet/data-management.md
deleted file mode 100644
index 056e37dc9dd..00000000000
--- a/docs/fleet/data-management.md
+++ /dev/null
@@ -1,106 +0,0 @@
----
-title: "Data Management"
-linkTitle: "Data Management"
-weight: 40
-no_list: true
-type: "docs"
-tags: ["data management", "data", "services"]
-description: "Capture data from machines, sync it to the cloud, and access it and train image classification and object detection models on the data."
-aliases:
- - /manage/data-management/
- - /services/data-management/
- - /manage/data/
- - "/data-management/"
- - "/data-management/"
- - "/services/data/"
- - "/data/"
- - /manage/data/export/
- - /data/export/
- - /services/data/export/
- - /manage/data/view/
- - /data/view/
- - /services/data/view/
-icon: true
-images: ["/services/icons/data-management.svg"]
-no_service: true
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-The [data management service](/services/data/) allows you to reliably capture and sync data to the cloud where you can query data from all your machines.
-You can collect data from your robots, IoT devices, or any other machines, and sync all the data to one place in the cloud without needing to manually gather data from each machine.
-
-{{}}
-
-## Cloud data management
-
-
-{{}}
-
-
-Once your data is synced to the cloud, you can view, filter, and label data, and assign data to datasets, from your [Viam app **DATA** page](https://app.viam.com/data/view).
-You can also interact with your data using the [Viam CLI](/cli/#data), or using the [data client API](/appendix/apis/data-client/).
-
-
-
-{{< cards >}}
-{{% manualcard title="Create datasets" link="/fleet/dataset/" %}}
-
-Label data for management and machine learning, with dynamic datasets that change with underlying data modifications.
-
-{{% /manualcard %}}
-{{% manualcard title="Export data" link="/how-tos/export-data/" %}}
-
-Export data with the Viam CLI and download your data for offline access.
-
-{{% /manualcard %}}
-{{% manualcard title="Upload a batch of data" link="/how-tos/upload-data/" %}}
-
-Upload data to the Viam Cloud from your computer or mobile device using the data client API, the Viam CLI, or the Viam mobile app.
-
-{{% /manualcard %}}
-{{< /cards >}}
-
-### Query your data
-
-Once your data has [synced](/services/data/), you can query it using the [data client API](/appendix/apis/data-client/).
-For _tabular_ sensor data, you can also run {{< glossary_tooltip term_id="sql" text="SQL" >}} or {{< glossary_tooltip term_id="mql" text="MQL" >}} queries from the [Query subtab](https://app.viam.com/data/query) of the **Data** tab in the Viam app.
-
-{{< cards >}}
-{{% card link="/how-tos/sensor-data-query-with-third-party-tools/" noimage="True" %}}
-{{% card link="/appendix/apis/data-client/" noimage="True" %}}
-{{< /cards >}}
-
-### Permissions
-
-Data management permissions vary between owners and operators.
-For more information about who can do what with data, see [Data Permissions](/cloud/rbac/#data-and-machine-learning).
-
-## API
-
-The [data client API](/appendix/apis/data-client/) supports the following methods:
-
-
-
-Methods to upload data like images or sensor readings directly to the Viam Cloud:
-
-{{< readfile "/static/include/app/apis/generated/data_sync-table.md" >}}
-
-
-
-Methods to download, filter, tag, or perform other tasks on data like images or sensor readings:
-
-{{< readfile "/static/include/app/apis/generated/data-table.md" >}}
-
-
-
-Methods to work with datasets:
-
-{{< readfile "/static/include/app/apis/generated/dataset-table.md" >}}
-
-
-
-The data management API supports a separate set of methods that allow you to sync data to the Viam app.
-For information about that API, see [Data Management API](/appendix/apis/services/data/).
-
-For the command line interface `data` command, see [CLI](/cli/#data).
diff --git a/docs/fleet/dataset.md b/docs/fleet/dataset.md
deleted file mode 100644
index 863897d854f..00000000000
--- a/docs/fleet/dataset.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: "Datasets"
-linkTitle: "Datasets"
-description: "Label data and create datasets for managing data and creating machine learning models."
-weight: 50
-type: "docs"
-tags: ["data management", "cloud", "sync"]
-imageAlt: "Label data and create datasets"
-images: ["/services/data/label-dog.gif"]
-videos: ["/services/data/label-dog.webm", "/services/data/label-dog.mp4"]
-videoAlt: "Add a bounding box around the dog in an image."
-aliases:
- - /manage/data/label/
- - /manage/data/dataset/
- - /data/dataset/
-no_service: true
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
-# SME: Tahiya Salam
----
-
-A dataset is a grouping of images that you use to train machine learning models.
-You can create and manage datasets using the [**DATA** tab](https://app.viam.com/data/view) in the Viam app, using the [data client API](/appendix/apis/data-client/), or using the [CLI `dataset` command](/cli/#dataset).
-
-{{< alert title="Info" color="info" >}}
-Filtered datasets are views and not materialized.
-That means the data you are viewing may change as you label and train on the dataset.
-
-Your dataset is also not versioned. If you train [ML models](/registry/ml-models/) on your dataset and the dataset changes existing models will not be affected but any new models you train will use the dataset with the data in it at the time of training.
-{{< /alert >}}
-
-## Labels
-
-You label the images in your dataset with bounding boxes or image tags, depending on the type of model you intend to train:
-
-- **Bounding boxes** are used to train [object detection models](/services/vision/#detections).
-- **Image tags** are used to train [image classification models](/services/vision/#classifications).
- Tag names support alphanumeric characters, underscores, and hyphens.
-
-## API
-
-To interact with datasets programmatically, use the [data client API](/appendix/apis/data-client/), which supports the following methods for working with datasets:
-
-{{< readfile "/static/include/app/apis/generated/dataset-table.md" >}}
-
-## How-to guide
-
-The following how-to guide contains instructions on creating datasets as well as on how to train a model on a dataset:
-
-{{< cards >}}
-{{% card link="/how-tos/train-deploy-ml/" %}}
-{{< /cards >}}
diff --git a/docs/fleet/fragments.md b/docs/fleet/fragments.md
deleted file mode 100644
index ae411e58f6c..00000000000
--- a/docs/fleet/fragments.md
+++ /dev/null
@@ -1,320 +0,0 @@
----
-title: "Configuration Fragments"
-linkTitle: "Fragments"
-weight: 10
-type: "docs"
-description: Use fragments to configure many machines at the same time.
-tags: ["fleet management", "cloud", "app"]
-images: ["/how-tos/one-to-many/new-fragment.png"]
-aliases:
- - /fleet/configure-a-fleet/
-date: "2022-01-01"
-# updated: "" # When the content was last entirely checked
----
-
-If you have multiple machines with similar configurations, you can use a _fragment_ to configure all of the machines at the same time.
-Fragments are a way of sharing and managing [machine configurations](/configure/) across multiple machines.
-
-If there are differences between your machines, you can use a fragment to quickly configure the {{< glossary_tooltip term_id="resource" text="resources" >}} that are the same between machines.
-You can then configure the differing resources separately, outside of the fragment.
-For example, if you have multiple similar rovers but one has an arm attached, you can add the rover configuration fragment (including the motors and base components), and then configure the arm on just that one rover.
-
-When you or one of your collaborators edit a fragment that you've already deployed to one or more machines, the Viam app updates the configuration on each deployed machine that uses that fragment.
-
-{{< alert title="Alert" color="caution" >}}
-Be cautious when making changes to fragments that have been deployed to production machines.
-We recommend that you create a duplicate fragment, make your desired change to that second fragment, and then deploy that fragment to a test machine that is configured identically to your production machines.
-
-Once you are confident that your configuration change works as expected, you can safely make the same change to the fragment in use on your production fleet, and the Viam app will deploy that change to all machines using that fragment.
-{{< /alert >}}
-
-If you attempt to delete a fragment that is currently deployed to a machine, you will receive an error message advising that the fragment is in use, but you can still delete the fragment if desired.
-You can see the number of machines using your fragment from the [fragments page](https://app.viam.com/fragments) in the Viam app.
-
-You must be an [organization owner](/cloud/rbac/#permissions) to create fragments associated with a given organization.
-
-A fragment can define one, several, or all resources on a machine.
-You can add multiple fragments to a single machine, and you can add additional resources to a machine that has already been configured with a fragment.
-
-## Create and use a fragment
-
-Get started with this how-to guide:
-
-{{< cards >}}
-{{% card link="/how-tos/one-to-many/" %}}
-{{< /cards >}}
-
-## Modify the config of a machine that uses a fragment
-
-If you need to modify the config of one or a few machines that use a fragment, you can overwrite fields of the fragment.
-
-When you add a fragment to a machine, the configuration of components and services included in a fragment are _read-only_.
-Any changes made by overwriting them do not change the fragment itself.
-
-If you need to make changes to all machines that use a fragment, modify the fragment itself instead.
-
-{{% alert title="Support Notice" color="note" %}}
-
-Fragment overwrites are _not_ supported for the modification of [trigger](/configure/triggers/) configuration.
-You can create a trigger with a fragment but you cannot modify it with `fragment_mods`.
-
-{{% /alert %}}
-
-{{< tabs >}}
-{{% tab name="Config Builder" %}}
-
-To overwrite fields of a fragment, make edits to the component or service configuration just as you would for a non-fragment {{< glossary_tooltip term_id="resource" text="resource" >}}.
-
-When you make edits to the configuration of component or service that was configured using a fragment, the Viam app builder automatically adds an overwrite to your config.
-If you have made edits, you will see an **edited from FRAGMENT NAME** indicator in the upper right corner of the edited component or service card.
-
-![A motor config card with "edited from SCUTTLE101" in the upper right corner.](/fleet/fragment-edited.png)
-
-{{% /tab %}}
-{{% tab name="Raw JSON" %}}
-
-You can modify fragment fields in your machine's raw JSON config by using [update operators](https://www.mongodb.com/docs/manual/reference/operator/update/positional/#---update-).
-Viam supports all update operators except for `$setOnInsert`, `$`, `$[]`, and `$[]`.
-
-To configure fragment overwrites manually instead of using the builder UI:
-
-1. Navigate to your machine's **CONFIGURE** tab.
-2. Switch to **JSON** mode.
-3. Add a top-level section called `"fragment_mods"` (alongside the other top-level sections like `"components"` and `"fragments"`):
-
-{{< tabs >}}
-{{% tab name="Template" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
- "fragment_mods": [
- {
- "fragment_id": "",
- "mods": [
- {
-
- }
- ]
- }
- ],
-```
-
-{{% /tab %}}
-{{% tab name="Full example" %}}
-This example assumes the fragment with ID `abcd7ef8-fa88-1234-b9a1-123z987e55aa` contains a motor configured with `"name": "motor1"`.
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "components": [],
- "fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "components.motor1.attributes.max_rpm": 1818,
- "components.motor1.attributes.pins.a": 30,
- "components.motor1.attributes.board": "local"
- }
- },
- {
- "$unset": {
- "components.motor1.attributes.pins.pwm": 0
- }
- }
- ]
- }
- ],
- "fragments": ["abcd7ef8-fa88-1234-b9a1-123z987e55aa"]
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-4. Edit the `fragment_id` value to match the ID of the fragment you want to modify, for example `"12345678-1a2b-9b8a-abcd987654321"`.
-5. Add any update operators you'd like to apply to the fragment to the `mods` section.
- Click to view each example:
-
-{{< expand "Change the name and attributes of a component" >}}
-This example uses [`$set`](https://www.mongodb.com/docs/manual/reference/operator/update/set/#mongodb-update-up.-set) to make the following changes to the attributes of a motor named `motor1`:
-
-- Sets the `max_rpm` to `1818`.
-- Changes the name of `motor1` to `my_motor`.
- Note that this does not affect the other mods; you still use `motor1` for them.
-- Sets the pin number for pin `a` to `30`.
-- Sets the name of the board associated with this motor to `local`.
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "components.motor1.attributes.max_rpm": 1818,
- "components.motor1.name": "my_motor",
- "components.motor1.attributes.pins.a": 30,
- "components.motor1.attributes.board": "local"
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Remove an attribute" >}}
-This example uses [`$unset`](https://www.mongodb.com/docs/manual/reference/operator/update/unset/#mongodb-update-up.-unset) to remove the pin number set for the `pwm` pin, so the motor no longer has a PWM pin set.
-In other words, it deletes the `pwm` pin field.
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$unset": {
- "components.motor1.attributes.pins.pwm": 0
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Modify dependencies" >}}
-This example uses [`$set`](https://www.mongodb.com/docs/manual/reference/operator/update/set/#mongodb-update-up.-set) to assign a new list of dependencies to a component named `rover_base2`.
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "components.rover_base2.attributes.depends_on": ["local", "motor1"]
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Change motor pins from A and B to PWM and DIR" >}}
-This example uses [`$rename`](https://www.mongodb.com/docs/manual/reference/operator/update/rename/) to make the following changes to the attributes of a motor named `motor1` in the fragment:
-
-- Retrieves the pin number for pin `a` and assigns that value to the PWM pin.
- Deletes the `pins.a` field.
-- Retrieves the pin number for pin `b` and assigns that value to the DIR pin.
- Deletes the `pins.b` field.
-
-_`$rename` is for changing an attribute's key, not its value.
-If you want to change the `name` of a component (for example, `motor1`), use `$set`, as shown in the change the name of a component example._
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$rename": {
- "components.motor1.attributes.pins.a": "components.motor1.attributes.pins.pwm",
- "components.motor1.attributes.pins.b": "components.motor1.attributes.pins.dir"
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Change a camera path" >}}
-This example uses [`$set`](https://www.mongodb.com/docs/manual/reference/operator/update/set/#mongodb-update-up.-set) to change the video path for a camera named `camera-one` in the fragment:
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "components.camera-one.attributes.video_path": "0x11100004a12345"
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Modify data sync settings" >}}
-This example uses [`$set`](https://www.mongodb.com/docs/manual/reference/operator/update/set/#mongodb-update-up.-set) to change the sync interval for a [data management service](/services/data/) named `data-management` in the fragment:
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "services.data-management.attributes.sync_interval_mins": "0.5"
- }
- }
- ]
- }
-],
-```
-
-{{< /expand >}}
-{{< expand "Pin a module version" >}}
-This example uses [`$set`](https://www.mongodb.com/docs/manual/reference/operator/update/set/#mongodb-update-up.-set) to set [version update settings for a module](/registry/modular-resources/#configuration) named `custom-sensor` in the fragment:
-
-```json {class="line-numbers linkable-line-numbers"}
-"fragment_mods": [
- {
- "fragment_id": "abcd7ef8-fa88-1234-b9a1-123z987e55aa",
- "mods": [
- {
- "$set": {
- "modules.custom-sensor.version": "1.8.0"
- }
- }
- ]
- }
-],
-```
-
-Here are the version options:
-
-- To update with new minor releases of the same major release branch, use `"^"`, for example `"^1"`
-- To update with new patch releases of the same minor release branch, use `"~"`, for example `"~1.8"`
-- To always update with the latest release, use `"latest"`
-- To pin to a specific release, use `""`, for example `"1.8.3"`
-
-{{< /expand >}}
-
-6. Click **Save** in the upper right corner of the page to save your new configuration.
-7. To check that your mods are working, view your machine's debug configuration.
- In **Builder** mode on the **CONFIGURE** tab, select the **...** (Actions) menu to the right of your main part's name in the left-hand panel and click the **View debug configuration** option to view the full configuration file.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-After configuring fragment modifications, check your machine's [**LOGS** tab](/cloud/machines/#logs).
-If there are problems with fragment modifications, depending on the issue, your machine or some of its components may not work until the configuration is fixed.
-
-If you need to restore the original fragment, click the **...** in the upper right corner of the card you modified, and click **Revert changes**.
-
-## Next steps
-
-Viam provides several [pre-made fragments](https://app.viam.com/fragments) which you can use as templates for writing your own fragments.
-
-For an example of a fragment that configures multiple components and services, see the [Viam Rover fragment](https://app.viam.com/fragment?id=3e8e0e1c-f515-4eac-8307-b6c9de7cfb84).
-
-For an example of creating a fragment and using it to configure a fleet of machines, see the air quality fleet tutorial:
-
-{{< cards >}}
-{{% card link="/tutorials/control/air-quality-fleet/" %}}
-{{< /cards >}}
diff --git a/docs/fleet/provision.md b/docs/fleet/provision.md
deleted file mode 100644
index 6f29016dc67..00000000000
--- a/docs/fleet/provision.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-title: "Provision machines using viam-agent"
-linkTitle: "Provisioning Machines"
-weight: 20
-type: "docs"
-description: "Provision a machine as it first comes online with a pre-defined configuration - in the factory or when the machine is taken into service."
-images: ["/platform/provisioning-demo.gif"]
-videos: ["/platform/provisioning-demo.webm", "/platform/provisioning-demo.mp4"]
-tags: ["fleet management", "viam-server", "viam-agent"]
-# SMEs: James, Ale
-aliases:
- - "/build/provision/"
- - "/fleet/provision/"
-date: "2024-08-16"
-# updated: "" # When the content was last entirely checked
----
-
-You can use Viam's software provisioning manager (`agent-provisioning`), to provision a machine as it first comes online with a pre-defined configuration.
-This is useful when deploying a fleet of machines directly from the factory to a customer, or when bundling proprietary software on your Viam machine.
-
-The provisioning subsystem is a feature of [`viam-agent`](/configure/agent/), which you can install as part of your manufacturing process.
-`agent-provisioning` will then perform the rest of the first-time setup for your machine once an [end user sets up the machine](#end-user-experience).
-
-Consider a company that sells machines that monitor weather conditions on a maritime craft and provide navigation advice based on those readings.
-Such a machine might use Viam to regularly capture and upload a stream of sensor readings, for example.
-To parse the readings and provide tailored guidance to a ship's captain, the company writes their own proprietary application which includes live analytics and speech generation for conveying advice to the captain.
-
-Using `agent-provisioning`, this company can ship their machines directly to customers with `viam-agent` installed.
-When a customer sets up their machine, the provisioning subsystem installs `viam-server`.
-By having the end customer set up the machine, the company:
-
-- eliminates per-device setup and individualization at the factory
-- allows for tailored configurations per customer as needed
-- allows customer to provide their own WiFi credentials
-
-{{< alert title="Support Notice" color="note" >}}
-
-Provisioning is supported and tested only on Debian 11 (Bullseye), and 12 (Bookworm) but should work on most distros using NetworkManager v1.42 (or newer) as well.
-For Bullseye, the installation of `viam-agent` changes the network configuration to use NetworkManager.
-
-{{< /alert >}}
-
-For a guide on how to configure provisioning for your machine, see:
-
-{{< cards >}}
-{{% card link="/how-tos/provision-setup/" %}}
-{{< /cards >}}
-
-## End user experience
-
-End users receive a machine, and use either a captive web portal or mobile app to complete the machine setup.
-
-One option is to use the [Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app).
-The Viam mobile app allows end users to create a new machine in the app, and `agent-provisioning` will then install `viam-server` and run it with a provided configuration.
-
-To add your branding, you can build your own mobile app and use the [Flutter SDK](https://flutter.viam.dev/viam_protos.provisioning.provisioning/ProvisioningServiceClient-class.html) or the [TypeScript SDK](https://github.com/viamrobotics/viam-typescript-sdk/blob/main/src/app/provisioning-client.ts) to connect to `viam-agent` and provision your machines.
-
-If you are not using Flutter or TypeScript and would like to use provisioning, please [contact us](mailto:support@viam.com).
-
-For an end-user guide to setting up their machine, see:
-
-{{< cards >}}
-{{% card link="/how-tos/provision/" %}}
-{{< /cards >}}
-
-This is the general process for provisioning depending on whether you are using a captive web portal or a mobile app:
-
-{{< tabs >}}
-{{% tab name="Mobile app" min-height="703px" %}}
-
-{{}}
-
-1. If the provisioning happens with a mobile app, open the app and follow any instructions there until the app directs you to turn on the machine.
-
- - If you are using the Viam mobile app, create a new machine or click on an existing machine that has not yet been set up and follow the instructions.
-
-1. When you power on the machine that has `viam-agent` installed and `agent-provisioning` configured, `agent-provisioning` creates a WiFi hotspot.
-
- - The [`agent-provisioning` configuration](#configuration) is at /etc/viam-provisioning.json .
-
-1. You then use your mobile device or computer and connect to the WiFi hotspot.
-
- - By default, the hotspot network is named `viam-setup-HOSTNAME`, where `HOSTNAME` is replaced with the hostname of your machine.
- The WiFi password for this hotspot network is `viamsetup` by default.
- You can customize these values in the [`agent-provisioning` configuration](/configure/agent/#configuration).
-
-1. If you as the end user have a provisioning mobile app, go back to the app to complete setup.
- In the mobile app, you will be prompted to provide the network information for the machine.
-
-1. The machine will then disable the hotspot network and attempt to connect using the provided network information.
- If `viam-agent` cannot establish a connection using the provided network information, the machine will create the hotspot again and continue going through steps (2-5) until a connection is successfully established.
-1. If the connection is successful, `viam-agent` installs `viam-server`.
-
- - `agent-provisioning` will use the provided network if it can connect, even if that network does not have internet access.
- Note that any features that require internet access will not function if the connected WiFi network is not connected to the internet.
- If you want `agent-provisioning` to require that a WiFi network be connected to the internet in order to connect to it, enable roaming mode.
-
-1. `viam-agent` then starts `viam-server` with the provided configuration and the machine becomes **live**.
-
-{{% /tab %}}
-{{% tab name="Captive web portal" %}}
-
-1. When you, as the end user, power on the machine that has `viam-agent` installed and `agent-provisioning` configured, `agent-provisioning` creates a WiFi hotspot.
-
- - The [`agent-provisioning` configuration](#configuration) is at /etc/viam-provisioning.json .
- - If a machine already exists, a machine cloud credentials file, if provided, is at /etc/viam.json .
-
-1. You as the end user then use your mobile device or computer and connect to the WiFi hotspot.
-
- - By default, the hotspot network is named `viam-setup-HOSTNAME`, where `HOSTNAME` is replaced with the hostname of your machine.
- The WiFi password for this hotspot network is `viamsetup` by default.
- You can customize these values in the [`agent-provisioning` configuration](/configure/agent/#configuration).
-
-1. Once connected to the hotspot, you will be redirected to a sign-in page.
- If you are using a laptop or are not redirected, try opening [http://viam.setup/](http://viam.setup/) in a browser.
-
-1. In the captive web portal, you will then be prompted to provide the network information for the machine.
-
- - If there is no machine cloud credentials file at /etc/viam.json , the captive portal will also require you to paste a machine cloud credentials file.
- This is the JSON object which contains your machine part secret key and cloud app address, which your machine's `viam-server` instance needs to connect to the Viam app.
-
- To copy a machine cloud credentials file:
-
- - Navigate to your machine's page on the [Viam app](https://app.viam.com).
- - Select the part status dropdown to the right of your machine's name on the top of the page.
- {{}}
- - Click the copy icon next to **Machine cloud credentials**.
- - Paste the machine cloud credentials when prompted.
-
-1. The machine will then disable the hotspot network and attempt to connect using the provided network information.
- If `viam-agent` cannot establish a connection using the provided network information, the machine will create the hotspot again and continue going through steps (2-5) until a connection is successfully established.
-1. If the connection is successful, `viam-agent` installs `viam-server`.
-
- - `agent-provisioning` will use the provided network if it can connect, even if that network does not have internet access.
- Note that any features that require internet access will not function if the connected WiFi network is not connected to the internet.
- If you want `agent-provisioning` to require that a WiFi network be connected to the internet in order to connect to it, enable roaming mode.
-
-1. `viam-agent` then starts `viam-server` with the provided configuration and the machine becomes **live**.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## Configuration
-
-When you [install `viam-agent`](/configure/agent/#installation), you may optionally provide a provisioning configuration file to customize the experience at /etc/viam-provisioning.json with the following format:
-
-{{< tabs >}}
-{{% tab name="Template" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "manufacturer": "",
- "model": "",
- "fragment_id": "",
- "hotspot_prefix": "",
- "disable_dns_redirect": true,
- "hotspot_password": "",
- "roaming_mode": false,
- "offline_timeout": "0m00s",
- "user_timeout": "0m00s",
- "fallback_timeout": "0m00s"
-}
-```
-
-{{% /tab %}}
-{{% tab name="Example" %}}
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "manufacturer": "Skywalker",
- "model": "C-3PO",
- "fragment_id": "2567c87d-7aef-41bc-b82c-d363f9874663",
- "hotspot_prefix": "skywalker-setup",
- "disable_dns_redirect": true,
- "hotspot_password": "skywalker123",
- "roaming_mode": false,
- "offline_timeout": "3m30s",
- "user_timeout": "2m30s",
- "fallback_timeout": "15m"
-}
-```
-
-This file configures some basic metadata, specifies a [fragment](/fleet/fragments/) to use to configure the machine, and provides the WiFi hotspot network name and password to use on startup.
-It also configures timeouts to control how long `viam-agent` waits for a valid local WiFi network to come online before creating its hotspot network, and how long to keep the hotspot active before terminating it.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Attributes
-
-
-| Name | Type | Required? | Description |
-| ---------- | ------ | --------- | ----------- |
-| `manufacturer` | string | Optional | Purely informative. May be displayed on captive portal or provisioning app. Default: `"viam"`. |
-| `model` | string | Optional | Purely informative. May be displayed on captive portal or provisioning app. Default: `"custom"`. |
-| `fragment_id` | string | Optional | The `fragment_id` of the fragment to configure machines with. Required when using the Viam mobile app for provisioning. The Viam mobile app uses the fragment to configure the machine. |
-| `hotspot_prefix` | string | Optional | `viam-agent` will prepend this to the hostname of the device and use the resulting string for the provisioning hotspot SSID. Default: `"viam-setup"`. |
-| `disable_dns_redirect` | boolean | Optional | By default, ALL DNS lookups using the provisioning hotspot will redirect to the device. This causes most phones/mobile devices to automatically redirect the user to the captive portal as a "sign in" screen. When disabled, only domains ending in .setup (ex: viam.setup) will be redirected. This generally avoids displaying the portal to users and is mainly used in conjunction with a mobile provisioning application workflow. Default: `false`. |
-| `hotspot_password` | string | Optional | The Wifi password for the provisioning hotspot. Default: `"viamsetup"`. |
-| `roaming_mode` | boolean | Optional | By default, the device will only attempt to connect to a single wifi network (the one with the highest priority), provided during initial provisioning/setup using the provisioning mobile app or captive web portal. Wifi connection alone is enough to consider the device as "online" even if the global internet is not reachable. If the primary network configured during provisioning cannot be connected to and roaming mode is enabled, the device will attempt connections to all configured networks in `networks`, and only consider the device online if the internet is reachable. Default: `false`. |
-| `offline_timeout` | boolean | Optional | Will only enter provisioning mode (hotspot) after being disconnected longer than this time. Useful on flaky connections, or when part of a system where the device may start quickly, but the wifi/router may take longer to be available. Default: `"2m"` (2 minutes). |
-| `user_timeout` | boolean | Optional | Amount of time before considering a user (using the captive web portal or provisioning app) idle, and resuming normal behavior. Used to avoid interrupting provisioning mode (for example for network tests/retries) when a user might be busy entering details. Default: `"5m"` (5 minutes). |
-| `fallback_timeout` | boolean | Optional | Provisioning mode will exit after this time, to allow other unmanaged (for example wired) or manually configured connections to be tried. Provisioning mode will restart if the connection/online status doesn't change. Default: `"10m"` (10 minutes). |
-| `networks` | boolean | Optional | Add additional networks the machine can connect to for provisioning. We recommend that you add WiFi settings in the operating system (for example, directly in NetworkManager) rather than in this file, or in the corresponding machine config in the Viam app, if networks aren't needed until after initial provisioning. See [Networks](/configure/agent/#networks). Default: `[]`. |
-
-#### Networks
-
-During the provisioning process, a machine connects to a network to install `viam-server`.
-If an end user uses an app to provision the machine, they will generally provide network details through that app.
-
-If you know in advance which other networks a machine should be able to connect to, we recomment that you add WiFi settings in the operating system (for example, directly in NetworkManager).
-
-However, if you want to add additional networks to the provisioning configuration you can add them to the `networks` field value.
-
-{{< alert title="Important" color="note" >}}
-You must enable `roaming_mode` in the [`agent-provisioning` configuration](#configuration) to allow the machine to connect to the specified networks.
-{{< /alert >}}
-
-If `roaming_mode` is enabled, `agent-provisioning` will try to connect to each specified network in order of `priority` from highest to lowest.
-
-
-| Name | Type | Description |
-| ---------- | ------ | ----------- |
-| `type` | string | The type of the network. Options: `"wifi"`|
-| `ssid` | string | The network's SSID. |
-| `psk` | string | The network pass key. |
-| `priority` | int | Priority to choose the network with. Values between -999 and 999. Default: `0`. |
-
-The following configuration defines the connection information and credentials for two WiFi networks named `fallbackNetOne` and `fallbackNetTwo`:
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "manufacturer": "Skywalker",
- "model": "C-3PO",
- "fragment_id": "2567c87d-7aef-41bc-b82c-d363f9874663",
- "hotspot_prefix": "skywalker-setup",
- "disable_dns_redirect": true,
- "hotspot_password": "skywalker123",
- "roaming_mode": false,
- "offline_timeout": "3m30s",
- "user_timeout": "2m30s",
- "fallback_timeout": "15m",
- "roaming_mode": true,
- "networks": [
- {
- "type": "wifi",
- "ssid": "otherNetworkOne",
- "psk": "myFirstPassword",
- "priority": 30
- },
- {
- "type": "wifi",
- "ssid": "otherNetworkTwo",
- "psk": "mySecondPassword",
- "priority": 10
- }
- ]
-}
-```
diff --git a/docs/get-started.md b/docs/get-started.md
deleted file mode 100644
index 874909d10ae..00000000000
--- a/docs/get-started.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: "Learn about Viam"
-linkTitle: "Learn about Viam"
-weight: 5
-type: "docs"
-layout: "empty"
-aliases:
- - "/getting-started/"
- - "/getting-started/high-level-overview"
- - "/product-overviews/"
- - "/viam/"
- - "/viam/app.viam.com/"
-imageAlt: "/general/understand.png"
-images: ["/general/understand.png"]
-canonical: "/#program-any-device"
----
diff --git a/docs/how-tos/collect-data.md b/docs/how-tos/collect-data.md
deleted file mode 100644
index 94dc64db616..00000000000
--- a/docs/how-tos/collect-data.md
+++ /dev/null
@@ -1,272 +0,0 @@
----
-title: "Collect images or sensor data in 3 minutes"
-linkTitle: "Collect data (3 min)"
-type: "docs"
-images: ["/get-started/quickstarts/collect-data.png"]
-description: "Use Viam to gather images or sensor data from your machine."
-imageAlt: "The data icon"
-authors: []
-languages: []
-viamresources: ["data_manager", "sensor"]
-platformarea: ["data"]
-no_list: true
-cost: "0"
-resource: "quickstart"
-aliases:
- - /get-started/quickstarts/collect-data/
- - /get-started/collect-data/
-languages: []
-viamresources: [
- "camera",
- "sensor",
- "data_manager",
- ]
-level: "Beginner"
-date: "2024-07-31"
-# updated: "" # When the tutorial was last entirely checked
-cost: "0" # Approximate cost in USD - Only specify number
----
-
-In this guide you'll capture and sync sensor or image data from a machine.
-
-{{< alert title="You will learn" color="tip" >}}
-
-- How to configure data capture and sync
-- How to view captured data
-
-{{< /alert >}}
-
-{{}}
-
-## Requirements
-
-You don't need to buy or own any hardware to complete this tutorial.
-If you have the following components, you can follow along on your own hardware:
-
-- A Linux, macOS or WSL computer which can run `viam-server` or an ESP32 which can run `viam-micro-server`.
-- A sensor or a webcam: this could be the webcam on your laptop or any other webcam you can connect to your computer.
-
-Make sure to connect your sensor or webcam to your computer.
-
-{{% expand "No computer, camera, or sensor at hand?" %}}
-No problem.
-If you don't have a development machine or other computer that can run `viam-server`, use [Try Viam](https://app.viam.com/try) to borrow a rover free of cost online.
-The rover already has `viam-server` installed and is configured with some components to test with, including a webcam.
-
-Once you have borrowed a rover, go to the **CONFIGURE** tab of the machine, find the cameras and click on the **Test** panel at the bottom of each camera's configuration panel to test the camera stream.
-You should have a front-facing camera and an overhead view of your rover.
-Now you know what the rover can _perceive_.
-
-If your rover is facing a wall, find the base configuration panel and click on its **Test** panel.
-Use the controls to drive your rover to a different location.
-
-Now that you have seen that the cameras on your Try Viam rover work, **continue with Step 4**.
-
-If you have a computer that can run `viam-server` but no physical sensor, you can use the [`viam:viam-sensor:telegrafsensor`](https://app.viam.com/module/viam/viam-telegraf-sensor) model which measures computer performance metrics.
-{{% /expand%}}
-
-## Instructions
-
-Select a tab below to collect images from a camera or readings from a sensor:
-
-{{< tabs >}}
-{{% tab name="Collect camera images" %}}
-
-{{< expand "Step 1: Create a machine" >}}
-
-Go to the [Viam app](https://app.viam.com) and add a new machine by providing a name in the **New machine** field and clicking **Add machine**.
-
-![The 'First Location' page on the Viam app with a new machine name in the New machine field and the Add machine button next to the field highlighted.](/fleet/app-usage/create-machine.png)
-
-{{< /expand >}}
-{{% expand "Step 2: Install viam-server or viam-micro-server" %}}
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Follow the {{< glossary_tooltip term_id="setup" text="setup instructions" >}} that appear on your new machine's **CONFIGURE** page.
-If you are using a microcontroller, install `viam-micro-server`.
-Otherwise, install `viam-server`.
-Wait for your device to connect to the Viam app.
-
-![The Viam app DATA page showing sensor data from an air quality sensor.](/get-started/quickstarts/collect-data/setup-button.png)
-
-{{% /expand %}}
-{{< expand "Step 3: Configure a camera" >}}
-
-{{< gif webm_src="/how-tos/configure-webcam.webm" mp4_src="/how-tos/configure-webcam.mp4" alt="The process described below." max-width="550px" class=aligncenter >}}
-
-1. From the **CONFIGURE** tab on your machine's page in the [Viam app](https://app.viam.com/), click the **+** icon next to your machine part and select **Component**.
- Select the `camera` type and add the `webcam` model.
-
-1. Click the **Save** button in the top right corner of the page to save your config.
-
-1. Click on the **Test** panel at the bottom of the camera configuration panel to test the camera stream.
- If you don't see an image stream, [configure the `video_path` attribute](/components/camera/webcam/#using-video_path).
- By default your camera stream refreshes once every second.
- You can change the refresh frequency to **Live** in the dropdown menu at the top of the **Test** panel.
-
-For more detailed information, including optional attribute configuration, see the [`webcam` docs](/components/camera/webcam/).
-
-{{< /expand >}}
-{{< expand "Step 4: Configure data capture on the camera" >}}
-
-{{}}
-
-1. Click the **Add method** button in the camera's configuration card.
- When the **Create data management service** prompt appears, click to add the service to your machine.
- Leave the default settings.
-
-1. Scroll back up to your camera config card.
- In the **Data capture** section:
-
- - Click the **Method** dropdown and select **ReadImage**.
-
- - Set the frequency to `0.1` to capture an image every 10 seconds.
-
- - Set the MIME type to `image/jpeg`.
-
-1. Click the **Save** button in the top right corner of the page to save your config.
-
-For more detailed information, see [data management service](/services/data/).
-
-{{< /expand >}}
-{{< expand "Step 5: View the captured image data" >}}
-
-Click on the **...** menu of the camera component and click on **View captured data**.
-This takes you to the data tab.
-
-![View captured data option in the component menu](/get-started/quickstarts/collect-data/cam-capt-data.png)
-
-If you do not see images from your camera, try waiting a minute and refreshing the page to allow time for the images to be captured and then synced to the app at the interval you configured.
-
-{{< /expand >}}
-{{< expand "Step 6: Stop data capture" >}}
-
-If this is a test project, make sure you stop data capture to avoid charges for a large amount of unwanted data.
-
-In the **Data capture** section of your camera's configuration, toggle the switch to **Off**.
-
-Click the **Save** button in the top right corner of the page to save your config.
-
-{{< /expand >}}
-
-{{% /tab %}}
-{{% tab name="Collect sensor readings" %}}
-
-{{< expand "Step 1: Create a machine" >}}
-
-Add a new machine in the [Viam app](https://app.viam.com).
-
-![The 'First Location' page on the Viam app with a new machine name in the New machine field and the Add machine button next to the field highlighted.](/fleet/app-usage/create-machine.png)
-
-{{< /expand >}}
-{{% expand "Step 2: Install viam-server or viam-micro-server" %}}
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Follow the {{< glossary_tooltip term_id="setup" text="setup instructions" >}} that appear on your new machine's **CONFIGURE** page.
-If you are using a microcontroller, install `viam-micro-server`.
-Otherwise, install `viam-server`.
-Wait for your device to connect to the Viam app.
-
-![The Viam app with the setup button.](/get-started/quickstarts/collect-data/setup-button.png)
-
-{{% /expand%}}
-{{< expand "Step 3: Configure a board" >}}
-
-Most sensors need to be wired to the pins of a SBC such as a Raspberry Pi.
-
-If you are not using a single-board computer (SBC), move on to step 4.
-
-If you are using a SBC, make sure you have installed `viam-server` on the SBC.
-Then add a [board component](/components/board/#configuration) to your config for your SBC.
-
-![An example board configuration in the app builder UI. The name (local), type (board) and model (pi) are shown. No other attributes are configured.](/components/board/pi-ui-config.png)
-
-{{% alert title="Important" color="note" %}}
-If your sensor uses I2 C, SPI, or serial port communication, you need to enable that type of communication in your board's settings.
-For example, if you are using a Raspberry Pi, SSH to it and [enable serial communication in `raspi-config`](/installation/prepare/rpi-setup/#enable-communication-protocols).
-{{% /alert %}}
-
-{{< /expand >}}
-
-{{< expand "Step 4: Configure a sensor" >}}
-
-Search the [sensor models](/components/sensor/#configuration) for a model of sensor that is compatible with your sensor hardware.
-For example, if you have a Sensirion SHT3x-DIS temperature and humidity sensor, you should use the [`sensirion-sht3xd`](https://github.com/viam-modules/sensirion/) model of sensor.
-
-If you don't have a physical sensor that can be wired to the pins of a SBC, you can use the [`viam:viam-sensor:telegrafsensor`](https://app.viam.com/module/viam/viam-telegraf-sensor) model which measures computer performance metrics.
-
-Once you determine which model to use, add it to your machine's configuration:
-
-1. From the **CONFIGURE** tab on your machine's page in the [Viam app](https://app.viam.com/), click the **+** icon next to your machine part and select **Component**.
- Select the `sensor` type and add your sensor model.
-
- {{}}
-
-1. Add required attributes, such as information about how the sensor is connected to the board.
- You can find information on these attributes by clicking the name of your sensor model in the [available models list](/components/sensor/#configuration).
-
-1. Click the **Save** button in the upper right corner of the page to save your configuration.
-
-1. Click on the **Test** panel at the bottom of the configuration panel of the sensor to confirm you are getting readings.
- If you don't see the latest reading from the sensor, check that your sensor is properly wired to the board, and that the type of communication the sensor uses is enabled on the board (if applicable).
-
-{{% alert title="Important" color="note" %}}
-If your sensor uses I2 C, SPI, or serial port communication, you need to enable that type of communication in your board's settings.
-For example, if you are using a Raspberry Pi, SSH to it and [enable serial communication in `raspi-config`](/installation/prepare/rpi-setup/#enable-communication-protocols).
-{{% /alert %}}
-
-{{< /expand >}}
-{{< expand "Step 5: Configure data capture on the sensor" >}}
-
-{{< gif webm_src="/how-tos/capture-sensor-readings.webm" mp4_src="/how-tos/capture-sensor-readings.mp4" alt="The process described below." max-width="600px" class="aligncenter" >}}
-
-1. On the sensor's configuration card, find the **Data capture** area and click the **Add method** button.
- When the **Data management service missing** alert appears, click **Create data management service** to add the service to your machine.
- Keep the default settings.
-
-1. Scroll back up to your sensor configuration card.
- In the **Data capture** section:
-
- - Click the **Method** dropdown and select **Readings**.
-
- - Set the frequency to `0.05` to capture a sensor reading once every 20 seconds.
-
-1. Click the **Save** button in the top right corner of the page to save your config.
-
-For more detailed information, see [data management service](/services/data/).
-
-{{< /expand >}}
-{{< expand "Step 6: View the captured sensor data" >}}
-
-Click on the **...** menu of the sensor component and click on **View captured data**.
-This takes you to the data tab.
-
-![View captured data option in the component menu](/get-started/quickstarts/collect-data/sensor-capt-data.png)
-
-If you do not see data from your sensor, try waiting a minute and refreshing the page to allow time for the readings to be captured and then synced to the app at the interval you configured.
-
-{{< /expand >}}
-{{< expand "Step 7: Stop data capture" >}}
-
-If this is a test project, make sure you stop data capture to avoid charges for a large amount of unwanted data.
-
-In the **Data capture** section of your sensor's configuration, toggle the switch to **Off**.
-
-Click the **Save** button in the top right corner of the page to save your config.
-
-{{< /expand >}}
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## Next steps
-
-Now that you have captured data, you could use this data to [train your own Machine Learning model](/how-tos/train-deploy-ml/) with the Viam platform.
-
-To learn more about the Viam platform, dive into the [How-to Guides](/how-tos/) which provide instructions for common tasks and workflows, check out [Tutorials](/tutorials/) for projects, or learn more in the [Platform Reference](/platform/) documentation:
-
-{{< cards >}}
-{{% card link="/how-tos/" %}}
-{{% card link="/tutorials/" %}}
-{{% card link="/platform/" %}}
-{{< /cards >}}
diff --git a/docs/how-tos/collect-sensor-data.md b/docs/how-tos/collect-sensor-data.md
deleted file mode 100644
index 7c069b32bca..00000000000
--- a/docs/how-tos/collect-sensor-data.md
+++ /dev/null
@@ -1,145 +0,0 @@
----
-title: "Collect and view sensor data from any machines"
-linkTitle: "Collect sensor data"
-weight: 10
-type: "docs"
-images: ["/services/icons/data-capture.svg"]
-icon: true
-description: "Gather sensor data, sync it to the cloud, and view it in the Viam app."
-aliases:
- - /use-cases/collect-sensor-data/
-languages: ["python", "go", "typescript", "flutter", "c++"] # Viam SDK programming languages used, if any
-viamresources: ["sensor", "data_manager"]
-platformarea: ["data"]
-level: "Beginner"
-date: "2024-08-23"
-# updated: "" # When the tutorial was last entirely checked
-cost: "0"
-# SME: Devin Hilly
----
-
-You can use the data management service to capture sensor data from any or all of your machines and sync that data to the cloud.
-For example, you can configure data capture for several sensors across one or multiple machines to report the current memory usage or the ambient operating temperature.
-
-You can do all of this using the [Viam app](https://app.viam.com/) user interface.
-You do not need to write any code to follow this guide.
-
-{{< alert title="In this page" color="tip" >}}
-
-1. [Gather data on any machine and syncing it to the cloud](#gather-and-sync-data).
-1. [View sensor data](#view-sensor-data).
-1. [Stop data capture](#stop-data-capture).
-
-{{< /alert >}}
-
-## Prerequisites
-
-You don't need to buy or own any hardware to complete this tutorial.
-You do need:
-
-{{% expand "A running machine connected to the Viam app. Click to see instructions." %}}
-
-{{% snippet "setup-both.md" %}}
-
-{{% /expand%}}
-
-{{% expand "At least one configured sensor. Click to see instructions." %}}
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Click the **+** icon next to your machine part in the left-hand menu and select **Component**.
-Then [find and add a sensor model](/components/sensor/) that supports your sensor.
-
-If you have a physical sensor, make sure to connect it physically to your computer.
-
-If you do not have a physical sensor or if you're not sure which sensor model to choose, add the `viam:viam-sensor:telegrafsensor` which captures performance data (CPU, memory usage, and more) from your machine. After adding the component, use the following attribute configuration:
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "disable_cpu": false,
- "disable_disk": false,
- "disable_disk_io": false,
- "disable_kernel": false,
- "disable_mem": false,
- "disable_net": false,
- "disable_netstat": false,
- "disable_processes": false,
- "disable_swap": false,
- "disable_system": false,
- "disable_temp": true,
- "disable_wireless": true
-}
-```
-
-{{% /expand%}}
-
-## Gather and sync data
-
-Viam's [data management service](/services/data/) lets you capture data locally from sensors and then sync it to the cloud where you can access all data across different {{< glossary_tooltip term_id="machine" text="machines" >}} or {{< glossary_tooltip term_id="location" text="locations" >}}.
-
-{{< table >}}
-{{% tablestep link="/services/data/"%}}
-{{}}
-**1. Add the data management service**
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Click the **+** icon next to your machine part in the left-hand menu and select **Service**.
-Then add the **data management** service.
-
-Enable **Syncing** to ensure captured data is synced to the cloud and set the sync interval, for example to `0.5` minutes to sync every 30 seconds.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-{{}}
-**2. Capture data from sensor**
-
-On the **CONFIGURE** tab, go to the **sensor**'s card and find the **Data capture** section.
-Add a new method, `Readings`, to capture data for and set the frequency.
-For example, setting a frequency of `0.05` will capture data once every 20 seconds.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-{{}}
-**3. Save to start capturing**
-
-Save the config.
-With cloud sync enabled, captured data is automatically uploaded to the Viam app after a short delay.
-
-{{% /tablestep %}}
-{{< /table >}}
-
-{{< alert title="Tip" color="tip" >}}
-If you need to sync data conditionally, for example at a certain time, see [Conditional Sync](/how-tos/conditional-sync/#configure-the-data-manager-to-sync-based-on-sensor).
-{{< /alert >}}
-
-## View sensor data
-
-Click on the **...** menu of the sensor component and click on **View captured data**.
-This takes you to the **DATA** tab.
-
-![View captured data option in the component menu](/how-tos/sensor-capt-data.png)
-
-If you do not see data from your sensor, try waiting a minute and refreshing the page to allow time for the readings to be captured and then synced to the app at the interval you configured.
-
-## Stop data capture
-
-If this is a test project, make sure you stop data capture to avoid [incurring fees](https://www.viam.com/product/pricing) for capturing large amounts of test data.
-
-In the **Data capture** section of your sensor's configuration, toggle the switch to **Off**.
-
-Click the **Save** button in the top right corner of the page to save your config.
-
-## Next steps
-
-Now that you have collected sensor data, you can [query it](/how-tos/sensor-data-query-with-third-party-tools/), [access it programmatically](/appendix/apis/data-client/) or [visualize it](/how-tos/sensor-data-visualize/) with third-party tools.
-
-{{< cards >}}
-{{% card link="/how-tos/sensor-data-query-with-third-party-tools/" %}}
-{{% card link="/appendix/apis/data-client/" %}}
-{{% card link="/how-tos/sensor-data-visualize/" %}}
-{{< /cards >}}
-
-To see sensor data in action, check out this tutorial:
-
-{{< cards >}}
-{{% card link="/tutorials/control/air-quality-fleet/" %}}
-{{< /cards >}}
diff --git a/docs/how-tos/conditional-sync.md b/docs/how-tos/conditional-sync.md
deleted file mode 100644
index 82162797235..00000000000
--- a/docs/how-tos/conditional-sync.md
+++ /dev/null
@@ -1,328 +0,0 @@
----
-title: "Conditional cloud sync"
-linkTitle: "Conditional data sync"
-description: "Trigger cloud sync to sync captured data when custom conditions are met."
-type: "docs"
-tags: ["data management", "cloud", "sync"]
-images: ["/services/icons/data-cloud-sync.svg"]
-icon: true
-aliases:
- - /data/trigger-sync/
- - /how-tos/trigger-sync/
- - /services/data/trigger-sync/
-languages: []
-viamresources: ["sensor", "data_manager"]
-platformarea: ["data", "registry"]
-level: "Intermediate"
-date: "2024-09-02"
-# updated: "" # When the tutorial was last entirely checked
-cost: "0"
----
-
-You may want to sync data only when a certain logic condition is met, instead of at a regular time interval.
-For example, if you rely on mobile data but have intermittent WiFi connection in certain locations or at certain times of the day, you may want to trigger sync to only occur when these conditions are met.
-Or, you may want to trigger sync only when your machine detects an object of a certain color.
-You can use the [trigger-sync-examples module](https://github.com/viam-labs/trigger-sync-examples-v2) if one of these examples is what you are looking for.
-
-If you need different logic, you can create a modular sensor that determines if the conditions for sync are met or not.
-This guide will show you the implementation of a sensor which only allows sync during a defined time interval.
-You can use it as the basis of your own custom logic.
-
-{{% alert title="In this page" color="tip" %}}
-
-{{% toc %}}
-
-{{% /alert %}}
-
-## Prerequisites
-
-{{% expand "A running machine connected to the Viam app. Click to see instructions." %}}
-
-{{% snippet "setup-both.md" %}}
-
-{{% /expand%}}
-
-{{< expand "Enable data capture and sync on your machine." >}}
-
-Add the [data management service](/services/data/):
-
-On your machine's **CONFIGURE** tab, click the **+** icon next to your machine part in the left-hand menu and select **Service**.
-
-Select the `data management / RDK` service and click **Create**.
-You can leave the default data sync interval of `0.1` minutes to sync every 6 seconds.
-Also leave both **Capturing** and **Syncing** toggles in the "on" position.
-
-{{< /expand >}}
-
-{{% expand "Create a sensor module. Click to see instructions." %}}
-
-Start by [creating a sensor module](/how-tos/sensor-module/).
-Your sensor should have access to the information you need to determine if your machine should sync or not.
-Based on that data, make the sensor return true when the machine should sync and false when it should not.
-For example, if your want your machine to return data only during a specific time interval, your sensor needs to be able to access the time as well as be configured with the time interval during which you would like to sync data.
-It can then return true during the specified sync time interval and false otherwise.
-
-{{% /expand%}}
-
-## Return `should_sync` as a reading from a sensor
-
-If the builtin data manager is configured with a sync sensor, the data manager will check the sensor's `Readings` method for a response with a "should_sync" key.
-
-The following example returns `"should_sync": true` if the current time is in a specified time window, and `"should_sync": false` otherwise.
-
-```go {class="line-numbers linkable-line-numbers" data-line="26,31,32,37"}
-func (s *timeSyncer) Readings(context.Context, map[string]interface{}) (map[string]interface{}, error) {
- currentTime := time.Now()
- var hStart, mStart, sStart, hEnd, mEnd, sEnd int
- n, err := fmt.Sscanf(s.start, "%d:%d:%d", &hStart, &mStart, &sStart)
-
- if err != nil || n != 3 {
- s.logger.Error("Start time is not in the format HH:MM:SS.")
- return nil, err
- }
- m, err := fmt.Sscanf(s.end, "%d:%d:%d", &hEnd, &mEnd, &sEnd)
- if err != nil || m != 3 {
- s.logger.Error("End time is not in the format HH:MM:SS.")
- return nil, err
- }
-
- zone, err := time.LoadLocation(s.zone)
- if err != nil {
- s.logger.Error("Time zone cannot be loaded: ", s.zone)
- }
-
- startTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(),
- hStart, mStart, sStart, 0, zone)
- endTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(),
- hEnd, mEnd, sEnd, 0, zone)
-
- readings := map[string]interface{}{"should_sync": false}
- readings["time"] = currentTime.String()
- // If it is between the start and end time, sync.
- if currentTime.After(startTime) && currentTime.Before(endTime) {
- s.logger.Debug("Syncing")
- readings["should_sync"] = true
- return readings, nil
- }
-
- // Otherwise, do not sync.
- s.logger.Debug("Not syncing. Current time not in sync window: " + currentTime.String())
- return readings, nil
-}
-```
-
-{{< alert title="Note" color="note" >}}
-You can return other readings alongside the `should_sync` value.
-{{< /alert >}}
-
-If you wish to see more context, see the entire [implementation of the sensor on GitHub](https://github.com/viam-labs/sync-at-time/blob/main/timesyncsensor/timesyncsensor.go).
-
-For additional examples, see the `Readings` function of the [time-interval-trigger code](https://github.com/viam-labs/trigger-sync-examples-v2/blob/main/time-interval-trigger/selective_sync/selective_sync.go) and the [color-trigger code](https://github.com/viam-labs/trigger-sync-examples-v2/blob/main/color-trigger/selective_sync/selective_sync.go).
-
-## Add your sensor to determine when to sync
-
-Add your module to your machine and configure it.
-In this example we will continue to use [`sync-at-time:timesyncsensor`](https://app.viam.com/module/naomi/sync-at-time).
-You will need to follow the same steps with your module:
-
-{{< table >}}
-{{% tablestep %}}
-**1. Add the sensor to your machine**
-
-On your machine's **CONFIGURE** page, click the **+** button next to your machine part in the left menu.
-Select **Component**, then search for and select the `sync-at-time:timesyncsensor` model provided by the [`sync-at-time` module](https://app.viam.com/module/naomi/sync-at-time).
-
-Click **Add module**, then enter a name or use the suggested name for your sensor and click **Create**.
-
-{{% /tablestep %}}
-
-
-
-{{% tablestep link="https://github.com/viam-labs/sync-at-time" %}}
-**2. Configure your time frame**
-
-Go to the new component panel and copy and paste the following attribute template into your sensor’s attributes field:
-
-{{< tabs >}}
-{{% tab name="Template" %}}
-
-```json
-{
- "start": "HH:MM:SS",
- "end": "HH:MM:SS",
- "zone": ""
-}
-```
-
-{{% /tab %}}
-{{% tab name="Example" %}}
-
-```json
-{
- "start": "18:29:00",
- "end": "18:30:00",
- "zone": "CET"
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-The following attributes are available for the `naomi:sync-at-time:timesyncsensor` sensor:
-
-
-
-
-| Name | Type | Required? | Description |
-| ------- | ------ | --------- | ----------- |
-| `start` | string | **Required** | The start time for the time frame during which you want to sync. Example: `"14:10:00"`. |
-| `end` | string | **Required** | The end of the sync time frame, for example: `"15:35:00"`. |
-| `zone` | string | **Required** | The time zone for the `start` and `end` time, for example: `"CET"`. |
-
-{{< /tablestep >}}
-{{< /table >}}
-
-
-
-
-In the next step you will configure the data manager to take the sensor into account when syncing.
-
-## Configure the data manager to sync based on sensor
-
-On your machine's **CONFIGURE** tab, switch to **JSON** mode and add a `selective_syncer_name` with the name for the sensor you configured and add the sensor to the `depends_on` field:
-
-{{< tabs >}}
-{{% tab name="JSON Template" %}}
-
-```json {class="line-numbers linkable-line-numbers" data-line="9,14"}
-{
- "name": "data_manager-1",
- "type": "data_manager",
- "namespace": "rdk",
- "attributes": {
- "additional_sync_paths": [],
- "capture_dir": "",
- "capture_disabled": false,
- "selective_syncer_name": "",
- "sync_disabled": false,
- "sync_interval_mins": 0.1,
- "tags": []
- },
- "depends_on": [""]
-}
-```
-
-{{% /tab %}}
-{{% tab name="JSON Example" %}}
-
-```json {class="line-numbers linkable-line-numbers" data-line="7,12"}
-{
- "name": "datamanager",
- "type": "data_manager",
- "namespace": "rdk",
- "attributes": {
- "additional_sync_paths": [],
- "selective_syncer_name": "timesensor",
- "sync_interval_mins": 0.1,
- "capture_dir": "",
- "tags": []
- },
- "depends_on": ["timesensor"]
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-{{% expand "Click to view a full configuration example" %}}
-
-```json {class="line-numbers linkable-line-numbers" data-line="12-22,25-37,40-45"}
-{
- "components": [
- {
- "name": "camera-1",
- "namespace": "rdk",
- "type": "camera",
- "model": "webcam",
- "attributes": {
- "video_path": "0x114000005a39331"
- }
- },
- {
- "name": "timesensor",
- "namespace": "rdk",
- "type": "sensor",
- "model": "naomi:sync-at-time:timesyncsensor",
- "attributes": {
- "start": "18:29:00",
- "end": "18:30:00",
- "zone": "CET"
- }
- }
- ],
- "services": [
- {
- "name": "data_manager-1",
- "namespace": "rdk",
- "type": "data_manager",
- "attributes": {
- "capture_dir": "",
- "tags": [],
- "additional_sync_paths": [],
- "selective_syncer_name": "timesensor",
- "sync_interval_mins": 0.1
- },
- "depends_on": ["timesensor"]
- }
- ],
- "modules": [
- {
- "type": "registry",
- "name": "naomi_sync-at-time",
- "module_id": "naomi:sync-at-time",
- "version": "2.0.0"
- }
- ]
-}
-```
-
-{{% /expand%}}
-
-You have now configured sync to happen during a specific time slot.
-
-## Test your sync configuration
-
-To test your setup, [configure a webcam](/components/camera/webcam/) or another component and [enable data capture on the component](/services/data/#configuration).
-Make sure to physically connect any hardware parts to the computer controlling your machine.
-For a camera component, use the `ReadImage` method.
-The data manager will now capture data.
-Go to the [**CONTROL** tab](/fleet/control/).
-You should see the sensor.
-Click on `GetReadings`.
-
-{{}}
-
-If you are in the time frame for sync, the time sync sensor will return true.
-
-You can confirm that if data is currently syncing by going to the [**Data** tab](https://app.viam.com/data/view).
-If you are not in the time frame for sync, adjust the configuration of your time sync sensor.
-Then check again on the **CONTROL** and **Data** tab to confirm data is syncing.
-
-## Next steps
-
-You can now use custom logic to trigger sync conditionally.
-For more information, see:
-
-
-
-{{< cards >}}
-{{% card link="/how-tos/sensor-module/" %}}
-{{% card link="/how-tos/create-module/" %}}
-{{% manualcard link="https://github.com/viam-labs/trigger-sync-examples-v2" %}}
-
-Sync Trigger Examples
-
-Other example code for modules that trigger sync.
-
-{{% /manualcard %}}
-{{< /cards >}}
diff --git a/docs/how-tos/configure.md b/docs/how-tos/configure.md
deleted file mode 100644
index 021c095e4a4..00000000000
--- a/docs/how-tos/configure.md
+++ /dev/null
@@ -1,150 +0,0 @@
----
-title: "Create and configure a machine"
-linkTitle: "Configure a machine"
-weight: 10
-type: "docs"
-description: "Create a machine in a few steps using Viam's modular system of components and services without writing much or any code."
-images: ["/platform/build.svg", "/services/ml/configure.svg"]
-icon: true
-tags: ["components", "configuration"]
-aliases:
- - /use-cases/configure/
- - use-cases/configure/
-languages: []
-viamresources: []
-platformarea: ["fleet", "core"]
-level: "Beginner"
-date: "2024-08-02"
-# updated: "2024-08-26" # When the tutorial was last entirely checked
-cost: "0"
----
-
-You can get any device running with Viam in just a few steps.
-
-Viam's modular system of {{< glossary_tooltip term_id="component" text="components" >}} and {{< glossary_tooltip term_id="service" text="services" >}} means that you can start doing interesting things with your machine without writing much or any code.
-
-{{% alert title="In this page" color="info" %}}
-
-- [Configure a machine](#configure-a-machine)
-
-{{% /alert %}}
-
-## Prerequisites
-
-{{% expand "A device that can run viam-server or viam-micro-server" %}}
-
-See [`viam-server` Platform requirements](/installation/viam-server-setup/#platform-requirements) and [`viam-micro-server` Platform requirements](/installation/viam-micro-server-setup/#platform-requirements) for more information on if your device is suitable.
-
-{{% /expand%}}
-
-## Configure a machine
-
-{{< table >}}
-{{% tablestep %}}
-**1. Create a machine in the Viam app**
-
-First, [create a Viam account](https://app.viam.com/) if you haven't already. Log in to the [Viam app](https://app.viam.com/)
-
-Create a {{< glossary_tooltip term_id="machine" text="machine" >}} in any location by clicking **Add machine** and typing in a name and.
-
-{{}}
-
-{{% /tablestep %}}
-{{% tablestep link="/installation/viam-server-setup/" %}}
-**2. Install Viam on your machine**
-
-Follow the {{< glossary_tooltip term_id="setup" text="setup instructions" >}} on your machine page to install `viam-server`.
-If you are using a microcontroller, install `viam-micro-server` instead.
-Follow the setup instructions until your machine connects and appear as **Live** in the Viam app.
-
-{{% /tablestep %}}
-{{% tablestep link="/configure/" %}}
-**3. Navigate to the CONFIGURE tab of your machine**
-
-All {{< glossary_tooltip term_id="machine" text="machines" >}} are configured on the **CONFIGURE** tab.
-
-
-{{< imgproc src="/how-tos/new-machine-configured.png" alt="A machine on the CONFIGURE tab with a board, two motors, and a camera" resize="600x" class="aligncenter" >}}
-
-
-Click on the **CONFIGURE** tab of your machine's page in the Viam app to navigate to it.
-
-{{% /tablestep %}}
-{{% tablestep link="/configure/#components" %}}
-**4. Configure your components**
-
-You will now create a configuration that describes any connected hardware as well as any software your device uses.
-The {{% glossary_tooltip term_id="component" text="_components_" %}} in your configuration can describe:
-
-- Physical hardware, such as arms, motors, or cameras.
-- Wrappers that provide additional functionality for other configured components, for example a failover motor that switches from one motor to another if the primary motor fails.
-- Software that maps to the API calls that you would use for existing hardware types. For example, a temperature sensor may provide temperature readings based on an online service instead of hardware readings. Another such type of sensor that is frequently used returns _readings_ confirming it is safe to sync data or reconfigure a machine.
-- Software that does not map well to the existing APIs, such as a switch that you'd like to be able to turn on an off. For these types of components, you use the generic component API.
-
-Follow these for each component that makes up your machine:
-
-1. On your machine's **CONFIGURE** tab, click the **+** button next to your machine part and select **Component**.
-2. Select the component type you need.
-3. Select from the available models for the component.
- You can find more information about the available models in each component's documentation.
- For example, you can scroll through available sensor models on the [sensor page](/components/sensor/#configuration).
-
- {{< alert title="Tip" color="tip" >}}
-
-If a component you want to use for your project is not natively supported, you can [build your own modular resource](/how-tos/create-module/).
-
- {{< /alert >}}
-
-4. When you add a component, it will create a panel in the configuration builder tool. Fill in any required attributes, following the documentation for the specific model.
- You can find this documentation by following the link to the model's documentation from the available resources.
-
-5. Click the **TEST** area of the configuration panel to test your component.
-6. If any problems occur check the **LOGS** tab or check the component page for component-specific troubleshooting.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-
-
-
-**5. Control your components**
-
-When you configured each component, you saw the **TEST** panel on its configuration panel.
-You can also access the control interfaces for all your components in one place from the **CONTROL** tab.
-
-{{}}
-
-{{% /tablestep %}}
-{{% tablestep link="/configure/#services" %}}
-
-**6. Configure services**
-
-Services are software packages that add high-level functionality to your smart machine such as:
-
-- **Data Management**: Capture and sync data from one or more machines, and use that data for machine learning and beyond.
-- **Computer Vision**: Enable your machine to intelligently see and interpret the world around it.
-- **Motion Planning**: Make your machine plan its movement and move itself.
-- **Simultaneous Localization And Mapping (SLAM)**: Make your machine map its surroundings and find its position on a map.
-
-To use these or other services, see their documentation for configuration and usage information.
-
-{{% /tablestep %}}
-{{< /table >}}
-
-## Next steps
-
-For more information, see the [configuration documentation](/configure/).
-Once you have configured your machine, continue to develop an application.
-Or, if you have many machines, learn about how you can use _{{< glossary_tooltip term_id="fragment" text="fragments" >}}_ to configure multiple similar machines in one go:
-
-{{< cards >}}
-{{% card link="/how-tos/develop-app/" %}}
-{{% card link="/how-tos/one-to-many/" %}}
-{{< /cards >}}
-
-To see full sample projects that configure and control machines, check out these tutorials:
-
-{{< cards >}}
-{{% card link="/tutorials/get-started/lazy-susan/" %}}
-{{% card link="/tutorials/get-started/blink-an-led/" %}}
-{{% card link="/tutorials/services/color-detection-scuttle/" %}}
-{{< /cards >}}
diff --git a/docs/how-tos/control-motor.md b/docs/how-tos/control-motor.md
deleted file mode 100644
index c9d6eb3c9a0..00000000000
--- a/docs/how-tos/control-motor.md
+++ /dev/null
@@ -1,591 +0,0 @@
----
-title: "Control a motor in 2 minutes"
-linkTitle: "Control a motor (2 min)"
-type: "docs"
-images: ["/icons/components/motor.svg"]
-description: "Use Viam to control a motor's speed and direction in just a few steps."
-authors: []
-weight: 30
-viamresources: ["motor"]
-platformarea: ["core"]
-no_list: true
-cost: "0"
-resource: "quickstart"
-aliases:
- - /get-started/quickstarts/control-motor/
- - /get-started/control-motor/
-languages: ["python", "go", "typescript", "flutter", "c++"]
-viamresources: [
- "motor",
- ]
-level: "Beginner"
-date: "2024-07-31"
-# updated: "" # When the tutorial was last entirely checked
-cost: "0" # Approximate cost in USD - Only specify number
----
-
-In this guide you'll configure and control a motor.
-
-{{< alert title="You will learn" color="tip" >}}
-
-- How to create a machine and install `viam-server` or `viam-micro-server`
-- How to configure a board and a motor
-- How to control your motor with UI and code
-
-{{< /alert >}}
-
-{{}}
-
-## Requirements
-
-You don't need to buy or own any hardware to complete this tutorial.
-If you have the following components, you can follow along on your own hardware:
-
-- A single-board computer or an ESP32.
-- A motor and compatible motor driver.
-
-Make sure to wire your motor to your board before starting.
-Power the board on if you want to test your machine while configuring it.
-
-{{% expand "No motor at hand?" %}}
-No problem.
-If you do not have both a board and motor, install `viam-server` on your laptop or computer and follow the instructions to use a _fake_ motor, which is a model that serves for testing.
-{{% /expand%}}
-
-## Instructions
-
-Follow these steps to control your motor:
-
-{{< expand "Step 1: Create a machine" >}}
-
-Add a new machine in the [Viam app](https://app.viam.com).
-
-![The 'My Desk' page on the Viam app with a new machine name in the New machine field and the Add machine button next to the field highlighted.](/get-started/quickstarts/add-machine.png)
-
-{{< /expand >}}
-{{< expand "Step 2: Install viam-server or viam-micro-server" >}}
-
-Navigate to the **CONFIGURE** tab of your machine's page in the [Viam app](https://app.viam.com).
-Follow the {{< glossary_tooltip term_id="setup" text="setup instructions" >}} that appear on your new machine's **CONFIGURE** page.
-If you are using a microcontroller, install `viam-micro-server`.
-Otherwise, install `viam-server`.
-Wait for your device to connect to the Viam app.
-
-{{< /expand >}}
-{{< expand "Step 3: Configure a board" >}}
-
-On the **CONFIGURE** page you can add components and services to your machine.
-Click on the **+** icon to select a suitable board.
-
-If you are using a physical board to follow along, look through the [**Supported Models**](/components/board/#configuration) to determine the model of component to configure.
-For example, configure a [`viam:raspberry-pi:rpi` board](https://github.com/viam-modules/raspberry-pi) for a Raspberry Pi 4, Raspberry Pi 3 or Raspberry Pi Zero 2 W:
-
-![An example board configuration in the app builder UI. The name (local), type (board) and model (pi) are shown. No other attributes are configured.](/get-started/quickstarts/configure-pi.png)
-
-If you do not have a physical board, use the [`fake` board model](/components/board/fake/).
-
-Follow the instructions in the board model's documentation to configure any required attributes.
-For the `fake` model, there are no required attributes.
-
-{{< /expand >}}
-{{< expand "Step 4: Configure a motor" >}}
-
-Add a `motor` component that supports the type of motor and motor driver you're using.
-Look through the [**Supported Models**](/components/motor/#configuration) to determine the model of component to configure.
-For example, if you are using a standard DC motor (brushed or brushless) wired to a typical GPIO pin-controlled motor driver, configure a [`gpio` motor](/components/motor/gpio/):
-
-![The CONFIGURE tab of the Viam app populated with a configured gpio motor.](/get-started/quickstarts/configure-motor.png)
-
-Follow the motor driver manufacturer's data sheet to wire your motor driver to your board and to your motor.
-Follow the [model's documentation](/components/motor/) to configure the attributes so that the computer can send signals to the motor.
-
-If you do not have a physical motor, use the [`fake` motor model](/components/motor/fake/).
-For the `fake` model, there are no required attributes.
-
-**Save your configuration.**
-{{< /expand >}}
-{{< expand "Step 5: Choose how you will control the motor" >}}
-
-You can control your motor directly from the Viam app, using the mobile app, or programmatically.
-
-### Option 1: Control from the app
-
-Navigate to your machine's **CONTROL** tab in the Viam app and click on the motor panel.
-Then use the **Power %** slider to set the motor's speed.
-Use the **Backwards** and **Forwards** buttons to change the direction.
-
-{{}}
-
-### Option 2: Control from the mobile app
-
-You can use [the Viam mobile app](/fleet/control/#control-interface-in-the-viam-mobile-app) to control your motor's speed and direction directly from your smart phone.
-
-Open the Viam mobile app and log in to your account.
-Select the location that your machine is in from the **Locations** tab.
-
-Choose your machine from the list and use the mobile interface to adjust the motor settings.
-
-{{}}
-
-### Option 3: Control programmatically
-
-Each component has a standardized API.
-The following code shows you how to control the motor's speed and direction using the [Motor API](/components/motor/#api).
-
-If you'd like to try it, find your machine's API key and address on your machine's **CONNECT** tab and run the code sample:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-```python
-import asyncio
-import time
-
-from viam.robot.client import RobotClient
-from viam.components.motor import Motor
-
-
-async def connect():
- opts = RobotClient.Options.with_api_key(
- # Replace "" (including brackets) with your machine's API key
- api_key='',
- # Replace "" (including brackets) with your machine's API
- # key ID
- api_key_id=''
- )
- return await RobotClient.at_address(
- '', opts)
-
-
-async def main():
- machine = await connect()
-
- print('Resources:')
- print(machine.resource_names)
-
- # Instantiate the motor client
- motor_1 = Motor.from_robot(machine, "motor-1")
- # Turn the motor at 35% power forwards
- await motor_1.set_power(power=0.35)
- # Let the motor spin for 3 seconds
- time.sleep(3)
- # Stop the motor
- await motor_1.stop()
-
- # Don't forget to close the machine when you're done!
- await machine.close()
-
-
-if __name__ == '__main__':
- asyncio.run(main())
-```
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-```go
-package main
-
-import (
- "context"
- "time"
-
- "go.viam.com/rdk/logging"
- "go.viam.com/utils/rpc"
- "go.viam.com/rdk/robot/client"
- "go.viam.com/rdk/components/motor")
-
-func main() {
- logger := logging.NewDebugLogger("client")
- machine, err := client.New(
- context.Background(),
- // Replace "" (including brackets) with your machine's address
- "",
- logger,
- client.WithDialOptions(utils.WithEntityCredentials(
- // Replace "" (including brackets) with your machine's API key ID
- "",
- utils.Credentials{
- Type: utils.CredentialsTypeAPIKey,
- // Replace "" (including brackets) with your machine's API key
- Payload: "",
- })),
- )
- if err != nil {
- logger.Fatal(err)
- }
-
- defer machine.Close(context.Background())
- logger.Info("Resources:")
- logger.Info(machine.ResourceNames())
-
-
- // Instantiate the motor client
- motor1Component, err:= motor.FromRobot(machine, "motor-1")
- if err != nil {
- logger.Error(err)
- return
- }
- // Turn the motor at 35% power forwards
- err = motor1Component.SetPower(context.Background(), 0.35, nil)
- if err != nil {
- logger.Error(err)
- return
- }
- // Let the motor spin for 3 seconds
- time.Sleep(3 * time.Second)
- // Stop the motor
- err = motor1Component.Stop(context.Background(), nil)
- if err != nil {
- logger.Error(err)
- return
- }
-}
-```
-
-{{% /tab %}}
-{{% tab name="Flutter" %}}
-
-Flutter code must be launched from inside a running Flutter application.
-To get started programming your machine with Flutter, follow the instructions to [Build a Flutter App that Integrates with Viam](/tutorials/control/flutter-app/).
-Then return to this page to add motor control to your app.
-
-Add a new file to your application in /lib called motor_screen.dart .
-Paste this code into your file:
-
-```dart {class="line-numbers linkable-line-numbers"}
-/// This is the MotorScreen, which allows us to control a [Motor].
-/// This particular example uses both the Viam-provided [ViamMotorWidget],
-/// while also providing an example of how you could create your own
-/// widgets to control a resource.
-library;
-
-import 'package:flutter/material.dart';
-import 'package:viam_sdk/viam_sdk.dart';
-import 'package:viam_sdk/widgets.dart';
-
-class MotorScreen extends StatelessWidget {
- final Motor motor;
-
- const MotorScreen(this.motor, {super.key});
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: Text(motor.name)),
- body: Column(children: [
- // The first widget in our column will be the one provided
- // by the Viam SDK.
- ViamMotorWidget(motor: motor),
- const SizedBox(height: 10), // Padding between widgets
-
- // Here we have a button that controls the [Motor]:
- // Spin the motor at 35% power forwards for three seconds.
- // The [Motor] resource provides many control functions, but here
- // we are using the [Motor.setPower] method.
- //
- // You can extrapolate this to other Viam resources.
- // For example, you could make the onPressed function call
- // [Gripper.open] on a gripper, or [Sensor.readings] on a Sensor.
- Row(mainAxisAlignment: MainAxisAlignment.center, children: [
- ElevatedButton(
- onPressed: () async {
- motor.setPower(0.35); // Set motor power to 35%
- await Future.delayed(Duration(seconds: 3)); // Let the motor spin for 3 seconds
- await motor.stop(); // Stop the motor
- },
- style: ElevatedButton.styleFrom(
- minimumSize: Size(80, 20), // Adjusts width and height of the button
- padding: EdgeInsets.symmetric(horizontal: 4, vertical: 6), // Adjusts padding inside the button
- ),
- child: const Text('Set motor power', textAlign: TextAlign.center),
- ),
- ]),
- ]),
- );
- }
-}
-```
-
-This code creates a screen with a power widget to adjust the power and a button that, when pressed, calls on the `setPower()` method to spin the motor forwards at 35% power, waits three seconds to let it spin, and then stops the motor.
-
-Then, replace the contents of robot_screen.dart with the following file, or add the highlighted lines of code to your program in the locations indicated:
-
-```dart {class="line-numbers linkable-line-numbers" data-line="9, 73-85, 99-102"}
-/// This is the screen that shows the resources available on a robot (or smart machine).
-/// It takes in a Viam app client instance, as well as a robot client.
-/// It then uses the Viam client instance to create a connection to that robot client.
-/// Once the connection is established, you can view the resources available
-/// and send commands to them.
-library;
-
-import 'package:flutter/material.dart';
-import 'motor_screen.dart';
-import 'package:viam_sdk/protos/app/app.dart';
-import 'package:viam_sdk/viam_sdk.dart';
-
-class RobotScreen extends StatefulWidget {
- final Viam _viam;
- final Robot robot;
-
- const RobotScreen(this._viam, this.robot, {super.key});
-
- @override
- State createState() => _RobotScreenState();
-}
-
-class _RobotScreenState extends State {
- /// Similar to previous screens, start with [_isLoading] to true.
- bool _isLoading = true;
-
- /// This is the [RobotClient], which allows you to access
- /// all the resources of a Viam Smart Machine.
- /// This differs from the [Robot] provided to us in the widget constructor
- /// in that the [RobotClient] contains a direct connection to the Smart Machine
- /// and its resources. The [Robot] object simply contains information about
- /// the Smart Machine, but is not actually connected to the machine itself.
- ///
- /// This is initialized late because it requires an asynchronous
- /// network call to establish the connection.
- late RobotClient client;
-
- @override
- void initState() {
- super.initState();
- // Call our own _initState method to initialize our state.
- _initState();
- }
-
- @override
- void dispose() {
- // You should always close the [RobotClient] to free up resources.
- // Calling [RobotClient.close] will clean up any tasks and
- // resources created by Viam.
- client.close();
- super.dispose();
- }
-
- /// This method will get called when the widget initializes its state.
- /// It exists outside the overridden [initState] function since it's async.
- Future _initState() async {
- // Using the authenticated [Viam] the received as a parameter,
- // the app can obtain a connection to the Robot.
- // There is a helpful convenience method on the [Viam] instance for this.
- final robotClient = await widget._viam.getRobotClient(widget.robot);
- setState(() {
- client = robotClient;
- _isLoading = false;
- });
- }
-
- /// A computed variable that returns the available [ResourceName]s of
- /// this robot in an alphabetically sorted list.
- List get _sortedResourceNames {
- return client.resourceNames..sort((a, b) => a.name.compareTo(b.name));
- }
-
- bool _isNavigable(ResourceName rn) {
- if (rn.subtype == Motor.subtype.resourceSubtype) {
- return true;
- }
- return false;
- }
-
- void _navigate(ResourceName rn) {
- if (rn.subtype == Motor.subtype.resourceSubtype) {
- final motor = Motor.fromRobot(client, rn.name);
- Navigator.of(context).push(MaterialPageRoute(builder: (_) => MotorScreen(motor)));
- }
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: Text(widget.robot.name)),
- body: _isLoading
- ? const Center(child: CircularProgressIndicator.adaptive())
- : ListView.builder(
- itemCount: client.resourceNames.length,
- itemBuilder: (_, index) {
- final resourceName = _sortedResourceNames[index];
- return ListTile(
- title: Text(resourceName.name),
- subtitle: Text(
- '${resourceName.namespace}:${resourceName.type}:${resourceName.subtype}'),
- onTap: () => _navigate(resourceName),
- trailing: _isNavigable(resourceName) ? Icon(Icons.chevron_right) : SizedBox.shrink(),
- );
- }));
- }
-}
-```
-
-This imports the motor_screen.dart file into the program and adds logic to check if a {{< glossary_tooltip term_id="resource" text="resource" >}} is "navigable", or, has a screen made for it.
-Since you added a screen for motor, motor is a navigable resource.
-
-To navigate to the motor screen, save your code and launch your simulator.
-Navigate to the robot screen of your (live) machine with a motor resource configured, and see the resource control interface displayed:
-
-{{}}
-
-You can adjust the toggle to change the power of your motor or press the buttons to make it revolve forwards and backwards.
-
-{{% /tab %}}
-{{% tab name="TypeScript" %}}
-
-package.json :
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "name": "test-rover",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "start": "esbuild ./main.ts --bundle --outfile=static/main.js --servedir=static",
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "Viam Docs Team",
- "license": "ISC",
- "devDependencies": {
- "esbuild": "*"
- },
- "dependencies": {
- "@viamrobotics/sdk": "*"
- }
-}
-```
-
-static/index.html :
-
-```html {class="line-numbers linkable-line-numbers"}
-
-
-
- Drive a Rover
-
-
-
-
- Click me
-
-
-
-
-```
-
-main.ts :
-
-```ts {class="line-numbers linkable-line-numbers"}
-// This code must be run in a browser environment.
-
-import * as VIAM from "@viamrobotics/sdk";
-
-// This function gets the button element
-function button() {
- return document.getElementById("main-button");
-}
-
-const main = async () => {
- const host = "ADDRESS_FROM_VIAM_APP";
-
- const machine = await VIAM.createRobotClient({
- host,
- credential: {
- type: "api-key",
- // Replace "" (including brackets) with your machine's API key
- payload: "",
- },
- // Replace "" (including brackets) with your machine's API key ID
- authEntity: "",
- signalingAddress: "https://app.viam.com:443",
- });
-
- button().onclick = async () => {
- // Instantiate the motor client
- // Replace with the name of a motor on your machine.
- const name = "motor-1";
- const motorClient = new VIAM.MotorClient(machine, name);
-
- // Turn the motor at 35% power forwards
- await motorClient.setPower(0.35);
- // Let the motor spin for 3 seconds, then stop the motor
- const sleep = (ms: number) =>
- new Promise((resolve) => setTimeout(resolve, ms));
- await sleep(3000);
- await motorClient.stop();
- };
- button().disabled = false;
-};
-
-main().catch((error) => {
- console.error("encountered an error:", error);
-});
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-```cpp
-#include
-#include
-#include
-#include
-#include
-#include
-
-using namespace viam::sdk;
-
-int main() {
- std::string host("muddy-snow-main.7kp7y4p393.viam.cloud");
- DialOptions dial_opts;
- dial_opts.set_entity(std::string(""));
- /* Replace "" (including brackets) with your machine's api key id */
- Credentials credentials("api-key", "");
- /* Replace "" (including brackets) with your machine's api key */
- dial_opts.set_credentials(credentials);
- boost::optional opts(dial_opts);
- Options options(0, opts);
-
- auto machine = RobotClient::at_address(host, options);
-
- std::cout << "Resources:\n";
- for (const Name& resource : machine->resource_names()) {
- std::cout << "\t" << resource << "\n";
- }
-
- std::string motor_name("motor-1");
-
- std::cout << "Getting motor: " << motor_name << std::endl;
- std::shared_ptr motor;
- try {
- // Get the motor client
- motor = machine->resource_by_name(motor_name);
- // Turn the motor at 35% power forwards
- motor->set_power(0.35);
- // Let the motor spin for 3 seconds
- sleep(3);
- // Stop the motor
- motor->stop();
- } catch (const std::exception& e) {
- std::cerr << "Failed to find " << motor_name << ". Exiting." << std::endl;
- throw;
- }
- return EXIT_SUCCESS;
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-{{< /expand >}}
-
-## Next steps
-
-To learn more about the Viam platform, dive into the [How-to Guides](/how-tos/) which provide instructions for common tasks and workflows, check out [Tutorials](/tutorials/) for projects, or learn more in the [Platform Reference](/platform/) documentation:
-
-{{< cards >}}
-{{% card link="/how-tos/" %}}
-{{% card link="/tutorials/" %}}
-{{% card link="/platform/" %}}
-{{< /cards >}}
diff --git a/docs/how-tos/create-custom-training-scripts.md b/docs/how-tos/create-custom-training-scripts.md
deleted file mode 100644
index 1b7eeebff1e..00000000000
--- a/docs/how-tos/create-custom-training-scripts.md
+++ /dev/null
@@ -1,624 +0,0 @@
----
-title: "Train models with any machine learning frameworks"
-linkTitle: "Train models with custom specs"
-weight: 90
-type: "docs"
-tags: ["data management", "ml", "model training"]
-description: "If you want to train models to custom specifications, write a custom training script and upload it to the Viam Registry."
-# SME: Tahiya S.
-images: ["/services/icons/ml.svg"]
-icon: true
-aliases:
- - /services/ml/upload-training-script/
-languages: ["python"]
-viamresources: ["mlmodel", "data_manager"]
-platformarea: ["ml"]
-level: "Advanced"
-date: "2024-08-29"
-updated: "2024-10-20" # When the tutorial was last entirely checked
-cost: "0"
----
-
-You can create custom Python training scripts that train ML models to your specifications using PyTorch, Tensorflow, TFLite, ONNX, or any other Machine Learning framework.
-Once you upload a training script to the [Viam Registry](https://app.viam.com/registry?type=Training+Script), you can use it to build ML models in the Viam Cloud based on your datasets.
-
-{{< alert title="In this page" color="tip" >}}
-
-1. [Create a training script](#create-a-training-script) from a template.
-1. [Test your training script locally](#test-your-training-script-locally) with a downloaded dataset.
-1. [Upload your training script](#upload-your-training-script).
-1. [Submit a training job](#submit-a-training-job) that uses the training script on a dataset to train a new ML model.
-
-{{< /alert >}}
-
-## Prerequisites
-
-{{% expand "A dataset with data you can train an ML model on. Click to see instructions." %}}
-
-For image data, you can follow the instructions to [Create a dataset and label data](/how-tos/train-deploy-ml/#create-a-dataset-and-label-data) to create a dataset.
-
-For other data you can use the [Data Client API](/appendix/apis/data-client/) from within the training script to get data stored in the Viam Cloud.
-
-{{% /expand%}}
-
-{{% expand "The Viam CLI. Click to see instructions." %}}
-
-You must have the Viam CLI installed to upload training scripts to the registry.
-
-{{< readfile "/static/include/how-to/install-cli.md" >}}
-
-{{% /expand%}}
-
-## Create a training script
-
-{{< table >}}
-{{% tablestep %}}
-**1. Create files**
-
-Create the following folders and empty files:
-
-```treeview
-my-training/
-├── model/
-| ├── training.py
-| └── __init__.py
-└── setup.py
-```
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**2. Add `setup.py` code**
-
-Add the following code to `setup.py` and add additional required packages on line 11:
-
-```python {class="line-numbers linkable-line-numbers" data-line="11"}
-from setuptools import find_packages, setup
-
-setup(
- name="my-training",
- version="0.1",
- packages=find_packages(),
- include_package_data=True,
- install_requires=[
- "google-cloud-aiplatform",
- "google-cloud-storage",
- # TODO: Add additional required packages
- ],
-)
-```
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**3. Create `__init__.py`**
-
-If you haven't already, create a folder called model and create an empty file inside it called \_\_init\_\_.py .
-
-{{% /tablestep %}}
-{{< tablestep >}}
-
-4. Add training.py
code
-
-Copy this template into training.py :
-
-{{% expand "Click to see the template" %}}
-
-```python {class="line-numbers linkable-line-numbers" data-line="126,170" }
-import argparse
-import json
-import os
-import typing as ty
-
-single_label = "MODEL_TYPE_SINGLE_LABEL_CLASSIFICATION"
-multi_label = "MODEL_TYPE_MULTI_LABEL_CLASSIFICATION"
-labels_filename = "labels.txt"
-unknown_label = "UNKNOWN"
-
-API_KEY = os.environ['API_KEY']
-API_KEY_ID = os.environ['API_KEY_ID']
-
-
-# This parses the required args for the training script.
-# The model_dir variable will contain the output directory where
-# the ML model that this script creates should be stored.
-# The data_json variable will contain the metadata for the dataset
-# that you should use to train the model.
-def parse_args():
- """Returns dataset file, model output directory, and num_epochs if present.
- These must be parsed as command line arguments and then used as the model
- input and output, respectively. The number of epochs can be used to
- optionally override the default.
- """
- parser = argparse.ArgumentParser()
- parser.add_argument("--dataset_file", dest="data_json", type=str)
- parser.add_argument("--model_output_directory", dest="model_dir", type=str)
- parser.add_argument("--num_epochs", dest="num_epochs", type=int)
- args = parser.parse_args()
- return args.data_json, args.model_dir, args.num_epochs
-
-
-# This is used for parsing the dataset file (produced and stored in Viam),
-# parse it to get the label annotations
-# Used for training classifiction models
-def parse_filenames_and_labels_from_json(
- filename: str, all_labels: ty.List[str], model_type: str
-) -> ty.Tuple[ty.List[str], ty.List[str]]:
- """Load and parse JSON file to return image filenames and corresponding
- labels. The JSON file contains lines, where each line has the key
- "image_path" and "classification_annotations".
- Args:
- filename: JSONLines file containing filenames and labels
- all_labels: list of all N_LABELS
- model_type: string single_label or multi_label
- """
- image_filenames = []
- image_labels = []
-
- with open(filename, "rb") as f:
- for line in f:
- json_line = json.loads(line)
- image_filenames.append(json_line["image_path"])
-
- annotations = json_line["classification_annotations"]
- labels = [unknown_label]
- for annotation in annotations:
- if model_type == multi_label:
- if annotation["annotation_label"] in all_labels:
- labels.append(annotation["annotation_label"])
- # For single label model, we want at most one label.
- # If multiple valid labels are present, we arbitrarily select
- # the last one.
- if model_type == single_label:
- if annotation["annotation_label"] in all_labels:
- labels = [annotation["annotation_label"]]
- image_labels.append(labels)
- return image_filenames, image_labels
-
-
-# Parse the dataset file (produced and stored in Viam) to get
-# bounding box annotations
-# Used for training object detection models
-def parse_filenames_and_bboxes_from_json(
- filename: str,
- all_labels: ty.List[str],
-) -> ty.Tuple[ty.List[str], ty.List[str], ty.List[ty.List[float]]]:
- """Load and parse JSON file to return image filenames
- and corresponding labels with bboxes.
- Args:
- filename: JSONLines file containing filenames and bboxes
- all_labels: list of all N_LABELS
- """
- image_filenames = []
- bbox_labels = []
- bbox_coords = []
-
- with open(filename, "rb") as f:
- for line in f:
- json_line = json.loads(line)
- image_filenames.append(json_line["image_path"])
- annotations = json_line["bounding_box_annotations"]
- labels = []
- coords = []
- for annotation in annotations:
- if annotation["annotation_label"] in all_labels:
- labels.append(annotation["annotation_label"])
- # Store coordinates in rel_yxyx format so that
- # we can use the keras_cv function
- coords.append(
- [
- annotation["y_min_normalized"],
- annotation["x_min_normalized"],
- annotation["y_max_normalized"],
- annotation["x_max_normalized"],
- ]
- )
- bbox_labels.append(labels)
- bbox_coords.append(coords)
- return image_filenames, bbox_labels, bbox_coords
-
-
-# Build the model
-def build_and_compile_model(
- labels: ty.List[str], model_type: str, input_shape: ty.Tuple[int, int, int]
-) -> Model:
- """Builds and compiles a model
- Args:
- labels: list of string lists, where each string list contains up to
- N_LABEL labels associated with an image
- model_type: string single_label or multi_label
- input_shape: 3D shape of input
- """
-
- # TODO: Add logic to build and compile model
-
- return model
-
-
-def save_labels(labels: ty.List[str], model_dir: str) -> None:
- """Saves a label.txt of output labels to the specified model directory.
- Args:
- labels: list of string lists, where each string list contains up to
- N_LABEL labels associated with an image
- model_dir: output directory for model artifacts
- """
- filename = os.path.join(model_dir, labels_filename)
- with open(filename, "w") as f:
- for label in labels[:-1]:
- f.write(label + "\n")
- f.write(labels[-1])
-
-
-def save_model(
- model: Model,
- model_dir: str,
- model_name: str,
-) -> None:
- """Save model as a TFLite model.
- Args:
- model: trained model
- model_dir: output directory for model artifacts
- model_name: name of saved model
- """
- file_type = ""
-
- # Save the model to the output directory.
- filename = os.path.join(model_dir, f"{model_name}.{file_type}")
- with open(filename, "wb") as f:
- f.write(model)
-
-
-if __name__ == "__main__":
- DATA_JSON, MODEL_DIR = parse_args()
-
- IMG_SIZE = (256, 256)
-
- # Read dataset file.
- # TODO: change labels to the desired model output.
- LABELS = ["orange_triangle", "blue_star"]
-
- # The model type can be changed based on whether you want the model to
- # output one label per image or multiple labels per image
- model_type = multi_label
- image_filenames, image_labels = parse_filenames_and_labels_from_json(
- DATA_JSON, LABELS, model_type)
-
- # Build and compile model on data
- model = build_and_compile_model()
-
- # Save labels.txt file
- save_labels(LABELS + [unknown_label], MODEL_DIR)
- # Convert the model to tflite
- save_model(
- model, MODEL_DIR, "classification_model", IMG_SIZE + (3,)
- )
-```
-
-{{% /expand %}}
-
-{{% /tablestep %}}
-{{< tablestep >}}
-
-5. Understand template script parsing functionality
-When a training script is run, the Viam platform passes the dataset file for the training and the designated model output directory to the script.
-The template contains functionality to parse the command line inputs and parse annotations from the dataset file.
-
-{{% expand "Click for more information on parsing command line inputs." %}}
-
-The script you are creating must take the following command line inputs:
-
-- `dataset_file`: a file containing the data and metadata for the training job
-- `model_output_directory`: the location where the produced model artifacts are saved to
-
-The `parse_args()` function in the template parses your arguments.
-
-You can add additional custom command line inputs by adding them to the `parse_args()` function.
-
-{{% /expand %}}
-
-{{% expand "Click for more information on parsing annotations from dataset file." %}}
-
-When you submit a training job to the Viam Cloud, Viam will pass a `dataset_file` to the training script when you train an ML model with it.
-The file contains metadata from the dataset used for the training, including the file path for each data point and any annotations associated with the data.
-
-Dataset JSON files for image datasets with bounding box labels and classification labels are formatted as follows:
-
-```json {class="line-numbers linkable-line-numbers"}
-{
- "image_path": "/path/to/data/data1.jpeg",
- "bounding_box_annotations": [
- {
- "annotation_label": "blue_star",
- "x_min_normalized": 0.38175675675675674,
- "x_max_normalized": 0.5101351351351351,
- "y_min_normalized": 0.35585585585585583,
- "y_max_normalized": 0.527027027027027
- }
- ],
- "classification_annotations": [
- {
- "annotation_label": "blue_star"
- }
- ]
-}
-{
- "image_path": "/path/to/data/data2.jpeg",
- "bounding_box_annotations": [
- {
- "annotation_label": "blue_star",
- "x_min_normalized": 0.2939189189189189,
- "x_max_normalized": 0.4594594594594595,
- "y_min_normalized": 0.25225225225225223,
- "y_max_normalized": 0.5495495495495496
- }
- ],
- "classification_annotations": [
- {
- "annotation_label": "blue_star"
- }
- ]
-}
-
-{
- "image_path": "/path/to/data/data3.jpeg",
- "bounding_box_annotations": [
- {
- "annotation_label": "blue_star",
- "x_min_normalized": 0.03557312252964427,
- "x_max_normalized": 0.2015810276679842,
- "y_min_normalized": 0.30526315789473685,
- "y_max_normalized": 0.5368421052631579
- },
- {
- "annotation_label": "blue_square",
- "x_min_normalized": 0.039525691699604744,
- "x_max_normalized": 0.2015810276679842,
- "y_min_normalized": 0.2578947368421053,
- "y_max_normalized": 0.5473684210526316
- }
- ],
- "classification_annotations": [
- {
- "annotation_label": "blue_star"
- },
- {
- "annotation_label": "blue_square"
- }
- ]
-}
-```
-
-In your training script, you must parse the dataset file for the classification or bounding box annotations from the dataset metadata.
-Depending on if you are training a classification or detection model, the template script contains the `parse_filenames_and_labels_from_json()` and the `parse_filenames_and_bboxes_from_json()` function.
-
-{{% /expand%}}
-
-If the script you are creating does not use an image dataset, you only need the model output directory.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**6. Add logic to produce the model artifact**
-
-You must fill in the `build_and_compile_model` function.
-In this part of the script, you use the data from the dataset and the annotations from the dataset file to build a Machine Learning model.
-
-As an example, you can refer to the logic from model/training.py from this [example classification training script](https://github.com/viam-modules/classification-tflite) that trains a classification model using TensorFlow and Keras.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**7. Save the model artifact**
-
-The `save_model()` and the `save_labels()` functions in the template before the `main` logic save the model artifact your training job produces to the `model_output_directory` in the cloud.
-
-Once a training job is complete, Viam checks the output directory and creates a package with all of the contents of the directory, creating or updating a registry item for the ML model.
-
-You must fill in these functions.
-
-As an example, you can refer to the logic from model/training.py from this [example classification training script](https://github.com/viam-modules/classification-tflite) that trains a classification model using TensorFlow and Keras.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**8. Update the main method**
-
-Update the main to call the functions you have just created.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**9. Using Viam APIs in a training script**
-
-If you need to access any of the [Viam APIs](/appendix/apis/) within a custom training script, you can use the environment variables `API_KEY` and `API_KEY_ID` to establish a connection.
-These environment variables will be available to training scripts.
-
-```python
-async def connect() -> ViamClient:
- """Returns a authenticated connection to the ViamClient for the requested
- org associated with the submitted training job."""
- # The API key and key ID can be accessed programmatically, using the
- # environment variable API_KEY and API_KEY_ID. The user does not need to
- # supply the API keys, they are provided automatically when the training
- # job is submitted.
- dial_options = DialOptions.with_api_key(
- os.environ.get("API_KEY"), os.environ.get("API_KEY_ID")
- )
- return await ViamClient.create_from_dial_options(dial_options)
-```
-
-{{% /tablestep %}}
-{{< /table >}}
-
-## Test your training script locally
-
-You can export one of your Viam datasets to test your training script locally.
-
-{{< table >}}
-{{% tablestep %}}
-**1. Export your dataset**
-
-You can get the dataset ID from the dataset page or using the [`viam dataset list`](/cli/#dataset) command:
-
-```sh {class="command-line" data-prompt="$"}
-viam dataset export --destination= --dataset-id= --include-jsonl=true
-```
-
-The dataset will be formatted like the one Viam produces for the training.
-Use the `parse_filenames_and_labels_from_json` and `parse_filenames_and_bboxes_from_json` functions to get the images and annotations from your dataset file.
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**2. Run your training script locally**
-
-Install any required dependencies and run your training script specifying the path to the dataset.jsonl file from your exported dataset:
-
-```sh {class="command-line" data-prompt="$"}
-python3 -m model.training --dataset_file=/path/to/dataset.jsonl \
- --model_output_directory=. --custom_arg=3
-```
-
-{{% /tablestep %}}
-{{< /table >}}
-
-## Upload your training script
-
-To be able to use your training script in the Viam platform, you must upload it to the Viam Registry.
-
-{{< table >}}
-{{% tablestep %}}
-**1. Package the training script as a tar.gz source distribution**
-
-Before you can upload your training script to Viam, you have to compress your project folder into a tar.gz file:
-
-```sh {class="command-line" data-prompt="$"}
-tar -czvf my-training.tar.gz my-training/
-```
-
-{{% alert title="Tip" color="tip" %}}
-You can refer to the directory structure of this [example classification training script](https://github.com/viam-modules/classification-tflite).
-{{% /alert %}}
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**2. Upload a training script**
-
-To upload your custom training script to the registry, use the `viam training-script upload` command.
-
-{{< tabs >}}
-{{% tab name="Usage" %}}
-
-```sh {class="command-line" data-prompt="$"}
-viam training-script upload --path= \
- --org-id= --script-name=
-```
-
-{{% /tab %}}
-{{% tab name="Examples" %}}
-
-```sh {class="command-line" data-prompt="$"}
-viam training-script upload --path=my-training.tar.gz \
- --org-id= --script-name=my-training-script
-
-viam training-script upload --path=my-training.tar.gz \
- --org-id= --script-name=my-training \
- --framework=tensorflow --type=single_label_classification \
- --description="Custom image classification model" \
- --visibility=private
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-You can also [specify the version, framework, type, visibility, and description](/cli/#training-script) when uploading a custom training script.
-
-To find your organization's ID, run the following command:
-
-```sh {class="command-line" data-prompt="$"}
-viam organization list
-```
-
-After a successful upload, the CLI displays a confirmation message with a link to view your changes online.
-You can view uploaded training scripts by navigating to the [registry's **Training Scripts** page](https://app.viam.com/registry?type=Training+Script).
-
-{{% /tablestep %}}
-{{< /table >}}
-
-## Submit a training job
-
-After uploading the training script, you can run it by submitting a training job through the Viam app or using the Viam CLI or [ML Training client API](/appendix/apis/ml-training-client/#submittrainingjob).
-
-{{< table >}}
-{{% tablestep %}}
-**1. Create the training job**
-
-{{< tabs >}}
-{{% tab name="Viam app" min-height="150px" %}}
-
-{{}}
-
-In the Viam app, navigate to your list of [**DATASETS**](https://app.viam.com/data/datasets) and select the one you want to train a model on.
-
-Click **Train model** and select **Train on a custom training script**, then follow the prompts.
-
-{{% /tab %}}
-{{% tab name="CLI" %}}
-
-You can use [`viam train submit custom from-registry`](/cli/#positional-arguments-submit) to submit a training job.
-
-For example:
-
-```sh {class="command-line" data-prompt="$"}
-viam train submit custom from-registry --dataset-id= \
- --org-id= --model-name=MyRegistryModel \
- --model-version=2 --version=1 \
- --script-name=mycompany:MyCustomTrainingScript
- --args=custom_arg1=3,custom_arg2="'green_square blue_star'"
-```
-
-This command submits a training job to the previously uploaded `MyCustomTrainingScript` with another input dataset, which trains `MyRegistryModel` and publishes that to the registry.
-
-You can get the dataset id from the dataset page or using the [`viam dataset list`](/cli/#dataset) command.
-
-{{% /tab %}}
-{{< /tabs >}}
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**2. Check on training job process**
-
-You can view your training job on the **DATA** page's [**TRAINING** tab](https://app.viam.com/training).
-
-Once the model has finished training, it becomes visible on the **DATA** page's [**MODELS** tab](https://app.viam.com/data/models).
-
-You will receive an email when your training job completes.
-
-You can also check your training jobs and their status from the CLI:
-
-```sh {class="command-line" data-prompt="$"}
-viam train list --org-id= --job-status=unspecified
-```
-
-{{% /tablestep %}}
-{{% tablestep %}}
-**3. Debug your training job**
-
-From the **DATA** page's [**TRAINING** tab](https://app.viam.com/training), click on your training job's ID to see its logs.
-
-{{< alert title="Note" color="note" >}}
-
-Your training script may output logs at the error level but still succeed.
-
-{{< /alert >}}
-
-You can also view your training jobs' logs with the [`viam train logs`](/cli/#train) command.
-
-{{% /tablestep %}}
-{{< /table >}}
-
-## Next steps
-
-To use your new model with machines, you must deploy it with the [ML model service](/services/ml/).
-Then you can use another service, such as the vision service, to apply the deployed model to camera feeds.
-
-To see models in use with machines, see one of the following resources:
-
-{{< cards >}}
-{{% card link="/how-tos/detect-people/" %}}
-{{% card link="/tutorials/projects/helmet/" %}}
-{{% card link="/tutorials/projects/integrating-viam-with-openai/" %}}
-{{< /cards >}}
diff --git a/docs/how-tos/create-module.md b/docs/how-tos/create-module.md
deleted file mode 100644
index 2a548fc0f03..00000000000
--- a/docs/how-tos/create-module.md
+++ /dev/null
@@ -1,1687 +0,0 @@
----
-title: "Create a new module"
-linkTitle: "Create a module"
-type: "docs"
-weight: 25
-images: ["/registry/module-puzzle-piece.svg"]
-tags: ["modular resources", "components", "services", "registry"]
-description: "Add support for a new component or service model by writing a module."
-aliases:
- - /registry/create/
- - /use-cases/create-module/
-languages: ["python", "go", "c++"]
-viamresources: []
-platformarea: ["registry"]
-level: "Intermediate"
-date: "2024-07-30"
-# updated: "" # When the tutorial was last entirely checked
-cost: "0"
----
-
-{{}}
-
-
-Viam provides built-in support for a variety of different {{< glossary_tooltip term_id="component" text="components" >}} and {{< glossary_tooltip term_id="service" text="services" >}}, as well as a registry full of {{< glossary_tooltip term_id="module" text="modules" >}} created by other users.
-If no [existing modules](/registry/modular-resources/) support your specific use case, you can write your own custom modular {{< glossary_tooltip term_id="resource" text="resources" >}} by creating a module, and either upload it to the [Viam Registry](https://app.viam.com/registry) to share it publicly, or deploy it to your machine as a local module without uploading it to the registry.
-
-Follow the instructions below to learn how to write a new module using your preferred language and its corresponding [Viam SDK](/sdks/), and then deploy it to your machines.
-
-{{% alert title="In this page" color="tip" %}}
-
-1. [Write a custom module to support a new resource.](#write-a-module)
-1. [Test your module locally.](#test-your-module-locally)
-1. [Upload your module to the modular resource registry.](#upload-your-module-to-the-modular-resource-registry)
-1. [Deploy your module on more machines.](#deploy-your-module-to-more-machines)
-
-{{% /alert %}}
-
-{{< alert title="Note: viam-micro-server modules" color="note" >}}
-[`viam-micro-server`](/installation/viam-micro-server-setup/#install-viam-micro-server) works differently from the RDK (and `viam-server`), so creating modular resources for it is different from the process described on this page.
-Refer to the [Micro-RDK Module Template on GitHub](https://github.com/viamrobotics/micro-rdk/tree/main/templates/module) for information on how to create custom resources for your `viam-micro-server` machine.
-You will need to [recompile and flash your ESP32 yourself](/installation/viam-micro-server-setup/#install-viam-micro-server) instead of using Viam's prebuilt binary and installer.
-{{< /alert >}}
-
-{{% alert title="Tip" color="tip" %}}
-For a simplified step-by-step guide, see [Create a Hello World module](/how-tos/hello-world-module/).
-{{% /alert %}}
-
-You can also watch this guide to creating a vision service module:
-
-{{}}
-
-## Write a module
-
-Generally, to write a module, you will complete the following steps:
-
-1. Choose a Viam API to implement in your model.
-1. Write your new model definition code to map all the capabilities of your model to the API.
-1. Write an entry point (main program) file that registers your model with the Viam SDK and starts it up.
-1. Compile or package the model definition file or files, main program file, and any supporting files into a single executable file (a module) that can be run by `viam-server`.
-
-While you can certainly combine the resource model definition and the main program code into a single file if desired (for example, a single `main.py` program that includes both the model definition and the `main()` program that uses it), this guide will use separate files for each.
-
-### Choose an API to implement in your model
-
-Look through the [component APIs](/appendix/apis/#component-apis) and [service API](/appendix/apis/#service-apis) and find the API that best fits your use case.
-Each API contains various methods which you will need to define in your module:
-
-- One or more methods specific to that API, such as the servo component's `Move` and `GetPosition` methods.
-- Inherited `ResourceBase` methods such as `DoCommand` and `Close`, common to all Viam {{< glossary_tooltip term_id="resource" text="resource" >}} APIs.
-- (For some APIs) Other inherited methods, for example all actuator APIs such as the motor API and servo API inherit `IsMoving` and `Stop`.
-
-{{< expand "Click for more guidance" >}}
-Think about what functionality you want your module to provide, what methods you need, and choose an API to implement accordingly.
-For example, the [sensor API](/appendix/apis/components/sensor/) has a `GetReadings` method, so if you create a module for a model of sensor, you'll need to write code to provide a response to the `GetReadings` method.
-If instead of just getting readings, you actually have an encoder and need to be able to reset the zero position, use the [encoder API](/appendix/apis/components/encoder/) so you can define functionality behind the `GetPosition` and `ResetPosition` methods.
-
-In addition to the list of methods, another reason to choose one API over another is how certain APIs fit into the Viam ecosystem.
-For example, though you could technically implement a GPS as a sensor with just the `GetReadings` method, if you implement it as a movement sensor then you have access to methods like `GetCompassHeading` which allow you to use your GPS module with the [navigation service](/services/navigation/).
-For this reason, it's generally best to choose the API that most closely matches your hardware or software.
-{{< /expand >}}
-
-{{% alert title=Note color="note" %}}
-If you want to write a module to add support to a new type of component or service that is relatively unique, consider using the generic API for your resource type to build your own API:
-
-- If you are working with a component that doesn't fit into any of the existing component APIs, you can use the [generic component](/components/generic/) to build your own component API.
-- If you are designing a service that doesn't fit into any of the existing service APIs, you can use the [generic service](/services/generic/) to build your own service API.
-- It is also possible to [define an entirely new API](/registry/advanced/create-subtype/), but this is even more advanced than using `generic`.
-
-Most module use cases, however, benefit from implementing an existing API instead of `generic`.
-{{% /alert %}}
-
-#### Valid API identifiers
-
-Each existing component or service API has a unique identifier in the form of a colon-delimited triplet.
-You will use this {{< glossary_tooltip term_id="api-namespace-triplet" text="API namespace triplet" >}} when creating your new model, to indicate which API it uses.
-
-The API namespace triplet is the same for all built-in and modular models that implement a given API.
-For example, every model of motor built into Viam, as well as every custom model of motor provided by a module, all use the same API namespace triplet `rdk:component:motor` to indicate that they implement the [motor API](/components/motor/#api).
-
-The three pieces of the API namespace triplet are as follows:
-
-{{< tabs >}}
-{{% tab name="Component" %}}
-
-- `namespace`: `rdk`
-- `type`: `component`
-- `subtype`: any one of [these component proto files](https://github.com/viamrobotics/api/tree/main/proto/viam/component), for example `motor` if you are creating a new model of motor
-
-{{% /tab %}}
-{{% tab name="Service" %}}
-
-- `namespace`: `rdk`
-- `type`: `service`
-- `subtype`: any one of [these service proto files](https://github.com/viamrobotics/api/tree/main/proto/viam/service), for example `vision` if you are creating a new model of vision service
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Name your new resource model
-
-In addition to determining which existing API namespace triplet to use when creating your module, you need to decide on a separate triplet unique to your model.
-
-{{< expand "API namespace triplet and model namespace triplet examples" >}}
-
-The `rand:yahboom:arm` model and the `rand:yahboom:gripper` model use the repository name [yahboom](https://github.com/viam-labs/yahboom).
-The models implement the `rdk:component:arm` and the `rdk:component:gripper` API to support the Yahboom DOFBOT arm and gripper, respectively:
-
-```json
-{
- "api": "rdk:component:arm",
- "model": "rand:yahboom:arm"
-},
-{
- "api": "rdk:component:gripper",
- "model": "rand:yahboom:gripper"
-}
-```
-
-The `viam-labs:audioout:pygame` model uses the repository name [audioout](https://github.com/viam-labs/audioout).
-It implements the custom API `viam-labs:service:audioout`:
-
-```json
-{
- "api": "viam-labs:service:audioout",
- "model": "viam-labs:audioout:pygame"
-}
-```
-
-{{< /expand >}}
-
-A resource model is identified by a unique name, called the {{< glossary_tooltip term_id="model-namespace-triplet" text="model namespace triplet" >}}, using the format: `namespace:repo-name:model-name`, where:
-
-- `namespace` is the [namespace of your organization](/cloud/organizations/#create-a-namespace-for-your-organization).
- - For example, if your organization uses the `acme` namespace, your models must all begin with `acme`, like `acme:repo-name:mybase`.
- If you do not intend to [upload your module](#upload-your-module-to-the-modular-resource-registry) to the [Viam Registry](https://app.viam.com/registry), you do not need to use your organization's namespace as your model's namespace.
- - The `viam` namespace is reserved for models provided by Viam.
-- `repo-name` is the code repository (GitHub repo) that houses your module code.
- - Ideally, your `repo-name` should describe the common functionality provided across the model or models of that module.
-- `model-name` is the name of the new resource model that your module will provide.
-
-For example, if your organization namespace is `acme`, and you have written a new base implementation named `mybase` which you have pushed to a repository named `my-custom-base-repo`, you would use the namespace `acme:my-custom-base-repo:mybase` for your model.
-
-More requirements:
-
-- Your model triplet must be all-lowercase.
-- Your model triplet may only use alphanumeric (`a-z` and `0-9`), hyphen (`-`), and underscore (`_`) characters.
-
-Determine the model name you want to use based on these requirements, then proceed to the next section.
-
-### Write your new resource model definition
-
-In this step, you will code the logic that is unique to your model.
-
-{{% alert title="Tip (optional)" color="tip" %}}
-
-If you are using Golang, use the [Golang Module templates](https://github.com/viam-labs/module-templates-golang) which contain detailed instructions for creating your module.
-
-If you are using Python, you can use the [Viam module generator](https://github.com/viam-labs/generator-viam-module/) to generate the scaffolding for a module with one resource model.
-
-{{% /alert %}}
-
-{{< expand "Additional example modules" >}}
-
-Browse additional example modules by language:
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-
-| Module | Repository | Description |
-| ------ | ---------- | ----------- |
-| [berryimu](https://app.viam.com/module/viam-labs/berryimu) | [viam-labs/berry-imu](https://github.com/viam-labs/berry-imu) | Extends the built-in [movement sensor API](/appendix/apis/components/movement-sensor/) to support using the BerryIMU v3 accelerometer, gyroscope and magnetometer using an I2C connection on ARM64 systems. |
-| [oak](https://app.viam.com/module/viam/oak) | [viam-modules/viam-camera-oak](https://github.com/viam-modules/viam-camera-oak) | Extends the built-in [camera API](/appendix/apis/components/camera/) to support OAK cameras. |
-| [odrive](https://app.viam.com/module/viam/odrive) | [viamrobotics/odrive](https://github.com/viamrobotics/odrive) | Extends the built-in [motor API](/components/motor/#api) to support the ODrive motor. This module provides two models, one for a `canbus`-connected ODrive motor, and one for a `serial`-connected ODrive motor. |
-| [yahboom](https://app.viam.com/module/rand/yahboom) | [viamlabs/yahboom](https://github.com/viam-labs/yahboom) | Extends the built-in [arm API](/appendix/apis/components/arm/) and [gripper API](/appendix/apis/components/gripper/) to support the Yahboom Dofbot robotic arm. |
-
-For more Python module examples:
-
-- See the [Python SDK `examples` directory](https://github.com/viamrobotics/viam-python-sdk/tree/main/examples) for sample module code of varying complexity.
-- For tutorials featuring modular resource creation, see the [Modular resource examples](/registry/examples/) page.
-- For an example featuring a sensor, see [MCP300x](https://github.com/viam-labs/mcp300x-adc-sensor).
-- For additional examples use the [modular resources search](/registry/modular-resources/) to search for examples of the model you are implementing, and click on the model's link to be able to browse its code.
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-
-| Module | Repository | Description |
-| ------ | ---------- | ----------- |
-| [agilex-limo](https://app.viam.com/module/viam/agilex-limo) | [viamlabs/agilex](https://github.com/viam-labs/agilex/) | Extends the built-in [base API](/appendix/apis/components/base/) to support the Agilex Limo base. |
-| [rplidar](https://app.viam.com/module/viam/rplidar) | [viamrobotics/rplidar](https://github.com/viamrobotics/rplidar) | Extends the built-in [camera API](/appendix/apis/components/camera/) to support several models of the SLAMTEC RPlidar. |
-| [filtered-camera](https://app.viam.com/module/erh/filtered-camera) | [erh/filtered_camera](https://github.com/erh/filtered_camera) | Extends the built-in [camera API](/appendix/apis/components/camera/) to enable filtering captured images by comparing to a defined ML model, and only syncing matching images to the Viam app. See the [filtered-camera guide](/how-tos/image-data/) for more information. |
-
-For more Go module examples:
-
-- See the [Go SDK `examples` directory](https://github.com/viamrobotics/rdk/blob/main/examples/) for sample module code of varying complexity.
-- For additional examples use the [modular resources search](/registry/modular-resources/) to search for examples of the model you are implementing, and click on the model's link to be able to browse its code.
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-
-| Module | Repository | Description |
-| ------ | ---------- | ----------- |
-| [csi-cam](https://app.viam.com/module/viam/csi-cam) | [viamrobotics/csi-camera](https://github.com/viamrobotics/csi-camera/) | Extends the built-in [camera API](/appendix/apis/components/camera/) to support the Intel CSI camera. |
-
-
-{{% /tab %}}
-{{% /tabs %}}
-
-Explore the full list of available modules in the [Viam Registry](https://app.viam.com/registry).
-{{< /expand >}}
-
-Follow the instructions below to define the capabilities provided by your model, for the language you are using to write your module code:
-
-{{% alert title="Note: Pin numbers" color="note" %}}
-
-If your module references {{< glossary_tooltip term_id="pin-number" text="pin numbers" >}}, you should use physical board pin numbers, _not_ GPIO (BCM) numbers, to maintain consistency across {{< glossary_tooltip term_id="resource" text="resources" >}} from different sources.
-
-{{% /alert %}}
-
-{{< tabs >}}
-{{% tab name="Python" %}}
-
-First, inspect the built-in class provided by the resource API that you are extending.
-
-For example, if you wanted to add support for a new [base component](/components/base/) to Viam (the component that represents the central physical platform of your machine, to which all other components are connected), you would start by looking at the built-in `Base` component class, which is defined in the [Viam Python SDK](https://github.com/viamrobotics/viam-python-sdk) in the following file:
-
-
-| Resource Model File | Description |
-| ------------------- | ----------- |
-| [src/viam/components/base/base.py](https://github.com/viamrobotics/viam-python-sdk/blob/main/src/viam/components/base/base.py) | Defines the built-in `Base` class, which includes several built-in methods such as `move_straight()`. |
-
-{{% alert title="Tip" color="tip" %}}
-You can view the other built-in component classes in similar fashion.
-For example, the `Camera` class is defined in [camera.py](https://github.com/viamrobotics/viam-python-sdk/blob/main/src/viam/components/camera/camera.py) and the `Sensor` class is defined in [sensor.py](https://github.com/viamrobotics/viam-python-sdk/blob/main/src/viam/components/sensor/sensor.py).
-The same applies to service APIs.
-For example, the `MLModel` class for the ML Model service is defined in [mlmodel.py](https://github.com/viamrobotics/viam-python-sdk/blob/main/src/viam/services/mlmodel/mlmodel.py).
-{{% /alert %}}
-
-Take note of the methods defined as part of the class API, such as `move_straight()` for the `Base` class.
-Your new resource model must either:
-
-- implement all of the methods that the corresponding resource API provides, or
-- explicitly raise a `NotImplementedError()` in the body of functions you do not want to implement or put `pass`.
-
-Otherwise, your new class will not instantiate.
-
-Next, create a file that will define your new resource model.
-This file will inherit from the existing class for your resource type, implement each built-in method for that class (or raise a `NotImplementedError()` for it), and define any new functionality you want to include as part of your model.
-
-For example, the following file, `my_base.py`:
-
-- defines a new model `acme:my-custom-base-repo:mybase` by implementing a new `MyBase` class, which inherits from the built-in class `Base`.
-- defines a new constructor `new_base()` and a new method `validate_config()`.
-- does not implement several built-in methods, including `get_properties()` and `set_velocity()`, but instead raises a `NotImplementedError` error in the body of those functions.
- This prevents these methods from being used by new base components that use this modular resource, but meets the requirement that all built-in methods either be defined or raise a `NotImplementedError()` error, to ensure that the new `MyBase` class successfully instantiates.
-
-{{< expand "Click to view sample code for my_base.py" >}}
-
-```python {class="line-numbers linkable-line-numbers"}
-from typing import ClassVar, Mapping, Sequence, Any, Dict, Optional, cast
-
-from typing_extensions import Self
-
-from viam.components.base import Base
-from viam.components.motor import Motor
-from viam.module.types import Reconfigurable
-from viam.module.module import Module
-from viam.proto.app.robot import ComponentConfig
-from viam.proto.common import ResourceName, Vector3
-from viam.resource.base import ResourceBase
-from viam.resource.registry import Registry, ResourceCreatorRegistration
-from viam.resource.types import Model, ModelFamily
-from viam.utils import ValueTypes
-from viam.logging import getLogger
-
-LOGGER = getLogger(__name__)
-
-
-class MyBase(Base, Reconfigurable):
- """
- MyBase implements a base that only supports set_power
- (basic forward/back/turn controls) is_moving (check if in motion), and stop
- (stop all motion).
-
- It inherits from the built-in resource subtype Base and conforms to the
- ``Reconfigurable`` protocol, which signifies that this component can be
- reconfigured. Additionally, it specifies a constructor function
- ``MyBase.new_base`` which confirms to the
- ``resource.types.ResourceCreator`` type required for all models.
- """
-
- # Here is where we define our new model's colon-delimited-triplet:
- # acme:my-custom-base-repo:mybase
- # acme = namespace, my-custom-base-repo = repo-name, mybase = model name.
- MODEL: ClassVar[Model] = Model(
- ModelFamily("acme", "my-custom-base-repo"), "mybase")
-
- def __init__(self, name: str, left: str, right: str):
- super().__init__(name, left, right)
-
- # Constructor
- @classmethod
- def new_base(cls,
- config: ComponentConfig,
- dependencies: Mapping[ResourceName, ResourceBase]) -> Self:
- base = cls(config.name)
- base.reconfigure(config, dependencies)
- return base
-
- # Validates JSON Configuration
- @classmethod
- def validate_config(cls, config: ComponentConfig) -> Sequence[str]:
- left_name = config.attributes.fields["motorL"].string_value
- if left_name == "":
- raise Exception(
- "A motorL attribute is required for a MyBase component.")
- right_name = [config.attributes.fields["motorR"].string_value]
- if right_name == "":
- raise Exception(
- "A motorR attribute is required for a MyBase component.")
- return [left_name, right_name]
-
- # Handles attribute reconfiguration
- def reconfigure(self,
- config: ComponentConfig,
- dependencies: Mapping[ResourceName, ResourceBase]):
- left_name = config.attributes.fields["motorL"].string_value
- right_name = config.attributes.fields["motorR"].string_value
-
- left_motor = dependencies[Motor.get_resource_name(left_name)]
- right_motor = dependencies[Motor.get_resource_name(right_name)]
-
- self.left = cast(Motor, left_motor)
- self.right = cast(Motor, right_motor)
-
- """
- Implement the methods the Viam RDK defines for the base API
- (rdk:component:base)
- """
-
- # move_straight: unimplemented
- async def move_straight(self,
- distance: int,
- velocity: float,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
- raise NotImplementedError
-
- # spin: unimplemented
- async def spin(self,
- angle: float,
- velocity: float,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
- raise NotImplementedError
-
- # set_power: set the linear and angular velocity of the left and right
- # motors on the base
- async def set_power(self,
- linear: Vector3,
- angular: Vector3,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
-
- # stop the base if absolute value of linear and angular velocity is
- # less than .01
- if abs(linear.y) < 0.01 and abs(angular.z) < 0.01:
- return self.stop(extra=extra, timeout=timeout)
-
- # use linear and angular velocity to calculate percentage of max power
- # to pass to SetPower for left & right motors
- sum = abs(linear.y) + abs(angular.z)
-
- self.left.set_power(power=((linear.y - angular.z) / sum),
- extra=extra,
- timeout=timeout)
- self.right.set_power(power=((linear.y + angular.z) / sum),
- extra=extra,
- timeout=timeout)
-
- # set_velocity: unimplemented
- async def set_velocity(self,
- linear: Vector3,
- angular: Vector3,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
- raise NotImplementedError
-
- # get_properties: unimplemented
- async def get_properties(self,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
- raise NotImplementedError
-
- # stop: stop the base from moving by stopping both motors
- async def stop(self,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs):
- self.left.stop(extra=extra, timeout=timeout)
- self.right.stop(extra=extra, timeout=timeout)
-
- # is_moving: check if either motor on the base is moving with motors'
- # is_powered
- async def is_moving(self,
- *,
- extra: Optional[Dict[str, Any]] = None,
- timeout: Optional[float] = None,
- **kwargs) -> bool:
- return self.left.is_powered(extra=extra, timeout=timeout)[0] or \
- self.right.is_powered(extra=extra, timeout=timeout)[0]
-```
-
-{{< /expand >}}
-
-When implementing built-in methods from the Viam Python SDK in your model, be sure your implementation of those methods returns any values designated in the built-in function's return signature, typed correctly.
-For example, the `is_moving()` implementation in the example code above returns a `bool` value, which matches the return value of the built-in `is_moving()` function as defined in the Viam Python SDK in the file [`base.py`](https://github.com/viamrobotics/viam-python-sdk/blob/main/src/viam/components/base/base.py).
-
-For more information on the base component API methods used in this example, see the following resources:
-
-- [Python SDK documentation for the `Base` class](https://python.viam.dev/autoapi/viam/components/base/index.html)
-- [Base API methods](/appendix/apis/components/base/)
-
-{{% /tab %}}
-{{% tab name="Go"%}}
-
-First, inspect the built-in package provided by the resource API that you are extending.
-
-For example, if you wanted to add support for a new [base component](/components/base/) to Viam (the component that represents the central physical platform of your machine, to which all other components are connected), you would start by looking at the built-in `base` component package, which is defined in the [Viam Go SDK](https://github.com/viamrobotics/rdk/) in the following file:
-
-
-| Resource Model File | Description |
-| ------------------- | ----------- |
-| [components/base/base.go](https://github.com/viamrobotics/rdk/blob/main/components/base/base.go) | Defines the built-in `base` package, which includes several built-in methods such as `MoveStraight()`. |
-
-{{% alert title="Tip" color="tip" %}}
-You can view the other built-in component packages in similar fashion.
-For example, the `camera` package is defined in [camera.go](https://github.com/viamrobotics/rdk/blob/main/components/camera/camera.go) and the `sensor` package is defined in [sensor.go](https://github.com/viamrobotics/rdk/blob/main/components/sensor/sensor.go).
-The same applies to service APIs.
-For example, the `mlmodel` package for the ML Model service is defined in [mlmodel.go](https://github.com/viamrobotics/rdk/blob/main/services/mlmodel/mlmodel.go).
-{{% /alert %}}
-
-Take note of the methods defined as part of the package API, such as `MoveStraight()` for the `base` package.
-Your new resource model must either:
-
-- implement all of the methods that the corresponding resource API provides, or
-- explicitly return an `errUnimplemented` error in the body of functions you do not want to implement.
-
-Otherwise, your new package will not instantiate.
-
-Next, create a file that will define your new resource model.
-This file will inherit from the existing package for your resource type, implement - or return an `errUnimplemented` error for - each built-in method for that package, and define any new functionality you want to include as part of your model.
-
-For example, the following file, `mybase.go`:
-
-- defines a new model `acme:my-custom-base-repo:mybase` by implementing a new `mybase` package, which inherits from the built-in package `base`.
-- defines a new constructor `newBase()` and a new method `Validate()`.
-- does not implement several built-in methods, including `MoveStraight()` and `SetVelocity()`, but instead returns an `errUnimplemented` error in the body of those methods.
- This prevents these methods from being used by new base components that use this modular resource, but meets the requirement that all built-in methods either be defined or return an `errUnimplemented` error, to ensure that the new `mybase` package successfully instantiates.
-
-{{< expand "Click to view sample code for mybase.go" >}}
-
-```go {class="line-numbers linkable-line-numbers"}
-// Package mybase implements a base that only supports SetPower (basic forward/back/turn controls), IsMoving (check if in motion), and Stop (stop all motion).
-// It extends the built-in resource subtype Base and implements methods to handle resource construction, attribute configuration, and reconfiguration.
-
-package mybase
-
-import (
- "context"
- "fmt"
- "math"
-
- "github.com/golang/geo/r3"
- "github.com/pkg/errors"
- "go.uber.org/multierr"
-
- "go.viam.com/rdk/components/base"
- "go.viam.com/rdk/components/base/kinematicbase"
- "go.viam.com/rdk/components/motor"
- "go.viam.com/rdk/logging"
- "go.viam.com/rdk/resource"
- "go.viam.com/rdk/spatialmath"
-)
-
-// Here is where we define your new model's colon-delimited-triplet (acme:my-custom-base-repo:mybase)
-// acme = namespace, my-custom-base-repo = repo-name, mybase = model name.
-var (
- Model = resource.NewModel("acme", "my-custom-base-repo", "mybase")
- errUnimplemented = errors.New("unimplemented")
-)
-
-const (
- myBaseWidthMm = 500.0 // Base has a wheel tread of 500 millimeters
- myBaseTurningRadiusM = 0.3 // Base turns around a circle of radius .3 meters
-)
-
-func init() {
- resource.RegisterComponent(base.API, Model, resource.Registration[base.Base, *Config]{
- Constructor: newBase,
- })
-}
-
-func newBase(ctx context.Context, deps resource.Dependencies, conf resource.Config, logger logging.Logger) (base.Base, error) {
- b := &myBase{
- Named: conf.ResourceName().AsNamed(),
- logger: logger,
- }
- if err := b.Reconfigure(ctx, deps, conf); err != nil {
- return nil, err
- }
- return b, nil
-}
-
-
-// Reconfigure reconfigures with new settings.
-func (b *myBase) Reconfigure(ctx context.Context, deps resource.Dependencies, conf resource.Config) error {
- b.left = nil
- b.right = nil
-
- // This takes the generic resource.Config passed down from the parent and converts it to the
- // model-specific (aka "native") Config structure defined, above making it easier to directly access attributes.
- baseConfig, err := resource.NativeConfig[*Config](conf)
- if err != nil {
- return err
- }
-
- b.left, err = motor.FromDependencies(deps, baseConfig.LeftMotor)
- if err != nil {
- return errors.Wrapf(err, "unable to get motor %v for mybase", baseConfig.LeftMotor)
- }
-
- b.right, err = motor.FromDependencies(deps, baseConfig.RightMotor)
- if err != nil {
- return errors.Wrapf(err, "unable to get motor %v for mybase", baseConfig.RightMotor)
- }
-
- geometries, err := kinematicbase.CollisionGeometry(conf.Frame)
- if err != nil {
- b.logger.CWarnf(ctx, "base %v %s", b.Name(), err.Error())
- }
- b.geometries = geometries
-
- // Stop motors when reconfiguring.
- return multierr.Combine(b.left.Stop(context.Background(), nil), b.right.Stop(context.Background(), nil))
-}
-
-// DoCommand simply echos whatever was sent.
-func (b *myBase) DoCommand(ctx context.Context, cmd map[string]interface{}) (map[string]interface{}, error) {
- return cmd, nil
-}
-
-// Config contains two component (motor) names.
-type Config struct {
- LeftMotor string `json:"motorL"`
- RightMotor string `json:"motorR"`
-}
-
-// Validate validates the config and returns implicit dependencies,
-// this Validate checks if the left and right motors exist for the module's base model.
-func (cfg *Config) Validate(path string) ([]string, error) {
- // check if the attribute fields for the right and left motors are non-empty
- // this makes them required for the model to successfully build
- if cfg.LeftMotor == "" {
- return nil, fmt.Errorf(`expected "motorL" attribute for mybase %q`, path)
- }
- if cfg.RightMotor == "" {
- return nil, fmt.Errorf(`expected "motorR" attribute for mybase %q`, path)
- }
-
- // Return the left and right motor names so that `newBase` can access them as dependencies.
- return []string{cfg.LeftMotor, cfg.RightMotor}, nil
-}
-
-type myBase struct {
- resource.Named
- left motor.Motor
- right motor.Motor
- logger logging.Logger
- geometries []spatialmath.Geometry
-}
-
-// MoveStraight does nothing.
-func (b *myBase) MoveStraight(ctx context.Context, distanceMm int, mmPerSec float64, extra map[string]interface{}) error {
- return errUnimplemented
-}
-
-// Spin does nothing.
-func (b *myBase) Spin(ctx context.Context, angleDeg, degsPerSec float64, extra map[string]interface{}) error {
- return errUnimplemented
-}
-
-// SetVelocity does nothing.
-func (b *myBase) SetVelocity(ctx context.Context, linear, angular r3.Vector, extra map[string]interface{}) error {
- return errUnimplemented
-}
-
-// SetPower computes relative power between the wheels and sets power for both motors.
-func (b *myBase) SetPower(ctx context.Context, linear, angular r3.Vector, extra map[string]interface{}) error {
- b.logger.CDebugf(ctx, "SetPower Linear: %.2f Angular: %.2f", linear.Y, angular.Z)
- if math.Abs(linear.Y) < 0.01 && math.Abs(angular.Z) < 0.01 {
- return b.Stop(ctx, extra)
- }
- sum := math.Abs(linear.Y) + math.Abs(angular.Z)
- err1 := b.left.SetPower(ctx, (linear.Y-angular.Z)/sum, extra)
- err2 := b.right.SetPower(ctx, (linear.Y+angular.Z)/sum, extra)
- return multierr.Combine(err1, err2)
-}
-
-// Stop halts motion.
-func (b *myBase) Stop(ctx context.Context, extra map[string]interface{}) error {
- b.logger.CDebug(ctx, "Stop")
- err1 := b.left.Stop(ctx, extra)
- err2 := b.right.Stop(ctx, extra)
- return multierr.Combine(err1, err2)
-}
-
-// IsMoving returns true if either motor is active.
-func (b *myBase) IsMoving(ctx context.Context) (bool, error) {
- for _, m := range []motor.Motor{b.left, b.right} {
- isMoving, _, err := m.IsPowered(ctx, nil)
- if err != nil {
- return false, err
- }
- if isMoving {
- return true, err
- }
- }
- return false, nil
-}
-
-// Properties returns details about the physics of the base.
-func (b *myBase) Properties(ctx context.Context, extra map[string]interface{}) (base.Properties, error) {
- return base.Properties{
- TurningRadiusMeters: myBaseTurningRadiusM,
- WidthMeters: myBaseWidthMm * 0.001, // converting millimeters to meters
- }, nil
-}
-
-// Geometries returns physical dimensions.
-func (b *myBase) Geometries(ctx context.Context, extra map[string]interface{}) ([]spatialmath.Geometry, error) {
- return b.geometries, nil
-}
-
-// Close stops motion during shutdown.
-func (b *myBase) Close(ctx context.Context) error {
- return b.Stop(ctx, nil)
-}
-```
-
-{{< /expand >}}
-
-{{< alert title="Note" color="note" >}}
-For an example featuring a sensor, see [MCP3004-8](https://github.com/mestcihazal/mcp3004-8-go).
-
-For additional examples use the [modular resources search](/registry/modular-resources/) to search for examples of the model you are implementing, and click on the model's link to be able to browse its code.
-{{< /alert >}}
-
-When implementing built-in methods from the Viam Go SDK in your model, be sure your implementation of those methods returns any values designated in the built-in method's return signature, typed correctly.
-For example, the `SetPower()` implementation in the example code above returns a `multierr` value (as provided by the [`multierr` package](https://pkg.go.dev/go.uber.org/multierr)), which allows for transparently combining multiple Go `error` return values together.
-This matches the `error` return type of the built-in `SetPower()` method as defined in the Viam Go SDK in the file [`base.go`](https://github.com/viamrobotics/rdk/blob/main/components/base/base.go).
-
-For more information on the base component API methods used in this example, see the following resources:
-
-- [Go SDK documentation for the `base` package](https://pkg.go.dev/go.viam.com/rdk/components/base#pkg-functions)
-- [Base API methods](/appendix/apis/components/base/)
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-First, inspect the built-in class provided by the resource API that you are extending.
-In the C++ SDK, all built-in classes are abstract classes.
-
-For example, if you wanted to add support for a new [base component](/components/base/) to Viam (the component that represents the central physical platform of your machine, to which all other components are connected), you would start by looking at the built-in `Base` component class, which is defined in the [Viam C++ SDK](https://cpp.viam.dev/) in the following files:
-
-
-| Resource Model File | Description |
-| ------------------- | ----------- |
-| [components/base/base.hpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/base.hpp) | Defines the API of the built-in `Base` class, which includes the declaration of several purely virtual built-in functions such as `move_straight()`. |
-| [components/base/base.cpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/base.cpp) | Provides implementations of the non-purely virtual functionality defined in `base.hpp`. |
-
-{{% alert title="Tip" color="tip" %}}
-You can view the other built-in component classes in similar fashion.
-For example, the API of the built-in `Camera` class is defined in [camera.hpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/camera.hpp) and its non-purely virtual functions are declared in [camera.cpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/camera.cpp), while the API of the built-in `Sensor` class is defined in [sensor.hpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/sensor.hpp) and its non-purely virtual functions are declared in [sensor.cpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/sensor.cpp).
-The same applies to service APIs.
-For example, the API of the built-in `MLModelService` class for the ML Model service is defined in [mlmodel.hpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/services/mlmodel.hpp) and its non-purely virtual functions declared in [mlmodel.cpp](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/services/mlmodel.cpp).
-{{% /alert %}}
-
-Take note of the functions defined as part of the class API, such as `move_straight()` for the `Base` class.
-Your new resource model must either:
-
-- define all _pure virtual methods_ that the corresponding resource API provides, or
-- explicitly `throw` a `runtime_error` in the body of functions you do not want to implement.
-
-Otherwise, your new class will not instantiate.
-For example, if your model implements the `base` class, you would either need to implement the [`move_straight()` virtual method](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/base.hpp#L72), or `throw` a `runtime_error` in the body of that function.
-However, you would _not_ need to implement the [`resource_registration()`](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/base.hpp#L56) function, as it is not a virtual method.
-
-Next, create your header file (`.hpp`) and source file (`.cpp`), which together define your new resource model.
-The header file defines the API of your class, and includes the declaration of any purely virtual functions, while the source file includes implementations of the functionality of your class.
-
-For example, the files below define the new `MyBase` class and its constituent functions:
-
-- The `my_base.hpp` header file defines the API of the `MyBase` class, which inherits from the built-in `Base` class.
- It defines a new method `validate()`, but does not implement several built-in functions, including `move_straight()` and `set_velocity()`, instead it raises a `runtime_error` in the body of those functions.
- This prevents these functions from being used by new base components that use this modular resource, but meets the requirement that all built-in functions either be defined or `throw` a `runtime_error` error, to ensure that the new `MyBase` class successfully instantiates.
-- The `my_base.cpp` source file contains the function and object definitions used by the `MyBase` class.
-
-Note that the model triplet itself, `acme:my-custom-base-repo:mybase` in this example, is defined in the entry point (main program) file `main.cpp`, which is described in the next section.
-
-{{< expand "Click to view sample code for the my_base.hpp header file" >}}
-
-```cpp {class="line-numbers linkable-line-numbers"}
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-
-using namespace viam::sdk;
-
-// `MyBase` inherits from the `Base` class defined in the Viam C++ SDK and
-// implements some of the relevant methods along with `reconfigure`. It also
-// specifies a static `validate` method that checks configuration validity.
-class MyBase : public Base {
- public:
- MyBase(Dependencies deps, ResourceConfig cfg) : Base(cfg.name()) {
- this->reconfigure(deps, cfg);
- };
- void reconfigure(Dependencies deps, ResourceConfig cfg) override;
- static std::vector validate(ResourceConfig cfg);
-
- bool is_moving() override;
- void stop(const AttributeMap& extra) override;
- void set_power(const Vector3& linear,
- const Vector3& angular,
- const AttributeMap& extra) override;
-
- AttributeMap do_command(const AttributeMap& command) override;
- std::vector get_geometries(const AttributeMap& extra) override;
- Base::properties get_properties(const AttributeMap& extra) override;
-
- void move_straight(int64_t distance_mm, double mm_per_sec, const AttributeMap& extra) override {
- throw std::runtime_error("move_straight unimplemented");
- }
- void spin(double angle_deg, double degs_per_sec, const AttributeMap& extra) override {
- throw std::runtime_error("spin unimplemented");
- }
- void set_velocity(const Vector3& linear,
- const Vector3& angular,
- const AttributeMap& extra) override {
- throw std::runtime_error("set_velocity unimplemented");
- }
-
- private:
- std::shared_ptr left_;
- std::shared_ptr right_;
-};
-```
-
-{{< /expand >}}
-
-{{< expand "Click to view sample code for the my_base.cpp source file" >}}
-
-```cpp {class="line-numbers linkable-line-numbers"}
-#include "my_base.hpp"
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-
-using namespace viam::sdk;
-
-std::string find_motor(ResourceConfig cfg, std::string motor_name) {
- auto base_name = cfg.name();
- auto motor = cfg.attributes()->find(motor_name);
- if (motor == cfg.attributes()->end()) {
- std::ostringstream buffer;
- buffer << base_name << ": Required parameter `" << motor_name
- << "` not found in configuration";
- throw std::invalid_argument(buffer.str());
- }
- const auto* const motor_string = motor->second->get();
- if (!motor_string || motor_string->empty()) {
- std::ostringstream buffer;
- buffer << base_name << ": Required non-empty string parameter `" << motor_name
- << "` is either not a string "
- "or is an empty string";
- throw std::invalid_argument(buffer.str());
- }
- return *motor_string;
-}
-
-void MyBase::reconfigure(Dependencies deps, ResourceConfig cfg) {
- // Downcast `left` and `right` dependencies to motors.
- auto left = find_motor(cfg, "left");
- auto right = find_motor(cfg, "right");
- for (const auto& kv : deps) {
- if (kv.first.short_name() == left) {
- left_ = std::dynamic_pointer_cast(kv.second);
- }
- if (kv.first.short_name() == right) {
- right_ = std::dynamic_pointer_cast(kv.second);
- }
- }
-}
-
-std::vector MyBase::validate(ResourceConfig cfg) {
- // Custom validation can be done by specifying a validate function at the
- // time of resource registration (see main.cpp) like this one.
- // Validate functions can `throw` exceptions that will be returned to the
- // parent through gRPC. Validate functions can also return a vector of
- // strings representing the implicit dependencies of the resource.
- //
- // Here, we return the names of the "left" and "right" motors as found in
- // the attributes as implicit dependencies of the base.
- return {find_motor(cfg, "left"), find_motor(cfg, "right")};
-}
-
-bool MyBase::is_moving() {
- return left_->is_moving() || right_->is_moving();
-}
-
-void MyBase::stop(const AttributeMap& extra) {
- std::string err_message;
- bool throw_err = false;
-
- // make sure we try to stop both motors, even if the first fails.
- try {
- left_->stop(extra);
- } catch (const std::exception& err) {
- throw_err = true;
- err_message = err.what();
- }
-
- try {
- right_->stop(extra);
- } catch (const std::exception& err) {
- throw_err = true;
- err_message = err.what();
- }
-
- // if we received an err from either motor, throw it.
- if (throw_err) {
- throw std::runtime_error(err_message);
- }
-}
-
-void MyBase::set_power(const Vector3& linear, const Vector3& angular, const AttributeMap& extra) {
- // Stop the base if absolute value of linear and angular velocity is less
- // than 0.01.
- if (abs(linear.y()) < 0.01 && abs(angular.z()) < 0.01) {
- stop(extra); // ignore returned status code from stop
- return;
- }
-
- // Use linear and angular velocity to calculate percentage of max power to
- // pass to set_power for left & right motors
- auto sum = abs(linear.y()) + abs(angular.z());
- left_->set_power(((linear.y() - angular.z()) / sum), extra);
- right_->set_power(((linear.y() + angular.z()) / sum), extra);
-}
-
-AttributeMap MyBase::do_command(const AttributeMap& command) {
- std::cout << "Received DoCommand request for MyBase " << Resource::name() << std::endl;
- return command;
-}
-
-std::vector MyBase::get_geometries(const AttributeMap& extra) {
- auto left_geometries = left_->get_geometries(extra);
- auto right_geometries = right_->get_geometries(extra);
- std::vector geometries(left_geometries);
- geometries.insert(geometries.end(), right_geometries.begin(), right_geometries.end());
- return geometries;
-}
-
-Base::properties MyBase::get_properties(const AttributeMap& extra) {
- // Return fake properties.
- return {2, 4, 8};
-}
-```
-
-{{< /expand >}}
-
-When implementing built-in functions from the Viam C++ SDK in your model, be sure your implementation of those functions returns any values designated in the built-in function's return signature, typed correctly.
-For example, the `set_power()` implementation in the example code above returns three values of type `Vector3`, `Vector3`, `AttributeMap`, which matches the return values of the built-in `set_power()` function as defined in the Viam C++ SDK in the file [`base.hpp`](https://github.com/viamrobotics/viam-cpp-sdk/blob/main/src/viam/sdk/components/base.hpp).
-
-For more information on the base component API methods used in these examples, see the following resources:
-
-- [C++ SDK documentation for the `Base` class](https://cpp.viam.dev/classviam_1_1sdk_1_1Base.html)
-- [Base API methods](/appendix/apis/components/base/)
-
-For more C++ module examples of varying complexity,see the [C++ SDK `examples` directory](https://github.com/viamrobotics/viam-cpp-sdk/tree/main/src/viam/examples/modules/).
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Write an entry point (main program) file
-
-A main entry point file starts the module, and adds the resource model.
-
-Follow the instructions below for the language you are using to write your module code:
-
-{{< tabs name="Sample SDK Main Program Code">}}
-{{% tab name="Python"%}}
-
-Create a main.py file to serve as the module's entry point file, which:
-
-- imports the custom model
-- defines a `main()` function that registers the model with the Python SDK
-- creates and starts the module
-
-For example, the following `main.py` file serves as the entry point file for the `MyBase` custom model.
-It imports the `MyBase` model from the `my_base.py` file that provides it, and defines a `main()` function that registers it.
-
-{{< expand "Click to view sample code for main.py" >}}
-
-```python {class="line-numbers linkable-line-numbers"}
-import asyncio
-
-from viam.components.base import Base
-from viam.module.module import Module
-from viam.resource.registry import Registry, ResourceCreatorRegistration
-from my_base import MyBase
-
-
-async def main():
- """
- This function creates and starts a new module, after adding all desired
- resource models. Resource creators must be registered to the resource
- registry before the module adds the resource model.
- """
- Registry.register_resource_creator(
- Base.SUBTYPE,
- MyBase.MODEL,
- ResourceCreatorRegistration(MyBase.new_base, MyBase.validate_config))
- module = Module.from_args()
-
- module.add_model_from_registry(Base.SUBTYPE, MyBase.MODEL)
- await module.start()
-
-if __name__ == "__main__":
- asyncio.run(main())
-```
-
-{{< /expand >}}
-
-{{% /tab %}}
-{{% tab name="Go"%}}
-
-Create a main.go file to serve as the module's entry point file, which:
-
-- imports the custom model
-- defines a `main()` function that registers the model with the Viam Go SDK
-- creates and starts the module
-
-For example, the following `main.go` file serves as the entry point file for the `mybase` custom model.
-It imports the `mybase` model from the `my_base.go` file that provides it, and defines a `main()` function that registers it.
-
-{{< expand "Click to view sample code for main.go" >}}
-
-```go {class="line-numbers linkable-line-numbers"}
-// Package main is a module which serves the mybase custom model.
-package main
-
-import (
- "context"
-
- "go.viam.com/rdk/components/base"
- "go.viam.com/rdk/logging"
- "go.viam.com/rdk/module"
- "go.viam.com/rdk/utils"
-
- // Import your local package "mybase"
- // NOTE: Update this path if your custom resource is in a different location,
- // or has a different name:
- "go.viam.com/rdk/examples/customresources/models/mybase"
-)
-
-func main() {
- // NewLoggerFromArgs will create a logging.Logger at "DebugLevel" if
- // "--log-level=debug" is an argument in os.Args and at "InfoLevel" otherwise.
- utils.ContextualMain(mainWithArgs, module.NewLoggerFromArgs("mybase"))
-}
-
-func mainWithArgs(ctx context.Context, args []string, logger logging.Logger) (err error) {
- myMod, err := module.NewModuleFromArgs(ctx, logger)
- if err != nil {
- return err
- }
-
- // Models and APIs add helpers to the registry during their init().
- // They can then be added to the module here.
- err = myMod.AddModelFromRegistry(ctx, base.API, mybase.Model)
- if err != nil {
- return err
- }
-
- err = myMod.Start(ctx)
- defer myMod.Close(ctx)
- if err != nil {
- return err
- }
- <-ctx.Done()
- return nil
-}
-```
-
-{{< /expand >}}
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-Create a main.cpp file to serve as the module's entry point file, which:
-
-- imports the custom model implementation and definitions
-- includes a `main()` function that registers the model with the Viam C++ SDK
-- creates and starts the module
-
-For example, the following `main.cpp` file serves as the entry point file for the `mybase` custom model.
-It imports the `mybase` model implementation from the `my_base.hpp` file that provides it, declares the model triplet `acme:my-custom-base-repo:mybase`, and defines a `main()` function that registers it.
-
-{{< expand "Click to view sample code for main.cpp" >}}
-
-```cpp {class="line-numbers linkable-line-numbers"}
-#include
-#include
-
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "my_base.hpp"
-
-using namespace viam::sdk;
-
-int main(int argc, char** argv) {
- API base_api = Base::static_api();
- Model mybase_model("acme", "my-custom-base-repo", "mybase");
-
- std::shared_ptr mybase_mr = std::make_shared(
- base_api,
- mybase_model,
- [](Dependencies deps, ResourceConfig cfg) { return std::make_unique(deps, cfg); },
- MyBase::validate);
-
- std::vector> mrs = {mybase_mr};
- auto my_mod = std::make_shared(argc, argv, mrs);
- my_mod->serve();
-
- return EXIT_SUCCESS;
-};
-```
-
-{{< /expand >}}
-
-{{% /tab %}}
-{{< /tabs >}}
-
-#### (Optional) Configure logging
-
-If desired, you can configure your module to output log messages to the [Viam app](https://app.viam.com/).
-Log messages sent to the Viam app appear under the [**LOGS** tab](/cloud/machines/#logs) for your machine in an easily-parsable and searchable manner.
-
-Log messages generated when your machine is offline are queued, and sent together when your machine connects to the internet once more.
-
-Add the following code to your module code to enable logging to the Viam app, depending on the language you using to code your module. You can log in this fashion from the model definition file or files, the entry point (main program) file, or both, depending on your logging needs:
-
-{{% alert title="Tip" color="tip" %}}
-The example code shown above under [Write your new resource model definition](#write-your-new-resource-model-definition) includes the requisite logging code already.
-{{% /alert %}}
-
-{{< tabs name="Configure logging">}}
-{{% tab name="Python"%}}
-
-To enable your Python module to write log messages to the Viam app, add the following lines to your code:
-
-```python {class="line-numbers linkable-line-numbers" data-line="2,5"}
-# In your import block, import the logging package:
-from viam.logging import getLogger
-
-# Before your first class or function, define the LOGGER variable:
-LOGGER = getLogger(__name__)
-
-# in some method, log information
-LOGGER.debug("debug info")
-LOGGER.info("info info")
-LOGGER.warn("warn info")
-LOGGER.error("error info")
-LOGGER.exception("error info", exc_info=True)
-LOGGER.critical("critical info")
-```
-
-{{% /tab %}}
-{{% tab name="Go"%}}
-
-To enable your Go module to write log messages to the Viam app, add the following lines to your code:
-
-```go {class="line-numbers linkable-line-numbers"}
-// In your import() block, import the logging package:
-import(
- ...
- "go.viam.com/rdk/logging"
-)
-// Alter your component to hold a logger
-type component struct {
- ...
- logger logging.Logger
-}
-// Then, alter your component's constructor to save the logger:
-func init() {
- registration := resource.Registration[resource.Resource, *Config]{
- Constructor: func(ctx context.Context, deps resource.Dependencies, conf resource.Config, logger logging.Logger) (resource.Resource, error) {
- ...
- return &component {
- ...
- logger: logger
- }, nil
- },
- }
- resource.RegisterComponent(...)
-}
-// Finally, when you need to log, use the functions on your component's logger:
-fn (c *component) someFunction(ctx context.Context, a int) {
- // Log with severity info:
- c.logger.CInfof(ctx, "performing some function with a=%v", a)
- // Log with severity debug (using value wrapping):
- c.logger.CDebugw(ctx, "performing some function", "a" ,a)
- // Log with severity warn:
- c.logger.CWarnw(ctx, "encountered warning for component", "name", c.Name())
- // Log with severity error without a parameter:
- c.logger.CError(ctx, "encountered an error")
-}
-```
-
-{{% /tab %}}
-{{% tab name="C++" %}}
-
-`viam-server` automatically gathers all output sent to the standard output (`STDOUT`) in your C++ code and forwards it to the Viam app when a network connection is available.
-
-We recommend that you use a C++ logging library to assist with log message format and creation, such as the [Boost trivial logger](https://www.boost.org/doc/libs/1_84_0/libs/log/doc/html/log/tutorial/trivial_filtering.html):
-
-```cpp {class="line-numbers linkable-line-numbers"}
-#include
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Compile or package your module
-
-The final step to creating a new module is to create an executable file that `viam-server` can use to run your module on demand.
-
-This executable file:
-
-- runs your module when executed
-- takes a local UNIX socket as a command line argument
-- exits cleanly when sent a termination signal
-
-Depending on the language you are using to code your module, you may have options for how you create your executable file:
-
-{{% tabs %}}
-{{% tab name="Python: pyinstaller (recommended)" %}}
-
-The recommended approach for Python is to use [`PyInstaller`](https://pypi.org/project/pyinstaller/) to compile your module into a packaged executable: a standalone file containing your program, the Python interpreter, and all of its dependencies.
-When packaged in this fashion, you can run the resulting executable on your desired target platform or platforms without needing to install additional software or manage dependencies manually.
-
-To create a packaged executable:
-
-1. First, [create a Python virtual environment](/sdks/python/python-venv/) in your module's directory to ensure your module has access to any required libraries.
- Be sure you are within your Python virtual environment for the rest of these steps: your terminal prompt should include the name of your virtual environment in parenthesis.
-
-1. Create a `requirements.txt` file containing a list of all the dependencies your module requires.
- For example, a `requirements.txt` file with the following contents ensures that the Viam Python SDK (`viam-sdk`), PyInstaller (`pyinstaller`), and the Google API Python client (`google-api-python-client`) are installed:
-
- ```sh { class="command-line" data-prompt="$"}
- viam-sdk
- pyinstaller
- google-api-python-client
- ```
-
- Add additional dependencies for your module as needed.
- See the [pip `requirements.txt` file documentation](https://pip.pypa.io/en/stable/reference/requirements-file-format/) for more information.
-
-1. Install the dependencies listed in your `requirements.txt` file within your Python virtual environment using the following command:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m pip install -r requirements.txt -U
- ```
-
-1. Then compile your module, adding the Google API Python client as a hidden import:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m PyInstaller --onefile --hidden-import="googleapiclient" src/main.py
- ```
-
- If you need to include any additional data files to support your module, specify them using the `--add-data` flag:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m PyInstaller --onefile --hidden-import="googleapiclient" --add-data src/arm/my_arm_kinematics.json:src/arm/ src/main.py
- ```
-
- By default, the output directory for the packaged executable is dist , and the name of the executable is derived from the name of the input script (in this case, main).
-
-We recommend you use PyInstaller with the [`build-action` GitHub action](https://github.com/viamrobotics/build-action) which provides a simple cross-platform build setup for multiple platforms: x86 and Arm Linux distributions, and MacOS.
-Follow the instructions to [Update an existing module using a GitHub action](/how-tos/manage-modules/#update-an-existing-module-using-a-github-action) to add the build configuration to your machine.
-
-With this approach, you can make a build script like the following to
-build your module, and configure the resulting executable (dist/main ) as your module `"entrypoint"`:
-
-```sh { class="command-line"}
-#!/bin/bash
-set -e
-
-sudo apt-get install -y python3-venv
-python3 -m venv .venv
-. .venv/bin/activate
-pip3 install -r requirements.txt
-python3 -m PyInstaller --onefile --hidden-import="googleapiclient" src/main.py
-tar -czvf dist/archive.tar.gz dist/main
-```
-
-This script automates the process of setting up a Python virtual environment on a Linux arm64 machine, installing dependencies, packaging the Python module into a standalone executable using PyInstaller, and then compressing the resulting executable into a tarball.
-For more examples of build scripts see [Update an existing module using a GitHub action](/how-tos/manage-modules/#update-an-existing-module-using-a-github-action).
-
-{{% alert title="Note" color="note" %}}
-
-PyInstaller does not support relative imports in entrypoints (imports starting with `.`).
-If you get `"ImportError: attempted relative import with no known parent package"`, set up a stub entrypoint as described on [GitHub](https://github.com/pyinstaller/pyinstaller/issues/2560).
-
-In addition, PyInstaller does not support cross-compiling: you must compile your module on the target architecture you wish to support.
-For example, you cannot run a module on a Linux `arm64` system if you compiled it using PyInstaller on a Linux `amd64` system.
-Viam makes this easy to manage by providing a build system for modules.
-Follow [these instructions](/cli/#using-the-build-subcommand) to automatically build for each system your module can support using Viam's [CLI](/cli/).
-
-{{% /alert %}}
-
-{{% /tab %}}
-{{% tab name="Python: venv" %}}
-
-Create a `run.sh` shell script that creates a new Python virtual environment, ensures that the package dependencies your module requires are installed, and runs your module.
-This is the recommended approach for modules written in Python:
-
-1. Create a `requirements.txt` file containing a list of all the dependencies your module requires.
- For example, a `requirements.txt` file with the following contents ensures that the Viam Python SDK (`viam-sdk`) is installed:
-
- ```sh { class="command-line" data-prompt="$"}
- viam-sdk
- ```
-
- Add additional dependencies for your module as needed.
- See the [pip `requirements.txt` file documentation](https://pip.pypa.io/en/stable/reference/requirements-file-format/) for more information.
-
-1. Add a shell script that creates a new virtual environment, installs the dependencies listed in `requirements.txt`, and runs the module entry point file `main.py`:
-
- ```sh { class="command-line" data-prompt="$"}
- #!/bin/sh
- cd `dirname $0`
-
- # Create a virtual environment to run our code
- VENV_NAME="venv"
- PYTHON="$VENV_NAME/bin/python"
-
- python3 -m venv $VENV_NAME
- $PYTHON -m pip install -r requirements.txt -U # remove -U if viam-sdk should not be upgraded whenever possible
-
- # Be sure to use `exec` so that termination signals reach the python process,
- # or handle forwarding termination signals manually
- exec $PYTHON /main.py $@
- ```
-
-1. Make your shell script executable by running the following command in your terminal:
-
- ```sh { class="command-line" data-prompt="$"}
- sudo chmod +x /run.sh
- ```
-
-Using a virtual environment together with a `requirements.txt` file and a `run.sh` file that references it ensures that your module has access to any packages it requires during runtime.
-If you intend to share your module with other users, or to deploy it to a fleet of machines, this approach handles dependency resolution for each deployment automatically, meaning that there is no need to explicitly determine and install the Python packages your module requires to run on each machine that installs your module.
-See [prepare a Python virtual environment](/sdks/python/python-venv/) for more information.
-
-{{% /tab %}}
-{{% tab name="Python: nuitka" %}}
-
-Use the [`nuitka` Python compiler](https://pypi.org/project/Nuitka/) to compile your module into a single executable file:
-
-1. In order to use Nuitka, you must install a [supported C compiler](https://github.com/Nuitka/Nuitka#c-compiler) on your machine.
-
-1. Then, [create a Python virtual environment](/sdks/python/python-venv/) in your module's directory to ensure your module has access to any required libraries.
- Be sure you are within your Python virtual environment for the rest of these steps: your terminal prompt should include the name of your virtual environment in parenthesis.
-
-1. Create a `requirements.txt` file containing a list of all the dependencies your module requires.
- For example, a `requirements.txt` file with the following contents ensures that the Viam Python SDK (`viam-sdk`) and Nuitka (`nuitka`) are installed:
-
- ```sh { class="command-line" data-prompt="$"}
- viam-sdk
- nuitka
- ```
-
- Add additional dependencies for your module as needed.
- See the [pip `requirements.txt` file documentation](https://pip.pypa.io/en/stable/reference/requirements-file-format/) for more information.
-
-1. Install the dependencies listed in your `requirements.txt` file within your Python virtual environment using the following command:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m pip install -r requirements.txt -U
- ```
-
-1. Then, compile your module using Nuitka with the following command:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m nuitka --onefile src/main.py
- ```
-
- If you need to include any additional data files to support your module, specify them using the `--include-data-files` flag:
-
- ```sh { class="command-line" data-prompt="$"}
- python -m nuitka --onefile --include-data-files=src/arm/my_arm_kinematics.json src/main.py
- ```
-
-Compiling your Python module in this fashion ensures that your module has access to any packages it requires during runtime.
-If you intend to share your module with other users, or to deploy it to a fleet of machines, this approach "bundles" your module code together with its required dependencies, making your module highly-portable across like architectures.
-
-However, used in this manner, Nuitka does not support relative imports (imports starting with `.`).
-In addition, Nuitka does not support cross-compiling: you can only compile your module on the target architecture you wish to support if using the Nutika approach.
-If you want to cross-compile your module, consider using a different local compilation method, or the [`module build start` command](/cli/#using-the-build-subcommand) to build your module on a cloud build host, which supports building for multiple platforms.
-For example, you cannot run a module on a Linux `arm64` system if you compiled it using Nuitka on a Linux `amd64` system.
-
-{{% /tab %}}
-{{% tab name="Go" %}}
-
-Use Go to compile your module into a single executable:
-
-- Navigate to your module directory in your terminal.
-- Run `go build` to compile your entry point (main program) file