Smart Home Projects & Automation Guides

Upcycling a Google Nest Hub:
Building a Custom Family Calendar Dashboard

By ZoraPro Operations Lab June 23, 2026 10 Min Read

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.

  1. 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.
  2. Configure Network Settings: In the Imager's settings menu, set your local username, password, Wi-Fi configuration, and enable **SSH**.
  3. 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).
  4. 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.

  1. Navigate to the directory and install dependencies:
    cd ~/nest-calendar
    npm install
  2. 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

  1. Go to the Google Cloud Console.
  2. Create a project, search for the **Google Calendar API**, and click **Enable**.
  3. 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_GOOGLE_API_KEY=your_actual_api_key_here
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:

const getColorForEvent = (title) => {
  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

sudo apt-get install -y pipx
pipx install catt

B. Create the Watchdog Script

Create ~/nest-calendar/watchdog.sh:

#!/bin/bash

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:

nohup npm run preview -- --host > preview.log 2>&1 &

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:

* * * * * /home/pi/nest-calendar/watchdog.sh > /home/pi/nest-calendar/watchdog.log 2>&1

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!