The family schedule shouldn't live in five different apps, three text threads, and one person's head. Yet somehow, that's exactly where it ends up.
Wall-mounted tablet displays promise to fix this — but $300 for a glorified picture frame? Hard pass. Commercial smart displays look sleek in the ads and mediocre on your kitchen counter. And that first-gen Google Nest Hub collecting dust in your drawer? It still works perfectly. It just needs a purpose.
This guide gives it one.
We're going to turn that forgotten device into a beautiful, always-on family dashboard — a central display that shows everyone's schedule at a glance, no nagging required. Along the way, you'll get hands-on with a genuinely impressive stack: React, Vite, a Raspberry Pi, Google Calendar's API, and Cast protocols, all woven together into something that feels custom-built (because it is).
This is the kind of project that's equal parts practical and satisfying. You'll solve a real problem, breathe new life into hardware you already own, and have something worth showing off at the end of it. Let's build.
The Architecture: How It Works
Instead of relying on the Chromecast's default photo frames, we are using the Cast protocol to host a local webpage and push it to the Nest Hub.
System Integration Flow
HOST
Raspberry Pi
Serves Vite app & runs watchdog cron
DATA
Google Cal API
Pulls public calendar events
RECEIVER
Google Nest Hub
Launches DashCast & renders UI
- The Web App: A lightweight React + Vite application that fetches events and renders a clean, dark-themed weekly planner optimized for Google Home.
- The Server: A Raspberry Pi running on your local network that hosts this web app.
- The Cast Client:
catt(Cast All The Things), a command-line tool installed on the Raspberry Pi that controls your Chromecast/Google Home. - The Watchdog: A cron job that runs every minute to verify if the calendar is still playing on your screen. If someone manually casts music, or if the connection drops, it automatically casts the calendar back.
Step 1: Setting Up the Raspberry Pi
The Raspberry Pi will serve as our local web server and cast orchestrator. It doesn't need to be powerful; a Raspberry Pi Zero 2 W or Raspberry Pi 3/4 works perfectly.
- Install Raspberry Pi OS: Use the official Raspberry Pi Imager to flash Raspberry Pi OS Lite (64-bit is recommended) onto your micro SD card.
- Configure Network Settings: In the Imager's settings menu, set your local username, password, Wi-Fi configuration, and enable **SSH**.
-
Find your Pi's Local IP: Boot the Pi and run
hostname -I(or check your router dashboard) to find its IP address (e.g.,192.168.1.100). -
Install Node.js & Git: SSH into your Pi (
ssh pi@192.168.1.100) and run the following setup script:# Install Node.js v20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs git
Step 2: Installing the Calendar Code
You can download the clean, pre-packaged and anonymized codebase directly here:
Extract the files and copy the nest-calendar directory to your home directory on the Raspberry Pi.
-
Navigate to the directory and install dependencies:
cd ~/nest-calendar
npm install -
Compile the static client production build:
npm run build
Step 3: Connecting to your Google Calendar
To load events, the web app needs to connect to the Google Calendar API.
A. Get your Google Calendar ID
Open Google Calendar, go to Settings, choose the calendar you wish to display, scroll down to the "Integrate calendar" section, and copy the Calendar ID.
B. Generate a Google Cloud API Key
- Go to the Google Cloud Console.
- Create a project, search for the **Google Calendar API**, and click **Enable**.
- Navigate to **Credentials** -> **+ Create Credentials** -> **API Key**. Copy the resulting token.
C. Configure Environment Variables
In your ~/nest-calendar root, create a .env file:
VITE_CALENDAR_ID=your_calendar_id_here
D. Customizing Calendar Colors and Categories
To give your family dashboard a premium, color-coded look, you can customize how different events are colored based on keywords in the event title.
Open src/App.jsx and look for the getColorForEvent function:
if (!title) return 'bg-gradient-to-br from-red-500 ...';
const lowerTitle = title.toLowerCase();
// Map event keywords to Tailwind CSS background classes
if (lowerTitle.includes('kid1')) return 'bg-green-500';
if (lowerTitle.includes('kid2')) return 'bg-yellow-600';
if (lowerTitle.includes('kid3')) return 'bg-pink-500';
return 'bg-gradient-to-br from-red-500 via-yellow-500 to-blue-500';
};
Replace 'kid1', 'kid2', and 'kid3' with the names of your family members or activities (like 'soccer' or 'dentist'), and feel free to adjust the Tailwind color classes (e.g. bg-blue-500) to match your custom design theme.
Step 4: Setting Up the Google Home / Nest Hub
Connect your Nest Hub to your router and find its exact display name in the Google Home app (e.g., "Living Room Display").
💡 Pro Tip: If your display name has spaces or emojis, or if casting fails, you can use the Chromecast's static IP address (e.g., 192.168.1.150) directly instead of its name.
Step 5: Setting Up the Watchdog Script & Casting
Next, we install catt to control the cast stream, write the check script, and schedule it.
A. Install catt
pipx install catt
B. Create the Watchdog Script
Create ~/nest-calendar/watchdog.sh:
export PATH=/home/pi/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
export LANG=en_US.UTF-8
CATT_BIN="/home/pi/.local/bin/catt"
HUB_NAME="Living Room Display"
SITE_URL="http://192.168.1.100:4173/"
echo "--- Watchdog Check: $(date) ---"
STATUS=$($CATT_BIN -d "$HUB_NAME" status 2>&1)
echo "Nest Hub Status: $STATUS"
if [[ "$STATUS" != *"4173"* && "$STATUS" != *"DashCast"* ]]; then
echo "Action: Calendar not detected. Recasting..."
$CATT_BIN -d "$HUB_NAME" cast_site "$SITE_URL"
else
echo "Action: Calendar is already playing."
fi
C. Start Server in Background
Make sure the Vite server runs in the background even if you exit the shell:
Critical: Avoid full disk space errors
Since your watchdog script checks the device status every single minute, appending logs using >> will quickly fill up your Raspberry Pi's SD card. Make sure to use a single redirection operator > in your crontab to overwrite the file on every execution.
D. Configure the Cron Job
Open the cron scheduler: crontab -e, and add the following overwrite rule:
Conclusion
Once saved, your Raspberry Pi will monitor your Google Nest Hub, load DashCast, and project your beautiful family agenda onto the screen.
This is more than just a calendar—it is a cost-effective, custom smart home asset. Enjoy your newly unified operations right on your kitchen counter!