> ## Content Index
> Fetch the complete content index at: https://ptarmiganlabs.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Ptarmigan Coffee: the Onboard.qs demo app behind the video
- URL: https://ptarmiganlabs.com/onboard-qs-coffee-demo-app/
- Published: 2026-11-07T06:20:45.000Z
- Updated: 2026-11-11T11:11:47.000Z
- Description: The app in the video on the Onboard.qs README is a third demo app, now in the repository with the other two. Ptarmigan Coffee is a made-up roastery whose tours read like infographics: cards, bars and rankings worked out by Qlik expressions, and a step that follows what you click on the map.
- Author: Göran Sander
- Tags: Onboard.qs

Earlier this week I wrote about the [Onboard.qs demo apps](https://ptarmiganlabs.com/onboard-qs-demo-apps/): two Qlik Sense apps, one English and one Swedish, showing guided tours doing two jobs — walking new users around an app, and telling them what the numbers say.

There is a third app, and it didn't make that post. It's the one in the video at the top of the [Onboard.qs README](https://github.com/ptarmiganlabs/onboard.qs?ref=ptarmiganlabs.com), and it has now gone into the repository alongside the other two, as **Onboard.qs demo Coffee (EN)**.

Ptarmigan Coffee is a made-up speciality roastery in Gothenburg. It buys green coffee from ten origins and pours it in ten Nordic cafés. The app exists to make one point: a tour step doesn't have to be a paragraph of text. It can be a stat card, a ranking, a row of bars — all worked out from the data model while the tour runs.

Seventy seconds tells the story:

0:00 

/1:11 

1× 

The coffee demo app in 70 seconds: the welcome tour that starts by itself, two tours whose cards and bars are Qlik expressions, the Origin profiles step following clicks on the map, and the tour editor where it is all set up. No sound; the captions are part of the video. Recorded with Onboard.qs 1.10.0 on Qlik Sense Enterprise on Windows, May 2026 Patch 3.

****Take the app for a spin.** The coffee app is a free .qvf download. Import it in the QMC under Apps, with the free [Onboard.qs extension](https://github.com/ptarmiganlabs/onboard.qs/releases/latest?ref=ptarmiganlabs.com) (1.9.0 or later) installed. The load script generates its own data, so there is nothing to connect and nothing to reload. Open sheet 1 and the welcome tour starts by itself.

[Download the coffee demo app (.qvf) ](https://github.com/ptarmiganlabs/onboard.qs/raw/refs/heads/main/docs/demo-app/Onboard.qs%20demo%20Coffee%20%28EN%29.qvf?ref=ptarmiganlabs.com) 

## What's in the app

Three sheets, five tours between them:

| Sheet                | What's on it                                                                                  | Tours                                                                                          |
| -------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| 1\. From farm to cup | A map with the origins, their sea routes and the cafés, four KPIs, and green coffee by origin | *Welcome: find your way around* (starts by itself), *Coffee by the numbers*, *Origin profiles* |
| 2\. Origins          | Quality against price, where the coffee comes from, and a table of origin profiles            | *Reading the origins*                                                                          |
| 3\. Cafés            | Cups per month, café revenue, cups by country and by café                                     | *The cafés*                                                                                    |

The business behind it: 285 tonnes of green coffee from ten origins on three continents, 2.28 million cups poured in ten cafés in four countries, from November 2024 to October 2026\. The load script generates all of it, so the app needs no data connection and nothing to reload. A sine hash stands in for `Rand()`, which can't be seeded, so every reload gives the same figures — handy when the tour texts quote them.

## Tours that read like infographics

The second step of *Coffee by the numbers* is a ranking of the origins beside the chart that ranks them:

![A tour step beside a bar chart of green coffee by origin. The step, titled "Where the beans come from", lists Brazil 62 t, Colombia 46 t, Ethiopia 40 t, Kenya 26 t and Guatemala 24 t, each with a bar, and adds "Brazil alone is 22% of everything we buy."](https://ptarmiganlabs.com/content/images/2026/11/coffee-origins-step.png)

One expression draws all of this: the flags, the names, the bar widths, the tonnes and the sentence below them. The bar chart beside it ranks the same ten origins, and the two cannot disagree, because both ask the data model the same question.

Nothing in that step is typed. The flags, the names, the bar widths and the tonnes come out of one `Concat(Aggr(…))` expression that builds the HTML, and the sentence underneath is its tail:

```qlik
FirstSortedValue(Origin, -Aggr(Sum(KgGreen), Origin)) & ' alone is ' &
Num(Max(Aggr(Sum(KgGreen), Origin)) / Sum(KgGreen), '0%') & ' of everything we buy.'
```

Brazil is at the top because Brazil is at the top today. A reload that changes the order changes the ranking, the bars, the tonnes and that closing sentence with it.

Step titles work the same way. The next step is called *A 27-day voyage*, where the 27 is the average time at sea, weighted by volume:

```qlik
'A ' & Num(Sum(KgGreen * SeaDays) / Sum(KgGreen), '0') & '-day voyage'
```

Its text then names the longest trip — Rwanda, at 38 days — by asking the data which one it is, rather than by remembering.

## A step that follows what you click

The demo apps post ended with a list of things to watch out for, and the first was that a tour's expressions are worked out once, when the tour starts. Make a selection halfway through and the steps keep the figures they opened with.

That one is fixed. Onboard.qs 1.9.0 added a per-tour setting, **Update expressions at each step** ([onboard.qs#280](https://github.com/ptarmiganlabs/onboard.qs/issues/280?ref=ptarmiganlabs.com)), and the coffee app's *Origin profiles* tour is a single step with it turned on, sitting on the map. With nothing selected it asks you to pick an origin. Click Ethiopia, and the step becomes Ethiopia's profile:

![Two tour steps side by side. Left: "Origin profiles" asks you to click an origin on the map and lists all ten as chips. Right: the same step after clicking Ethiopia, headed "Ethiopia · Yirgacheffe", with flavour notes, 1,750–2,200 m altitude, washed process, a cupping score of 88.5, a 14% share of the coffee and 89 SEK/kg delivered against an average of 71.](https://ptarmiganlabs.com/content/images/2026/11/coffee-origin-profiles.png)

The same single step, before and after clicking Ethiopia on the map. With "Update expressions at each step" turned on, every figure in the card is worked out again as the selection changes: altitude, process, cupping score, share and delivered price.

Add Colombia to the selection and the same step switches to a comparison of the two. Its title is an expression as well, so the heading changes with it:

```qlik
If(GetSelectedCount(Origin) = 1, Only(Flag) & ' ' & Only(Origin) & ' · ' & Only(Region),
   If(GetSelectedCount(Origin) > 1, 'Comparing ' & GetSelectedCount(Origin) & ' origins',
      '☕ Origin profiles'))
```

In the tour editor it is one checkbox, per tour, and it is off by default — a tour that walks people around a toolbar has nothing to recompute:

![The Onboard.qs tour editor showing the coffee app's three tours: Welcome, Coffee by the numbers and the selected Origin profiles, with its single step and its tour settings. "Update expressions at each step" is ticked.](https://ptarmiganlabs.com/content/images/2026/11/coffee-tour-editor.png)

The setting that makes a step follow the selections is one checkbox in the tour editor, per tour, off by default. Origin profiles is a single step, which is all it needs: the card rewrites itself rather than moving on.

Two other items from that list are gone too, both in releases since: tall step dialogs now stay inside the browser window, and the progress text is configurable per tour, so a Swedish tour can say *1 av 7* instead of *1 of 7*.

## Getting the app

The video was recorded with Onboard.qs 1.10.0 on Qlik Sense Enterprise on Windows, May 2026 Patch 3\. The app itself needs 1.9.0 or later — anything older has no *Update expressions at each step*, and the *Origin profiles* step will simply stand still.

☁️

****Not yet tried on Qlik Cloud.** The extension runs on both platforms, but this app has only been run on client-managed Sense. Its welcome tour points at the client-managed toolbar, so that is the first thing likely to miss on Cloud. If you try it there, I'd like to hear how it went — and bug reports and feedback of any kind are very welcome: [open an issue on GitHub](https://github.com/ptarmiganlabs/onboard.qs/issues/new/choose?ref=ptarmiganlabs.com).

****Get the app and the extension.** The button downloads the coffee app as a .qvf; import it in the QMC under Apps. The extension is a separate, free download: get the [latest Onboard.qs release](https://github.com/ptarmiganlabs/onboard.qs/releases/latest?ref=ptarmiganlabs.com) and import the onboard-qs.zip inside it under Extensions, in the QMC on client-managed Sense or the Management Console on Qlik Cloud.

The sales demo apps from the previous post are in the [same folder](https://github.com/ptarmiganlabs/onboard.qs/tree/main/docs/demo-app?ref=ptarmiganlabs.com), in English and Swedish.

[Download the coffee demo app (.qvf) ](https://github.com/ptarmiganlabs/onboard.qs/raw/refs/heads/main/docs/demo-app/Onboard.qs%20demo%20Coffee%20%28EN%29.qvf?ref=ptarmiganlabs.com) 

Open the app, let the welcome tour run, then go into edit mode and open the tour editor. Every expression in this post is in there to read, copy and take apart. The [demo app tutorial](https://github.com/ptarmiganlabs/onboard.qs/blob/main/docs/DEMO-APP-TUTORIAL.md?ref=ptarmiganlabs.com) does the same job for the two sales apps, sheet by sheet.

## The rest of the bench

Onboard.qs is one of a set of open source tools for Qlik Sense I've been building for years. All free, all on GitHub, all in use in real environments. If this one was useful, its neighbours might be too.

**Inside the app, for the people using it:**

- [**HelpButton.qs**](https://github.com/ptarmiganlabs/help-button.qs?ref=ptarmiganlabs.com) — a help button on the sheet: context-aware help menus, a feedback dialog with a star rating that POSTs to a webhook, and Markdown tooltips on any object. Onboard.qs is the proactive half of an in-app UX layer, HelpButton.qs the reactive one: guidance up front, help when someone goes looking for it.

**Around the app, for the people running it:**

- [**Butler Sheet Icons**](https://github.com/ptarmiganlabs/butler-sheet-icons?ref=ptarmiganlabs.com) — creates sheet thumbnails from what each sheet actually looks like, across many apps at once, on Cloud and client-managed. A cross-platform binary, built to sit in a pipeline or a scheduled task.
- [**Ctrl-Q**](https://github.com/ptarmiganlabs/ctrl-q?ref=ptarmiganlabs.com) — the command line for Qlik Sense Enterprise admin and DevOps work: tasks, apps, master items, bookmarks and more, scriptable and greppable.
- [**Ctrl-Q QVD Viewer**](https://github.com/ptarmiganlabs/ctrl-q-qvd-viewer?ref=ptarmiganlabs.com) — open a QVD in VS Code and read its metadata, fields and rows without a Sense engine in sight, then export it to Parquet, CSV, Excel, JSON and a handful of others.
- [**Butler**](https://github.com/ptarmiganlabs/butler?ref=ptarmiganlabs.com) and [**Butler SOS**](https://github.com/ptarmiganlabs/butler-sos?ref=ptarmiganlabs.com) — reload failure alerts, a task scheduler and a key-value store for the first; real-time operational metrics into InfluxDB, Prometheus or New Relic for the second. Add Grafana and you can watch a Sense cluster breathe.

That's the short list; [ptarmiganlabs.com](https://ptarmiganlabs.com/) has the rest.

Onboard.qs is MIT licensed, free to use, modify and share. If you find it useful, please give it a ⭐ on [GitHub](https://github.com/ptarmiganlabs/onboard.qs?ref=ptarmiganlabs.com). It helps other Qlik developers find the project, and it's the clearest signal I get about how widely these tools are actually used.