Skip to content
Hoody.com

Magic comments configure script behavior from the top of the file itself. You do not change code, write a configuration file, or set environment variables; you edit a comment and the behavior changes.

// @mode worker
// @cors reflective
// @timeout 5000
// @log-level standard
// @ai true
// Your code starts here...
return { hello: 'world' };

Magic comments are parsed at script load time. Put them at the very top of the file, before any code, imports, or expressions.

Rules:

  • Start with // followed by a space and @
  • One comment per line
  • Comment names are case-sensitive
  • A comment’s value overrides the default
  • The validation API parses and checks them

Validation example:

Terminal window
# Validate magic comments in a script
hoody exec validate magic-comments \
--code "// @mode worker\n// @cors reflective\n// @timeout 5000\nreturn {};"

CommentValuesDefaultDescription
@modeworker | serverlessserverlessExecution mode. Worker mode keeps a stateful persistent VM; serverless mode starts a fresh, isolated VM for each request
@enabledtrue | falsetrueEnable or disable script execution. A disabled script does not run
@timeoutms | 90s/5m/2h | 0 | unlimited3600000Soft request timeout (default 1 hour). Bare number = ms; unit suffixes (s/m/h/d) accepted. Past the deadline an un-started response gets 504; the timeout does not interrupt an already-streaming response or kill in-flight VM work. 0/unlimited = no timeout
@await-promisestrue | falsetrueAuto-await returned promises before sending response
@concurrentnumber | true | falsetrueMax concurrent executions (applies in both worker and serverless mode, and to cron). true = unlimited, false = single serial execution, N = at most N in parallel
@schedulecron expression(none)Run the script on a cron schedule (e.g., 0 9 * * *). See Scheduling

Examples:

// @mode worker // Persistent VM, shared state
// @timeout 60000 // 60 second timeout
// @concurrent false // Serverless: process one at a time
// @timeout 0 // No timeout (use with care)
// @timeout unlimited // Same as @timeout 0

CommentValuesDefaultDescription
@corsreflective | * | URL | nonereflectiveOrigin policy for the actual response. Omitting @cors keeps the server’s global reflective CORS; none strips CORS headers; reflective/*/URL set the allowed origin
@cors-credentialstrue | falsefalseAllow credentials (cookies, auth headers). Never combined with @cors *
@cors-methodsGET,POST,...(server default)Access-Control-Allow-Methods is preflight-only: the browser reads it from the OPTIONS response, which the server answers globally, so the per-script value is not applied and the server default is used
@cors-headersAuthorization,...(server default)Access-Control-Allow-Headers is preflight-only (server-answered, not applied per-script); the per-script value drives Access-Control-Expose-Headers on the actual response
@cors-max-agenumber (seconds)(server default)Preflight cache hint. Not applied per-script: the server answers the OPTIONS preflight globally

Examples:

// @cors reflective // Mirror request origin (development)
// @cors * // Allow any origin (testing)
// @cors https://app.example.com // Specific origin (production)
// @cors none // No CORS headers
// @cors-credentials true // Allow cookies
// @cors-methods GET,POST // Only allow GET and POST

CommentValuesDefaultDescription
@log-levelnone | minimal | standard | full | debugstandardLogging verbosity
@debugtrue | falsefalseShortcut for @log-level debug
@log-request-bodyfull | redacted | off | true | falsefullLog incoming request bodies
@log-response-bodyfull | redacted | off | true | falsefullLog response bodies
@log-max-body-sizebytes | 512kb/1mb1048576Max body size to log. Bare number = bytes; unit suffixes (kb/mb/gb) accepted
@log-exclude-headersheader namesauthorization cookie x-tokenHeaders to exclude from logs (e.g., authorization cookie)
@log-retention-days0 to 365014Days to keep log files (values above the 3650-day cap are clamped)
@debug-instrumenttrue | falsefalseEnable code instrumentation for detailed tracing

Examples:

// @log-level full // Maximum logging
// @log-request-body true // Log request payloads
// @log-response-body true // Log response payloads
// @log-exclude-headers authorization cookie // Hide sensitive headers
// @log-retention-days 30 // Keep logs for 30 days
// @debug-instrument true // Detailed code tracing

Log levels:

  • none: no logging
  • minimal: the request line plus the final status and duration, without the detailed request and response logs
  • standard: request metadata and headers (the default)
  • full: everything in standard plus request and response bodies, with body capture still gated by @log-request-body and @log-response-body
  • debug: everything in full plus internal execution details such as VM creation and module loading

CommentValuesDefaultDescription
@aitrue | falsetrueEnable AI helpers. Injects model, openai, ai, generateText, streamText, and generateObject
@ai-modelmodel namehoody-ai/hoody-freeAI model to use. Overrides the server default (e.g., deepseek/deepseek-v4-pro)
@ai-temperature0 to 2(none)AI temperature parameter (provider default when unset)
@ai-max-tokensnumber(none)Max tokens for AI response (provider default when unset)
@ai-keystringserver-configuredAI API key override (default uses the server’s --ai-key flag)

Example:

// @mode serverless
// @ai true
// @ai-model deepseek/deepseek-v4-pro
// @ai-temperature 0.3
const { text } = await generateText({
model,
prompt: `Summarize this: ${req.body.content}`
});
return { summary: text };

CommentValuesDefaultDescription
@tokenstring(none)Per-endpoint shared secret. Requests must provide the token via one of four methods

Add @token to protect an endpoint, with no middleware, auth library, or configuration file involved:

// @token my-secret-key-123
// @cors reflective
return { data: 'only authenticated requests see this' };

Clients authenticate using any of these methods (checked in priority order):

PriorityMethodExample
1aAuthorization: Bearer <token>curl -H "Authorization: Bearer my-secret-key-123" ...
1bAuthorization: Basic (password field)curl -u user:my-secret-key-123 ... or curl -u :my-secret-key-123 ...
2X-Token headercurl -H "X-Token: my-secret-key-123" ...
3?token= query parametercurl "https://...?token=my-secret-key-123"

Security details:

  • Constant-time comparison (SHA-256 + timingSafeEqual): immune to timing attacks
  • The token is redacted in all API responses, logs, and access logs ([REDACTED])
  • ?token= is stripped from req.url and metadata.parameters before your script runs
  • CORS preflight (OPTIONS) returns 204 without requiring auth (spec-correct behavior)
  • WebSocket upgrade requests are also gated; pass the token via a header or ?token=
  • Empty or whitespace-only values are ignored (endpoint stays public)

See Authentication for the full guide with examples.


CommentValuesDefaultDescription
@websocket(flag)(none)Enable WebSocket support. Requires worker mode
@rawBody(flag)(none)Skip the request-body auto-parser, so req stays a raw Node Readable stream (for large uploads, streaming, or passthrough). Accepts @rawBody, @rawBody true, or @rawBody false
@labelstring(none)Script classification label for filtering and organization
@return-typeTypeScript type(none)TypeScript type definition for the script’s return value
@return-type-modestrict | warn | devstrictEnforcement mode for @return-type validation. strict rejects on mismatch, warn logs only, dev enforces only outside production
@descriptiontext(none)API documentation description
@tagsTag1, Tag2(none)Categorization tags for API documentation

Examples:

// @mode worker
// @websocket // Enable WebSocket handlers
// @label user-api // Classify this script
// @return-type { id: string, name: string, email: string }
// @return-type-mode strict // Enforce return-type at runtime
// @description User profile API
// @tags Users, Profile

Manage magic comments through the API:

EndpointDescription
GET /api/v1/exec/magic-comments/schemaGet the canonical schema of all supported magic comments
GET /api/v1/exec/magic-comments/readRead magic comments from a script
PUT /api/v1/exec/magic-comments/updateUpdate magic comments on a script
POST /api/v1/exec/magic-comments/bulk-updateBulk update magic comments across multiple scripts
Terminal window
# Read magic comments from a specific script
hoody exec magic-comments read --path "api/hello.ts"

All magic comments, by category:

CategoryComments
Execution@mode, @enabled, @timeout, @await-promises, @concurrent, @schedule
Authentication@token
CORS@cors, @cors-credentials, @cors-methods, @cors-headers, @cors-max-age
Logging@log-level, @debug, @log-request-body, @log-response-body, @log-max-body-size, @log-exclude-headers, @log-retention-days, @debug-instrument
AI@ai, @ai-model, @ai-temperature, @ai-max-tokens, @ai-key
Advanced@websocket, @rawBody, @label, @return-type, @return-type-mode, @description, @tags