This guide gets your drone online in SkyHub in four steps. You copy one command onto the drone, add the drone in the dashboard, activate it, and check that it is online.

Before you start

You need:
  • A SkyHub account. Sign up at skyhub.ai/register, confirm your email and log in.
  • The drone’s computer. An NVIDIA Jetson, such as a Jetson Orin Nano, running JetPack 6 or newer (Ubuntu 22.04 or 24.04). Other 64-bit Ubuntu or Debian computers (arm64 or x86-64) work too, but hardware video encoding needs a Jetson. Is the drive still blank? Flash it first.
  • A terminal on the drone. Use a keyboard and screen, or SSH in from your laptop.
  • A user with sudo rights. Run the commands as your normal user. The installer asks for your password once, at the start.
  • Internet on the drone. The installer downloads SkyCore, Docker and the drone’s containers. Keep the drone connected until the last step.
The drone only opens outgoing connections. Allow:Nothing needs to reach the drone from the internet. SkyHub talks to the drone through the VPN: interface wg0, port 9090. If ufw is on, activation opens this for you.

1. Install SkyCore

On the drone, open a terminal and paste this command:
Type your password when asked. The installer:
  • downloads SkyCore and installs it as the skycore command,
  • installs what is missing: Docker, the AWS CLI and a few system packages (anything already there is left alone),
  • runs nine checks and prints the drone’s status.
How long it takes: a few minutes. A freshly flashed board takes longer, because it downloads Docker and the AWS CLI first. When it is done, the end of the output looks like this:
Lines with [⋯] are progress and [!] are warnings. Only a red [✖] or Error: line means something failed. If you get one, find it under Troubleshooting.
You can run the install command again at any time. It skips what is already done, so it is also the way to repair an install.

2. Add the drone in the dashboard

1

Open the Add Vehicle dialog

Log in to SkyHub and open skyhub.ai/home?dialog=app-create-drone-dialog. The dashboard opens with the Add Vehicle dialog.
2

Describe the drone

Give it a Name. Set Type to Physical and Vehicle Type to Copter or Rover. Save.
3

Copy the activation token

After you save, the drone’s details open. Copy its activation token, a 10-digit number. You need it in the next step.
A token works once. Keep it private until you have used it.
On the free plan you can add one vehicle. If you already have one, the dashboard asks you to choose a plan first.

3. Activate the drone

On the drone, run this. Replace <token> with the number you copied, without the angle brackets:
The installer saved the stage (prod) in step 1, so you do not need to type it again. The command the installer printed, with --stage prod, does the same thing. Activation:
  1. checks that Docker and the VPN can work before it uses your token,
  2. registers the drone with SkyHub and connects it to the SkyHub VPN,
  3. downloads and starts the drone’s services, skyhub and mavproxy.
How long it takes: downloading the containers is the slow part, so it depends on your connection. On a Jetson, the first activation also builds the VPN client, which adds a few minutes. It ends with [✔] Drone activation is complete. and the drone’s status.

4. Check that it is online

On the drone, run:
Look for these lines:
  • activated: yes means the token was accepted.
  • running next to each service means the drone is up.
Then open the vehicle list in the dashboard. The drone’s status changes from Pending Activation to Online.
On a bench with no flight controller connected, mavproxy shows restarting and a warning. That is expected. It runs once the flight controller is connected.
You are done. Your drone is online in SkyHub.

Update SkyCore

To get the latest SkyCore and containers, run:
It changes only what is out of date and restarts only the containers whose image changed. If everything is already current, it says so and changes nothing:
Like install, it ends with the drone’s status.

Start over or remove SkyCore

Run the install command again. It is safe on an installed or activated drone and does not use up your token.
To stop the SkyCore containers:
To start them again:
Each token works once. To activate a drone again, for example after a failed activation:
  1. In the dashboard’s vehicle list, delete the old vehicle.
  2. Add it again as in step 2 and copy the new token.
  3. Run sudo skycore activate --token <new-token> on the drone.
There is no uninstall command. For a clean start, re-flash the drive.To take a board out of service without re-flashing, stop the containers:
Then stop the VPN and keep it off after a reboot:
Then delete the vehicle in the dashboard.If you also want to delete the files, the installer put these on the board:
  • /usr/local/bin/skycore, /usr/local/bin/sc.sh, /usr/local/bin/skycore_cli.py and /usr/local/share/skycore/
  • /home/skycore/skycore.conf (holds the stage and the activation token) and /home/skycore/docker-compose.yml
  • /etc/wireguard/wg0.conf (the VPN settings)
  • on a Jetson: /usr/local/bin/wireguard-go and /etc/systemd/system/wg-quick@wg0.service.d/override.conf
  • /etc/udev/rules.d/99-tty-permissions.rules or 99-usb-permissions.rules (serial port access for the flight controller)
Docker, the AWS CLI, WireGuard tools and the system packages stay installed, because other software may use them. So does the ufw rule skycore-vpn, if activation added one.

Troubleshooting

Find the message you see, then follow the fix. If a command fails, the first red [✖] or Error: line is the one that matters.

During install

The full message is Error: Say which environment this vehicle belongs to: add --stage dev or --stage prod (no stage is recorded in /home/skycore/skycore.conf).The command was missing --stage prod. Copy the whole install command, including the end.
You see Error: --stage must be dev or prod, not '...'. There is a typo after --stage. Use --stage prod.
You see Error: This needs root. Install sudo, or run it as root. or Error: Could not obtain root.Your user cannot use sudo, or the password was wrong. Log in as a user with sudo rights and run the command again.
The drone cannot reach SkyHub. Check that it is online and that the network allows HTTPS to skyhub.ai. Then run the install command again.
The installer only works on Ubuntu or Debian, which includes JetPack. Use a supported board or flash a JetPack image.
apt-get could not install packages SkyCore needs. Read the apt error printed just above it. Often another update is still running in the background: wait a few minutes, then run the install command again.
This is a safety stop. On this Jetson, apt would have replaced the NVIDIA kernel with a stock Ubuntu kernel, which can stop the board from booting. Nothing was changed. Check that the board’s apt sources are the JetPack ones, then run the install again. If it keeps happening, ask on Discord.
The installer tries Docker’s own packages first and then Ubuntu’s. Both failed. Check that the drone can reach download.docker.com and its apt mirrors, then run the install command again.
Docker is installed but will not start. Look at why with:
Rebooting the board often helps. Then run the install command again.
This is a warning, not a failure. The AWS CLI could not be installed. Activation still works, but skycore update cannot refresh its access to the container images. Run the install command again later to retry.
Scroll up to the first red [✖] line and look it up on this page.

During activation

Activation checks Docker and the VPN before it uses your token. If it stops before the line Activating this vehicle on the prod environment, the token is not used yet: fix the cause and run the same command again with the same token.
Put sudo in front: sudo skycore activate --token <token>.
Add the token: sudo skycore activate --token <token>.
SkyCore was not installed with a stage. Run the install command first, or add --stage prod to the activate command.
A tool SkyCore needs (curl, jq or docker) is missing. Run the install command again, then activate. Your token is not used yet.
Docker is not running. Reboot the board, or check sudo systemctl status docker, then activate again. Your token is not used yet.
The VPN client could not be installed or built. On a Jetson it is built from source the first time. The lines above it say which download failed. Check that the drone can reach go.dev and git.zx2c4.com, then activate again. Your token is not used yet.
SkyHub did not accept the token. It may have a typo, it may already have been used, or it may belong to another environment. Copy it again from the dashboard. If it was already used, get a new token.
SkyHub could not finish setting up the drone’s VPN in time. Wait a minute, then run the same command again.
The drone cannot reach SkyHub’s API. Check the drone’s internet connection, and that the network allows outgoing TCP port 5000 to skyhub.ai. See Network requirements.
The drone got its VPN settings but the VPN did not come up. The token is used by now. See why with:
Check that the network allows outgoing UDP. Then activate again with a new token.
The VPN settings download was not valid. The download link may have expired. Activate again with a new token.
The drone could not log in to the container registry. The token is used by now. Check the drone’s internet connection, then activate again with a new token.
The drone is activated, but its containers did not download or start. The message above it says why, usually a network problem. Fix that, then run:
You do not need a new token.
An older SkyCore install, or a developer copy, is already running the drone’s containers. Starting a second set would put two mavproxy containers on one serial port, so nothing was started. Stop the old ones with docker compose -f <that file> down, using the file the message names. Then run sudo skycore update. You do not need a new token.

Drone not online

SkyHub reaches the drone through the VPN on interface wg0, port 9090. A firewall on the drone can block that.If activation printed ufw is active and the rule for wg0 could not be added, run:
If it printed a FIREWALL: box about iptables INPUT policy DROP, allow wg0 and make the rule permanent:
Also check that the VPN is up with sudo systemctl status wg-quick@wg0.
mavproxy talks to the flight controller. With no flight controller connected it restarts in a loop. Connect the flight controller and it settles.
A service stopped. Start the drone’s services again with sudo skycore up. If it stops again, the message shows the docker logs command for that container.
The settings file is readable by root only. Run sudo skycore status.

During update

This drone was activated before SkyCore saved the stage. Tell it once, and it is remembered:
You added a --stage that differs from the drone’s. Leave --stage off: sudo skycore update. To move a drone to another environment, activate it again with a token from that environment.
The VPN is not up, so the drone could not renew its access to the container images. The update carries on with the access it already has. Check the VPN with sudo systemctl status wg-quick@wg0, then run the update again.
Run the install command again to add the AWS CLI, then run the update again.
The drone cannot reach skyhub.ai. Check its internet connection and run the update again. Nothing on the drone was changed.
Still stuck? Ask on Discord. Paste the output of sudo skycore status and the first red line you saw.

Advanced

You do not need these to set up a drone.
If you already have the token, add --token to the install command:
--stage says which SkyHub environment the drone belongs to: prod for everyone, dev for ID Robots development. There is no default. The stage is saved in /home/skycore/skycore.conf and later commands read it from there.A dev drone needs a token from the development environment:
install and update never move an activated drone to another stage. To move it, activate again with --stage and a token from the other environment.
By default the drone runs skyhub and mavproxy. To pick services, pass a comma-separated list when you activate:
To list the services this release defines:
The list is saved in /home/skycore/skycore.conf and sudo skycore up starts the same services. Old names are translated: drone-mavros, core, ws_proxy, ws-proxy and gamepad become skyhub, and camera-proxy and slam are skipped. See Microservices & Container Profiles.
To update to a release that is not published yet, point update at its archive. Use an https:// URL, or an s3://bucket/key URL (fetched with the AWS CLI):
The status then shows the archive it used (archive:). The next plain sudo skycore update goes back to the published release.
To write a JetPack image to an SSD or NVMe drive before you install, see Flashing Drives. To back up a drive, see Cloning Drives.