From 52d5bffca4a7adf7c38383087ff093642ab5638f Mon Sep 17 00:00:00 2001 From: Brian Love Date: Mon, 11 May 2026 15:58:46 -0700 Subject: [PATCH 1/4] feat(web): replace brian.jpg placeholder with real square headshot --- apps/web/public/brand/brian.jpg | Bin 32346 -> 33615 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/web/public/brand/brian.jpg b/apps/web/public/brand/brian.jpg index ba090746d0efa3837ceed003ecf3a5cc3f3bafa5..4bd3340e0fa2512ec9bd3dceffeac97fa0638525 100644 GIT binary patch literal 33615 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 D%(4N< literal 32346 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 N=NMZUoicO|{y#`P5>)^I From 5eaccb14537d72cfb4523912bdc1760724afe6d5 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Mon, 11 May 2026 16:01:58 -0700 Subject: [PATCH 2/4] content(blog): expand three launch posts with real essays --- .../blog/2026-05-12-why-we-built-dawn.mdx | 106 +++++++++++++++++- .../2026-05-19-app-router-for-ai-agents.mdx | 99 ++++++++++++++-- .../blog/2026-06-02-dawn-0-4-release.mdx | 82 ++++++++++++-- 3 files changed, 267 insertions(+), 20 deletions(-) diff --git a/apps/web/content/blog/2026-05-12-why-we-built-dawn.mdx b/apps/web/content/blog/2026-05-12-why-we-built-dawn.mdx index d111b5ec..cbf62c43 100644 --- a/apps/web/content/blog/2026-05-12-why-we-built-dawn.mdx +++ b/apps/web/content/blog/2026-05-12-why-we-built-dawn.mdx @@ -7,16 +7,110 @@ type: post author: brian --- -Agents are the new frontier of application development, but the tooling has lagged the moment. The Python ecosystem moved first, and TypeScript got bolt-ons. +Dawn started as a folder of helper scripts that kept showing up in every LangGraph project we touched. By the third project, it was clear the helpers were a framework wearing a trench coat. -## The mismatch +This post is about the friction those scripts were absorbing, and why we decided to make that work explicit. -When we started prototyping in LangGraph from a Next.js app, the friction wasn't the framework, it was the impedance. Stack-trace boundaries, type erasure, and a runtime mental model that didn't match the rest of our code. +## The moment it stopped scaling -## What we wanted +LangGraph is excellent at what it does. The runtime, the channels, the checkpointer — they all hold up. What didn't hold up was the *code around* the graph. -Type-safety everywhere. File-system routing for agent graphs. No DSL overhead. The same authoring ergonomics that Next.js brought to web apps, applied to agent stacks. +Our second production agent project had four graphs, eleven tools, and a `langgraph.json` that no one wanted to touch. The graphs lived in one folder, the tools in another, the state shapes in a third, and a `registry.ts` glued them together. Every new feature touched all four locations. + +We started writing internal docs explaining where things were supposed to go. That was the moment. If the framework is making you write a memo about file layout, the framework is missing a piece. + +## The friction list + +The same pain showed up in every project. None of it is LangGraph's fault — these are just things LangGraph leaves to you. + +- **Graph boilerplate.** Every agent route involves the same `StateGraph` plumbing — `addNode`, `addConditionalEdges`, `bindTools`, an exported `compile()`. The interesting code is twenty lines; the wiring is sixty. +- **No project structure.** LangGraph has no opinion on where graphs, tools, or state live. So every team invents their own layout, then re-invents it six months later when the first one stops working. +- **Hand-written tool schemas.** Every tool means a function, a Zod schema, and a `tool()` wrapper. The schema duplicates the TypeScript types you already wrote, and drifts the moment you forget. +- **No local dev loop.** `langgraph dev` works but is heavyweight. Iterating against a route meant pushing to staging, watching the deploy, and waiting on traces. Tight loops aren't tight. +- **Lost types at the boundary.** Tool inputs, state shape, dynamic routing parameters — none of these are typed across the graph boundary by default. You learn at runtime what a misspelled key costs. + +Each item is solvable on its own. The trouble is that every team solves them slightly differently, and the solutions don't compose. + +## What "meta-framework" means here + +Dawn is not a competitor to LangGraph. The runtime, the graph compiler, the checkpointer, LangSmith — all unchanged. The output of `dawn build` is a `langgraph.json` that LangSmith deploys without translation. + +What Dawn replaces is the *code around* the graph. Concretely: + +Without Dawn, a hello-world tool-calling agent looks like this: + +```ts +// graph.ts +import { StateGraph, MessagesAnnotation, START, END } from "@langchain/langgraph" +import { ToolNode } from "@langchain/langgraph/prebuilt" +import { ChatOpenAI } from "@langchain/openai" +import { tool } from "@langchain/core/tools" +import { z } from "zod" + +const greet = tool(async ({ name }) => `Hello, ${name}!`, { + name: "greet", + description: "Greet a user by name.", + schema: z.object({ name: z.string() }), +}) + +const model = new ChatOpenAI({ model: "gpt-4o-mini" }).bindTools([greet]) +const tools = new ToolNode([greet]) + +async function callModel(state: typeof MessagesAnnotation.State) { + return { messages: [await model.invoke(state.messages)] } +} + +function shouldContinue(state: typeof MessagesAnnotation.State) { + const last = state.messages.at(-1) as any + return last?.tool_calls?.length ? "tools" : END +} + +export const graph = new StateGraph(MessagesAnnotation) + .addNode("agent", callModel) + .addNode("tools", tools) + .addEdge(START, "agent") + .addConditionalEdges("agent", shouldContinue, ["tools", END]) + .addEdge("tools", "agent") + .compile() +``` + +Plus a hand-maintained `langgraph.json` pointing at the export. + +With Dawn, it's two files: + +```ts +// src/app/(public)/hello/[tenant]/index.ts +import { agent } from "@dawn-ai/sdk" + +export default agent({ + model: "gpt-4o-mini", + systemPrompt: "You are a helpful assistant for the {tenant} organization.", +}) +``` + +```ts +// src/app/(public)/hello/[tenant]/tools/greet.ts +export default async ({ name }: { name: string }) => `Hello, ${name}!` +``` + +`dawn build` produces the `langgraph.json`. The `greet` tool is bound to the agent because it lives under `tools/`. The `[tenant]` segment becomes a typed field on state. Same deploy target; roughly a quarter of the code. + +The point isn't lines saved. The point is that every concept — route, tool, state, middleware — has *one place* it lives, and that place is on disk where your editor can find it. + +## The bet: agent code should feel like Next.js code + +The Next.js App Router did one thing extraordinarily well: it gave every concern a coordinate. A route is a folder. A layout is `layout.tsx`. A server action is a function in a route file. You can point at a thing, search for it, refactor it, write a test next to it. + +Agent codebases lack that. The runtime is reasonable, but the *codebase shape* is whatever you negotiated with your team last quarter. + +Our bet is that agent code should feel like Next.js code. A route is a folder under `src/app/`. The folder path is the agent endpoint. Tools, state, middleware, and tests live next to the route they belong to. Types are generated from the file tree, not maintained by hand. + +That's the whole framework. Filesystem routes, inferred types, a real dev server, and a build step that emits the artifact LangSmith already understands. ## Where we are now -Dawn is in active development. The docs cover the working pieces; what's next is detailed on the roadmap and in the upcoming release notes. +Dawn 0.3 ships the route conventions, the typed tool inference, the dev server, and the build step. The mental model is documented at [`/docs/mental-model`](/docs/mental-model) and the route conventions at [`/docs/routes`](/docs/routes). If you have a working LangGraph project, the migration walkthrough at [`/docs/migrating-from-langgraph`](/docs/migrating-from-langgraph) covers the construct-by-construct move. + +What's next is Deep Agents — composable sub-agents — and a deeper streaming story. Both are coming in 0.4. + +If you've felt the friction described above, the [getting started](/docs/getting-started) guide takes about a minute end to end. That's the right way to evaluate whether Dawn matches the mental model you already have. diff --git a/apps/web/content/blog/2026-05-19-app-router-for-ai-agents.mdx b/apps/web/content/blog/2026-05-19-app-router-for-ai-agents.mdx index b05c7964..d8c0c1b4 100644 --- a/apps/web/content/blog/2026-05-19-app-router-for-ai-agents.mdx +++ b/apps/web/content/blog/2026-05-19-app-router-for-ai-agents.mdx @@ -7,16 +7,101 @@ type: post author: brian --- -The Next.js App Router did something subtle but important: it gave web developers a *location* for every concern. +The Next.js App Router did something subtle but important. It didn't introduce a new runtime, and it didn't change how React rendered. What it changed was the *answer to the question "where does this code go?"*. -## Routes are locations, not graphs +Every concern got a coordinate. A page is `page.tsx`. A layout is `layout.tsx`. A server action is a function in a server file. Middleware lives at `middleware.ts`. There is one place each concept lives, and that place is a file on disk. -A file path is a coordinate. You can point to it, search for it, refactor it. Agent frameworks that hide structure behind builders give up that property. +Agent codebases don't have that yet. Dawn is an attempt to fix it. -## Type-safety as a forcing function +## The missing coordinate system -When tool arguments are inferred from TypeScript types rather than authored as JSON schema, the type system becomes the contract. +If you've worked on a LangGraph project past the second graph, you know the shape of the problem. You have graphs in one folder, tools in another, state definitions in a third, and a registry that ties them together. The connections between those files are implicit — a tool is "for" a graph because it's imported by it, not because it lives next to it. -## What this unlocks +That works fine at the kitchen-table scale. It stops working when you need to answer questions like: -The same code intelligence you have for routes, components, and APIs — applied to agents. That's the bet. +- Which tools does the `support` graph have access to? +- If I rename `lookupOrder`, what else needs to change? +- Where do I add the tenant-aware auth check for the `triage` route? +- Can I delete this tool? Who calls it? + +These are all answerable, but the answer lives in your head or in a wiki page, not on disk. The codebase doesn't know its own structure. + +## File-system routes as the answer + +The fix is borrowed wholesale from web frameworks. A route is a folder. The folder path is the endpoint. Everything that belongs to the route lives next to it. + +A real Dawn project tree: + +```text +my-agents/ +├── dawn.config.ts +├── package.json +└── src/ + └── app/ + ├── support/ + │ ├── [tenant]/ + │ │ ├── index.ts + │ │ ├── state.ts + │ │ ├── middleware.ts + │ │ └── tools/ + │ │ ├── lookupOrder.ts + │ │ └── escalate.ts + │ └── internal/ + │ └── index.ts + └── triage/ + ├── index.ts + └── state.ts +``` + +Read that tree out loud and you've read the architecture. `support/[tenant]/` is a parameterized route. It has its own state shape, its own auth middleware, and two tools the agent can call. `support/internal/` is a separate route — a different endpoint, a different graph. `triage/` is unrelated to either. + +There's no registry. There's no `tools: [...]` array. The connection between a tool and the route that uses it is the *folder it's in*. + +## Co-location as a feature, not aesthetics + +Putting files near the thing they belong to isn't a style preference. It changes what your tools can do. + +**Refactoring works.** Move a folder, move the route. Delete a folder, delete the route. There's no central registry whose edits you'll forget. + +**Search works.** "Find references" on a tool finds the route that uses it because the route imports it directly. "Find references" on a state field finds the agent prompt that mentions it. + +**Tests don't drift.** A scenario test for `support/[tenant]/` lives in `support/[tenant]/run.test.ts`. When you change the route, the test is right there in the same diff. The chance of test rot drops a lot when the test is sitting next to the thing it tests. + +**Onboarding works.** New engineers can open the tree and read the surface area without a Loom video. The structure is the documentation. + +Frameworks that hide structure behind a builder API give all of this up. Once your routes are constructed at runtime from a `.register()` call, your editor cannot tell you what your codebase looks like — only the running process can. + +## Types as the route boundary + +The other half of the coordinate system is types. A route is a contract, and the contract should be checked at the boundary. + +In Dawn, a tool is just a TypeScript function: + +```ts +// src/app/support/[tenant]/tools/lookupOrder.ts +export default async ( + input: { readonly orderId: string }, + ctx: { signal: AbortSignal }, +) => { + const res = await fetch(`https://api.example.com/orders/${input.orderId}`, { + signal: ctx.signal, + }) + return (await res.json()) as { readonly status: string } +} +``` + +There's no Zod schema. There's no `tool()` wrapper. The parameter type *is* the schema — `dawn typegen` reads it at build time and emits both a JSON schema for the LLM and a typed `ctx.tools.lookupOrder` for any code that calls it directly. + +This sounds like a small convenience. It's actually a forcing function. Because the type is the contract, drift is impossible. If you change the tool's signature, callers fail to typecheck. If you misspell a tool name in a workflow route, the editor underlines it. The route boundary is checked the same way the rest of your TypeScript is checked. + +Generated types live in `dawn.generated.d.ts`. Commit it or regenerate on the fly — both work, the same way `next-env.d.ts` works. + +## What this unlocks at scale + +The interesting thing isn't the first agent. It's the tenth. + +A codebase with ten agents, forty tools, and a dozen middleware files needs the same code-intelligence features a web app does — go-to-definition that works, refactors that don't break things in production, tests that run on a tight loop, deploys that don't require a memo. Those features don't show up by accident; they require the codebase to have a *shape* the tools can reason about. + +That's the whole pitch. Dawn isn't asking you to learn a new graph runtime. The graph runtime is fine. Dawn is the coordinate system around it — the answer to "where does this code go" — and the type machinery that makes the answer load-bearing. + +If the mental model resonates, [`/docs/mental-model`](/docs/mental-model) is the one-page version, and [`/docs/routes`](/docs/routes) is where the conventions are spelled out in full. diff --git a/apps/web/content/blog/2026-06-02-dawn-0-4-release.mdx b/apps/web/content/blog/2026-06-02-dawn-0-4-release.mdx index 9a43aa70..c352e4f2 100644 --- a/apps/web/content/blog/2026-06-02-dawn-0-4-release.mdx +++ b/apps/web/content/blog/2026-06-02-dawn-0-4-release.mdx @@ -8,18 +8,86 @@ version: 0.4.0 author: brian --- -Dawn 0.4 is out. This release adds a preview of Deep Agents — composable sub-agents — and a handful of streaming improvements. +Dawn 0.4 is out. The headline is a preview of **Deep Agents** — composable sub-agents with their own routes, tools, and state — plus a tighter streaming story and a stabilized middleware API. -## What's new +This is a backward-compatible release for projects already on 0.3.x. The upgrade is a single `pnpm` command. -- Deep Agents preview (`createSubAgent`) -- Streaming improvements across the runtime -- Middleware API stabilized +## Deep Agents preview + +Real agent systems are rarely one agent. A support assistant calls a research sub-agent. A triage flow hands off to a domain specialist. Until now in Dawn, "sub-agent" meant "another route you invoke via `ctx.run()`" — workable, but the boundary wasn't first-class. + +`createSubAgent` makes the boundary first-class. A sub-agent is a route under the parent, declared with the same `agent({...})` ergonomics, and reachable as a typed call from the parent. + +```ts +// src/app/support/[tenant]/index.ts +import { agent } from "@dawn-ai/sdk" + +export default agent({ + model: "gpt-4o-mini", + systemPrompt: + "You are a tier-1 support assistant for {tenant}. " + + "Delegate research questions to the `research` sub-agent.", + subAgents: ["research"], +}) +``` + +```ts +// src/app/support/[tenant]/research/index.ts +import { createSubAgent } from "@dawn-ai/sdk" + +export default createSubAgent({ + model: "gpt-4o", + systemPrompt: + "You are a research specialist. Given a question, gather facts " + + "from the knowledge base and return a concise answer.", +}) +``` + +The parent route's prompt can reference `research` by name. Dawn binds it as a callable from the parent agent — the LLM picks when to delegate, just like a tool call, but the sub-agent runs with its own state, its own tools (under `research/tools/`), and its own middleware. + +Why this matters: each sub-agent is a folder. You can test it in isolation with `dawn run "/support/[tenant]/research"`, deploy it as its own `assistant_id`, and reuse it from a different parent by referencing the path. The boundary is on disk, not in a config file. + +Deep Agents is a preview. The shape of `subAgents` and the streaming contract for delegated calls may shift before 0.5. We'll call out breaking changes explicitly in the changelog. + +## Streaming improvements + +Three concrete changes: + +- **Token-level streaming through sub-agent boundaries.** In 0.3, a delegated call buffered until the sub-agent finished. In 0.4, the parent's stream interleaves the sub-agent's tokens, tagged with the sub-agent's route id. +- **`/runs/stream` matches LangSmith verbatim.** The event names, ordering, and payload shapes are now byte-identical to the production protocol, so dev-server output and deployed output line up in tooling that consumes both. +- **`dawn dev` shows streamed events in the terminal.** The local dev server prints tool calls, state mutations, and token deltas as they happen. No more attaching a curl to watch progress. + +The streaming work also shaved roughly 30% off cold-start time for the dev server on projects with more than 20 routes — a side effect of moving route metadata into a lazy import path. + +## Middleware API stabilized + +The middleware shape that landed in 0.3 behind a flag is stable as of 0.4. The flag is gone. `defineMiddleware`, the `allow` / `reject` helpers, and nearest-ancestor resolution are the supported API. + +```ts +// src/app/support/middleware.ts +import { allow, defineMiddleware, reject } from "@dawn-ai/sdk" + +export default defineMiddleware(async (req) => { + if (!req.headers["x-api-key"]) { + return reject(401, { error: "Missing x-api-key" }) + } + return allow({ tenant: req.params.tenant ?? "public" }) +}) +``` + +If you were using the experimental flag in `dawn.config.ts`, remove it. The behavior is the same; the gate is just gone. ## Upgrading ```bash -pnpm add @dawn-ai/cli@0.4.0 +pnpm add @dawn-ai/cli@0.4.0 @dawn-ai/sdk@0.4.0 +pnpm exec dawn verify ``` -See the migration notes in the docs for details. +`dawn verify` will regenerate `dawn.generated.d.ts` against the new SDK types. If your project compiles after that, you're done. + +If you're coming from a raw LangGraph project and haven't moved yet, the migration walkthrough at [`/docs/migrating-from-langgraph`](/docs/migrating-from-langgraph) is the construct-by-construct guide. Nothing in 0.4 changes the migration path described there. + +## What's next + +0.5 will lift the Deep Agents preview flag, ship a typed evaluations API, and add the durable-execution story for long-running workflows. Tracking issue in the repo; feedback on the sub-agent shape is especially welcome while it's still in preview. From 234838073f3dbdbcf2a3ac698fd68b7f064bbfd3 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Mon, 11 May 2026 16:03:55 -0700 Subject: [PATCH 3/4] =?UTF-8?q?feat(web):=20OG=20image=20polish=20?= =?UTF-8?q?=E2=80=94=20Fraunces=20title=20font=20+=20RSS=20atom:link=20sel?= =?UTF-8?q?f-ref?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OG images render the post title in Fraunces (loaded from google/fonts on GitHub) instead of system-ui, matching the brand serif used throughout the site. Falls back to ui-serif if the font fetch fails so a network hiccup doesn't block image generation. RSS feed gains the xmlns:atom namespace plus an for W3C feed-validator compliance; corresponding unit test added. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/app/blog/[slug]/opengraph-image.tsx | 28 +++++++++++++++++-- apps/web/app/components/blog/rss-feed.test.ts | 9 +++++- apps/web/app/components/blog/rss-feed.ts | 3 +- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/apps/web/app/blog/[slug]/opengraph-image.tsx b/apps/web/app/blog/[slug]/opengraph-image.tsx index 91ca438c..b205a204 100644 --- a/apps/web/app/blog/[slug]/opengraph-image.tsx +++ b/apps/web/app/blog/[slug]/opengraph-image.tsx @@ -8,11 +8,29 @@ export function generateImageParams() { return getAllPosts().map((p) => ({ slug: p.slug })) } +// Fraunces variable font (Open Font License, hosted by google/fonts on GitHub). +// next/og needs the raw font bytes — fetched at build time per generated image. +const FRAUNCES_URL = + "https://github.com/google/fonts/raw/main/ofl/fraunces/Fraunces%5BSOFT%2CWONK%2Copsz%2Cwght%5D.ttf" + +async function loadFraunces(): Promise { + try { + const res = await fetch(FRAUNCES_URL) + if (!res.ok) return null + return await res.arrayBuffer() + } catch { + return null + } +} + export default async function Image({ params }: { params: { slug: string } }) { const post = getPost(params.slug) const title = post?.title ?? "Dawn" const eyebrow = post?.type === "release" ? `Release · v${post.version}` : "Essay" + const fraunces = await loadFraunces() + const titleFontFamily = fraunces ? "Fraunces" : "ui-serif, Georgia, serif" + return new ImageResponse(
{title}
dawnai.org/blog
, - size, + { + ...size, + ...(fraunces && { + fonts: [{ name: "Fraunces", data: fraunces, weight: 600, style: "normal" }], + }), + }, ) } diff --git a/apps/web/app/components/blog/rss-feed.test.ts b/apps/web/app/components/blog/rss-feed.test.ts index 349b04be..7b7cbb6f 100644 --- a/apps/web/app/components/blog/rss-feed.test.ts +++ b/apps/web/app/components/blog/rss-feed.test.ts @@ -17,11 +17,18 @@ const samplePost: Post = { describe("buildRssFeed", () => { it("includes channel metadata", () => { const xml = buildRssFeed([samplePost], { siteUrl: "https://dawnai.org" }) - expect(xml).toContain('') + expect(xml).toContain('') expect(xml).toContain("Dawn") expect(xml).toContain("https://dawnai.org/blog") }) + it("includes atom:link self-reference for validator compliance", () => { + const xml = buildRssFeed([samplePost], { siteUrl: "https://dawnai.org" }) + expect(xml).toContain( + '', + ) + }) + it("includes one item per post with required fields", () => { const xml = buildRssFeed([samplePost], { siteUrl: "https://dawnai.org" }) expect(xml).toContain("Why we built Dawn") diff --git a/apps/web/app/components/blog/rss-feed.ts b/apps/web/app/components/blog/rss-feed.ts index 99b31160..a19fa91f 100644 --- a/apps/web/app/components/blog/rss-feed.ts +++ b/apps/web/app/components/blog/rss-feed.ts @@ -32,10 +32,11 @@ export function buildRssFeed(posts: readonly Post[], opts: BuildOpts): string { }) .join("\n") return ` - + Dawn ${siteUrl}/blog + Writing on the agent stack, type-safety, and the tools we're building. en ${items} From 9e829f681857d7dcb5abbda9b641961df8fa6386 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Mon, 11 May 2026 16:05:08 -0700 Subject: [PATCH 4/4] feat(web): show author byline + tags inline in PostHeader on mobile PostMeta is the desktop left rail (hidden --- apps/web/app/components/blog/PostHeader.tsx | 41 ++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/web/app/components/blog/PostHeader.tsx b/apps/web/app/components/blog/PostHeader.tsx index 38a2e52d..15db9f39 100644 --- a/apps/web/app/components/blog/PostHeader.tsx +++ b/apps/web/app/components/blog/PostHeader.tsx @@ -1,4 +1,6 @@ -import type { Post } from "./post-index" +import Image from "next/image" +import Link from "next/link" +import { AUTHORS, type Author, type Post } from "./post-index" function formatDate(iso: string): string { return new Date(`${iso}T00:00:00Z`).toLocaleDateString("en-US", { @@ -14,6 +16,11 @@ export function PostHeader({ post }: { readonly post: Post }) { post.type === "release" ? `Release · v${post.version}` : `Essay · ${post.readingTimeMinutes} min read` + const author: Author = AUTHORS[post.author] ?? { + name: "Brian Love", + avatar: "/brand/brian.jpg", + url: "https://github.com/blove", + } return (
{eyebrow}
@@ -25,6 +32,38 @@ export function PostHeader({ post }: { readonly post: Post }) {

{post.description}

{formatDate(post.date)}
+ + {/* Mobile-only: author byline + tags. Desktop sees these in the PostMeta left rail. */} + + {post.tags.length > 0 && ( +
+ {post.tags.map((tag) => ( + + {tag} + + ))} +
+ )}
) }