Loading...
Loading...
Alchemy IaC framework for TypeScript. Use when the user mentions Alchemy, wants to set up infrastructure, deploy Cloudflare Workers, configure databases, KV, R2, queues, use bindings and secrets, set up dev mode, use framework adapters (Vite, Astro, React Router, SvelteKit, Nuxt, TanStack Start), create custom resources, or work with any Alchemy provider.
npx skill4agent add georgejeffers/alchemy-skills alchemyreferences/alchemy-concepts.mdalchemy create my-app --template vitealchemy initalchemy.run.tsimport alchemy from "alchemy";
import { Worker, KVNamespace } from "alchemy/cloudflare";
const app = await alchemy("my-app");
const kv = await KVNamespace("cache", { title: "my-cache" });
const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: {
CACHE: kv,
API_KEY: alchemy.secret(process.env.API_KEY),
STAGE: app.stage,
},
});
await app.finalize();alchemy deploy # deploy (default stage = $USER)
alchemy deploy --stage prod # deploy to prod
alchemy dev # local dev with hot reload
alchemy destroy # tear down all resources| User Request | What to Do |
|---|---|
| Set up Alchemy in a project | Use |
| Add a Worker | |
| Add a database/KV/R2/queue | Import from |
| Use secrets | |
| Set up dev mode | |
| Use a framework (Vite/Astro/etc.) | Load |
| Deploy to production | |
| Use Neon/Stripe/AWS/other provider | Load |
| Build a custom resource | Load |
| Build a new provider for Alchemy | Run the full Provider Development Workflow below |
const db = await D1Database("my-db", { name: "my-db" });const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: { DB: db, KV: kv, SECRET: alchemy.secret("value") },
});import type { worker } from "../alchemy.run";
export default {
async fetch(req: Request, env: typeof worker.Env) {
await env.DB.prepare("SELECT 1").run();
},
};alchemy.secret(process.env.API_KEY) // wrap a value
alchemy.secret.env.API_KEY // shorthand$USERalchemy deploy # deploys to $USER stage
alchemy deploy --stage prod # deploys to prod stagealchemy dev| Framework | Resource | Plugin/Adapter |
|---|---|---|
| Vite | | |
| Astro | | |
| React Router | | |
| SvelteKit | | |
| Nuxt | | |
| TanStack Start | | |
| BunSPA | | (no plugin needed) |
| Next.js | | |
| Redwood (RWSDK) | | |
| Provider | Import | Key Resources |
|---|---|---|
| Cloudflare | | Worker, D1Database, KVNamespace, R2Bucket, Queue, DurableObjectNamespace, Hyperdrive, Zone, DnsRecords |
| Neon | | NeonProject, NeonBranch, NeonDatabase, NeonRole |
| Stripe | | WebhookEndpoint, Price, Product, Coupon, and 10+ more |
| AWS | | Function, Table, Vpc, Subnet, SecurityGroup, Bucket, Role |
| AWS Control | | |
| GitHub | | GitHubSecret |
| Vercel | | VercelProject, VercelDnsRecord, VercelDeployment |
import alchemy from "alchemy"import { Worker } from "alchemy/cloudflare"await app.finalize()alchemy.run.ts$USER--stage prodalchemy.secret().alchemy/.gitignorereferences/alchemy-concepts.mdreferences/resource-patterns.mdreferences/test-patterns.mdreferences/doc-patterns.mdreferences/checklist.mdalchemy/src/{provider}/api.tsreferences/resource-patterns.mdResource("{provider}::{Resource}", ...)props.name ?? this.output?.name ?? this.scope.createPhysicalName(id)functionthisis{Resource}references/test-patterns.mdalchemy.test(import.meta, { prefix: BRANCH_PREFIX })destroy(scope)references/doc-patterns.mdalchemy-web/src/content/docs/providers/{provider}/{resource}.mdalchemy-web/src/content/docs/guides/{provider}.mdxexamples/{provider}/alchemy.run.tsreferences/checklist.mdbun formatbun vitest alchemy/test/{provider}/bun tsc -b