@smalk/astro
v0.1.2
Published
Smalk AI Ads for Astro on Cloudflare Pages — a build-time tracker integration plus an edge Pages Function that injects native AI-search text ads (SSAI) and freshens Last-Modified. The LLM-crawler view of your static pages.
Maintainers
Readme
@smalk/astro
Smalk AI Ads for Astro static sites on Cloudflare Pages.
Smalk serves native text ads inside AI-generated answers (ChatGPT, Perplexity, Claude, …). Since AI crawlers read the HTML your server returns — not JavaScript-rendered content — the ad has to be in that HTML. A static Astro site has no per-request server, so this package injects the ad at the Cloudflare edge instead. No rebuilds, no origin server, and it fails open: if anything is slow or unavailable, your page renders exactly as built.
Compat: Astro 4+, Cloudflare Pages.
Install
npm install @smalk/astro1. Tracker
Add the integration to your Astro config — it drops the Smalk tracker on every page at build time:
// astro.config.mjs
import { defineConfig } from "astro/config";
import smalk from "@smalk/astro";
export default defineConfig({
integrations: [smalk({ projectKey: process.env.SMALK_PROJECT_KEY })],
});2. Ads
Put the ad placeholder where you want the ad to appear, in your layout or page:
<div class="smalk-ads"></div>Add the Cloudflare Pages Function (create the file if it doesn't exist):
// functions/_middleware.js
export { onRequest } from "@smalk/astro/pages-function";Set your environment variables in Cloudflare Pages → Settings → Environment variables — the secret key is set here, in the dashboard, not in your code:
| Var | Required | Notes |
|---|---|---|
| SMALK_PROJECT_KEY | yes | Your project key (public) |
| SMALK_API_KEY | yes | Your API key (secret) |
| SMALK_EDGE_TRACKING | no | Records AI-agent visits (analytics) server-side. On by default; set to false to disable. |
| SMALK_API_BASE | no | Defaults to https://api.smalk.ai. |
Then redeploy. Cloudflare Pages Functions only take effect on the next
deployment after functions/_middleware.js is added — an already-running site
won't pick it up until you deploy again.
