Skip to content
/ bring Public

Remote control library for the Apache Guacamole protocol (RDP/VNC)


Notifications You must be signed in to change notification settings


Repository files navigation


GitHub tag (latest SemVer) Documentation Build Status Go Report Card Maintainability

Go client library for Apache Guacamole Protocol.

Quick start (tl;dr)

  1. Install the library in your project:

    go get
  2. Create a Client with the NewClient() function. This creates a session with the specified guacd server

  3. Start the client with go client.Start()

  4. Get screen updates with client.Screen()

  5. Send keystrokes with client.SendKey()

  6. Send mouse updates with client.SendMouse()

See the sample app for a working example


The API is provided by the Client struct. The documentation is a work in progress, but the API is very simple and you can take a look at all features available in the sample app provided. Here are the steps to run the app:

  1. You'll need a working guacd server in your machine. The easiest way is using docker and docker-compose. Just call docker-compose up -d in the root of this project. It starts the guacd server and a sample headless linux with a VNC server

  2. Run the sample app with make run. It will connect to the linux container started by docker.

Take a look at the Makefile to learn how to run it in different scenarios.


Apache Guacamole was created with the goal of making a dedicated client unnecessary. So why create a client?!

The idea is that if you need to control a remote machine from your Go code, you can leverage the Guacamole protocol and the guacd server as a bridge. This way you can use any protocol supported by Guacamole (currently RDP and VNC, with X11 coming in the future) to do screen capture and remote control of networked servers/desktop machines from within your Go app.

My use case was to automate some tasks in a VirtualBox VM, but there was no Go support for the VirtualBox XPCOM API on Macs (my host platform), nor a working RDP client implementation in Go. Instead of writing a new RDP client, why not leverage the awesome Guacamole project and get support for multiple protocols?