Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Deploy multilingual static websites on Cloudflare with Astro using markdown sources, supporting i18n, free hosting, and Git-based or direct deployment.
Deploy multilingual static websites on Cloudflare with Astro using markdown sources, supporting i18n, free hosting, and Git-based or direct deployment.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
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.
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.
Deploy multilingual static websites for free on Cloudflare using Astro framework.
Node.js 20+ installed Cloudflare account (free) Git repository (GitHub, GitLab, or Bitbucket)
npm create astro@latest my-site -- --template minimal cd my-site npm install
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', });
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.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
src/content/ βββ config.ts # Content collection schema βββ docs/ βββ en/ β βββ index.md β βββ guide.md βββ es/ β βββ index.md β βββ guide.md βββ fr/ βββ index.md βββ guide.md
// 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.
--- // 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>
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
SettingValueBuild commandnpm run buildBuild outputdistNode version20EnvironmentNODE_VERSION=20
Cloudflare Dashboard β Pages β your-site β Custom domains β Add domain
Create public/_redirects: / /en/ 302 /old-page /new-page 301
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
--- // 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>
Set NODE_VERSION=20 in Cloudflare Pages environment variables.
// astro.config.mjs export default defineConfig({ trailingSlash: 'always', });
Ensure: Locales match folder names exactly Content files have correct lang frontmatter Run npx astro sync after creating content collections
Run npx astro sync to generate TypeScript types.
Astro Docs Cloudflare Pages Docs Astro i18n Guide Cloudflare Adapter
ScriptDescriptionastro-new-post.pyCreate multilingual blog postsastro-i18n-check.pyValidate translation coverage
# 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).
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.