Dashboards are usually great at showing trends, but it is always good to now why these trends are happening. News articles, press releases, blog posts can be a good addition to your daily data input.

In this tutorial, we’ll close that gap by building a lightweight news feed that lives right inside a Tableau dashboard. A Python script does the scraping and processing, GitHub runs it and hosts the resulting data for free, and the Tableau REST Connector pulls it straight into your workbook: no server maintenance, no paid API, and no manual work.
How it fits together
- RSS is the format almost every news site publishes in (title, summary, date, link) – but Tableau can’t read it natively.
- REST API is how one system asks another for data over the web. Since version 2026.1, Tableau can fetch REST/JSON data directly, no extra setup.
- Python converts the RSS/XML into the JSON the REST connector expects.
- GitHub runs that Python script on a schedule and hosts the resulting JSON file, so nothing needs to run on your own machine.
Starterkit “News in your dashboard”
Nothing to install except Python (and only needed if you want to test locally), no credit card, no command line necessary (if you skip part 1). Download these three files to your computer:
- rss2json.py – downloads the news feeds and writes them as JSON
- feeds.json – which feeds to download (to start with, edit freely)
- rss.yml – tells GitHub to run the script every hour
The end result will be a URL like https://YOURNAME.github.io/feeds/all.json that Tableau reads like any other data source.
Part 1: Run it locally (optional)
Skip this part if you are in a hurry – do this part if you want to see the Tableau REST API running locally, and/or check if the feed work before publishing.
1.1 Install Python (skip if you already have it)
- Windows: download from python.org/downloads, run the installer and tick “Add python.exe to PATH” on the first screen.
- Mac: open Terminal (⌘-space, type
Terminal) and typepython3. If it isn’t installed, macOS offers to install it; say yes. Python.org has custom installers for newer versions
1.2 Open a terminal in this folder
- Windows: open this folder in File Explorer, click in the address bar, type
cmdand press Enter. A black window opens, already in this folder. - Mac: right-click the folder in Finder → Services → New Terminal at Folder (or open Terminal and type
cd, drag the folder onto the window, press Enter).
1.3 Run the script
Run the python script by typing this – followed by a Return:
python rss2json.py(Windows: use python; Mac: python3.)
You should see one line per feed, ending in something like [ok] all.json: 774 items from 6 feeds.
A new folder out now contains all.json (everything), and one .json file per feed. If an error occured, this might help:
| Error Message | Fix |
|---|---|
| python3: command not found / ‘python’ is not recognized | Python isn’t installed or wasn’t added to PATH – see 1.1 |
| No such file or directory: rss2json.py | The terminal isn’t in the right folder |
| [FAIL] some-feed: … for one feed | That news site is down or blocking your script – others still work. Remove it from feeds.json if it keeps failing |
1.4 Try it in Tableau right now (optional, running on same computer)
In the same terminal run a small webserver via Python:
cd out
python3 -m http.server 8000Leave that window open. In Tableau Desktop:
Connect → To a Server → More… → REST API, URL http://localhost:8000/all.json,
- Response Format JSON
- JSON Path
$.items[*]
Close the terminal window when done.

That proves everything works, but only on your machine. To let Tableau Server/Cloud reach it (or to stop running the script by hand) continue.
Part 2: Run it online for free
You need a free account at github.com (sign up, confirm your e-mail). Everything below happens in the browser – no command line anymore.
1. Create the repository
- Go to github.com/new.
- Repository name:
feeds. Leave it Public. - Create repository.
2. Switch on GitHub Pages
Do this before adding the workflow!
- Repository → Settings (tab at the top) → Pages (left menu).
- Under Build and deployment → Source, choose GitHub Actions. (there is no save button)
3. Upload the script and the feed list
- On the repository’s front page (Code tab) click Add file → Upload files.
- Drag
rss2json.pyandfeeds.jsonfrom this folder onto the page. - Commit changes.
4. Add the hourly execution
- Add file → Create new file.
- In the name box type exactly:
.github/workflows/rss.yml
(GitHub will automatically create this file and folder). - Open
rss.ymlfrom this folder in a text editor, copy everything, paste it into the big input box. - Commit changes – this will also start the first run.
5. Watch the first run and get your URL
- Click the Actions tab. The commit from 4. has started a run; if nothing is there, choose RSS to JSON on GitHub Pages in the left menu → Run workflow → Run workflow.
- Wait about a minute; click the run when it turns green. Under deploy you see your site address:
https://YOURNAME.github.io/feeds/
This webpage lists every file with its size. Your Tableau URL ishttps://YOURNAME.github.io/feeds/all.json
From now on GitHub re-downloads the feeds every hour at 42 minutes past, automatically, for free. Nothing runs on your computer any more.
Run failed with a red cross? Click it and read the first error:
| Error | Fix |
|---|---|
| Get Pages site failed … Not Found | Pages wasn’t turned on: do step 2, then re-run the failed job |
| No such file or directory: rss2json.py / feeds.json | Files aren’t at the top level of the repository |
| Yellow warnings about Node.js or Ubuntu versions | Ignore these |
Part 3: Connect Tableau


Install the REST API Connector from Tableau Exchange if it isn’t already listed, then:
Connect → To a Server → More → REST API, using the URL from step 5 above.

Tableau always builds this as an extract, not as a live connection. GitHub refreshes the source data hourly, but you still need to schedule extract refreshes yourself on Tableau Server/Cloud, e.g. at the 45th minute of each hour, a few minutes after GitHub’s run.
- Publish the datasource to Tableau Server or Cloud
- Schedule the refreshes. If you followed the instructions, every ’42nd minute after the hour’ the data is being fetched, so you might want to schedule a data refresh at the 45th minute of each hour.
Create a view
In Tableau Desktop, connect your workbook to the new datasource on Tableau Server or Cloud.
Useful first steps in the workbook:
publishedandupdatedarrive as text in UTC
→ create a calculated fieldDATETIME([published]).feed_slugtells you which feed a row came fromlinkopens the article (add it as a URL action).image_urlcan be shown with an Image Role (Tableau 2022.4+).categoriesis comma-separated;SPLIT([categories], ",", 1)gets the first.GUIDis the unique if of an article –- Limit the number of items by filtering on GUID top 5 articles by datetime
From here it’s a usual Tableau build: a list or card view of headlines, sorted by date, filtered/colored by feed_slug, with the URL action wired to link.
Changing and adding newsfeeds
Of course you want to add your own news sources. Open feeds.json in any text editor. Each feed is one block:
{
"slug": "bbc-world",
"url": "https://feeds.bbci.co.uk/news/world/rss.xml",
"name": "BBC News – World",
"category": "International news"
}- slug is a short name you choose (letters, digits, dashes) – it becomes the file name and the feed_slug column.
- url is the feed address.
nameis the friendly namecategorycan be used to group or filter news feeds
Add or remove blocks (mind the commas between them), then run the script again, or on GitHub open feeds.json → pencil icon → edit → Commit changes (that also triggers a fresh run).
Tip: Google News search
Create your own topical news feed on YOUR TERM:
https://news.google.com/rss/search?q=%22YOUR+TERM%22&hl=en-US&gl=US&ceid=US:en
works for any keyword, company name, or exact phrase (quote it for exact match). Swap hl/gl/ceid for other locales, e.g. nl-NL&gl=NL&ceid=NL:nl for Dutch results.
Tips on visualizing the Feeds
- When using Image Roles, be aware of its restrictions. If you use many and/or large images, the don’t always show. Limit the number of images.
- Both the USGS earthquakes and GDACS global disaster alerts contain spatial data – I added a longitude and latitude field so these can be plotted live on a map!

Good to know
- Everything you publish is public. Gists and Pages are readable by anyone with the link. The six feeds included allow this; some publishers (e.g. NU.nl) forbid it — check before you add a feed.
- It is a snapshot. Each run replaces the files with what the feed contains now (usually the last 10–100 items).
- GitHub pauses the hourly job after 60 days without changes to the repository. You get an e-mail; editing any file (or Run workflow) switches it back on.
- Cost: nothing. Public repositories on Github get unlimited job minutes and a run takes under a minute.
- If you are not allowed to install the JDBC connector on your laptop, just create the datasource on Tableau Cloud/Server directly, using ‘New – Published Datasource’
- RSS is a standard – but one with many implementations. You will encounter ‘strange’ feeds: with or without images, extremely long text, and broken feeds.
- I have build an extension which visualizes news articles very nicely. Interested in beta-testing? Just let me know!
Beyond the news
This tutorial is much more about the REST API Connector than it is about news.
Once you’ve seen the pattern:
- Python turns something into JSON
- GitHub hosts it for free (or your own platform)
- Tableau reads it as a live(-ish) datasource
… you can point it at almost anything with an API or feed: weather stations, public transit info, currency rates, GitHub issue counts, climate sensors – think of all datasources where the current status is important, not the history per se. The news feed is just one of the easiest things to demo in ten minutes.
So the best next step isn’t a bigger news dashboard, it’s picking a kind of ‘unusual’ datasource which is relevant to your work, and running it through a similar pipeline. That is the start of an even more insightful and actionable dashboard!
