Skip to content

Latest commit

 

History

History

README.md

Temp Proxy

A temporary free proxy list website built with Hoa framework, deployed on Cloudflare Workers.

Features

  • πŸ”Ž 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:

⚠️ Notice: Free proxies are unreliable by nature. Do not route sensitive traffic (credentials, API keys, payments, etc.) through them.

Tech Stack

  • 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

Getting Started

Prerequisites

  • Node.js >= 20
  • Cloudflare account

Install Dependencies

npm install

Configuration

  1. Rename the configuration template:
mv wrangler.example.jsonc wrangler.jsonc
  1. Create a D1 database:
npx wrangler d1 create tempproxy
  1. Edit wrangler.jsonc and fill in your configuration:
{
  "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"
    }
  ]
}

Database Migrations

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:migrate

sql:migrate runs drizzle-kit generate and then wrangler d1 migrations apply.

Local Development

npm run dev

Open http://localhost:8787 in your browser.

Deploy

npm run deploy

Routes

  • GET / - Search page (HTML)
  • GET /search?protocol=&anonymity=&country=&page= - Query proxies
    • protocol: http | socks5
    • anonymity: transparent | elite | anonymous
    • country: ISO 3166-1 alpha-2 code (e.g. US, CN)
    • page: 1-based, 100 per page
  • POST /geo - Proxy pass-through to https://catchproxy.com/geo (bypasses browser CORS for speed tests)

Scheduled Job

A Cron trigger (*/10 * * * *) runs scheduled/syncProxies.js, which:

  1. Fetches the latest list from proxifly/free-proxy-list
  2. Keeps only http and socks5 proxies, dedupes, normalizes fields
  3. Clears proxy_list and bulk-inserts the new rows (chunked to stay under D1's parameter limit)

License

MIT