ScottiBYTE Assist

ScottiBYTE Assist is designed as an alternative to remote-support and remote-access products such as TeamViewer, Chrome Remote Desktop, AnyDesk, LogMeIn, RustDesk, and MeshCentral, while taking a deliberately different approach to how remote access is established.

A typical 20,000-line web application might mostly consist of database operations, HTTP endpoints, business logic, forms and UI. Assist crosses a lot more architectural boundaries.

Assist is Qt/C++, GStreamer, Opus/audio processing, VP8/video, PipeWire & Wayland portals, X11, Windows desktop capture/input behavior, UAC/elevation, WebSockets, HTTP transfers, networking/NAT considerations, authentication, SQLite, Docker, reverse proxies and a browser-based administration interface.

Even something seemingly simple such as “show the other person’s screen and let me control it” crosses many boundries.

I could go on for hours describing the minutia surrounding the architectural design of ScottiBYTE Assist. Instead, let me just say that this is a unique implementation for remote assistance requiring 8-12 hours a day over a period of five weeks.

I used ChatGPT for the actual coding, but I went through around 20,000 prompts. I did a lot of the testing myself and I did simulated WAN tests which could only go so far.

A big “thank you and shout out” to my long time friend David for his many nights helping me test from 9pm to 5am for at least the last two weeks. David’s critique and eye for consistency allowed me to polish the interface to provide a professional look. Also, a thanks to my subscriber Hasan who assisted me with locating bugs in the voice configuration and its persistent settings. Hasan also provided a remote connection with five screens so I could scale the remote control interface.

Install Assist on any Docker server. I am using an Incus container.

incus launch images:ubuntu/26.04 Assist -p default -p bridgeprofile -c boot.autostart=true -c security.nesting=true 

Connect to the container.

incus shell Assist

Update the new instance.

apt update && apt upgrade -y

Install some dependencies.

apt install nano curl net-tools openssh-server -y

Install Docker from the script on the docker website.

curl https://get.docker.com | sh

Add a user account and put it in the docker and sudo groups for management.

adduser scott
usermod -aG sudo,docker scott

Move over to the new user account.

su - scott

Create the applications folder structure and move into the app folder.

mkdir -p ~/scottibyte-assist/data
cd ~/scottibyte-assist

Edit a docker compose file.

nano compose.yml

Copy the following code into the editor.

services:
  assist-server:
    image:
      scottibyte/scottibyte-assist-server:latest

    container_name:
      scottibyte-assist-server

    restart:
      unless-stopped

    environment:
      NODE_ENV: production
      HOST: 0.0.0.0
      PORT: 3089
      DATABASE_PATH: /app/data/assist.sqlite
      SESSION_LIFETIME_MINUTES: 30

    ports:
      - "3089:3089"

    volumes:
      - ./data:/app/data

    healthcheck:
      test:
        - CMD
        - wget
        - --quiet
        - --spider
        - http://127.0.0.1:3089/api/health
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

Do a CTRL O and enter to save the file and a CTRL X to exit the editor.

Start the application:

docker compose up -d

Check to see that it is running.

docker ps

Check the docker logs for your first time server setup/provider code.

docker compose logs

Look for your one-time setup code. Yours will differ from the one pictured.

Find out the address of your docker server (this Incus container).

ifconfig

Go to your DNS provider and create a subdomain for the assist application. In the video I had previously created test.scottibyte.com. Create a name that you like (hint: assist.mydomain.com).

Then go to your NginX Proxy Manager and create a new proxy record for that domain pointing the IP address you just found.

Head over to the advanced options by clicking on the gear.

You will want to enter the following into the custom Nginx Configuration for this host.

proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;

proxy_buffering off;
proxy_request_buffering off;

Here’s what it looks like in the GUI.

Click SAVE.

Find the new entry and edit it. Go to the SSL screen and "request a new certificate and click Save again.

Go back and edit the record again and turn force SSL on.

Click Save for the final time.

Go to your web browser and enter the subdomain we just defined the proxy for and you should be at the ScottiBYTE Assist portal page.

Download either the Windows or Linux client depending on your preference. The computer that you run the first client on and register first will become the superuser. The superuser can log into the admin interface and create other providers as needed.

I downloaded, installed and ran the Ubuntu Linux client.

Head over to the settings.

You will want to enter the “Assist Server URL” that you used in the web browser to access the portal. That is the address of your Assist server. You can also configure your input and output audio devices at this time and then click Save.

You will be presented with a first user bootstrap screen.

Above you will want to provide a name for the workstation that you are registering and as a reminder this becomes the one and only superuser who can manage additional providers.

So, enter a name that has meaning for you. Then enter that one-time setup code we got from “docker compose logs” (your docker compose logs). Enter a decently complex password and verify it and make sure you store that password in your password manager.

So, in the video I did this.

Then you click “Create First Administrator”.

The password that you created is the password that you use to enter the admin portal.

Finally, click Save to exit the settings screen.

At this point, you can provide support to another user who has downloaded and installed a ScottiBYTE Assist client from your portal.

All they have to do is go into settings and set your Assist server URL and press save and then provide you the six digit code they get on their “Receive Support” tab.

Let’s head over to your web browser and put a “/admin” at the end of your portal URL.

Provide the password that you entered when setting up the first client that we just did. That is the authorization password for managing providers. Once you enter that password you will see the admin screen.

You will notice that the first workstation you added defined that client as the superuser. The superuser is the person possessing the password that you used to log into this admin interface. You can optionally add other providers by typing a name of the workstation that you want to be a provider and clicking “Create Enrollment”.

That enrollment code is a one-time use code that expires after 15 minutes if it is not used. The idea is you configure that code on the ScottiBYTE Assist client on another computer that you want to authorize as a provider and this is done by adding that code in the settings screen on that computer.

You can also revoke any provider privilege at any time through this interface.

Don’t revoke your superuser. That’s a great way to shoot yourself in the foot. I may have disabled that, but don’t try it.

As of this writing, the Assist Server is at v1.3.2. However, when you:

docker compose pull
docker compose up -d

You will often not see the assist version change, but those commands also updates the versions of the clients offered by your portal and so you would be updating the clients. Clicking on the version number in the portal goes to the release page and will tell you if there are new versions of the clients and what the changes are.

ScottiBYTE Assist is completely locally hosted and all of the source code is on my Github. It is all open source and you are welcome to modify it or come to the chat at https://chat.scottibyte.com to engage with me to discuss this or other projects.