Inside Tableau Desktop – DebugMenu, Override, GammaRay
December 6, 2016
, , , , , , , ,

screen-shot-2016-12-06-at-09-49-53One thing that I realised in Austin: I’m not a Tableau Desktop guy. I’m struggling sometimes even with the easiest densification calcs and my dashboards generally suck. What can I do? Learn Desktop, deep dive and share my findings. Well, I did and the results are below.

Going back to Austin. I spend two hours in the Hackatlon with a Tableau employee called Paul Howie. While he wrote a clever password manager (LastPass) integration to Tableau Desktop I spent most of my time to understand Desktop’s architecture especially the Qt GUI layer (but at the end of the day I did integrate Sever with LastPass as well). We were both pissed off that we did not make into the top three? Honestly, how many people struggle with copying pass database password to Desktop (a lot) vs integration Amazon Alexa with a 3rd party commercial product (a few). And there is no better motivation than resentment (hear me, Ben Lower?) so I started to plan my ultimate solution to open up Tableau Desktop as platform for the masses.

So this is the first part of my journey to write a web REST API for Tableau Desktop (yes, in Tableau Desktop, yes a Tableau REST API) starting with the basics. At the end of this series you will able to inject a web server into Desktop and call tabdoc commands from a nice web UI. Let’s get started.

Control Tableau Desktop using an in-built web server and REST API

Control Tableau Desktop using an in-built web server and REST API

First of all, nothing is supported and only applies to current Desktop versions (10.1 release).

Switching experimental/internal features on

Shipping products with experimental features in disabled state is not an uncommon software development practice. Tableau does the same: viz in tooltips, web data connector debugging and other similar features are already in Tableau since a while. You just have to turn them on.

Selecting Viz in Tooltip. You can turn on several (incomplete) features

Selecting Viz in Tooltip. You can turn on several (incomplete) features

What are the options? You can easily get this information for workgroup.yml’s “feature.” section. When it’s false, it’s turned off but with tabadmin set you can turn on of course. Here is an example of the features:

If you want to play with VizInTooltips just add -DOverride=VizInTooltips  as a parameter to Tableau binary, and voila, you have viz in tooltips. Credit to Craig Bloodworth, who showed me first how these Server features work in Desktop. But hey, this is a Desktop post so let’s not cheat and get this information straight from Desktop.

These options are most probably string literals specified in compile time. Our chances that we found them in the binary libraries .data section is relatively high. Let’s give a try using my favorite radare2:

Great, here we have even more features than in the Tableau Server workgroup.yml config file. If you scroll up you can see the non-override (AppConfig) based values, like -DJdbcHeapSize  or -DDebugMenu .

And if you look carefully you might find my favourite: the DebugMenu. I learned this from Samm Desmond during the Hackatlon and eventually it turned out it’s a treasure for me.

DebugMenu: Control the Qt UI

After starting Tableau Desktop with debug menu ( -DDebugMenu )  we can start interacting with Tableau’s own debug user interface.


DebugMenu’s menu

Two important options here: Widget Sandbox and Script Command. Let’s start with Sandbox. Sandbox is essentially a GammaRay like in-process debug tool that helps people to see and understand Qt crap. Signals, slots, object properties, parents-childs and their attributes. My guess that it was designed and implemented by the same KDAB developer team who did GammaRay. The similarities are obvious. But what can it do?


You can pick a UI element and change it as you want. Don’t like the Tableau logo or Connect label? You can change it pretty easily:

You can change every QObject

You can change every QObject including QWidget styles and properties

Trust me, even if it looks like a toy this is actually a very powerful tool. You can change the look and feel, behaviour and almost everything inside Desktop. Note: we can control Tableau GUI.

Script Commands

But the life isn’t just UI. Can we control Tableau itself? Like automate everything what we do in the vizql space? I know you know the answer: of course we can. Script commands is an easy interface that allows us to send tabdoc and tabui vizql commands. What can you do with these functions? You can do anything what Tableau can do:


I hope now you get it. If you control the UI (you can access the Qt object registry) and you are able to issue vizql commands you can do anything. No limits.

That’s why I started to build my own Tableau Desktop API kit.  But wait. There is more.


Originally my plan was to implement my API using the fantastic GammaRay (by KDAB who I guess helped Tableau to build their DebugMenu) but GammaRay was not stable enough (it’s pretty intrusive since its hooking methods with pure memory image patching). I loved the features but I needed only just the subset plus the vizql commands.

Still, it was very useful to get more information on how Tableau works behind the scenes.

Now this is shit. You can access and alter anything.

Now this is real shit. You can access and alter anything.

You can search and monitoring everything. Quick example: are you interested in keyboard shortcuts? See them and change if you want:

Qt Actions and their shortcuts

Qt Actions and their shortcuts

My question during the Tableau hackatlon was: can I build something like GammaRay, DebugMenu and Script Window but from command line or software libraries? What’s your guess?

What’s next?

Injecting a webserver into Tableau Desktop to provide a pluggable HTTP REST API  to control Qt and Vizql APIs. Nothing more, nothing less. Have questions? Ask them.

Tamás Földi

Tamás Földi

Director of IT Development at Starschema
Decades of experience with data processing and state of the art programming. From nuclear bomb explosion simulation to distributed file systems. ethical hacking, real time stream processing practically I always had a great fun with those geeky ones and zeros.
Tamás Földi
  • Matthew

    Tamas, the REST of us are just swimming in your wake.

  • Controlling VizQl was the exact converstaion I had with Ben L from Tableau the same day you posted this. Can’t wait to see what’s possible.

    • do you have some use case in mind? just to check if I can do that now

      and for the records this vizql automation works with Server as well

      • Idea is fairly simple. Build a viz in desktop but then allow developer through an API to dynamicaly change the data being fed to VIZql so instead of the usual data source, you can instead load json to feed the pills in rows, collomns, marks and filters. Use case being imagine youre using a visualisation on the web and it shows you the scenarios as it is today that’s held in your databse, but then you change some variables and inputs or maybe run a predictive model that generates data on the fly. You can feed this output back to VIZql have it re render the viz without having to feed data back to the database or manage all the different outcomes of this scenario in terms of data or visulisations. In essence a view becomes a vessel you can dynamically manipulte without having to change the origin source, viz… does that make sense?

  • Tamas,

    I think you are going to make be become a programmer again. This stuff is awesome, even if I only understand about 0.01% of it right now. Thanks for sharing.


  • Mikhail Christiansen

    Tamas, can you explain in more detail how you were able to find the Widget Sandbox. I am not understanding, but definitely want to have this ability.

  • Thomas Rones

    This is awesome, but is there any way to keep the changes we make in the widget sandbox? Everything reverts back to normal when I close & re-open Tableau.

    • depends on what you changed. What do you want to achieve?

      • Thomas Rones

        I just changed some text. I had no real goal , just wanted to explore and see what I could do, but if I cant get the change to be permanent — then there is really no point because the user would have to make the change every time they open Tableau. Maybe a better question would be… Are there any settings that reflect the changes made in the widget sandbox, or would I have to decompile and re-compile? (which I am obviously not going to do).

  • Jeffrey Strauss

    Hi Tamas. Have you found a way to get the debug menu to be active with 10.4 desktop? When I try -DDebugMenu, it does not appear.

Related items

/ You may check this items as well

Scaling Tableau Image

Scaling out Tableau Extracts – Building a distributed, multi-node MPP Hyper Cluster

One thing that I realised in Austin: I’m not...

Read more
Pasted image at 2018_01_09 04_59 PM

Python Experiments in Tableau 1. – Add live currency conversion to Tableau Dashboards using TabPy

One thing that I realised in Austin: I’m not...

Read more
Tableau Docker

HOWTO: Tableau Server Linux in Docker Container

One thing that I realised in Austin: I’m not...

Read more