Fmovies Proxy List

Note: The status checker uses a public CORS proxy (cors-anywhere). For production use, you may want to replace it with your own backend endpoint. The list can be easily extended by editing the proxyDatabase array.


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
    <title>Fmovies Proxy List | Updated Working Mirrors</title>
    <style>
        * 
            margin: 0;
            padding: 0;
            box-sizing: border-box;
    body 
        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        background: #0a0f1e;
        color: #eef2ff;
        padding: 20px;
        line-height: 1.5;
.container 
        max-width: 1300px;
        margin: 0 auto;
/* Header */
    .header 
        text-align: center;
        margin-bottom: 30px;
        padding: 20px;
        background: linear-gradient(135deg, #1a1f2e, #0f1422);
        border-radius: 28px;
        box-shadow: 0 8px 20px rgba(0,0,0,0.3);
.header h1 
        font-size: 2rem;
        background: linear-gradient(135deg, #f5b042, #ff6b6b);
        -webkit-background-clip: text;
        background-clip: text;
        color: transparent;
        margin-bottom: 8px;
.header p 
        color: #9aa4bf;
        font-size: 0.95rem;
.last-updated 
        font-size: 0.8rem;
        margin-top: 12px;
        background: #1e2438;
        display: inline-block;
        padding: 6px 14px;
        border-radius: 40px;
/* Controls */
    .controls 
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
        align-items: center;
        gap: 15px;
        margin-bottom: 28px;
        background: #111624;
        padding: 15px 20px;
        border-radius: 24px;
.search-box 
        flex: 2;
        min-width: 200px;
.search-box input 
        width: 100%;
        padding: 12px 18px;
        border-radius: 40px;
        border: none;
        background: #1e253e;
        color: white;
        font-size: 1rem;
        outline: none;
        transition: 0.2s;
.search-box input:focus 
        background: #2a324f;
        box-shadow: 0 0 0 2px #f5b042;
.status-filter 
        display: flex;
        gap: 12px;
        flex-wrap: wrap;
.filter-btn 
        background: #1e253e;
        border: none;
        padding: 8px 18px;
        border-radius: 40px;
        color: #ccd6f0;
        cursor: pointer;
        font-weight: 500;
        transition: 0.2s;
.filter-btn.active 
        background: #f5b042;
        color: #0a0f1e;
.refresh-btn 
        background: #2d374b;
        border: none;
        padding: 8px 20px;
        border-radius: 40px;
        color: white;
        cursor: pointer;
        font-weight: bold;
        display: flex;
        align-items: center;
        gap: 8px;
.refresh-btn:hover 
        background: #f5b042;
        color: #0a0f1e;
/* Proxy Table/Cards */
    .proxy-grid 
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
        gap: 20px;
.proxy-card 
        background: #111624;
        border-radius: 24px;
        padding: 20px;
        transition: transform 0.2s, box-shadow 0.2s;
        border: 1px solid #262e44;
.proxy-card:hover 
        transform: translateY(-4px);
        box-shadow: 0 12px 24px rgba(0,0,0,0.4);
        border-color: #f5b04270;
.proxy-name 
        font-size: 1.4rem;
        font-weight: bold;
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 12px;
.status-badge 
        font-size: 0.7rem;
        padding: 4px 10px;
        border-radius: 30px;
        font-weight: normal;
.status-online 
        background: #10b981;
        color: white;
.status-offline 
        background: #ef4444;
        color: white;
.status-checking 
        background: #f59e0b;
        color: #1e1e2a;
.proxy-url 
        font-family: monospace;
        font-size: 0.85rem;
        background: #0b0f18;
        padding: 8px 10px;
        border-radius: 14px;
        word-break: break-all;
        margin: 12px 0;
        color: #b9c3e9;
.proxy-meta 
        display: flex;
        gap: 12px;
        font-size: 0.75rem;
        color: #8f9bb3;
        margin-bottom: 16px;
.card-buttons 
        display: flex;
        gap: 12px;
        margin-top: 8px;
.btn 
        flex: 1;
        text-align: center;
        padding: 8px 12px;
        border-radius: 40px;
        text-decoration: none;
        font-weight: 600;
        font-size: 0.85rem;
        transition: 0.2s;
        cursor: pointer;
        border: none;
.btn-visit 
        background: #f5b042;
        color: #0a0f1e;
.btn-visit:hover 
        background: #ff9f2c;
.btn-copy 
        background: #2d374b;
        color: white;
.btn-copy:hover 
        background: #3e4a66;
.footer-note 
        text-align: center;
        margin-top: 40px;
        font-size: 0.75rem;
        color: #6a7390;
        border-top: 1px solid #1e2438;
        padding-top: 24px;
@media (max-width: 700px) 
        body 
            padding: 12px;
.proxy-name 
            font-size: 1.2rem;
.loader-small 
        display: inline-block;
        width: 14px;
        height: 14px;
        border: 2px solid rgba(255,255,255,0.3);
        border-radius: 50%;
        border-top-color: white;
        animation: spin 0.8s linear infinite;
@keyframes spin 
        to  transform: rotate(360deg);
</style>

</head> <body>

<div class="container"> <div class="header"> <h1>🎬 Fmovies Proxy List</h1> <p>Working mirrors & proxies β€” updated and checked regularly</p> <div class="last-updated" id="lastUpdatedDisplay">Last check: --</div> </div> Fmovies Proxy List

<div class="controls">
    <div class="search-box">
        <input type="text" id="searchInput" placeholder="πŸ” Search proxy name or URL...">
    </div>
    <div class="status-filter">
        <button class="filter-btn active" data-filter="all">All</button>
        <button class="filter-btn" data-filter="online">Online</button>
        <button class="filter-btn" data-filter="offline">Offline</button>
    </div>
    <button class="refresh-btn" id="refreshBtn">πŸ”„ Check Status</button>
</div>
<div id="proxyContainer" class="proxy-grid">
    <!-- Cards will be injected here -->
    <div style="text-align: center; grid-column: 1/-1; padding: 40px;">Loading proxies...</div>
</div>
<div class="footer-note">
    ⚠️ Proxies are third-party services. Status may change. Always use at your own discretion.
</div>

</div>

<script> // ---------- PROXY DATABASE (predefined + editable) ---------- const proxyDatabase = [ id: 1, name: "Fmovies Mirror 1", url: "https://fmovies24.to", region: "EU", status: "unknown" , id: 2, name: "Fmovies Proxy (MX)", url: "https://fmoviesz.to", region: "NA", status: "unknown" , id: 3, name: "FMovie Hub", url: "https://fmovies.se", region: "Global", status: "unknown" , id: 4, name: "Fmovies Fast", url: "https://fmovie.cc", region: "AS", status: "unknown" , id: 5, name: "Mirror - FM Plus", url: "https://fmovieshd.vip", region: "EU", status: "unknown" , id: 6, name: "Fmovies Unblock", url: "https://fmovies.wtf", region: "NA", status: "unknown" , id: 7, name: "CineProxy", url: "https://fmovies.llc", region: "Global", status: "unknown" , id: 8, name: "Flixtor Mirror", url: "https://fmoviesz.llc", region: "EU", status: "unknown" , id: 9, name: "Fm Proxy New", url: "https://fmovies4free.com", region: "AS", status: "unknown" , id: 10, name: "FMovies alt", url: "https://fmovies.sx", region: "NA", status: "unknown" ]; Note: The status checker uses a public CORS

let proxies = [...proxyDatabase];   // working copy with dynamic status
let currentFilter = "all";
let searchTerm = "";
// Helper: update last updated time
function updateLastUpdatedTime() 
    const now = new Date();
    const formatted = now.toLocaleString();
    document.getElementById("lastUpdatedDisplay").innerHTML = `πŸ•’ Last check: $formatted`;
// CORS proxy status check (using free CORS Anywhere demo, or fetch with mode no-cors? but we need response)
// We'll use a public CORS proxy to ping each URL (head request) to avoid timeout issues.
// For reliability, we use a cors-anywhere demo or use a direct fetch with timeout & fallback.
// Because browsers block cross-origin, we use a helper (cors proxy). For production, consider own backend.
// Here we use "https://cors-anywhere.herokuapp.com/" as demo, but it has rate limits.
// Alternative: fetch via 'https://api.allorigins.win/raw?url=' but slower.
// We'll implement a lightweight check using a timeout and no-cors? Not accurate. Use cors proxy with error handling.
const CORS_PROXY = "https://cors-anywhere.herokuapp.com/"; // May require demo allowance, but fine for feature.
// To make more robust without proxy: check via image loading? Not good. We'll do a fetch with mode 'no-cors' -> limited but can detect offline if fails.
// Better: Use a simple fetch with timeout and signal, but cors will block. For feature demonstration, we check via HEAD request using a free public proxy.
// Some proxies might fail due to CORS, but we include fallback as 'unknown'.
async function checkProxyStatus(proxyUrl) 
    // Timeout after 7 seconds
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 7000);
// Try via CORS proxy first to get real status
    const proxiedUrl = CORS_PROXY + proxyUrl;
    try  response.status < 400) 
            return 'online';
         else 
            return 'offline';
catch (error) 
        clearTimeout(timeoutId);
        // Fallback: try direct fetch with no-cors (won't give status but might not throw)
        try 
            const fallbackFetch = await fetch(proxyUrl,  method: 'HEAD', mode: 'no-cors', signal: AbortSignal.timeout?.(5000) : undefined );
            // no-cors returns opaque response, status is 0 but we assume maybe online? Not reliable.
            return 'unknown';
         catch (e) 
            return 'offline';
// Update all proxy statuses
async function refreshAllStatuses() 
    // Set all to 'checking' temporarily
    proxies = proxies.map(p => ( ...p, status: 'checking' ));
    renderProxyList();
const statusChecks = proxies.map(async (proxy, index) => 
        const status = await checkProxyStatus(proxy.url);
        proxies[index].status = status;
    );
await Promise.allSettled(statusChecks);
    updateLastUpdatedTime();
    renderProxyList();
// Filter & search logic
function getFilteredProxies() 
    let filtered = [...proxies];
// Search by name or URL
    if (searchTerm.trim() !== "")  
            p.url.toLowerCase().includes(term)
        );
// Status filter
    if (currentFilter !== "all") 
        filtered = filtered.filter(p => p.status === currentFilter);
return filtered;
// Render proxy cards
function renderProxyList() 
    const container = document.getElementById("proxyContainer");
    const filtered = getFilteredProxies();
if (filtered.length === 0) 
        container.innerHTML = `<div style="grid-column:1/-1; text-align:center; padding:40px;">πŸ” No proxies match your criteria.</div>`;
        return;
const cardsHTML = filtered.map(proxy => 
        let statusClass = "status-offline";
        let statusText = "Offline";
        if (proxy.status === 'online') 
            statusClass = "status-online";
            statusText = "Online";
         else if (proxy.status === 'checking') 
            statusClass = "status-checking";
            statusText = "Checking...";
         else if (proxy.status === 'unknown') 
            statusClass = "status-checking";
            statusText = "Unknown";
// Truncate URL display
        const displayUrl = proxy.url.length > 45 ? proxy.url.substring(0, 42) + "..." : proxy.url;
return `
            <div class="proxy-card" data-id="$proxy.id">
                <div class="proxy-name">
                    $escapeHtml(proxy.name)
                    <span class="status-badge $statusClass">$statusText</span>
                </div>
                <div class="proxy-url" title="$proxy.url">$escapeHtml(displayUrl)</div>
                <div class="proxy-meta">
                    <span>🌍 $proxy.region</span>
                    <span>πŸ†” #$proxy.id</span>
                </div>
                <div class="card-buttons">
                    <a href="$proxy.url" target="_blank" rel="noopener noreferrer" class="btn btn-visit">🌐 Visit</a>
                    <button class="btn btn-copy" data-url="$proxy.url">πŸ“‹ Copy URL</button>
                </div>
            </div>
        `;
    ).join('');
container.innerHTML = cardsHTML;
// Attach copy event listeners after render
    document.querySelectorAll('.btn-copy').forEach(btn => 
        btn.addEventListener('click', (e) => 
            const url = btn.getAttribute('data-url');
            copyToClipboard(url);
            // temporary feedback
            const originalText = btn.innerText;
            btn.innerText = "βœ… Copied!";
            setTimeout(() =>  btn.innerText = originalText; , 1500);
        );
    );
// Helper: copy to clipboard
async function copyToClipboard(text) 
    try 
        await navigator.clipboard.writeText(text);
     catch (err) 
        alert("Manual copy: " + text);
// Simple escape to avoid XSS
function escapeHtml(str) 
    return str.replace(/[&<>]/g, function(m) 
        if (m === '&') return '&';
        if (m === '<') return '<';
        if (m === '>') return '>';
        return m;
    ).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(c) 
        return c;
    );
// Event listeners
function init() 
    renderProxyList();
// Search input
    const searchInput = document.getElementById("searchInput");
    searchInput.addEventListener("input", (e) => 
        searchTerm = e.target.value;
        renderProxyList();
    );
// Filter buttons
    const filterBtns = document.querySelectorAll(".filter-btn");
    filterBtns.forEach(btn => 
        btn.addEventListener("click", () => 
            filterBtns.forEach(b => b.classList.remove("active"));
            btn.classList.add("active");
            currentFilter = btn.getAttribute("data-filter");
            renderProxyList();
        );
    );
// Refresh button
    const refreshBtn = document.getElementById("refreshBtn");
    refreshBtn.addEventListener("click", async () => 
        refreshBtn.innerHTML = "⏳ Checking...";
        await refreshAllStatuses();
        refreshBtn.innerHTML = "πŸ”„ Check Status";
    );
// Auto-check status on load after 0.5s
    setTimeout(() => 
        refreshAllStatuses().catch(console.warn);
    , 500);
updateLastUpdatedTime();
init();

</script> </body> </html>


Without an updated proxy list, you are locked out of the library of 10,000+ movies and TV shows.


Even with a proxy, your ISP can see you are visiting a blocked site. A VPN encrypts all traffic. Even with a proxy

An Fmovies proxy list is a compilation of alternative URLs (mirror sites) that reroute your traffic to the original Fmovies servers. When your local ISP blocks fmovies.to, a proxy like fmovies.xyz or fmovies.pro can still load the content.

Great! Next, complete checkout for full access to Deskera Blog
Welcome back! You've successfully signed in
You've successfully subscribed to Deskera Blog
Success! Your account is fully activated, you now have access to all content
Success! Your billing info has been updated
Your billing was not updated