The built-in types cover structured data, but AI prompts are full of _free-form_
diff --git a/src/content/docs/ai-protection/prompt-injection.mdx b/src/content/docs/ai-protection/prompt-injection.mdx
index a5057eb31..5580a255b 100644
--- a/src/content/docs/ai-protection/prompt-injection.mdx
+++ b/src/content/docs/ai-protection/prompt-injection.mdx
@@ -45,8 +45,8 @@ ajToc:
import { Link } from "@/components/link";
import { Tabs, TabItem } from "@astrojs/starlight/components";
-import SlotByFramework from "@/components/SlotByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import { frameworks } from "@/lib/prefs";
import NextJsStep from "@/snippets/ai-protection/prompt-injection/nextjs/Example.mdx";
@@ -81,7 +81,7 @@ application behavior and your AI budget.
.map((d) => d.key)}
/>
-
+
diff --git a/src/content/docs/bot-protection/advanced-signals.mdx b/src/content/docs/bot-protection/advanced-signals.mdx
index 05e465eeb..4e8593262 100644
--- a/src/content/docs/bot-protection/advanced-signals.mdx
+++ b/src/content/docs/bot-protection/advanced-signals.mdx
@@ -46,8 +46,8 @@ import { Badge } from "@astrojs/starlight/components";
import Comments from "@/components/Comments.astro";
import { Link } from "@/components/link";
import { frameworks } from "@/lib/prefs";
-import SlotByFramework from "@/components/SlotByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import BunAddScript from "@/snippets/bot-protection/advanced-signals/html/AddScript.mdx";
import DenoAddScript from "@/snippets/bot-protection/advanced-signals/html/AddScript.mdx";
@@ -162,7 +162,7 @@ Load the signals script on every page that might lead into a sensitive route, su
We recommend adding the script to every page. Usage billing is based on when you call the `detectBot` rule, not on when the script runs, so you aren't charged for loading the script.
-
+
@@ -189,7 +189,7 @@ With an empty `allow` list, all detected bots are denied – including requests
that fail signals evaluation. This is the recommended configuration for
high-sensitivity endpoints:
-
+
@@ -210,7 +210,7 @@ To block signals failures alongside other specific identifiers, add
`ARCJET_SIGNALS` to the `deny` list. With a `deny` list, only the listed
identifiers are blocked – any bot not in the list is allowed:
-
+
@@ -227,7 +227,7 @@ identifiers are blocked – any bot not in the list is allowed:
To collect signals data without blocking, add `ARCJET_SIGNALS` to the `allow`
list. Signals are still evaluated but the result does not affect the decision:
-
+
@@ -248,7 +248,7 @@ doesn't execute JavaScript and a scraper that targets your API directly.
You can enforce the cookie by using a [filter rule](/filters) to block any request.
-
+
@@ -273,7 +273,7 @@ denial and return a more helpful response. For example, you can redirect the use
to an error page that explains cookies are required, rather than returning a
silent 403:
-
+
diff --git a/src/content/docs/bot-protection/quick-start.mdx b/src/content/docs/bot-protection/quick-start.mdx
index 0dff74884..db9f0af8d 100644
--- a/src/content/docs/bot-protection/quick-start.mdx
+++ b/src/content/docs/bot-protection/quick-start.mdx
@@ -56,10 +56,10 @@ import { CardGrid } from "@astrojs/starlight/components";
import { Link } from "@/components/link";
import { frameworks } from "@/lib/prefs";
import WhatIsArcjet from "/src/components/WhatIsArcjet.astro";
-import SlotByFramework from "@/components/SlotByFramework";
+import SlotByFramework from "@/components/SlotByFramework.astro";
import FrameworkName from "@/components/FrameworkName";
import FAQs from "/src/components/FAQs.astro";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import Comments from "/src/components/Comments.astro";
import SdkReferenceLinkByFramework from "/src/components/SdkReferenceLinkByFramework.astro";
@@ -123,7 +123,6 @@ Arcjet bot detection lets you manage traffic by automated clients and bots.
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -139,7 +138,7 @@ application from bots and automated clients.
In your project root, install the SDK:
-
+
@@ -158,7 +157,7 @@ In your project root, install the SDK:
[Create a free Arcjet account](https://console.arcjet.com) then follow the
instructions to add a site and get a key.
-
+
@@ -174,7 +173,7 @@ instructions to add a site and get a key.
### 3. Add bot protection
-
+
@@ -188,7 +187,7 @@ instructions to add a site and get a key.
-
+
diff --git a/src/content/docs/bot-protection/reference.mdx b/src/content/docs/bot-protection/reference.mdx
index 4d99a28db..8f1ac67dd 100644
--- a/src/content/docs/bot-protection/reference.mdx
+++ b/src/content/docs/bot-protection/reference.mdx
@@ -88,9 +88,9 @@ ajToc:
import { Badge, Tabs, TabItem } from "@astrojs/starlight/components";
import Comments from "@/components/Comments.astro";
import { Link } from "@/components/link";
-import SlotByFramework from "@/components/SlotByFramework";
-import TextByFramework from "@/components/TextByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import TextByFramework from "@/components/TextByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import { frameworks } from "@/lib/prefs";
import BunAllowingBots from "@/snippets/bot-protection/reference/bun/AllowingBots.mdx";
@@ -166,7 +166,6 @@ import SvelteKitPerRouteVsHooks from "@/snippets/bot-protection/reference/svelte
Arcjet bot detection lets you manage traffic by automated clients and bots.
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -249,7 +248,7 @@ say they are.
Configure this behavior with an `allow` list drawn from the [full list of
bots](https://arcjet.com/bot-list), from bot categories, or from both.
-
+
@@ -270,7 +269,7 @@ misconfigured or high-traffic bots.
Configure this behavior with a `deny` list drawn from the [full list of
bots](https://arcjet.com/bot-list), from bot categories, or from both.
-
+
@@ -282,7 +281,7 @@ bots](https://arcjet.com/bot-list), from
-
+
@@ -299,7 +298,7 @@ Arcjet provides a single `protect` function that is used to execute your
protection rules. This requires a `request` argument which is the request
context as passed to the request handler.
-
+
@@ -347,7 +346,7 @@ for result in decision.results:
-
+
@@ -365,7 +364,7 @@ The decision also contains all of the
@@ -400,7 +399,7 @@ header.
See an example of how to do this.
:::
-
+
@@ -418,7 +417,7 @@ All categories are also provided as enumerations, which allows for programmatic
access. For example, you may want to allow most of `CATEGORY:GOOGLE` except
their "advertising quality" bot.
-
+
@@ -684,7 +683,7 @@ Arcjet can also be triggered based using a sample of your traffic.
For details, see the Testing section of
the docs.
-
+
diff --git a/src/content/docs/content-moderation/quick-start.mdx b/src/content/docs/content-moderation/quick-start.mdx
index 14a77c534..a413b34c4 100644
--- a/src/content/docs/content-moderation/quick-start.mdx
+++ b/src/content/docs/content-moderation/quick-start.mdx
@@ -51,8 +51,8 @@ import { CardGrid, Tabs, TabItem } from "@astrojs/starlight/components";
import { Link } from "@/components/link";
import WhatIsArcjet from "/src/components/WhatIsArcjet.astro";
import Comments from "/src/components/Comments.astro";
-import SlotByFramework from "@/components/SlotByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import { frameworks } from "@/lib/prefs";
import BunStep from "@/snippets/content-moderation/quick-start/bun/Example.mdx";
@@ -89,7 +89,7 @@ is stored, displayed, or forwarded. It is a Guard rule – call it from
## Quick start
-
+
diff --git a/src/content/docs/email-validation/quick-start.mdx b/src/content/docs/email-validation/quick-start.mdx
index b54554fec..5ca540774 100644
--- a/src/content/docs/email-validation/quick-start.mdx
+++ b/src/content/docs/email-validation/quick-start.mdx
@@ -48,8 +48,8 @@ import { Link } from "@/components/link";
import { CardGrid } from "@astrojs/starlight/components";
import SdkReferenceLinkByFramework from "/src/components/SdkReferenceLinkByFramework.astro";
import WhatIsArcjet from "/src/components/WhatIsArcjet.astro";
-import FrameworkLinks from "@/components/FrameworkLinks";
-import SlotByFramework from "@/components/SlotByFramework";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
+import SlotByFramework from "@/components/SlotByFramework.astro";
import FrameworkName from "@/components/FrameworkName";
import { frameworks } from "@/lib/prefs";
import Step1Bun from "@/snippets/email-validation/quick-start/bun/Step1.mdx";
@@ -90,7 +90,6 @@ reduce the amount of spam or fraudulent accounts.
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -106,7 +105,7 @@ This guide shows you how to add email validation and verification to your
In your project root, install the SDK:
-
+
@@ -123,7 +122,7 @@ In your project root, install the SDK:
instructions to add a site and get a key. Add it to a `.env.local` file in your
project root.
-
+
@@ -141,7 +140,7 @@ email address is invalid or if no MX records are configured, Arcjet returns a
deny decision. Pass exactly one of `allow` or `deny`. An empty `allow` list
allows no email types.
-
+
@@ -152,7 +151,7 @@ allows no email types.
-
+
diff --git a/src/content/docs/email-validation/reference.mdx b/src/content/docs/email-validation/reference.mdx
index 13ecaa024..bfeb16db9 100644
--- a/src/content/docs/email-validation/reference.mdx
+++ b/src/content/docs/email-validation/reference.mdx
@@ -26,9 +26,9 @@ ajToc:
import { Link } from "@/components/link";
import { Aside, Badge, Tabs, TabItem } from "@astrojs/starlight/components";
-import SlotByFramework from "@/components/SlotByFramework";
-import TextByFramework from "@/components/TextByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import TextByFramework from "@/components/TextByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import DisplayType from "@/components/DisplayType.astro";
import { frameworks } from "@/lib/prefs";
@@ -66,7 +66,6 @@ preventing users from signing up with fake email addresses and can significantly
reduce the amount of spam or fraudulent accounts.
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -227,7 +226,7 @@ to allow certain types of email addresses, you can modify the options:
literals. Defaults to `false`. Changing to `true` means that
`foo@[123.456.789.0]` would be allowed.
-
+
@@ -238,7 +237,7 @@ protection rules. This requires a `request` argument which is the request
context as passed to the request handler. When configured with a `validateEmail`
rule it also requires an additional `email` prop.
-
+
@@ -288,7 +287,7 @@ for result in decision.results:
This example logs the full result as well as the email validation rule:
-
+
@@ -304,7 +303,7 @@ This example logs the full result as well as the email validation rule:
In addition to being able to deny specific email types, you can also configure
Arcjet to only allow specific email types and Arcjet blocks all other types.
-
+
@@ -415,7 +414,7 @@ rule's error result for more information.
If all other rules that were run returned an `ALLOW` result, then the final
Arcjet conclusion is `ERROR`.
-
+
diff --git a/src/content/docs/filters/quick-start.mdx b/src/content/docs/filters/quick-start.mdx
index f2e181468..f4ae8fa54 100644
--- a/src/content/docs/filters/quick-start.mdx
+++ b/src/content/docs/filters/quick-start.mdx
@@ -68,8 +68,8 @@ import Comments from "/src/components/Comments.astro";
import Faqs from "/src/components/FAQs.astro";
import SdkReferenceLinkByFramework from "/src/components/SdkReferenceLinkByFramework.astro";
import WhatIsArcjet from "/src/components/WhatIsArcjet.astro";
-import SlotByFramework from "@/components/SlotByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import FrameworkName from "@/components/FrameworkName";
import { frameworks } from "@/lib/prefs";
import { Link } from "@/components/link";
@@ -132,7 +132,6 @@ lets you enforce rules such as allow or deny by country, network, or
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -148,7 +147,7 @@ filters.
In your project root, install the SDK:
-
+
@@ -168,7 +167,7 @@ In your project root, install the SDK:
[Create a free Arcjet account](https://console.arcjet.com) and follow the
instructions to add a site and get a key.
-
+
@@ -185,7 +184,7 @@ instructions to add a site and get a key.
### 3. Add filters
-
+
@@ -202,7 +201,7 @@ instructions to add a site and get a key.
{/* Note: Step 4 has its heading inside it as it is dynamic. Make sure that the table of contents (in frontmatter) reflects that dynamic heading correctly. */}
-
+
@@ -221,7 +220,7 @@ instructions to add a site and get a key.
Make a `curl` request from your terminal to your app:
-
+
```sh
diff --git a/src/content/docs/filters/reference.mdx b/src/content/docs/filters/reference.mdx
index 618c5bb9e..53bcd8877 100644
--- a/src/content/docs/filters/reference.mdx
+++ b/src/content/docs/filters/reference.mdx
@@ -42,9 +42,9 @@ ajToc:
import { Link } from "@/components/link";
import { Badge, Tabs, TabItem } from "@astrojs/starlight/components";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import DisplayType from "@/components/DisplayType.astro";
-import SlotByFramework from "@/components/SlotByFramework";
+import SlotByFramework from "@/components/SlotByFramework.astro";
import { frameworks } from "@/lib/prefs";
import BunAllow from "@/snippets/filters/reference/bun/Allow.mdx";
import DenoAllow from "@/snippets/filters/reference/deno/Allow.mdx";
@@ -64,7 +64,6 @@ lets you enforce rules such as allow or deny by country, network, or
`user-agent`.
!frontmatter.frameworks.includes(d.key))
.map((d) => d.key)}
@@ -122,7 +121,7 @@ For details of examining the execution results, see [decision](#decision).
In this example, the expression matches non-VPN GET requests from the US.
Requests matching the expression are allowed and all others are denied.
-
+
diff --git a/src/content/docs/get-started.mdx b/src/content/docs/get-started.mdx
index 8b0790406..466fd95e8 100644
--- a/src/content/docs/get-started.mdx
+++ b/src/content/docs/get-started.mdx
@@ -78,13 +78,14 @@ ajToc:
---
import { YouTube } from "astro-embed";
-import SlotByFramework from "@/components/SlotByFramework";
-import FrameworkLinks from "@/components/FrameworkLinks";
+import SlotByFramework from "@/components/SlotByFramework.astro";
+import FrameworkLinks from "@/components/FrameworkLinks.astro";
import { Link } from "@/components/link";
import { Aside, LinkButton, CardGrid } from "@astrojs/starlight/components";
import FAQs from "/src/components/FAQs.astro";
import WhatIsArcjet from "/src/components/WhatIsArcjet.astro";
import SdkReferenceLinkByFramework from "/src/components/SdkReferenceLinkByFramework.astro";
+import SdkHydration from "@/components/SdkHydration.astro";
import AstroStep1 from "@/snippets/shared/astro/Install.mdx";
import AstroRequirements from "@/snippets/get-started/astro/Requirements.mdx";
@@ -250,6 +251,8 @@ import VercelEveStep4 from "@/snippets/get-started/vercel-eve/Step4.mdx";
[Arcjet](https://arcjet.com) is the runtime security platform that ships with your code. Enforce budgets, stop prompt injection, detect bots, and protect personal information with Arcjet's AI security building blocks.
+
+