Ending Active Maintenance for fastapitableau, plumbertableau, and shinytableau
A few years ago, we created a trio of small open source packages, fastapitableau, plumbertableau, and shinytableau to make it easier to call R and Python code from Tableau workbooks. They solved a real, narrow problem for some of our customers, and we're grateful to everyone who tried them, filed issues, and built on top of them.
Due to lack of adoption, we've decided to stop actively maintaining these projects. Rather than archive them quietly, we want to explain and discuss the purpose they served, how they accomplished it, and encourage anyone who wants to to fork them and carry them forward. The source code isn’t going anywhere. shinytableau will remain available on github, and fastapitableau and plumbertableau will remain available on github as well as CRAN and PyPI for as long as they meet the requirements of those distribution channels.
The problem they solved
The two packages, fastapitableau and plumbertableau were created to make interacting with Tableau's opinionated Analytics Extensions API easier. A Tableau workbook reaches out to two specific endpoints, /info and /evaluate, and expects requests and responses in a very particular JSON layout, with values arriving as parallel lists driven by a calculated field.
Posit Connect can host arbitrary R and Python web APIs, so in principle hosting a Tableau Analytics Extension on Connect was always possible. The catch was that you had to either hand-write that exact /evaluate endpoint for every project, or build something to bridge idiomatic Plumber and FastAPI code to the request shape Tableau expects.
That bridge is what these two packages provided. With plumbertableau you wrote a normal Plumber API in R with a few extra #* annotations, and the package handled /info, /evaluate, and the request reshaping for you. fastapitableau did the same for FastAPI in Python — swap FastAPI() for FastAPITableau(), and your endpoints became callable from Tableau calculated fields, complete with auto-generated usage examples. We wrote about the workflow when Connect added the integration in 2021, and Isabella Velásquez later walked through an end-to-end XGBoost example in Integrating Dynamic R and Python Models in Tableau Using plumbertableau. If you'd rather see it in motion, James Blair recorded a walkthrough on YouTube.
The shinytableau package was created to help R users incorporate visualizations generated with Shiny into Tableau dashboards. It was introduced as an experimental package designed to solicit feedback from Tableau users with crossover interest in R and Shiny.
A useful starting point, freely available
If you have a Tableau workbook that needs to call out to an R or Python model or incorporate a Shiny for R application as a dashboard extension, these projects are still perfectly serviceable as a template:
If you'd like to take more formal stewardship of any of these projects, we'd love to hear about it. Please open an issue and let us know. And if these packages helped solve a problem for you over the last few years: thank you for using them. That was the whole point.