# Send Astro to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "astro",
    "name": "Astro",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/bezkom/astro",
    "canonicalUrl": "https://clawhub.ai/bezkom/astro",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/astro",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=astro",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "_meta.json",
      "scripts/astro-i18n-check.py",
      "scripts/astro-new-post.py"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "astro",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T04:44:21.522Z",
      "expiresAt": "2026-05-07T04:44:21.522Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=astro",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=astro",
        "contentDisposition": "attachment; filename=\"astro-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "astro"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/astro"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/astro",
    "downloadUrl": "https://openagent3.xyz/downloads/astro",
    "agentUrl": "https://openagent3.xyz/skills/astro/agent",
    "manifestUrl": "https://openagent3.xyz/skills/astro/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/astro/agent.md"
  }
}
```
## Documentation

### Astro Static Site Generator

Deploy multilingual static websites for free on Cloudflare using Astro framework.

### Prerequisites

Node.js 20+ installed
Cloudflare account (free)
Git repository (GitHub, GitLab, or Bitbucket)

### 1. Create Project

npm create astro@latest my-site -- --template minimal
cd my-site
npm install

### 2. Configure for Cloudflare

Static Sites (Recommended for most use cases)

No adapter needed. Use default static output:

// astro.config.mjs
import { defineConfig } from 'astro/config';

export default defineConfig({
  site: 'https://your-site.pages.dev',
});

SSR/Edge Functions (Optional)

If you need server-side rendering or edge functions:

npm install @astrojs/cloudflare

// astro.config.mjs
import { defineConfig } from 'astro/config';
import cloudflare from '@astrojs/cloudflare';

export default defineConfig({
  output: 'server',
  adapter: cloudflare(),
  site: 'https://your-site.pages.dev',
});

### 3. Deploy to Cloudflare

Git Integration (Recommended)

Push to GitHub/GitLab
Cloudflare Dashboard → Pages → Create project → Connect to Git
Configure:

Build command: npm run build
Build output: dist

Direct Upload

# Deploy (authenticate via Cloudflare dashboard or wrangler)
npx wrangler pages deploy dist

### Astro Config

// astro.config.mjs
export default defineConfig({
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'es', 'fr', 'de'],
    routing: {
      prefixDefaultLocale: false,  // /about instead of /en/about
    },
  },
});

Routing Modes:

SettingURL StructureBest ForprefixDefaultLocale: false/about, /es/aboutDefault locale at rootprefixDefaultLocale: true/en/about, /es/aboutAll locales prefixed

### Content Structure

src/content/
├── config.ts          # Content collection schema
└── docs/
    ├── en/
    │   ├── index.md
    │   └── guide.md
    ├── es/
    │   ├── index.md
    │   └── guide.md
    └── fr/
        ├── index.md
        └── guide.md

### Content Collection Schema

// src/content/config.ts
import { defineCollection, z } from 'astro:content';

const docs = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    description: z.string(),
    lang: z.enum(['en', 'es', 'fr', 'de']),
  }),
});

export const collections = { docs };

Note: Run npx astro sync after adding content collections to generate types.

### Language Switcher Component

---
// src/components/LanguageSwitcher.astro
const languages = {
  en: 'English',
  es: 'Español',
  fr: 'Français',
  de: 'Deutsch',
};

const currentPath = Astro.url.pathname;
const currentLang = Astro.currentLocale || 'en';
---

<select onchange="window.location = this.value">
  {Object.entries(languages).map(([code, name]) => (
    <option 
      value={\`/${code}${currentPath}\`} 
      selected={code === currentLang}
    >
      {name}
    </option>
  ))}
</select>

### File Structure

my-site/
├── astro.config.mjs      # Astro configuration
├── package.json
├── public/
│   ├── favicon.svg
│   └── _redirects        # Cloudflare redirects (optional)
├── src/
│   ├── components/
│   │   └── LanguageSwitcher.astro
│   ├── content/
│   │   ├── config.ts
│   │   └── blog/
│   │       ├── en/
│   │       └── es/
│   ├── layouts/
│   │   └── BaseLayout.astro
│   └── pages/
│       ├── index.astro
│       ├── en/
│       │   └── index.astro
│       └── es/
│           └── index.astro

### Cloudflare Pages Settings

SettingValueBuild commandnpm run buildBuild outputdistNode version20EnvironmentNODE_VERSION=20

### Custom Domain

Cloudflare Dashboard → Pages → your-site → Custom domains → Add domain

### Redirects

Create public/_redirects:

/  /en/  302
/old-page  /new-page  301

### Commands Reference

CommandDescriptionnpm run devStart dev servernpm run buildBuild for productionnpm run previewPreview production buildnpx astro syncGenerate content collection typesnpx wrangler loginAuthenticate with Cloudflarenpx wrangler pages deploy distDeploy to Cloudflare

### Blog with Content Collections

---
// src/pages/blog/[...slug].astro
import { getCollection } from 'astro:content';

export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<article>
  <h1>{post.data.title}</h1>
  <Content />
</article>

### Build Fails on Cloudflare

Set NODE_VERSION=20 in Cloudflare Pages environment variables.

### 404 on Nested Routes

// astro.config.mjs
export default defineConfig({
  trailingSlash: 'always',
});

### i18n Not Working

Ensure:

Locales match folder names exactly
Content files have correct lang frontmatter
Run npx astro sync after creating content collections

### Content Collection Type Errors

Run npx astro sync to generate TypeScript types.

### Resources

Astro Docs
Cloudflare Pages Docs
Astro i18n Guide
Cloudflare Adapter

### Scripts

ScriptDescriptionastro-new-post.pyCreate multilingual blog postsastro-i18n-check.pyValidate translation coverage

### Script Usage

# Create a new post in multiple languages
python scripts/astro-new-post.py --title "My Post" --langs en,es,fr

# Create with author and tags
python scripts/astro-new-post.py --title "Tutorial" --langs en,es --author "John" --tags tutorial,astro

# Check translation coverage
python scripts/astro-i18n-check.py --langs en,es,fr

# Check specific content directory
python scripts/astro-i18n-check.py --content-dir src/content/blog --langs en,es

# Output as JSON
python scripts/astro-i18n-check.py --langs en,es,fr --json

All scripts use only Python standard library (no dependencies).
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: bezkom
- Version: 1.0.1
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-04-30T04:44:21.522Z
- Expires at: 2026-05-07T04:44:21.522Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/astro)
- [Send to Agent page](https://openagent3.xyz/skills/astro/agent)
- [JSON manifest](https://openagent3.xyz/skills/astro/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/astro/agent.md)
- [Download page](https://openagent3.xyz/downloads/astro)