Skip to content

Commit 1db1663

Browse files
committed
Fix SEO check failures and stale blog hero
- Retarget dynamic-apps landing links to existing docs pages (sqlite, workflows, multiplayer) - Add trailing slash to deploy docs link; point FAQ at /dynamic-apps/docs/sqlite/ - Blog: link cookbooks to /actors/learn/ instead of the /cookbook/ redirect - dynamic-apps workflows doc: root-relative /workflows/docs/ link - check-seo: skip skill example trees copied verbatim under /metadata/skills/ - Version the blog hero URL (image.png?v=2) so the build re-fetches the new thumbnail instead of the cached split variant
1 parent b5ba9fd commit 1db1663

5 files changed

Lines changed: 16 additions & 10 deletions

File tree

scripts/check-seo.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,13 @@ async function mapWithConcurrency<T, R>(
387387
return results;
388388
}
389389

390-
const htmlFiles = await fg("**/*.html", { cwd: DIST, absolute: true });
390+
const htmlFiles = await fg("**/*.html", {
391+
cwd: DIST,
392+
absolute: true,
393+
// Skill example projects are copied verbatim for agents; their HTML files
394+
// are source code, not site pages.
395+
ignore: ["metadata/skills/**"],
396+
});
391397
if (htmlFiles.length === 0) {
392398
console.error(
393399
"SEO check failed: dist/ contains no HTML. Run `pnpm build` first.",

src/content/posts/2026-08-31-introducing-dynamic-apps/page.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
author: nathan-flurry
33
published: "2026-08-31"
44
category: changelog
5-
image: { file: "image.png" }
5+
image: { file: "image.png?v=2" }
66
keywords: ["dynamic apps", "agentos", "ai-generated apps", "v8 isolates", "sqlite", "workflows", "multi-tenant", "workers for platforms"]
77
title: "Introducing Dynamic Apps: Deploy AI-Generated Apps for Your Users"
88
seoTitle: "Dynamic Apps: Deploy AI-Generated Apps for Your Users"
@@ -126,7 +126,7 @@ Every app gets, out of the box:
126126
- Realtime multiplayer
127127
- Static sites
128128

129-
Agents also get the [Rivet cookbooks](/cookbook/) as skills, so they have architecture recommendations for production-ready applications while they generate.
129+
Agents also get the [Rivet cookbooks](/actors/learn/) as skills, so they have architecture recommendations for production-ready applications while they generate.
130130

131131
For example, here's a generated app that processes an order as a durable workflow:
132132

src/data/faqs/dynamic-apps.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const dynamicAppsFaqs: FaqItem[] = [
1212
{
1313
question: "What can a generated app contain?",
1414
answerHtml:
15-
'Full HTTP backends and frontends, durable SQLite data, workflows, multiplayer and realtime state, queues, and cron jobs. A directory with an index.html is served as a static site. See <a href="https://rivet.dev/dynamic-apps/docs/state-and-data/">State and data</a>.',
15+
'Full HTTP backends and frontends, durable SQLite data, workflows, multiplayer and realtime state, queues, and cron jobs. A directory with an index.html is served as a static site. See <a href="/dynamic-apps/docs/sqlite/">SQLite</a>.',
1616
},
1717
{
1818
question: "What happens when a generated build fails?",

src/pages/dynamic-apps.astro

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,25 +145,25 @@ const appCapabilities = [
145145
title: 'SQLite',
146146
icon: Database,
147147
body: 'Store durable relational data in an actor-owned SQLite database.',
148-
href: '/dynamic-apps/docs/state-and-data/',
148+
href: '/dynamic-apps/docs/sqlite/',
149149
},
150150
{
151151
title: 'Workflows & queues',
152152
icon: Workflow,
153153
body: 'Run durable jobs that sleep, retry, and resume, plus ordered queue processing.',
154-
href: '/dynamic-apps/docs/background-work/',
154+
href: '/dynamic-apps/docs/workflows/',
155155
},
156156
{
157157
title: 'Crons & schedules',
158158
icon: CalendarClock,
159159
body: 'Schedule recurring work that runs even while the app is idle.',
160-
href: '/dynamic-apps/docs/background-work/',
160+
href: '/dynamic-apps/docs/workflows/',
161161
},
162162
{
163163
title: 'Multiplayer',
164164
icon: Users,
165165
body: 'Share realtime state between every user connected to an app.',
166-
href: '/dynamic-apps/docs/realtime/',
166+
href: '/dynamic-apps/docs/multiplayer/',
167167
},
168168
{
169169
title: 'Static sites',
@@ -297,7 +297,7 @@ const compositionLayers = [
297297
</div>
298298
</div>
299299
<div class="mt-12 min-w-0 md:mt-16" data-site-reveal>
300-
<AppsAnnotatedCode fileName={APPS_SERVER_FILE} regions={appsRegions} documentationUrl="/dynamic-apps/docs/deploy" sourceUrl={APPS_SERVER_SOURCE_URL} />
300+
<AppsAnnotatedCode fileName={APPS_SERVER_FILE} regions={appsRegions} documentationUrl="/dynamic-apps/docs/deploy/" sourceUrl={APPS_SERVER_SOURCE_URL} />
301301
</div>
302302
</div>
303303
</section>

vendor/dynamic-apps/docs/content/docs/workflows.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ to the actors inside it.
1515
<CodeSnippet file="examples/apps-workflows/src/client.ts" region="client" title="Client" />
1616
</CodeGroup>
1717

18-
See [Workflows in Rivet Actors](https://rivet.dev/actors/docs/workflows/) for
18+
See [Workflows in Rivet Actors](/workflows/docs/) for
1919
steps, loops, queues, and error handling.

0 commit comments

Comments
 (0)