Skip to content

astro — releases

Latest 20 GitHub releases for withastro/astro. Auto-mirrored by playbooks/local/autodocgen.yml.

[!info] Pinned in BreeZ-CF: 5.x · upstream latest: [email protected].

[email protected] · [email protected]

2026-04-30 · by @astrobot-houston

Minor Changes

  • #16187 fe58071 Thanks @gllmt! - Adds a waitUntil option to the RenderOptions so that adapters can forward runtime background-task hooks to Astro.

    When provided by an adapter, runtime cache providers receive context.waitUntil in CacheProvider.onRequest(), which allows background cache work such as stale-while-revalidate without blocking the response. The Cloudflare adapter now forwards ExecutionContext.waitUntil to this API.

  • #16290 a49637a Thanks @ViVaLaDaniel! - Ensures that server.allowedHosts (and vite.preview.allowedHosts) configuration is respected when using astro preview with the @astrojs/cloudflare adapter. This improves security by preventing DNS rebinding attacks when previewing Cloudflare builds locally.

  • #15725 4108ec1 Thanks @meyer! - Adds support for a new 'jsx' value for the compressHTML option. When set, whitespace is stripped using JSX whitespace rules instead of the default HTML compression strategy.

    // astro.config.mjs
    import { defineConfig } from 'astro/config';
    
    export default defineConfig({
      compressHTML: 'jsx',
    });
    

    In JSX, whitespaces never matter, as such, no amount of indentation, or newlines will not affect the rendered output. For instance, the following code:

    <div>
      <span>foo</span>
      <span>bar</span>
    </div>
    

    will be rendered as foobar, whereas with HTML whitespace rules, a space would be present between the words due to the newline and indentation between the tags.

  • #16477 28fb3e1 Thanks @ematipico! - Adds experimental support for configurable log handlers.

    This experimental feature provides better control over Astro's logging infrastructure by allowing users to replace the default console output with custom logging implementations (e.g., structured JSON). This is particularly useful for users using on-demand rendering and wishing to connect their log aggregation services, such as Kibana, Logstash, CloudWatch, Grafana, or Loki.

    By default, Astro provides three built-in log handlers (json, node, and console), but you can also create your own.

    JSON logging

    JSON logging can be enabled via the CLI for the build, dev, and sync commands using the experimentalJson flag:

    // astro.config.mjs
    import { defineConfig, logHandlers } from 'astro/config';
    
    export default defineConfig({
      experimental: {
        logger: logHandlers.json({
          pretty: true,
          level: 'warn',
        }),
      },
    });
    

    Custom logger

    You can also create your own custom logger by implementing the correct interface:

    // astro.config.mjs
    import { defineConfig } from 'astro/config';
    
    export default defineConfig({
      experimental: {
        logger: {
          entrypoint: '@org/custom-logger',
        },
      },
    });
    
    // @org/custom-logger.js
    import type { AstroLoggerDestination, AstroLoggerMessage } from 'astro';
    import { matchesLevel } from 'astor/logger';
    
    function customLogger(level = 'info'): AstroLoggerDestination {
      return {
        write(message: AstroLoggerMessage) {
          if (matchesLevel(message.level, level)) {
            // write message somewhere
          }
        },
      };
    }
    
    export default customLogger;
    

    For more information on enabling and using this feature in your project, see the Experimental Logger docs.

    For a complete overview and to give feedback on this experimental API, see the Custom logger RFC.

  • #16333 0f7c3c8 Thanks @florian-lefebvre! - Adds an experimental flag svgOptimizer that enables automatic optimization of your SVG components using the provided optimizer. This supersedes the svgo experimental flag, which is now removed.

    When enabled, your imported SVG files used as components will be optimized for smaller file sizes and better performance while maintaining visual quality. This can significantly reduce the size of your SVG assets by removing unnecessary metadata, comments, and redundant code.

    Astro ships with a SVGO based optimizer, but any can be used.

    To enable this feature, add the experimental flag in your Astro config and remove svgo if it was enabled:

    // astro.config.mjs
    -import { defineConfig } from "astro/config";
    +import { defineConfig, svgoOptimizer } from "astro/config";
    
    export default defineConfig({
    +  experimental: {
    +    svgOptimizer: svgoOptimizer()
    -    svgo: true
    +  }
    });
    

    For more information on enabling and using this feature in your project, see the experimental SVG optimization docs.

  • #16302 f6f8e80 Thanks @florian-lefebvre! - Adds a new experimental_getFontFileURL() method to resolve font file URLs when using the Fonts API

    The fontData object exported from astro:assets was introduced to provide low-level access to font family data for advanced usage. One of the goals of this API was to be able to resolve buffers using URLs. However, it turned out to be impractical, especially during prerendering.

    Astro now exports a new experimental_getFontFileURL() helper function from astro:assets to resolve font file URLs from fontData. For example, when using satori to generate Open Graph images:

    // src/pages/og.png.ts
    
    import type { APIRoute } from "astro";
    -import { fontData } from "astro:assets";
    +import { fontData, experimental_getFontFileURL } from "astro:assets";
    -import { outDir } from "astro:config/server";
    -import { readFile } from "node:fs/promises";
    import satori from "satori";
    import { html } from "satori-html";
    import sharp from "sharp";
    
    export const GET: APIRoute = async (context) => {
      const fontPath = fontData["--font-roboto"][0]?.src[0]?.url;
    
      if (fontPath === undefined) {
        throw new Error("Cannot find the font path.");
      }
    
    -  const data = import.meta.env.DEV
    -    ? await fetch(new URL(fontPath, context.url.origin)).then(async (res) => res.arrayBuffer())
    -    : await readFile(new URL(`.${fontPath}`, outDir));
    +  const url = experimental_getFontFileURL(fontPath, context.url);
    +  const data = await fetch(url).then((res) => res.arrayBuffer());
    
      const svg = await satori(
        html`<div style="color: black;">hello, world</div>`,
        {
          width: 600,
          height: 400,
          fonts: [
            {
              name: "Roboto",
              data,
              weight: 400,
              style: "normal",
            },
          ],
        },
      );
    
      const pngBuffer = await sharp(Buffer.from(svg))
        .resize(600, 400)
        .png()
        .toBuffer();
    
      return new Response(new Uint8Array(pngBuffer), {
        headers: {
          "Content-Type": "image/png",
        },
      });
    };
    

    See the Fonts API documentation for more information.

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-30 · by @astrobot-houston

Minor Changes

  • #16187 fe58071 Thanks @gllmt! - Adds a waitUntil option to the RenderOptions so that adapters can forward runtime background-task hooks to Astro.

    When provided by an adapter, runtime cache providers receive context.waitUntil in CacheProvider.onRequest(), which allows background cache work such as stale-while-revalidate without blocking the response. The Cloudflare adapter now forwards ExecutionContext.waitUntil to this API.

  • #16290 a49637a Thanks @ViVaLaDaniel! - Ensures that server.allowedHosts (and vite.preview.allowedHosts) configuration is respected when using astro preview with the @astrojs/cloudflare adapter. This improves security by preventing DNS rebinding attacks when previewing Cloudflare builds locally.

Patch Changes


[email protected] · [email protected]

2026-04-28 · by @astrobot-houston

Patch Changes

  • #16479 1058428 Thanks @matthewp! - Fixes a spurious [WARN] [content] Content config not loaded warning during astro dev for projects that don't use content collections

  • #16457 3d82220 Thanks @matthewp! - Hardens server island encryption to prevent encrypted data from one island component being replayed against a different one

  • #16481 152700e Thanks @matthewp! - Fixes a spurious 404 request for a dev toolbar sourcemap during astro dev caused by the browser mis-resolving a relative sourceMappingURL from the /@id/ URL prefix

  • #16480 1bcb43b Thanks @matthewp! - Fixes an unnecessary full page reload on first navigation during dev


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Patch Changes

  • #16486 0bae1a5 Thanks @cyphercodes! - Fix forwarded serverless requests with streamed bodies by preserving the required duplex: 'half' option when rewriting middleware paths.

@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Minor Changes

  • #16466 31b6198 Thanks @fkatsuhiro! - This change updates the Svelte integration's type shims to treat non-children snippet props and any-typed props as optional. Previously, these were incorrectly marked as required in Astro files, causing false-positive type errors when using Svelte 5 components.
    • Adds HandleSnippetProps to make Snippets optional in Astro.
    • Distinguishes between generic and non-generic components to preserve inference.
    • Updates TSX generation to apply the appropriate directive wrapper.

@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Patch Changes

  • #15908 8c62159 Thanks @felmonon! - Keep generated AstroComponent suffixes in language-server output while rewriting .astro auto-import suggestions and edits back to the expected component name.

@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Minor Changes

  • #16289 5d580c0 Thanks @maxmalkin! - Adds a new getDbError() helper exported from astro:db. It walks the error .cause chain and returns the underlying LibsqlError, or undefined if the error did not originate from libSQL. This is needed because drizzle-orm 0.44+ wraps query errors in a DrizzleQueryError whose .cause is the real LibsqlError.

    Upgrading

    Code that reads .code or .message after catching a database error should migrate from isDbError() to getDbError():

    // Before
    import { isDbError } from 'astro:db';
    try {
      await db.insert(MyTable).values({ ... });
    } catch (e) {
      if (isDbError(e)) {
        console.error(e.code, e.message);
      }
    }
    
    // After
    import { getDbError } from 'astro:db';
    try {
      await db.insert(MyTable).values({ ... });
    } catch (e) {
      const dbError = getDbError(e);
      if (dbError) {
        console.error(dbError.code, dbError.message);
      }
    }
    

    isDbError() is still exported and still returns true for wrapped errors, but its return type is now boolean instead of the err is LibsqlError type predicate. Code that relied on the narrowing to access .code or .message directly will now produce a TypeScript error pointing you to getDbError().

Patch Changes

  • #16289 5d580c0 Thanks @maxmalkin! - Fixes a SQL injection vulnerability by updating drizzle-orm to ^0.45.2, patching GHSA-gpj5-g38j-94v9 (CVE-2026-39356).

@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Patch Changes

  • #16498 4efe020 Thanks @matthewp! - Fixes the dependency scan failing with "No matching export for import 'default'" when a .ts file default-imports an .astro component

    The esbuild scan plugin now includes export default {} in its output for .astro files, preventing the scan from failing and ensuring all dependencies are discovered ahead of time.

  • Updated dependencies []:


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-28 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-23 · by @astrobot-houston

Patch Changes

  • #16458 8cb1f42 Thanks @matthewp! - Fixes Cloudflare dev and build failures caused by @cloudflare/vite-plugin defaulting compatibility_date to today's date, which can exceed the maximum date supported by the bundled workerd binary

[email protected] · [email protected]

2026-04-22 · by @astrobot-houston

Patch Changes

  • #16419 f3485c3 Thanks @matthewp! - Hardens nested object and package metadata lookups to ignore prototype keys in content handling and project scaffolding

[email protected] · [email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes

  • #16424 3fcdaf1 Thanks @matthewp! - Improves how @astrojs/upgrade spawns package manager commands so it uses the same Windows command resolution as create-astro

@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes


@astrojs/[email protected] · @astrojs/[email protected]

2026-04-22 · by @astrobot-houston

Patch Changes