UCLA Daily: Data Init
The node that makes UCLA Daily re-fetch every run
- ucla_data
If you've ever loaded a "live data" workflow and wondered why it keeps serving you yesterday's news, you already know the value of this node. UCLADailyDataInit is the front door of every UCLA Daily pipeline - the thing that stamps a report with a timestamp, sets the time window, and forces the whole graph to pull fresh data every single time you hit Queue. Wire it to nothing, run it, and you get one UCLA_DATA object with a reason to exist.
UCLA Daily is a pack from Jeffrey A. Brick that turns UCLA's public news feeds and event pages into 1920x1080 cards for a lobby TV (it was built for the screen at 6401 Wilshire Blvd). Every fetcher in the pack - Med, Arts, Fowler, Hammer, CS, Eventbrite, the lot - takes UCLA_DATA in and hands UCLA_DATA out, so they can be chained in any order. This node creates that structure at the start. Without it, there's nothing to feed into the first fetcher.
What it actually does
Under the hood it's tiny: it builds a Python dict with a metadata block (report name, created-at timestamp in both ISO and "Tuesday, March 3 at 9:41 AM" form, the horizon, and a seed), plus empty events and errors lists. The errors list is the pack's answer to flaky scrapes - any fetcher that fails logs the failure there instead of crashing the graph, so the pipeline keeps going.
The clever bit is IS_CHANGED, which returns time.time(). In ComfyUI terms that's a polite way of saying "always re-run me." Every queue execution re-creates this dict, which means every fetcher downstream re-fetches. That's exactly what you want for a daily-news display and exactly the opposite of what most nodes do (cache results until the inputs change). This is one of the rules from the author's own "ComfyUI Custom Node Survival Guide," and it's the difference between a screen that updates and a screen that lies to you.
The inputs that matter
Three widgets, all required, all self-explanatory:
- report_name - shows up in the header of the pulse report. Default
UCLA_Daily_Brief; name it after the run if you're generating multiple. - horizon_days - how many days ahead to include events.
1means today only,7means the week. Default 3. - seed -
0(default) uses the current timestamp, so every run is unique. Non-zero makes the run deterministic, which is handy for testing layout before you let it loose on live data.
Output
One output: ucla_data (custom type UCLA_DATA). That custom type is worth knowing about - ComfyUI will only let you plug this into inputs that expect UCLA_DATA, which is the pack's way of stopping you from accidentally wiring the wrong thing into a fetcher. Chain: DataInit → any fetchers → LobbyCard / DeepDiveCard / Pulse.
Install
Via ComfyUI Manager, search for UCLA Daily, or clone it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/jbrick2070/ComfyUI-UCLADaily.git
pip install qrcode pillow requests
Restart ComfyUI and the nodes appear under the UCLA Daily category. The fetchers are pure stdlib (with a requests→urllib fallback), so this node needs nothing beyond ComfyUI itself. The pip install line covers the card renderers and QR codes downstream.
Common gotchas
The one real trap: if you wire fetchers but forget the DataInit, nothing has a UCLA_DATA to work from and the graph won't validate. It's the smallest, least interesting node in the pack - and also the one everything else hangs off. Start here, always.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| report_name | STRING | UCLA_Daily_Brief | Name for this report run. Appears in the pulse output header. |
| horizon_days | INT | 31–30 | How many days ahead to include events (1=today only, 7=this week). |
| seed | INT | 00–18446744073709550000 | 0 = use current timestamp. Non-zero = deterministic for testing. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| ucla_data | UCLA_DATA | — |