[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-steven-tey--extrapolate":3,"tool-steven-tey--extrapolate":64},[4,18,26,35,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,2,"2026-04-06T11:32:50",[14,15,13],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":10,"last_commit_at":41,"category_tags":42,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[43,15,13,14],"语言模型",{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":10,"last_commit_at":50,"category_tags":51,"status":17},4292,"Deep-Live-Cam","hacksider\u002FDeep-Live-Cam","Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具，用户仅需一张静态照片，即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点，让高质量的数字内容创作变得触手可及。\n\n这款工具不仅适合开发者和技术研究人员探索算法边界，更因其极简的操作逻辑（仅需三步：选脸、选摄像头、启动），广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换，还是制作趣味短视频和直播互动，Deep-Live-Cam 都能提供流畅的支持。\n\n其核心技术亮点在于强大的实时处理能力，支持口型遮罩（Mouth Mask）以保留使用者原始的嘴部动作，确保表情自然精准；同时具备“人脸映射”功能，可同时对画面中的多个主体应用不同面孔。此外，项目内置了严格的内容安全过滤机制，自动拦截涉及裸露、暴力等不当素材，并倡导用户在获得授权及明确标注的前提下合规使用，体现了技术发展与伦理责任的平衡。",88924,"2026-04-06T03:28:53",[14,15,13,52],"视频",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",85013,"2026-04-06T11:09:19",[15,16,52,61,13,62,43,14,63],"插件","其他","音频",{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":80,"owner_email":81,"owner_twitter":82,"owner_website":83,"owner_url":84,"languages":85,"stars":101,"forks":102,"last_commit_at":103,"license":104,"difficulty_score":105,"env_os":106,"env_gpu":107,"env_ram":106,"env_deps":108,"category_tags":116,"github_topics":117,"view_count":32,"oss_zip_url":124,"oss_zip_packed_at":124,"status":17,"created_at":125,"updated_at":126,"faqs":127,"releases":128},4557,"steven-tey\u002Fextrapolate","extrapolate","Age transformation AI app powered by Next.js, Vercel, Replicate, Upstash, and Cloudflare R2 + Workers.","Extrapolate 是一款基于人工智能的年龄变换应用，旨在让用户直观地看到自己随时间推移的面容变化。只需上传一张照片，它就能在短短 3 秒内生成一段展示你从年轻到年老过程的动态 GIF 图像，帮助用户以趣味方式探索“未来模样”。\n\n这款工具主要解决了传统年龄模拟操作复杂、效果生硬的问题，通过集成先进的 AI 模型，提供流畅且逼真的面部老化推演体验。它不仅适合普通用户娱乐尝鲜，也特别适合前端开发者和技术爱好者参考学习——因为 Extrapolate 本身是一个开源项目，展示了如何构建现代化的 AI Web 应用。\n\n其技术架构颇具亮点：前端采用 Next.js 框架，部署在 Vercel 上；后端利用 Replicate 运行 AI 模型，配合 Upstash 实现高速数据缓存，并创新性地使用 Cloudflare R2 存储图片资源，结合 Cloudflare Workers 处理上传与读取逻辑，实现了低成本、高性能的无服务器架构。对于希望快速搭建类似 AI 应用的开发者而言，Extrapolate 提供了完整的部署模板和清晰的环境配置指南，极具参考价值。","\u003Ca href=\"https:\u002F\u002Fextrapolate.app\">\n  \u003Cimg alt=\"Extrapolate – See how well you age with AI\" src=\"https:\u002F\u002Fextrapolate.app\u002Fapi\u002Fog\">\n  \u003Ch1 align=\"center\">Extrapolate\u003C\u002Fh1>\n\u003C\u002Fa>\n\n\u003Cp align=\"center\">\n  See how well you age with AI\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fsteventey\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fsteventey?style=flat&label=steventey&logo=twitter&color=0bf&logoColor=fff\" alt=\"Steven Tey Twitter follower count\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsteven-tey\u002Fextrapolate\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fsteven-tey\u002Fextrapolate?label=steven-tey%2Fextrapolate\" alt=\"Extrapolate repo star count\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#introduction\">\u003Cstrong>Introduction\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#features\">\u003Cstrong>Features\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#deploy-your-own\">\u003Cstrong>Deploy Your Own\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#author\">\u003Cstrong>Author\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cbr\u002F>\n\n--NEW README COMING SOON--\n\n## Introduction\n\nExtrapolate is an app for you to see how well you age by transforming your face with Artificial Intelligence.\n\nhttps:\u002F\u002Fuser-images.githubusercontent.com\u002F28986134\u002F213781048-d215894d-2286-4176-a200-f745b255ecbe.mp4\n\n## Features\n\n- 3s GIF of your face as it ages through time 🧓\n- Store & retrieve photos from [Cloudflare R2](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F) using Workers\n\n## Deploy Your Own\n\nYou can deploy this template to Vercel with the button below:\n\n[![Deploy with Vercel](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsteven-tey_extrapolate_readme_a4c0f8073a9c.png)](https:\u002F\u002Fvercel.com\u002Fnew\u002Fclone?demo-title=Extrapolate%20%E2%80%93%C2%A0See%20how%20well%20you%20age%20with%20AI&demo-description=Age%20transformation%20AI%20app%20powered%20by%20Next.js%2C%20Replicate%2C%20Upstash%2C%20and%20Cloudflare%20R2%20%2B%20Workers.&demo-url=https%3A%2F%2Fextrapolate.app%2F&demo-image=%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F4B2RUQ7DTvPgpf3Ra9jSC2%2Fda2571b055081a670ac9649d3ac0ac7a%2FCleanShot_2023-01-20_at_12.04.08.png&project-name=Extrapolate%20%E2%80%93%C2%A0See%20how%20well%20you%20age%20with%20AI&repository-name=extrapolate&repository-url=https%3A%2F%2Fgithub.com%2Fsteven-tey%2Fextrapolate&from=templates&integration-ids=oac_V3R1GIpkoJorr6fqyiwdhl17&env=REPLICATE_API_TOKEN%2CREPLICATE_WEBHOOK_TOKEN%2CCLOUDFLARE_WORKER_SECRET%2CPOSTMARK_TOKEN&envDescription=How%20to%20get%20these%20env%20variables%3A%20&envLink=https%3A%2F%2Fgithub.com%2Fsteven-tey%2Fextrapolate%2Fblob%2Fmain%2F.env.example)\n\nNote that you'll need to:\n\n- Set up a [ReplicateHQ](https:\u002F\u002Freplicate.com) account to get the `REPLICATE_API_TOKEN` env var.\n- Set up an [Upstash](https:\u002F\u002Fupstash.com) account to get the Upstash Redis env vars.\n- Create a [Cloudflare R2 instance](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F) and set up a [Cloudflare Worker](https:\u002F\u002Fworkers.cloudflare.com\u002F) to handle uploads & reads (instructions below).\n\n### Cloudflare R2 setup instructions\n\n1. Go to Cloudflare and create an [R2 bucket](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F).\n2. Create a [Cloudflare Worker](https:\u002F\u002Fworkers.cloudflare.com\u002F) using the code snippet below.\n3. Bind your worker to your R2 instance under **Settings > R2 Bucket Bindings**.\n4. For extra security, set an `AUTH_KEY_SECRET` variable under **Settings > Environment Variables** (you can generate a random secret [here](https:\u002F\u002Fgenerate-secret.vercel.app\u002F)).\n5. Replace all instances of `images.extrapolate.workers.dev` in the codebase with your Cloudflare Worker endpoint.\n\n\u003Cdetails>\n\u003Csummary>Cloudflare Worker Code\u003C\u002Fsummary>\n\n```ts\n\u002F\u002F Check requests for a pre-shared secret\nconst hasValidHeader = (request, env) => {\n  return request.headers.get(\"X-CF-Secret\") === env.AUTH_KEY_SECRET;\n};\n\nfunction authorizeRequest(request, env, key) {\n  switch (request.method) {\n    case \"PUT\":\n    case \"DELETE\":\n      return hasValidHeader(request, env);\n    case \"GET\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    const key = url.pathname.slice(1);\n\n    if (!authorizeRequest(request, env, key)) {\n      return new Response(\"Forbidden\", { status: 403 });\n    }\n\n    switch (request.method) {\n      case \"PUT\":\n        await env.MY_BUCKET.put(key, request.body);\n        return new Response(`Put ${key} successfully!`);\n      case \"GET\":\n        const object = await env.MY_BUCKET.get(key);\n\n        if (object === null) {\n          return new Response(\"Object Not Found\", { status: 404 });\n        }\n\n        const headers = new Headers();\n        object.writeHttpMetadata(headers);\n        headers.set(\"etag\", object.httpEtag);\n\n        return new Response(object.body, {\n          headers,\n        });\n      case \"DELETE\":\n        await env.MY_BUCKET.delete(key);\n        return new Response(\"Deleted!\");\n\n      default:\n        return new Response(\"Method Not Allowed\", {\n          status: 405,\n          headers: {\n            Allow: \"PUT, GET, DELETE\",\n          },\n        });\n    }\n  },\n};\n```\n\n\u003C\u002Fdetails>\n\n## Author\n\n- Steven Tey ([@steventey](https:\u002F\u002Ftwitter.com\u002Fsteventey))\n","\u003Ca href=\"https:\u002F\u002Fextrapolate.app\">\n  \u003Cimg alt=\"Extrapolate – 使用AI查看你的衰老状况\" src=\"https:\u002F\u002Fextrapolate.app\u002Fapi\u002Fog\">\n  \u003Ch1 align=\"center\">Extrapolate\u003C\u002Fh1>\n\u003C\u002Fa>\n\n\u003Cp align=\"center\">\n  使用AI查看你的衰老状况\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fsteventey\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fsteventey?style=flat&label=steventey&logo=twitter&color=0bf&logoColor=fff\" alt=\"Steven Tey Twitter粉丝数\" \u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsteven-tey\u002Fextrapolate\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fsteven-tey\u002Fextrapolate?label=steven-tey%2Fextrapolate\" alt=\"Extrapolate仓库星数\" \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#introduction\">\u003Cstrong>简介\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#features\">\u003Cstrong>功能\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#deploy-your-own\">\u003Cstrong>部署属于你自己的\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#author\">\u003Cstrong>作者\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cbr\u002F>\n\n--新README即将发布--\n\n## 简介\n\nExtrapolate是一款应用，通过人工智能技术对你的面部进行变换，帮助你了解自己的衰老情况。\n\nhttps:\u002F\u002Fuser-images.githubusercontent.com\u002F28986134\u002F213781048-d215894d-2286-4176-a200-f745b255ecbe.mp4\n\n## 功能\n\n- 一段3秒的GIF动图，展示你的面部随时间推移的衰老过程 🧓\n- 使用Workers将照片存储并检索至[Cloudflare R2](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F)\n\n## 部署属于你自己的\n\n你可以使用下方按钮将此模板部署到Vercel：\n\n[![Deploy with Vercel](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsteven-tey_extrapolate_readme_a4c0f8073a9c.png)](https:\u002F\u002Fvercel.com\u002Fnew\u002Fclone?demo-title=Extrapolate%20%E2%80%93%C2%A0See%20how%20well%20you%20age%20with%20AI&demo-description=Age%20transformation%20AI%20app%20powered%20by%20Next.js%2C%20Replicate%2C%20Upstash%2C%20and%20Cloudflare%20R2%20%2B%20Workers.&demo-url=https%3A%2F%2Fextrapolate.app%2F&demo-image=%2F%2Fimages.ctfassets.net%2Fe5382hct74si%2F4B2RUQ7DTvPgpf3Ra9jSC2%2Fda2571b055081a670ac9649d3ac0ac7a%2FCleanShot_2023-01-20_at_12.04.08.png&project-name=Extrapolate%20%E2%80%93%C2%A0See%20how%20well%20you%20age%20with%20AI&repository-name=extrapolate&repository-url=https%3A%2F%2Fgithub.com%2Fsteven-tey%2Fextrapolate&from=templates&integration-ids=oac_V3R1GIpkoJorr6fqyiwdhl17&env=REPLICATE_API_TOKEN%2CREPLICATE_WEBHOOK_TOKEN%2CCLOUDFLARE_WORKER_SECRET%2CPOSTMARK_TOKEN&envDescription=How%20to%20get%20these%20env%20variables%3A%20&envLink=https%3A%2F%2Fgithub.com%2Fsteven-tey%2Fextrapolate%2Fblob%2Fmain%2F.env.example)\n\n请注意，你需要：\n\n- 注册一个[ReplicateHQ](https:\u002F\u002Freplicate.com)账户以获取`REPLICATE_API_TOKEN`环境变量。\n- 注册一个[Upstash](https:\u002F\u002Fupstash.com)账户以获取Upstash Redis的相关环境变量。\n- 创建一个[Cloudflare R2实例](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F)，并设置一个[Cloudflare Worker](https:\u002F\u002Fworkers.cloudflare.com\u002F)来处理上传和读取操作（具体说明见下文）。\n\n### Cloudflare R2设置步骤\n\n1. 前往Cloudflare并创建一个[R2存储桶](https:\u002F\u002Fwww.cloudflare.com\u002Flp\u002Fpg-r2\u002F)。\n2. 使用下方代码片段创建一个[Cloudflare Worker]。\n3. 在**设置 > R2存储桶绑定**中将你的Worker与R2实例绑定。\n4. 为了额外的安全性，在**设置 > 环境变量**中设置一个`AUTH_KEY_SECRET`变量（你可以在此处生成随机密钥[这里](https:\u002F\u002Fgenerate-secret.vercel.app\u002F)）。\n5. 将代码库中所有出现的`images.extrapolate.workers.dev`替换为你自己的Cloudflare Worker端点。\n\n\u003Cdetails>\n\u003Csummary>Cloudflare Worker代码\u003C\u002Fsummary>\n\n```ts\n\u002F\u002F 检查请求是否包含预共享密钥\nconst hasValidHeader = (request, env) => {\n  return request.headers.get(\"X-CF-Secret\") === env.AUTH_KEY_SECRET;\n};\n\nfunction authorizeRequest(request, env, key) {\n  switch (request.method) {\n    case \"PUT\":\n    case \"DELETE\":\n      return hasValidHeader(request, env);\n    case \"GET\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    const key = url.pathname.slice(1);\n\n    if (!authorizeRequest(request, env, key)) {\n      return new Response(\"Forbidden\", { status: 403 });\n    }\n\n    switch (request.method) {\n      case \"PUT\":\n        await env.MY_BUCKET.put(key, request.body);\n        return new Response(`Put ${key} successfully!`);\n      case \"GET\":\n        const object = await env.MY_BUCKET.get(key);\n\n        if (object === null) {\n          return new Response(\"Object Not Found\", { status: 404 });\n        }\n\n        const headers = new Headers();\n        object.writeHttpMetadata(headers);\n        headers.set(\"etag\", object.httpEtag);\n\n        return new Response(object.body, {\n          headers,\n        });\n      case \"DELETE\":\n        await env.MY_BUCKET.delete(key);\n        return new Response(\"Deleted!\");\n\n      default:\n        return new Response(\"Method Not Allowed\", {\n          status: 405,\n          headers: {\n            Allow: \"PUT, GET, DELETE\",\n          },\n        });\n    }\n  },\n};\n```\n\n\u003C\u002Fdetails>\n\n## 作者\n\n- Steven Tey ([@steventey](https:\u002F\u002Ftwitter.com\u002Fsteventey))","# Extrapolate 快速上手指南\n\nExtrapolate 是一个基于 AI 的面部年龄变换应用，可生成用户随时间变老的动态 GIF 图像。本项目基于 Next.js、Replicate、Upstash Redis 和 Cloudflare R2 构建。\n\n## 环境准备\n\n在开始之前，请确保满足以下要求：\n\n- **Node.js**: 版本 18 或更高\n- **包管理器**: npm, yarn, pnpm 或 bun\n- **账号准备**:\n  - [Replicate](https:\u002F\u002Freplicate.com) 账号（用于获取 `REPLICATE_API_TOKEN`）\n  - [Upstash](https:\u002F\u002Fupstash.com) 账号（用于 Redis 数据库）\n  - [Cloudflare](https:\u002F\u002Fwww.cloudflare.com) 账号（用于 R2 存储和 Workers）\n  - [Vercel](https:\u002F\u002Fvercel.com) 账号（用于部署，可选）\n\n## 安装步骤\n\n### 1. 克隆项目仓库\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fsteven-tey\u002Fextrapolate.git\ncd extrapolate\n```\n\n### 2. 安装依赖\n\n```bash\nnpm install\n# 或者使用其他包管理器\n# yarn install\n# pnpm install\n```\n\n### 3. 配置环境变量\n\n复制示例环境变量文件并填入你的密钥：\n\n```bash\ncp .env.example .env.local\n```\n\n编辑 `.env.local` 文件，填入以下关键变量：\n\n- `REPLICATE_API_TOKEN`: 从 Replicate 控制台获取\n- `REPLICATE_WEBHOOK_TOKEN`: 自定义一个用于验证 Webhook 的令牌\n- `UPSTASH_REDIS_REST_URL` 和 `UPSTASH_REDIS_REST_TOKEN`: 从 Upstash 控制台获取\n- `CLOUDFLARE_WORKER_SECRET`: 自定义一个随机密钥（可使用 [generate-secret.vercel.app](https:\u002F\u002Fgenerate-secret.vercel.app\u002F) 生成）\n- `POSTMARK_TOKEN`: 如需邮件通知功能，从 Postmark 获取\n\n### 4. 设置 Cloudflare R2 和 Worker\n\n1. 登录 Cloudflare 控制台，创建一个 **R2 Bucket**。\n2. 创建一个新的 **Cloudflare Worker**，并将以下代码粘贴进去：\n\n```ts\n\u002F\u002F Check requests for a pre-shared secret\nconst hasValidHeader = (request, env) => {\n  return request.headers.get(\"X-CF-Secret\") === env.AUTH_KEY_SECRET;\n};\n\nfunction authorizeRequest(request, env, key) {\n  switch (request.method) {\n    case \"PUT\":\n    case \"DELETE\":\n      return hasValidHeader(request, env);\n    case \"GET\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    const key = url.pathname.slice(1);\n\n    if (!authorizeRequest(request, env, key)) {\n      return new Response(\"Forbidden\", { status: 403 });\n    }\n\n    switch (request.method) {\n      case \"PUT\":\n        await env.MY_BUCKET.put(key, request.body);\n        return new Response(`Put ${key} successfully!`);\n      case \"GET\":\n        const object = await env.MY_BUCKET.get(key);\n\n        if (object === null) {\n          return new Response(\"Object Not Found\", { status: 404 });\n        }\n\n        const headers = new Headers();\n        object.writeHttpMetadata(headers);\n        headers.set(\"etag\", object.httpEtag);\n\n        return new Response(object.body, {\n          headers,\n        });\n      case \"DELETE\":\n        await env.MY_BUCKET.delete(key);\n        return new Response(\"Deleted!\");\n\n      default:\n        return new Response(\"Method Not Allowed\", {\n          status: 405,\n          headers: {\n            Allow: \"PUT, GET, DELETE\",\n          },\n        });\n    }\n  },\n};\n```\n\n3. 在 Worker 的 **Settings > R2 Bucket Bindings** 中，将 `MY_BUCKET` 绑定到你创建的 R2 存储桶。\n4. 在 **Settings > Environment Variables** 中添加 `AUTH_KEY_SECRET`，值设为你在 `.env.local` 中配置的 `CLOUDFLARE_WORKER_SECRET`。\n5. 记录你的 Worker 访问地址（例如：`https:\u002F\u002Fyour-worker.your-subdomain.workers.dev`），并在项目代码中将所有 `images.extrapolate.workers.dev` 替换为你的实际地址。\n\n### 5. 启动开发服务器\n\n```bash\nnpm run dev\n```\n\n访问 `http:\u002F\u002Flocalhost:3000` 即可看到本地运行的应用。\n\n## 基本使用\n\n1. 打开应用页面，上传一张清晰的人脸照片。\n2. 系统会自动调用 Replicate AI 模型处理图像，生成从年轻到年老的演变过程。\n3. 几秒后，你将看到一个约 3 秒的 GIF 动图，展示面部随时间变化的效果。\n4. 生成的图片会自动存储至你配置的 Cloudflare R2 存储桶，并可通过链接分享。\n\n> 💡 提示：首次运行可能需要等待 AI 模型冷启动，后续请求会更快。\n\n---\n\n你现在已成功部署并运行 Extrapolate！如需生产环境部署，可点击 README 中的 \"Deploy with Vercel\" 按钮一键部署。","一位独立开发者想快速构建一个\"AI 年龄预测”趣味应用来吸引用户，但缺乏处理复杂视频生成和海量图片存储的后端架构经验。\n\n### 没有 extrapolate 时\n- **开发门槛极高**：需要手动整合深度学习模型、编写复杂的视频帧处理脚本，并自行搭建能支撑高并发推理的后端服务。\n- **存储成本昂贵**：传统对象存储方案在应对大量用户上传的临时照片和生成的 GIF 时，带宽和存储费用难以控制。\n- **部署流程繁琐**：从前端界面到后端推理任务队列，再到数据库状态管理，需分别配置多个服务，耗时数周才能上线 MVP（最小可行性产品）。\n- **维护压力大**：需自行监控 GPU 资源利用率、处理任务排队拥堵问题，并保障图片上传下载的低延迟体验。\n\n### 使用 extrapolate 后\n- **一键部署成型**：基于 Next.js 和 Vercel 模板，只需配置 Replicate API 密钥和 Cloudflare 环境变量，几分钟内即可拥有完整的全栈应用。\n- **低成本高性能存储**：利用 Cloudflare R2 配合 Workers 边缘计算，实现了零出口费用的图片存取，大幅降低运营成​​本。\n- **自动化工作流**：内置 Upstash Redis 队列自动管理 AI 推理任务，用户上传图片后，系统自动调用 Replicate 模型并在 3 秒内返回变老效果的 GIF。\n- **专注业务创新**：开发者无需关心底层基础设施运维，可将精力集中在优化用户体验或拓展社交分享功能上。\n\nextrapolate 将复杂的 AI 视频生成与云原生架构封装为开箱即用的解决方案，让个人开发者也能以极低代价快速落地创意型 AI 应用。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fsteven-tey_extrapolate_64866d91.png","steven-tey","Steven Tey","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fsteven-tey_c9792980.jpg","building @dubinc | prev: @vercel","@dubinc","Seattle, WA","steven@dub.co","steventey","steventey.com","https:\u002F\u002Fgithub.com\u002Fsteven-tey",[86,90,94,97],{"name":87,"color":88,"percentage":89},"TypeScript","#3178c6",90,{"name":91,"color":92,"percentage":93},"PLpgSQL","#336790",7.3,{"name":95,"color":96,"percentage":32},"CSS","#663399",{"name":98,"color":99,"percentage":100},"JavaScript","#f1e05a",0.7,694,121,"2026-04-01T17:14:58","MIT",4,"未说明","无需本地 GPU（基于 Replicate API 云端运行）",{"notes":109,"python":106,"dependencies":110},"该项目为云端部署架构，核心 AI 推理通过 Replicate API 完成，无需本地配置 GPU 或深度学习环境。部署需准备：1. Replicate 账号及 API Token；2. Upstash Redis 实例；3. Cloudflare R2 存储桶及 Worker（用于图片上传下载，需按文档配置代码和密钥）。适合直接部署至 Vercel 平台。",[111,112,113,114,115],"Next.js","Replicate API","Upstash Redis","Cloudflare R2","Cloudflare Workers",[15],[118,119,120,121,122,123],"cloudflare-r2","nextjs","replicate","upstash","vercel","cloudflare-workers",null,"2026-03-27T02:49:30.150509","2026-04-07T01:48:04.033954",[],[]]