[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81408":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":34,"discoverSource":35},81408,"pingflare","butialabs\u002Fpingflare","butialabs","Uptime monitoring and heartbeats. Runs on the Cloudflare free tier (Workers + D1) or on any Docker host (Fly.io, Railway, VPS) with SQLite.","",null,"TypeScript",38,8,35,0,2,3,6,2.86,"Other",false,"main",true,[25,26,27,28,29,30],"cloudflare","cloudflare-workers","docker","flyio","heartbeat","uptime-monitor","2026-06-12 02:04:14","# Pingflare 🔥\n\n[![Cloudflare Workers](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCloudflare-Workers-F38020?logo=cloudflare&logoColor=white)](https:\u002F\u002Fworkers.cloudflare.com\u002F)\n[![Docker](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-ready-2496ED?logo=docker&logoColor=white)](https:\u002F\u002Fhub.docker.com\u002F)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5.x-3178C6?logo=typescript&logoColor=white)](https:\u002F\u002Fwww.typescriptlang.org\u002F)\n[![SvelteKit](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSvelteKit-2.x-FF3E00?logo=svelte&logoColor=white)](https:\u002F\u002Fkit.svelte.dev\u002F)\n[![D1 Database](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCloudflare-D1-F38020?logo=cloudflare&logoColor=white)](https:\u002F\u002Fdevelopers.cloudflare.com\u002Fd1\u002F)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg)](LICENSE)\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fc33e20fd-6a82-4e57-b95a-ec06bbf701f5\n\nUptime monitoring and heartbeats. Runs on the **Cloudflare free tier** (Workers + D1) or on **any Docker host** (Fly.io, Railway, VPS) with SQLite.\n\nSends alerts through Discord, Slack, Telegram, Email, ntfy, Pushover, generic webhooks, Apprise, and Google Chat.\n\n---\n\n## Deploy\n\nTwo deployment modes are supported:\n\n| | Cloudflare Workers | Docker \u002F VPS |\n|---|---|---|\n| **Database** | Cloudflare D1 | SQLite (local file) |\n| **Cron** | Cloudflare Triggers | node-cron (built-in) |\n| **Cost** | Free tier | Depends on host |\n| **Setup** | CF dashboard or `wrangler deploy` | `docker compose up` |\n\n---\n\n## ☁️ Deploy on Cloudflare Workers\n\n> **Recommended:** Fork this repository to your own GitHub account. This gives you full control over updates, pull upstream changes whenever you want, and Cloudflare deploys automatically from your fork on every push.\n\n> **Quick start:** Use the button below to deploy instantly from the current version of this repository. Note that this won't receive future updates automatically.\n\n[![Deploy to Cloudflare](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002Fbutton)](https:\u002F\u002Fdeploy.workers.cloudflare.com\u002F?url=https:\u002F\u002Fgithub.com\u002Fbutialabs\u002Fpingflare)\n\n### 1. Create the D1 database\n\n1. Go to [dash.cloudflare.com](https:\u002F\u002Fdash.cloudflare.com) → **Storage & Database > D1 SQL Database**\n2. Click **Create database**, name it `pingflare`, and confirm\n\n### 2. Connect the database to the Worker\n\n1. Open **Workers & Pages**, click on the `pingflare` Worker\n2. Go to **Settings > Bindings > Add binding**\n3. Choose **D1 Database**, set the variable name to `DB`, and select the `pingflare` database\n\n### 3. Set the required secrets\n\nStill on **Settings > Variables**, add the following under **Secret variables**:\n\n| Variable | Required | Description |\n|---|---|---|\n| `ADMIN_USER` | Yes | Username |\n| `ADMIN_PASS` | Yes | Password |\n| `JWT_SECRET` | Yes | Secret used to sign JWT tokens, min 32 characters |\n| `ENCRYPTION_KEY` | Yes | Key used to encrypt notification credentials at rest. Min 32 characters. |\n\n### 4. Redeploy\n\nClick **Deployments > Retry deploy** (or push any commit). On the first request, the Worker automatically creates all database tables.\n\nYour dashboard will be live at `https:\u002F\u002Fpingflare.\u003Cyour-subdomain>.workers.dev`.\n\n---\n\n## 🐳 Deploy with Docker\n\n```bash\ncurl -O https:\u002F\u002Fraw.githubusercontent.com\u002Fbutialabs\u002Fpingflare\u002Fmain\u002Fcompose.yml\n\n# Edit the file and fill in ADMIN_USER, ADMIN_PASS, JWT_SECRET, ENCRYPTION_KEY\n\ndocker compose up -d\n```\n\nOpen `http:\u002F\u002Flocalhost:3000`.\n\n### Environment variables\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n| `ADMIN_USER` | Yes | — | Dashboard username |\n| `ADMIN_PASS` | Yes | — | Dashboard password |\n| `JWT_SECRET` | Yes | — | JWT signing key, min 32 chars |\n| `ENCRYPTION_KEY` | Yes | — | AES-GCM key for notification credentials, min 32 chars |\n\n> Mount a volume at `\u002Fdata` to persist the database\n\n---\n\n## ✈️ Deploy on Fly.io\n\n```bash\nfly launch --name pingflare\nfly volumes create pingflare_data --size 1 --region iad\n\nfly secrets set \\\n  ADMIN_USER=admin \\\n  ADMIN_PASS=yourpassword \\\n  JWT_SECRET=your-jwt-secret-min-32-chars \\\n  ENCRYPTION_KEY=your-enc-key-min-32-chars\n\nfly deploy\n```\n\n---\n\n## Docs\n\n- [LOCAL_DEVELOPMENT.md](docs\u002FLOCAL_DEVELOPMENT.md)\n- [LOCALES.md](docs\u002FLOCALES.md)\n- [API.md](docs\u002FAPI.md)\n\n---\n\n## Cloudflare Free Tier Limits\n\nWhen running on Cloudflare Workers, Pingflare is designed to stay within free tier limits:\n\n- Workers: 100,000 requests per day\n- D1: 100,000 write rows per day, 5 million read rows per day\n- Cron Triggers: minimum 1-minute interval\n\nWith the default 90-day log retention and automatic cleanup on each cron run, write usage stays bounded proportional to the number of active monitors.\n\n> When running in Docker mode, there are no such limits — SQLite has no row quotas and the cron runs on the same Node.js process.\n","Pingflare 是一个用于网站或服务在线状态监控和心跳检测的工具。它利用 Cloudflare 的免费层级（Workers + D1）或者任何支持 Docker 的主机（如 Fly.io, Railway, VPS）搭配 SQLite 数据库运行，提供了一个轻量且灵活的部署选项。该工具支持通过多种渠道发送告警信息，包括 Discord、Slack、Telegram、电子邮件等。适用于需要实时监控其应用可用性并希望在出现故障时立即收到通知的小型企业或个人开发者。使用 TypeScript 编写，确保了代码的质量与可维护性。","2026-06-11 04:04:56","CREATED_QUERY"]