A temporary free proxy list website built with Hoa framework, deployed on Cloudflare Workers.
- π Searchable - Filter proxies by protocol, anonymity and country
- π Tabular View - Clean table of proxies with IP, port, HTTPS, anonymity, country and city
- β‘ One-click Speed Test - Test all listed proxies in one click via
catchproxy.com/geo - β° Auto Sync - Proxy list is refreshed every 10 minutes from proxifly/free-proxy-list via Cloudflare Cron
- ποΈ Cloudflare D1 - Proxies stored in D1 (SQLite), accessed via Drizzle ORM
- π¨ Minimal UI - Alpine.js + plain CSS, white background, no framework bloat
- π Edge Powered - Hosted on Cloudflare Workers for low-latency global access
Live Demo:
- Hoa - Lightweight web framework
- @hoajs/tiny-router - Router middleware
- Drizzle ORM + Drizzle Kit - Schema + migrations
- Alpine.js - Frontend reactivity
- Cloudflare Workers - Edge computing platform
- Cloudflare D1 - SQLite at the edge
- Cloudflare Cron Triggers - Scheduled proxy sync
- Node.js >= 20
- Cloudflare account
npm install- Rename the configuration template:
mv wrangler.example.jsonc wrangler.jsonc- Create a D1 database:
npx wrangler d1 create tempproxy- Edit
wrangler.jsoncand fill in your configuration:
Generate SQL from the Drizzle schema (db/schema/ProxyList.js) and apply it to D1:
# Local D1 (miniflare)
npm run sql:migrate:local
# Remote D1
npm run sql:migratesql:migrate runs drizzle-kit generate and then wrangler d1 migrations apply.
npm run devOpen http://localhost:8787 in your browser.
npm run deployGET /- Search page (HTML)GET /search?protocol=&anonymity=&country=&page=- Query proxiesprotocol:http|socks5anonymity:transparent|elite|anonymouscountry: ISO 3166-1 alpha-2 code (e.g.US,CN)page: 1-based, 100 per page
POST /geo- Proxy pass-through tohttps://catchproxy.com/geo(bypasses browser CORS for speed tests)
A Cron trigger (*/10 * * * *) runs scheduled/syncProxies.js, which:
- Fetches the latest list from proxifly/free-proxy-list
- Keeps only
httpandsocks5proxies, dedupes, normalizes fields - Clears
proxy_listand bulk-inserts the new rows (chunked to stay under D1's parameter limit)
MIT
{ "account_id": "your-account-id", // Your Cloudflare Account ID "name": "tempproxy", "main": "tempproxy.js", "compatibility_date": "2025-04-27", "no_bundle": false, "minify": true, "rules": [ { "type": "Text", "globs": ["**/tempproxy.html"] } ], "routes": [ { "pattern": "your-domain.com/*", // Your domain "zone_name": "your-domain.com" } ], "triggers": { "crons": ["*/10 * * * *"] }, "d1_databases": [ { "binding": "DB", "database_name": "tempproxy", "database_id": "your-d1-database-id", // From `wrangler d1 create` "migrations_dir": "migrations" } ] }