···127127All I needed to do was to render a `<PostPreview />` for every post folder:
128128129129```js
130130-import { PostPreview } from "./post-preview";
131130import { readdir } from "fs/promises";
131131+import { PostPreview } from "./post-preview";
132132133133export async function PostList() {
134134 const entries = await readdir("./public/", { withFileTypes: true });
···161161162162**Running my components close to their data source lets them read their own data and preprocess it _before_ sending any of that information to your device.**
163163164164-By the time that you load this page, there is no `<PostList>`, `<PostPreview>`, `fileContent`, or `dirs`. There is only a `<div>` with some `<section>`s and `<a>`s and `<i>`s inside each of them. Your device only receives *the UI it needs to display* (the rendered post titles, link URLs, and post word counts) rather than *the raw data* that your components used to compute that UI (the actual posts).
164164+By the time you loaded this page, there was no more `<PostList>` and no more `<PostPreview>`, no `fileContent` and no `dirs`, no `fs` and no `gray-matter`. Instead, there was only a `<div>` with a few `<section>`s with `<a>`s and `<i>`s inside each of them. Your device only received *the UI it actually needs to display* (the rendered post titles, link URLs, and post word counts) rather than *the full raw data* that your components used to compute that UI from (the actual posts).
165165166166With this mental model, *the UI is a function of server data*, or `UI = f(data)`. That data only exists *my* device, so that's where the components should run.
167167