Source & license
Upstream license: Apache-2.0
License TL;DR
You can use, change and sell it, including in closed-source products. When sharing copies, include the license, keep required notices and mark changed files. It includes a contributor patent grant with conditions, but no trademark permission or warranty.
Explain Apache 2.0 in plain English →Summary of the main license. Separate packages and assets can have different terms.
Inspect repository ↗Read this project’s actual license ↗Repository owner
See the upstream repository for the original creator and contributors.
Maintain this project? Maintainer verification →Cloudflare hosting
Free tier eligible within limits
The documented roim-picx deployment can use Cloudflare Free allowances for a small workload under the request, CPU and service-specific quotas below. This is conditional eligibility, not a measured zero-cost deployment; optional features, domains and external providers can add costs.
Hosting requirements
- Workers Free allows 100,000 requests per day shared across the account and 10 ms CPU per invocation; measure CPU-heavy authentication, parsing and rendering before assuming it fits.
- Pages static requests are free; Pages Functions count against the same Workers account request/CPU allowances.
- Keep aggregate D1 use below 5 million rows read/day, 100,000 rows written/day and 5 GB total storage; a request can touch many rows.
- Keep KV below 100,000 reads/day, 1,000 writes, deletes and list operations/day each, and 1 GB; cache refreshes and backups consume writes.
- Use R2 Standard storage, at most 10 GB-month, 1 million Class A operations and 10 million Class B operations/month; provision an eligible billing-enabled R2 account.
- Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations.
Sources checked 01/10/2026
Repository snapshot: 98408a3. Hosting eligibility reflects the deployment documentation and listed assumptions.
- imgur ↗
<p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p>
- cloudinary ↗
<p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p>
- workers ↗
r">roim-picx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√]
- pages ↗
cx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询
- d1 ↗
> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询 - [√]
- kv ↗
写| E[(R2 对象存储)] D -->|持久化| H[(D1 数据库)] D -->|会话管理| F[(KV 键值存储)] end subgraph 第三方服务 D -->|OAuth 认证| G[GitHub API] end ``` ### 前端技术栈 | 技术 | 版本 | 说明 | |:---|:---:|:---| | **Vue 3** | ^3.5 | 渐进式 JavaScript 框架,使用 Composition API | | **Vue Router** | ^4.6 | 官方路由管理器 | | **Element Plus** | ^2.13 | 基于 Vue 3 的组件库 | | **Tailwind CSS** | ^4.1 | 原子化 CSS 框架 | | **Vite** | ^7.3 | 下一代前端构建工具 | | **TypeScript** | ^5.9 | JavaScript 超集,提供类型安全 | | **Font Awesome** | ^7.1 | 图标库 | | **Axios** | ^1.13 | HTTP 客户端 | ### 后端技术栈 | 技术 | 说明 | |:---|:---| | **Cloudflare Pages** | 静态网站托管平台,支持全球 CDN 加速 | | **Pages Functions** | 基于 Cloudflare Workers 的 Serverless 函数 | | **Hono** | 轻量级、高性能的 Web 框架,运行在
- r2 ↗
-picx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表
- free-tier-eligible ↗
r">roim-picx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√]
- free-tier-eligible ↗
cx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询
- free-tier-eligible ↗
> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询 - [√]
- free-tier-eligible ↗
up>1, 2, 3, 4</sup> | Duration | CPU time | | --- | --- | --- | --- | | **Free** | 100,000 per day | No charge for duration | 10 milliseconds of CPU time per invocation | | **Standard** | 10 million included per month <br> +$0.30 per additional million | No charge or limit for duration | 30 million CPU milliseconds included per month<br> +$0.02 per additional million CPU milliseconds<br><br> Max of [5 minutes of CPU time](https://developers.cloudflare.com/workers/platform/limits/#account-plan-limits) per invocation (default: 30 seconds)<br> Max of 15 minutes of CPU time per [Cron Trigger](https://developers.cloudflare.com/workers/configuration/cron-triggers/) or [Queue Consumer](https://developers.cloudflare.co
- free-tier-eligible ↗
outes) to learn more about when Functions are invoked. ## Free Plan Requests to your Pages Functions count towards your quota for the Workers Free plan. For example, you could use 50,000 Functions requests and 50,000 Workers requests to use your full 100,000 daily request usage. The free plan daily request limit resets at midnight UTC. Was this helpful? YesNo ## On this page [Docs](https://developers.cloudflare.com/) ```json {"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/pages/functions/pricing/#page","headline":"Pricing","description":"Pages Functions requests are billed as Cloudflare Workers
- free-tier-eligible ↗
oudflare.com/workers/platform/pricing/#workers) | | --- | --- | --- | | Rows read | 5 million / day | First 25 billion / month included + $0.001 / million rows | | Rows written | 100,000 / day | First 50 million / month included + $1.00 / million rows | | Storage (per GB stored) | 5 GB (total) | First 5 GB included + $0.75 / GB-mo | Track your D1 usage To accurately track your usage, use the [meta object](https://developers.cloudflare.com/d1/worker-api/return-object/), [GraphQL Analytics API](https://developers.cloudflare.com/d1/observability/metrics-analytics/#query-via-the-graphql-api), or the [Cloudflare dashboard ↗︎](https://dash.cloudflare.com/?to=/:account/workers/d1/). Select your D1 database, then vie
- free-tier-eligible ↗
cing/). | | Free plan<sup>1</sup> | Paid plan | | --- | --- | --- | | Keys read | 100,000 / day | 10 million/month, + $0.50/million | | Keys written | 1,000 / day | 1 million/month, + $5.00/million | | Keys deleted | 1,000 / day | 1 million/month, + $5.00/million | | List requests | 1,000 / day | 1 million/month, + $5.00/million | | Stored data | 1 GB | 1 GB, + $0.50/ GB-month | <sup>1</sup> The Workers Free plan includes limited Workers KV usage. All limits reset daily at 00:00 UTC. If you exceed any one of these limits, further operations of that type will fail with an error. Note Workers KV pricing for read, write and delete operations is on a per-key basis. Bulk read operations are billed by the amount
- free-tier-eligible ↗
infrequent access storage) for 1.1 GB, you will be billed for 2 GB. ### Free tier You can use the following amount of storage and operations each month for free. | | Free | | --- | --- | | Storage | 10 GB-month / month | | Class A Operations | 1 million requests / month | | Class B Operations | 10 million requests / month | | Egress (data transfer to Internet) | Free <sup>[1](#user-content-fn-1)</sup> | Caution The free tier only applies to Standard storage, and does not apply to Infrequent Access storage. ### Storage usage Storage is billed using gigabyte-month (GB-month) as the billing metric. A GB-month is calculated by averaging the *peak* storage per day over a billing period (30 days). For examp
- Apache-2.0 ↗
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to ca
- architecture ↗
r">roim-picx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√]
- architecture ↗
cx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询
- architecture ↗
> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表查询 - [√]
- architecture ↗
写| E[(R2 对象存储)] D -->|持久化| H[(D1 数据库)] D -->|会话管理| F[(KV 键值存储)] end subgraph 第三方服务 D -->|OAuth 认证| G[GitHub API] end ``` ### 前端技术栈 | 技术 | 版本 | 说明 | |:---|:---:|:---| | **Vue 3** | ^3.5 | 渐进式 JavaScript 框架,使用 Composition API | | **Vue Router** | ^4.6 | 官方路由管理器 | | **Element Plus** | ^2.13 | 基于 Vue 3 的组件库 | | **Tailwind CSS** | ^4.1 | 原子化 CSS 框架 | | **Vite** | ^7.3 | 下一代前端构建工具 | | **TypeScript** | ^5.9 | JavaScript 超集,提供类型安全 | | **Font Awesome** | ^7.1 | 图标库 | | **Axios** | ^1.13 | HTTP 客户端 | ### 后端技术栈 | 技术 | 说明 | |:---|:---| | **Cloudflare Pages** | 静态网站托管平台,支持全球 CDN 加速 | | **Pages Functions** | 基于 Cloudflare Workers 的 Serverless 函数 | | **Hono** | 轻量级、高性能的 Web 框架,运行在
- architecture ↗
-picx</h1> <p align="center"> <strong>🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用</strong> </p> <p align="center"> <a href="https://roim.page">🌐 在线预览</a> • <a href="#-功能特性">✨ 功能特性</a> • <a href="#-部署教程">🚀 部署教程</a> • <a href="#-界面截图">📸 界面截图</a> </p> --- ## 📢 预览说明 > [!WARNING] > 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。 > **请勿将预览图床地址用于生产环境**,数据会定期清理。 **预览 Token:** `4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf` --- ## 💡 为什么选择 roim-picx? | 特性 | 说明 | |:---:|:---| | 💾 **免费存储** | 10GB 的免费存储空间 | | 🚀 **高速访问** | 每月 300W 次不计流量的图片访问(每天 10W 次限制) | | 📤 **上传无忧** | 每月 100W 次的图片上传次数 | | 🆓 **零成本部署** | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 | | 🔒 **数据安全** | 独立部署,无需担心第三方删除数据 | --- ## ✨ 功能特性 - [√] 📦 图片批量上传 - [√] 📋 图片列表
Upstream screenshot · roimdev/roim-picx repository contributors ↗. Depicts the upstream project. We have not deployed and tested a fresh installation here.
What it can replace
Compare the workflow you need. These mappings describe overlap; full feature parity requires a separate comparison.
Image upload, albums, library management and serving share links; Imgur community features and full Cloudinary transformation/DAM capabilities are excluded.
See supporting source ↗Image upload, albums, library management and serving share links; Imgur community features and full Cloudinary transformation/DAM capabilities are excluded.
See supporting source ↗How it works
The shape of roim-picx on Cloudflare, and how it stacks up against the rented tools it replaces.
Architecture
Diagram based on the linked repository documentation. See the sources and hosting assumptions above.
View upstream source ↗Configuration and workflow sources
Reviewed commit 98408a3b6bcf. Files were read as data; upstream applications and CI jobs were not executed.
Deployment configuration · 0 files
No Wrangler file found in the collected snapshot. The documented architecture above needs separate deployment verification.
Named environments are separate deployments. Bindings are shown only where declared. Configured routes are URL patterns, not verified application endpoints.
Runtime source · handlers, binding usage and workflow steps
Observed TypeScript/JavaScript declarations from Worker entrypoints and resolved relative imports. Calls and workflow steps may run conditionally; their listed order is not a proven end-to-end request flow. Router declarations may be mounted under a prefix or may not be registered. This shows code wiring, not a successful deployment or runtime test. Dynamic wiring, aliases and generated code may not resolve.
No direct runtime declarations resolved from this snapshot. Generated framework bundles or dynamic entrypoints need manual tracing.
Build and deployment pipeline · 0 GitHub Actions workflows
Repository CI declarations, separate from runtime request processing. Job dependencies and conditions are shown as written; long commands are shortened with an ellipsis; a workflow file does not prove a recent successful run.
No GitHub Actions workflow was found in the collected tree. Deployment may be manual or configured elsewhere.
build: vite build
Repository README
View original on GitHub ↗Full upstream document by @roimdev · README.md · snapshot 98408a3
roim-picx
🖼️ 一款基于 Cloudflare 的 Worker、R2、Pages、D1 实现的免费图床应用
🌐 在线预览 • ✨ 功能特性 • 🚀 部署教程 • 📸 界面截图
📢 预览说明
[!WARNING] 在线预览地址仅作演示使用,每天有使用限额,请勿大量上传图片。
请勿将预览图床地址用于生产环境,数据会定期清理。
预览 Token: 4xVSYkCKw2ExbPNEaMPjCnaaOowU9sTf
💡 为什么选择 roim-picx?
| 特性 | 说明 |
|---|---|
| 💾 免费存储 | 10GB 的免费存储空间 |
| 🚀 高速访问 | 每月 300W 次不计流量的图片访问(每天 10W 次限制) |
| 📤 上传无忧 | 每月 100W 次的图片上传次数 |
| 🆓 零成本部署 | 无需购买服务器,克隆代码后部署 Cloudflare 即可使用 |
| 🔒 数据安全 | 独立部署,无需担心第三方删除数据 |
✨ 功能特性
- [√] 📦 图片批量上传
- [√] 📋 图片列表查询
- [√] 🗑️ 图片删除
- [√] 📁 目录创建
- [√] 🔍 按目录查询
- [√] 📎 链接地址点击复制
- [√] 🔐 简单的身份认证功能
- [√] 🔗 提供删除图片的访问链接
- [√] 📂 上传图片时支持选择目录
- [√] 📄 管理页面支持分页加载
- [√] ✏️ 图片重命名
- [√] 🔑 多平台登录授权[Github/Google/Steam]
- [√] ⏰ 文件过期自动删除
- [√] 🔎 文件前缀搜索
- [√] 👤 上传图片关联登录用户信息
- [√] 📊 访问统计与热度分析
- [√] 💾 D1 数据库持久化存储元数据
- [√] 🔄 历史 R2 数据一键同步到 D1
- [√] 📱 移动端自适应优化
- [√] 🖼️ 相册管理 (创建、编辑、公开/加密分享)
- [√] 📤 进阶上传 (保留原名、自定义过期时间)
- [√] 👀 我的分享管理 (查看状态、复制链接、删除)
- [√] 支持NSFW内容检测
- [√] Hugging Face 存储
- [√] 支持添加文本水印
🏗️ 技术架构
架构概览
graph TB
subgraph 用户端
A[浏览器] -->|HTTPS| B[Cloudflare CDN]
end
subgraph Cloudflare 基础设施
B --> C[Pages 静态托管]
B --> D[Pages Functions]
D -->|读写| E[(R2 对象存储)]
D -->|持久化| H[(D1 数据库)]
D -->|会话管理| F[(KV 键值存储)]
end
subgraph 第三方服务
D -->|OAuth 认证| G[GitHub API]
end
前端技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| Vue 3 | ^3.5 | 渐进式 JavaScript 框架,使用 Composition API |
| Vue Router | ^4.6 | 官方路由管理器 |
| Element Plus | ^2.13 | 基于 Vue 3 的组件库 |
| Tailwind CSS | ^4.1 | 原子化 CSS 框架 |
| Vite | ^7.3 | 下一代前端构建工具 |
| TypeScript | ^5.9 | JavaScript 超集,提供类型安全 |
| Font Awesome | ^7.1 | 图标库 |
| Axios | ^1.13 | HTTP 客户端 |
后端技术栈
| 技术 | 说明 |
|---|---|
| Cloudflare Pages | 静态网站托管平台,支持全球 CDN 加速 |
| Pages Functions | 基于 Cloudflare Workers 的 Serverless 函数 |
| Hono | 轻量级、高性能的 Web 框架,运行在 Edge Runtime |
| R2 | S3 兼容的对象存储服务,用于存储图片文件 |
| D1 | Cloudflare 的原生 SQL 数据库,用于存储结构化元数据和统计信息 |
| KV | 分布式键值存储,用于会话管理和元数据存储 |
项目结构
roim-picx/
├── 📁 src/ # 前端源码
│ ├── 📁 components/ # Vue 组件
│ ├── 📁 views/ # 页面视图
│ ├── 📁 utils/ # 工具函数
│ ├── 📁 plugins/ # 插件配置
│ └── 📄 App.vue # 根组件
├── 📁 functions/ # Cloudflare Pages Functions
│ └── 📁 rest/ # RESTful API 路由
│ └── 📄 [[route]].ts # 动态路由处理
├── 📁 public/ # 静态资源
├── 📁 docs/ # 文档资源
├── 📁 migrations/ # D1 数据库迁移文件
├── 📄 package.json # 项目依赖配置
├── 📄 vite.config.ts # Vite 构建配置
├── 📄 tailwind.config.js # Tailwind CSS 配置
└── 📄 tsconfig.json # TypeScript 配置
数据流程
sequenceDiagram
participant U as 用户
participant F as 前端 (Vue)
participant A as API (Hono)
participant R as R2 存储
participant D as D1 数据库
participant K as KV 存储
U->>F: 选择图片上传
F->>A: POST /rest/upload
A->>K: 验证 Token/Session
K-->>A: 验证结果
A->>R: 存储图片文件
R-->>A: 返回存储路径
A->>D: 存储图片元数据
A-->>F: 返回图片 URL
F-->>U: 显示上传结果
🚀 部署教程
1️⃣ Fork 项目
将本项目 Fork 到自己的 GitHub 账户
2️⃣ 注册 Cloudflare 并开通 R2 服务

3️⃣ 创建 Pages 项目
找到 Pages 选项并创建项目

4️⃣ 链接代码仓库
连接 GitHub 或 GitLab 并选择需要构建的项目

5️⃣ 设置环境变量

6️⃣ 绑定 R2 和 KV 服务
在项目创建后,设置项目的函数信息绑定 R2 和 KV 服务

7️⃣ 构建项目
构建项目,提示成功即可访问

[!NOTE] Pages 的函数变量名称需要与项目的变量名称一致。
如需修改 functions 里面的 Env 命名空间,对应的文件是[[route]].ts
8️⃣ 数据库迁移
在本地环境执行以下命令将初始表结构导入到 D1:
npx wrangler d1 execute <YOUR_DATABASE_NAME> --remote --file=./migrations/0001_init.sql
首次升级可以使用命令进行数据库初始化
```bash
wrangler d1 migrations apply <YOUR_DATABASE_NAME> --remote
在部署 Cloudflare Pages 时,需要在 Settings -> Variables and Secrets 中配置以下环境变量:
核心配置
| 变量名 | 必填 | 示例值 | 说明 |
|---|---|---|---|
BASE_URL |
是 | https://picx.your-domain.com |
应用的根域名地址,用于生成完整链接 |
PICX_AUTH_TOKEN |
是 | your-secret-token |
管理员 Token,用于管理接口认证 |
ALLOW_TOKEN_LOGIN |
否 | true |
是否允许使用管理 Token 直接登录后台 |
STORAGE_TYPE |
否 | R2 |
默认存储类型,可选 R2 或 HF (Hugging Face) |
GitHub OAuth 登录(可选)
| 变量名 | 必填 | 说明 |
|---|---|---|
GITHUB_CLIENT_ID |
是 | GitHub OAuth App 的 Client ID |
GITHUB_CLIENT_SECRET |
是 | GitHub OAuth App 的 Client Secret |
VITE_GITHUB_CLIENT_ID |
是 | 同 GITHUB_CLIENT_ID,用于前端调用 |
GITHUB_OWNER |
是 | 允许登录的 GitHub 用户名,* 表示允许所有人 |
ADMIN_USERS |
否 | 超级管理员用户名列表,逗号分隔 (例: user1,user2) |
Google & Steam 登录(可选)
| 变量名 | 必填 | 说明 |
|---|---|---|
STEAM_LOGIN_ENABLED |
否 | 是否启用 Steam 登录 (true/false) |
STEAM_API_KEY |
否 | Steam Web API Key |
GOOGLE_LOGIN_ENABLED |
否 | 是否启用 Google 登录 (true/false) |
GOOGLE_CLIENT_ID |
否 | Google OAuth Client ID |
GOOGLE_CLIENT_SECRET |
否 | Google OAuth Client Secret |
Hugging Face 存储 (可选)
| 变量名 | 必填 | 说明 |
|---|---|---|
HF_TOKEN |
否 | Hugging Face Access Token (需要有写权限) |
HF_REPO |
否 | Hugging Face 数据集仓库名 (例: username/dataset) |
🔄 历史数据同步
如果你之前已经有一些图片存储在 R2 中但还没同步到 D1 数据库,可以使用内置的同步 API:
- 获取你的管理员 Token (
PICX_AUTH_TOKEN)。 - 调用同步接口:
curl -X POST -H "Authorization: <YOUR_ADMIN_TOKEN>" \ -H "Content-Type: application/json" \ -d '{"limit": 100}' \ "https://your-domain.com/rest/admin/sync-r2-to-d1" - 如果返回数据中
hasMore为true,请将返回的nextCursor放入下一次调用的cursor参数中:curl -X POST -H "Authorization: <YOUR_ADMIN_TOKEN>" \ -H "Content-Type: application/json" \ -d '{"limit": 100, "cursor": "YOUR_NEXT_CURSOR_HERE"}' \ "https://your-domain.com/rest/admin/sync-r2-to-d1"
📸 界面截图
![]() 🔐 登录页面 |
![]() 📋 管理页面 |
![]() 📤 上传页面 |
![]() 📂 选择上传 |
![]() ✅ 上传结果 |
![]() 🗑️ 删除页面 |
![]() 图片分享1 |
![]() 图片分享 |
![]() 系统管理 |
![]() 相册管理 |
🔑 GitHub 登录配置
步骤说明
注册 GitHub 应用
前往 GitHub Developer Settings 注册一个新的 GitHub 应用设置回调地址
https://your-domain.com/auth获取客户端凭证
在应用中获取客户端 ID 和客户端密钥
配置截图
![]() 找到设置 |
![]() 进入开发者设置 |
![]() 创建应用 |
![]() 填写应用信息 |
![]() 设置密钥 |
![]() 获取密钥 |
🙏 致谢
本项目参考了以下优秀开源项目:
- cfworker-kv-image-hosting - Cloudflare Worker KV 图床实现
- HikariSearch - 图片搜索引擎
Made with ❤️ by roimdev
Frequently asked about roim-picx
What is roim-picx?+
roim-picx is a self-hosted Cloudinary/Imgur alternative built on the Cloudflare developer platform. Host an image library and share links using Cloudflare Pages, R2, D1 and KV.
What does roim-picx replace?+
roim-picx is listed as an alternative to Cloudinary, Imgur. Compare the features and tradeoffs before migrating.
What Cloudflare primitives does roim-picx use?+
roim-picx is built on D1, KV, Pages, R2, Workers.
How much does roim-picx cost to run?+
The documented roim-picx deployment can use Cloudflare Free allowances for a small workload under the request, CPU and service-specific quotas below. This is conditional eligibility, not a measured zero-cost deployment; optional features, domains and external providers can add costs. Workers Free allows 100,000 requests per day shared across the account and 10 ms CPU per invocation; measure CPU-heavy authentication, parsing and rendering before assuming it fits. Pages static requests are free; Pages Functions count against the same Workers account request/CPU allowances. Keep aggregate D1 use below 5 million rows read/day, 100,000 rows written/day and 5 GB total storage; a request can touch many rows. Keep KV below 100,000 reads/day, 1,000 writes, deletes and list operations/day each, and 1 GB; cache refreshes and backups consume writes. Use R2 Standard storage, at most 10 GB-month, 1 million Class A operations and 10 million Class B operations/month; provision an eligible billing-enabled R2 account. Use a small personal or team workload; domain registration and optional third-party providers are separate costs. Provision your own IDs, secrets and migrations. Check current Cloudflare pricing before deploying.
Is roim-picx open source?+
The upstream repository declares the Apache-2.0 license. Read its terms at https://raw.githubusercontent.com/roimdev/roim-picx/98408a3b6bcfe9ec8daa589ab2fb3056fdedb9ab/LICENSE. Source code and contributor credit are available at https://github.com/roimdev/roim-picx.



















Discussion · 0
sign in to comment →