Add Transloadit Smart CDN URL signing to a Next.js App Router project (server-side signing route + optional client demo page).
Add this skill
npx mdskills install transloadit/integrate-asset-delivery-with-transloadit-smartcdn-in-nextjsPractical guide with clear step-by-step implementation and secure credential handling
1---2name: integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs3description: Add Transloadit Smart CDN URL signing to a Next.js App Router project (server-side signing route + optional client demo page).4---56# Inputs78- Required env (server-only): `TRANSLOADIT_KEY`, `TRANSLOADIT_SECRET`9- Optional env: `TRANSLOADIT_SMARTCDN_WORKSPACE`, `TRANSLOADIT_SMARTCDN_TEMPLATE`, `TRANSLOADIT_SMARTCDN_INPUT`1011For local dev, put these in `.env.local`. Never expose `TRANSLOADIT_SECRET` to the browser.1213# Install1415```bash16npm i @transloadit/utils17```1819# Implement (App Router)2021Pick the root:22- If your project has `src/app`, use `src/app/...`23- Else use `app/...`2425## 1) Server route: sign Smart CDN URLs2627Create `app/api/smartcdn/route.ts` (or `src/app/api/smartcdn/route.ts` if you use `src/`):2829```ts30import { NextResponse } from 'next/server'31import { getSignedSmartCdnUrl } from '@transloadit/utils/node'3233export const runtime = 'nodejs'3435function reqEnv(name: string): string {36 const v = process.env[name]37 if (!v) throw new Error(`Missing required env var: ${name}`)38 return v39}4041export async function GET() {42 try {43 const authKey = reqEnv('TRANSLOADIT_KEY')44 const authSecret = reqEnv('TRANSLOADIT_SECRET')4546 const workspace = process.env.TRANSLOADIT_SMARTCDN_WORKSPACE || 'demo'47 const template = process.env.TRANSLOADIT_SMARTCDN_TEMPLATE || 'serve-preview'48 const input = process.env.TRANSLOADIT_SMARTCDN_INPUT || 'example.jpg'4950 const url = getSignedSmartCdnUrl({ workspace, template, input, authKey, authSecret })5152 return NextResponse.json({ url, workspace, template, input })53 } catch (err) {54 const message = err instanceof Error ? err.message : 'Unknown error'55 return NextResponse.json({ error: message }, { status: 500 })56 }57}58```5960## 2) Optional: a tiny demo page6162Create `app/smartcdn/page.tsx` (or `src/app/smartcdn/page.tsx`):6364```tsx65import SmartCdnDemo from './smartcdn-demo'6667export default function SmartCdnPage() {68 return (69 <main style={{ padding: 24 }}>70 <h1 style={{ fontSize: 20, fontWeight: 600 }}>Smart CDN Signed URL</h1>71 <SmartCdnDemo />72 </main>73 )74}75```7677Create `app/smartcdn/smartcdn-demo.tsx` (or `src/app/smartcdn/smartcdn-demo.tsx`):7879```tsx80'use client'8182import { useEffect, useState } from 'react'8384export default function SmartCdnDemo() {85 const [payload, setPayload] = useState<unknown>(null)8687 useEffect(() => {88 let cancelled = false89 fetch('/api/smartcdn', { cache: 'no-store' })90 .then(async (res) => res.json())91 .then((json) => {92 if (!cancelled) setPayload(json)93 })94 .catch((err) => {95 if (!cancelled) setPayload({ error: String(err) })96 })97 return () => {98 cancelled = true99 }100 }, [])101102 return (103 <pre data-testid="smartcdn-json">104 {payload ? JSON.stringify(payload, null, 2) : '(loading)'}105 </pre>106 )107}108```109110# Quick Check111112- Start dev server, then open `/smartcdn` or fetch `/api/smartcdn`.113- Expect JSON including a `url` and your `{ workspace, template, input }`.114115# References (Internal)116117- Working reference implementation: `https://github.com/transloadit/skills/tree/main/scenarios/integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs`118119Tested with (see the scenario lockfile for the exact versions):120- Next.js 16.1.6 (App Router)121- React 19.2.3122- @transloadit/utils 4.3.0 (Smart CDN signing)123
Full transparency — inspect the skill content before installing.