astro-actions

SkillAI & models

Use when handling form submissions, mutations, or server-side logic with type safety in Astro via defineAction / astro:actions.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the astro-actions skill

What this skill tells your AI

The instructions your AI receives, as published by fusengine/agents in plugins/astro-expert/skills/astro-actions/SKILL.md and read by ahel’s review.

Covers the full action lifecycle from src/actions/index.ts structure through error handling and redirect patterns. Does not cover Astro DB integration in depth (astro-db handles the database layer) or Content Layer schemas (astro-content) — this skill focuses on the request/validation/response boundary.

Astro Actions Expert

Type-safe server functions with automatic validation, standardized errors, and progressive enhancement.

Agent Workflow (MANDATORY)

Before ANY implementation, spawn 3 agents in parallel, one Agent call each with a name:

  1. fuse-ai-pilot:explore-codebase - Check existing actions in src/actions/
  2. fuse-ai-pilot:research-expert - Verify latest Actions docs via Context7/Exa
  3. mcp__context7__query-docs - Get defineAction and ActionError examples

After implementation, run fuse-ai-pilot:sniper for validation.


Overview

When to Use

  • Handling form submissions with server-side validation
  • Creating type-safe backend mutations without API boilerplate
  • Building progressive enhancement (works without JS)
  • Replacing API endpoints for client-server communication

Why Astro Actions

FeatureBenefit
defineAction()Type-safe server function definition
Zod validationAutomatic JSON and FormData parsing
ActionErrorStandardized error codes and messages
accept: 'form'Direct HTML form submission support
Progressive enhancementWorks without JavaScript enabled
astro:actionsClient import for type-safe calls

Core Concepts

Action Structure

All actions live in src/actions/index.ts and export a server object:

// src/actions/index.ts
import { defineAction } from 'astro:actions';
import { z } from 'astro/zod';

export const server = {
  myAction: defineAction({ /* ... */ })
}

Accept Modes

ModeDescription
accept: 'json' (default)Parses JSON request body
accept: 'form'Parses HTML FormData directly

Error Codes

Standard HTTP-aligned codes: UNAUTHORIZED, FORBIDDEN, NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR, CONFLICT, TOO_MANY_REQUESTS.


Reference Guide

NeedReference
Concepts & architectureoverview.md
defineAction patternsdefining-actions.md
ActionError handlingerror-handling.md
HTML form integrationforms.md
Progressive enhancementprogressive-enhancement.md
Contact form templatetemplates/contact-form.md
JSON action templatetemplates/json-action.md

Best Practices

  1. Always define input schema — Never skip Zod validation
  2. Use ActionError for known errors — Standardized codes for client handling
  3. accept: 'form' for HTML forms — Native form submission support
  4. Progressive enhancement — Form works without JS, enhanced with it
  5. Check ctx.cookies for auth — Throw UNAUTHORIZED when not logged in

Signals

GitHub stars
25
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
astro-actions
Source
github.com/fusengine/agents