Assignment: Build Two Dashboards
In Introduction to Dashboarding you saw the difference between a no-code BI tool and a code-first dashboard app. This chapter gets you into Metabase: log in, connect to the shared Azure Postgres, and verify that your Week 10 dbt mart tables are visible before you build anything.
By the end of this chapter, you should be able to:
metabase_user read-only credentials.fct_trips and fct_daily_borough_stats tables through Metabase's table browser.Metabase is an open-source business intelligence tool that lets you query a database, build charts, and arrange them into dashboards, without writing application code. It speaks directly to PostgreSQL (and most other SQL databases) and lets non-technical users build their own views through a point-and-click interface.
The version the class uses is hosted and managed by HYF. You do not install anything locally for this chapter.
<aside> 🤓 Curious Geek: Why open-source BI became popular
Before tools like Metabase, BI platforms (Cognos, Business Objects, MicroStrategy) cost hundreds of thousands of euros per year. Metabase, launched in 2015, made self-serve dashboards accessible to small teams and startups. By 2026, it was used by over 90,000 companies. The open-source model meant companies could inspect and extend the code, which reduced the trust barrier for finance and compliance teams.
</aside>
Before you connect anything yourself, look at what you are working towards. The dashboard below is a finished example built on the same NYC taxi data you already modeled in Week 10: trip counts by borough, daily trip volume, average fare by borough, and the payment type split.
<aside> 🖼️ Visual: NYC Taxi Analytics dashboard (live, public Metabase link)
</aside>
https://metabase-hyf.politepebble-abd3ebc2.westeurope.azurecontainerapps.io/public/dashboard/5b002d37-09e7-4320-a4a5-390124952c3a
It is interactive: hover over a bar or slice to see the exact numbers, and note how each chart answers one specific question ("which borough has the most trips?", "how does volume change day to day?") rather than dumping every column into one view. Keep that in mind as you build your own Questions in the next chapters.
The HYF-managed Metabase instance is live at:
<https://metabase-hyf.politepebble-abd3ebc2.westeurope.azurecontainerapps.io>
<aside> 💡 The first load after a quiet period can take up to 90 seconds: the shared Metabase scales down to zero when nobody is using it, and the first request has to start it back up (a cold start). If the page seems to hang, wait it out and refresh once. It is not broken.
</aside>
Your login is your email address plus the password stored in Key Vault as metabase-password-<name>. Fetch it the same way you fetch your postgres-url-<name> secret:
az keyvault secret show --vault-name kv-hyf-data --name metabase-password-<name> --query value -o tsv
Ask your teacher if the login does not work.
Open it in your browser. You will land on the Metabase home screen. The main navigation areas are:

Metabase home screen with the left sidebar showing Home, Collections, and Data (Databases, Models, Metrics) sections
<aside>
⌨️ Hands on: Log in with your email and the Key Vault password. Navigate to Databases and confirm you can see the team1 database listed. Do not proceed until the database appears. If it is missing, ask your teacher to check the connection.
</aside>

Metabase Databases page listing the Sample Database and team1 database
Metabase connects to Postgres using a dedicated metabase_user role that has only SELECT permissions on your dev_<name> schema. It cannot INSERT, UPDATE, or DELETE any data.
This matters because every Question you build runs a SQL query against the live database. A misconfigured query (or a future Metabase plugin with unexpected behaviour) cannot corrupt your data if the user has no write permissions.
<aside>
⚠️ Never connect Metabase to Postgres using the same write-capable pipeline_user your ingestion and dbt builds use. That user has write access, and a dashboard query that accidentally triggers a write-path is a silent data corruption risk.
</aside>
The metabase_user was created when the HYF infrastructure was provisioned. You do not need to create it yourself.
Use your own schema for this chapter and the rest of Week 11 whenever possible: it is built from your own Week 10 work, so it is the more meaningful practice. Navigate to Databases → team1 → dev_yourname (replace yourname with your own schema). You should see at minimum:
fct_trips: one row per taxi trip, from your Week 10 fct_trips.sql modelfct_daily_borough_stats: one row per borough per date, from your Week 10 assignment<aside>
⚠️ Missing a table? Fall back to the reference schema, but only until your own is fixed. If fct_trips or fct_daily_borough_stats isn't in your own dev_yourname schema, don't let that block you here. Browse to team1 → nyc_taxi_reference instead: it has the same two tables, pre-populated, so you can keep working through this chapter and the next ones. Prefer your own schema once it's fixed: re-run your Week 10 dbt build, then switch back to dev_yourname for the rest of Week 11.
</aside>
Either way, here is what those tables look like once you find them.
<aside>
💡 Metabase displays table names in title case with the underscores removed, so fct_trips shows up as Fct Trips and fct_daily_borough_stats as Fct Daily Borough Stats. The underlying table name (the one you use in SQL) is still the snake_case version.
</aside>

Metabase table list for a schema, showing Fct Daily Borough Stats and Fct Trips as clickable table cards
Click Fct Trips. Metabase shows a sample of rows and column names. Confirm:
pickup_borough and dropoff_borough columns are presentfare_amount and tip_amount columns are present
Fct Trips table opened in Metabase's row browser, showing trip-level columns like Fare Amount, Tip Amount, and Pickup Borough
<aside>
⌨️ Hands on: Open Fct Trips in the table browser. Scroll to confirm pickup_borough and fare_amount are visible. Then open Fct Daily Borough Stats and confirm pickup_date and trip_count are present. If either table is missing, your Week 10 dbt models may not have run successfully. Check the Week 10 assignment and re-run dbt run if needed.
</aside>

Fct Daily Borough Stats table opened in Metabase's row browser, showing Pickup Borough, Pickup Date, and Trip Count columns
The next chapter, Dashboards in Metabase, assumes a working Metabase connection to Azure Postgres. Check each box before moving on; fix any failure here rather than while learning to build Questions:
metabase_user (the database shows a healthy/green status in Admin → Databases).fct_trips and fct_daily_borough_stats tables through Metabase's table browser.<aside> 💡 Using AI to help: Paste a Metabase connection error (an SSL, timeout, or "database not found" message) into an LLM to decode what it means and which setting to check. ⚠️ Never include real database passwords or connection strings with credentials.
</aside>
metabase_user Postgres role have permission to do, and what does it not have permission to do?fct_daily_borough_stats is not showing up in Metabase's table browser. List two possible causes.<aside> 🚀 Try it in the widget: Interactive Quiz: Metabase Setup
</aside>
https://lasse.be/simple-hyf-teach-widget/mcq.html?bank=week_11_ch2_metabase_setup_quiz&embed=1
If Metabase's interface felt unfamiliar, this short demo walks through the basics from scratch.
<aside> 🎬 Struggling with this concept? Watch this beginner-friendly video:
</aside>
https://www.youtube.com/watch?v=dnT2Xj52mnk
Next up: Dashboards in Metabase, where you build your first Questions on the dbt mart tables and arrange them into a dashboard.
The HackYourFuture curriculum is licensed under CC BY-NC-SA 4.0 *https://hackyourfuture.net/*

Built with ❤️ by the HackYourFuture community · Thank you, contributors
Found a mistake or have a suggestion? Let us know in the feedback form.