Extrapolate is an app for you to see how well you age by transforming your face with Artificial Intelligence. 100% free and privacy friendly.
/webhook
API endpoint)You can deploy this template to Vercel with the button below:
Note that you'll need to:
REPLICATE_API_KEY
env var.AUTH_KEY_SECRET
variable under Settings > Environment Variables (you can generate a random secret here).images.extrapolate.workers.dev
in the codebase with your Cloudflare Worker endpoint.// Check requests for a pre-shared secret const hasValidHeader = (request, env) => { return request.headers.get('X-CF-Secret') === env.AUTH_KEY_SECRET; }; function authorizeRequest(request, env, key) { switch (request.method) { case 'PUT': case 'DELETE': return hasValidHeader(request, env); case 'GET': return true default: return false; } } export default { async fetch(request, env) { const url = new URL(request.url); const key = url.pathname.slice(1); if (!authorizeRequest(request, env, key)) { return new Response('Forbidden', { status: 403 }); } switch (request.method) { case 'PUT': await env.MY_BUCKET.put(key, request.body); return new Response(`Put ${key} successfully!`); case 'GET': const object = await env.MY_BUCKET.get(key); if (object === null) { return new Response('Object Not Found', { status: 404 }); } const headers = new Headers(); object.writeHttpMetadata(headers); headers.set('etag', object.httpEtag); return new Response(object.body, { headers, }); case 'DELETE': await env.MY_BUCKET.delete(key); return new Response('Deleted!'); default: return new Response('Method Not Allowed', { status: 405, headers: { Allow: 'PUT, GET, DELETE', }, }); } }, };
Age transformation AI app powered by Next.js, Replicate, Upstash, and Cloudflare R2 + Workers.
Extrapolate is an app for you to see how well you age by transforming your face with Artificial Intelligence. 100% free and privacy friendly.
/webhook
API endpoint)You can deploy this template to Vercel with the button below:
Note that you'll need to:
REPLICATE_API_KEY
env var.AUTH_KEY_SECRET
variable under Settings > Environment Variables (you can generate a random secret here).images.extrapolate.workers.dev
in the codebase with your Cloudflare Worker endpoint.// Check requests for a pre-shared secret const hasValidHeader = (request, env) => { return request.headers.get('X-CF-Secret') === env.AUTH_KEY_SECRET; }; function authorizeRequest(request, env, key) { switch (request.method) { case 'PUT': case 'DELETE': return hasValidHeader(request, env); case 'GET': return true default: return false; } } export default { async fetch(request, env) { const url = new URL(request.url); const key = url.pathname.slice(1); if (!authorizeRequest(request, env, key)) { return new Response('Forbidden', { status: 403 }); } switch (request.method) { case 'PUT': await env.MY_BUCKET.put(key, request.body); return new Response(`Put ${key} successfully!`); case 'GET': const object = await env.MY_BUCKET.get(key); if (object === null) { return new Response('Object Not Found', { status: 404 }); } const headers = new Headers(); object.writeHttpMetadata(headers); headers.set('etag', object.httpEtag); return new Response(object.body, { headers, }); case 'DELETE': await env.MY_BUCKET.delete(key); return new Response('Deleted!'); default: return new Response('Method Not Allowed', { status: 405, headers: { Allow: 'PUT, GET, DELETE', }, }); } }, };