Cloudflare Outage Map
The map below depicts the most recent cities worldwide where Cloudflare users have reported problems and outages. If you are having an issue with Cloudflare, make sure to submit a report below
The heatmap above shows where the most recent user-submitted and social media reports are geographically clustered. The density of these reports is depicted by the color scale as shown below.
Cloudflare users affected:
Cloudflare is a company that provides DDoS mitigation, content delivery network (CDN) services, security and distributed DNS services. Cloudflare's services sit between the visitor and the Cloudflare user's hosting provider, acting as a reverse proxy for websites.
Most Affected Locations
Outage reports and issues in the past 15 days originated from:
| Location | Reports |
|---|---|
| Ahmedabad, GJ | 1 |
| Le Puy-en-Velay, Auvergne-Rhône-Alpes | 1 |
| Ann Arbor, MI | 1 |
| Palermo, Sicily | 1 |
| New York City, NY | 3 |
| Los Angeles, CA | 1 |
| Paris, Île-de-France | 1 |
Community Discussion
Tips? Frustrations? Share them here. Useful comments include a description of the problem, city and postal code.
Beware of "support numbers" or "recovery" accounts that might be posted below. Make sure to report and downvote those comments. Avoid posting your personal information.
Cloudflare Issues Reports
Latest outage, problems and issue reports in social media:
-
volkanolmez (@volkanolmez) reported@xDestin0 That's almost always a local proxy or antivirus doing SSL inspection — the cert itself is valid (Google Trust Services via Cloudflare). Corporate networks and Kaspersky/ESET-type antivirus are usual suspects. Any chance you're on a work network? 🙏
-
Colby Hill (@Chill_Investing) reportedA TON OF THINGS HAPPENED IN THE STOCK MARKET TODAY. Here's a full recap: 1. Middle East $SPY $QQQ Stocks sold off after the U.S. struck Iranian military assets and Tehran retaliated with missile and drone attacks, putting the Strait of Hormuz back in focus. Crude jumped about 5%, with Brent trading above $90. The S&P 500 fell 0.70% to 7,631, the Nasdaq dropped 1.03% to 26,100, and the Dow slipped 0.79% to 52,767. 2. Bonds $TLT The global bond selloff continued, with U.S. 30-year yields holding at levels not sustained since 2006 and Japan's 10-year briefly touching 3% for the first time in 30 years. The U.S. 10-year sat near 4.77%. Rising discount rates hit long-duration growth names hardest, which is how the tape traded all session. 3. Dell $DELL Dell reported fiscal Q2 revenue of $47.0 billion, up 58% year over year, with adjusted EPS of $7.04 against a $4.88 estimate. Record AI server orders pushed backlog to $95 billion and management raised full-year revenue guidance to $192 billion. Third-quarter guidance of $49.0 billion in revenue and $6.50 in EPS came in well above the $41.42 billion and $4.49 analysts expected. Shares fell 6.9% during the session to $424.36, then rose about 7% after hours. 4. Apple $AAPL John Ternus took over as chief executive and Tim Cook became executive chairman, ending a 15-year run that grew Apple from roughly $350 billion to about $4.6 trillion. Ternus, a 25-year company veteran who led hardware engineering, also joined the board. Shares rose 2.62% to $325.14, the strongest mega-cap performance on an otherwise red day. 5. Palo Alto Networks $PANW Fiscal Q4 revenue rose 34% to $3.41 billion against a $3.35 billion consensus, with adjusted EPS of $1.02. Next-Generation Security ARR grew 63% to $9.10 billion, and fiscal 2027 revenue guidance of $14.10-14.20 billion topped estimates. The company also announced it acquired Console, an AI-native agentic platform being folded into Cortex, with terms undisclosed. Shares still closed down 5.2% to $362.25. 6. MongoDB $MDB Revenue of $771.8 million grew 30% year over year, the fastest rate in several years, and adjusted EPS of $1.90 came in ahead of consensus. Management raised full-year revenue guidance to $2.99-3.03 billion. Shares fell roughly 14% after hours anyway, with expectations having run further than the print. 7. Fed $SPY Futures now imply roughly 68% odds of a 25 basis point hike at the September 16 FOMC meeting. Core PCE is running at 3.3% with headline at 3.7%, and Chair Kevin Warsh has been explicit about the need for further tightening. Energy-driven inflation from the Hormuz disruption complicates the read further. 8. Moderna $MRNA Moderna climbed 9.93% to $154.28, extending its run on continued analyst upgrades following the intismeran autogene Phase 3 melanoma readout with Merck in the 1,137-patient INTerpath-001 study. William Blair moved the stock to Outperform. Merck rose 1.48% to $149.94. 9. Axon $AXON Axon was the worst performer in the S&P 500, falling 8.52% to $518.30. Demand is not the problem, with net revenue retention at 123%. The pressure is coming from a premium multiple meeting rising discount rates, compressed operating margins, and heavy R&D and acquisition integration spend. 10. Software $CRWD $NET High-multiple software took the brunt of the rate move. CrowdStrike fell 6.90% to $215.07 and Cloudflare dropped 6.44% to $285.47. With yields climbing and oil spiking, expensive growth software was the wrong place to be positioned. 11. Duolingo $DUOL Evercore ISI upgraded Duolingo to Outperform and doubled its price target to $210, citing product gains and engagement trends. Shares rose 7.10% to $158.89, one of the few green names anywhere in growth tech. 12. Crypto $COIN $CRCL Bitcoin slid about 2.2% to roughly $77,076, pulling the crypto-linked equities down with it. Coinbase fell 6.00% to $176.83 and Circle dropped 6.36% to $89.48. Interactive Brokers fell 7.00% to $90.42. 13. Energy $XLE $XOM $CVX Energy was the only sector with real strength as crude surged. The sector ETF gained 1.28%, with Exxon up 2.24% to $164.56 and Chevron up 2.38% to $211.05. The defensive tilt showed elsewhere too: the low-volatility ETF fell just 0.20% against a 2.12% drop for high beta, while gold slipped 2.83%. 📈 CHILL INVESTING — YOUR DAILY STOCK MARKET RECAP
-
⚛︎ Daddio ⚛︎ (@ScienceDaddio) reported@grok @DaddioAI E4H.1 is implemented. The pump-activity table is now the reusable presentation surface; events are optional overlays, not duplicate source tables. Raw duration rows stay immutable. E4G.6B canonical stable-ID work is intact (trend_report.html, trend_report.js, test/trend-report-stable-id-e4g6b.test.js). The workspace is not a *** repo, so that was confirmed by file inspection, not *** status. Codex had only started reading; no detector or research files were rewritten. ─── 1. Working-tree inspection No *** repo. Inspected files vs the E4G.6B baseline. E4H.1 presentation files were already present from the interrupted session. This closeout preserved that work, then stopped overlaying Current Assembly / Station Packet tables so automatic assembly still uses detector is_event_row highlighting instead of the new ERT overlay. 2. Distinction from E4G.6B E4G.6B remains: stable IDs and trend_report.js?v=e4h1-e4g6a-e4g6b. E4H.1 added presentation state, ERT overlay, settings UI, and Search Tables controls. Research under research/e4c8g/ was not touched. 3. Existing table architecture found Canonical BossDataTable renders Trend Report, Search Tables, and exports. Manual/Search tables use the approved catalog with exact start/end, pump, and sort. Event tables keep Context Before/After. Snapshots store source columns/rows; presentation is a separate optional field. EMAIL-v1 already highlights via is_event_row. 4. Existing fixed ERT architecture ┌──────────────────────────────────────┬──────────────────────────────────────┬─────────────────────┐ │ Layer │ Behavior │ E4H.1 action │ ├──────────────────────────────────────┼──────────────────────────────────────┼─────────────────────┤ │ Python PumpDurationERT / │ Materialized at ERT_MINUTES = 15, │ Preserved │ │ PumpActivityERT │ RUN_TIME ≥ │ │ ├──────────────────────────────────────┼──────────────────────────────────────┼─────────────────────┤ │ detectFixedErt() │ Exists; not called from │ Preserved │ │ │ detectEvents() │ │ ├──────────────────────────────────────┼──────────────────────────────────────┼─────────────────────┤ │ Settings fixedErtEnabled / │ Default enabled, 900 seconds │ Reused as overlay │ │ fixedErtSeconds │ │ config │ ├──────────────────────────────────────┼──────────────────────────────────────┼─────────────────────┤ │ Historical FIXED_ERT Station Events │ Readable history │ Preserved │ └──────────────────────────────────────┴──────────────────────────────────────┴─────────────────────┘ 5. Existing Adaptive Long Runtime architecture detectAdaptiveRuntime() remains in detectEvents(). Station Events, Current Assembly, and report generation still consume Adaptive events. No silent detector swap. 6. Settings architecture Existing analysis settings: global row + per-station overrides in analysis-settings.js, Station Review cards, PUT /api/station-review/settings/global and station override PUT. No parallel settings universe. 7. ERT setting storage Existing columns: • fixed_ert_enabled (boolean, default true) • fixed_ert_seconds (number, default 900) Read-only reshape: GET /api/pump-activity/ert-settings → { default_enabled, default_threshold_seconds, stations: { [id]: { enabled, threshold_seconds } } }. Writes go through the existing Station Review settings APIs. No new write endpoint. 8. ERT defaults 15 minutes (900 seconds) when no station override exists. Sands is not hardcoded. 9. Threshold semantics Granular rows only: RUN_SECONDS >= station.threshold_seconds Annotation metadata records comparison: 'gte'. Equality counts (6:00 at a 6-minute threshold is ERT; 5:59 is not). Validation range: finite, 1 to 2,592,000 seconds (1 second through 30 days). That is the existing analysis-settings bound. UI is minutes: 0.0167–43,200, converted × 60 on save. Allowed values include 6, 10, 15, 17, 20, 30 minutes. Invalid overlay input clamps to 900 seconds; settings save still rejects out-of-range values. 10. Shared table presentation model Fields actually implemented: • context — SEARCH \| TREND_EVENT \| TREND_MANUAL • start / end • pump — '' \| PUMP-1 \| PUMP-2 • row_mode — ALL_ACTIVITY \| EVENTS_ONLY • event_display — NONE \| ALL \| EXTENDED_RUNTIME \| CONSECUTIVE_SAME_PUMP • enabled_event_types • highlight_enabled • consecutive_available • ert_settings (optional snapshot of thresholds) 11. Annotation provider model src/public/pump-activity-presentation.js (BossPumpActivityPresentation): • ERT provider: derived from row runtime + per-station threshold • Consecutive provider: persisted evidence only (event_source_keys / source_key / is_event_row fallback) • 0–N annotations per row, keyed by sourceIdentity, not DOM index 12. Raw data integrity applyPresentation clones rows. Source objects are not mutated. Annotations are not written into duration history. Tests stringify the source array before and after. 13. Trend Report integration User-inserted granular tables get a collapsed Table Display card: Start, End, Pump, Rows, Events, Highlight Events, Apply. Event-from-tray tables default All Events + Highlight ON. Manual/Search-style inserts default None + Highlight OFF. Apply updates the same Canvas section (no duplicate). Context Before/After still exist; once they produce a new window, annotations follow that window. Current Assembly and Station Packet tables do not attach overlay presentation and do not show Table Display. They keep detector is_event_row highlighting. 14. Search Tables integration Granular duration tables (pump_runs, pump_durations, PumpDurationERT, rolling48_all, *_durations) show Rows / Events / Highlight. Defaults: Events: None, Highlight: Off, All Pump Activity. Consecutive is not offered. Aggregate tables (PumpActivityDaily, PumpActivitySQL, PumpActivityERT, StationActivityDaily) stay plain with the bar hidden. 15. Generate Report / aggregate handling Generate Report was not merged or redesigned. PumpActivityDaily MAX above threshold is not treated as a granular ERT event (aggregate: true, no Event column). 16. Time-range recalculation Annotations are computed from the table’s current start/end. Expand the window → newly visible ERT rows annotate. Contract → out-of-range annotations disappear. The table is not married to the initiating event. 17. Row modes • ALL_ACTIVITY — all qualifying source rows; annotated rows carry labels when highlight is on • EVENTS_ONLY — only rows with currently enabled annotations • EVENTS_PLUS_CONTEXT was not built event_display = NONE forces ALL_ACTIVITY. 18. Highlight toggle / plain mode Highlight OFF (or Events = None): no event-row class, no Event column, no event_labels / event_annotations, no threshold text in the row payload. Same source rows, visually plain. 19. Pump filter Both / Pump 1 / Pump 2 preserved. Annotations follow remaining rows. 20. Sorting Existing newest/oldest/runtime sorts remain. Highlight class uses sourceIdentity, not row index. 21. Multi-station threshold behavior Each row uses that row’s station config. Example: Sands 6 minutes + Magnolia 20 minutes → a 10-minute Sands row is ERT; the same duration at Magnolia is not. 22. Multiple-annotation support One row can show EXTENDED RUNTIME · CONSECUTIVE. Structure is a list, not one-event-per-row. 23. Consecutive compatibility Now: Trend Report event tables may show persisted Consecutive annotations when source keys or is_event_row evidence exists. Deferred: no detectConsecutiveRuns() changes, no LG30/C1, no historical reconstruction. Search Tables are ERT-only because complete Consecutive evidence is not available there. 24. Adaptive legacy behavior Preserved. Adaptive still feeds Station Events and Current Assembly. The new overlay is fixed-threshold ERT only. 25. Legacy fixed ERT tables PumpDurationERT and PumpActivityERT remain in the catalog and Python pipeline at 15 minutes. 26. Canonical snapshot / save-reopen presentation is optional on table sections. Legacy snapshots with presentation: null still validate and render with is_event_row. New snapshots store view state (including ert_settings when present) and reapply on reopen. 27. EMAIL rendering HUB presentTableSection applies the overlay when presentation is set and the table is not assembly-bound. EMAIL-v1 was not modified. Highlight still uses is_event_row; HUB sets that flag from overlay identity when annotations are shown. Plain presentation leaves rows unhighlighted and without an Event column. Cloudflare requests stay 0 in tests. 28. Auto/custom narrative autoTableNarrative() exists as a helper only. It is not wired into Current Assembly. Deferred to E4H.2. 29. Future AI compatibility A later local AI can set the same structured presentation object (station/start/end/pump/row_mode/event_display/highlight_enabled) without HTML-specific logic. No AI was implemented. 30. Files created • src/public/pump-activity-presentation.js • test/pump-activity-presentation-e4h1.test.js • test/pump-activity-table-integration-e4h1.test.js 31. Files modified • src/public/trend_report.js • src/public/trend_report.html • src/public/data_views.js • src/public/data_views.html • src/public/station_review.js • src/public/station_review.html • src/public/styles.css • src/server.js • src/services/saved-reports.js • src/services/trend-report-email.js • cache-bust strings in a few existing tests (saved-reports-e4d, station-event-email-ui-e4c1, station-review-queue-e4h1) Not modified: event-engine.js, analysis-settings schema (reused), Python ERT builders, EMAIL-v1, research/. 32. Focused E4H.1 tests 30 / 30 33. Search Tables regression 40 / 40 (catalog, exact time, pump, historical durations, shared renderer) 34. Trend Report regression 85 / 85 on X4 + E4G.6 / 6A / 6B core files; remainder included in full HUB 767. 35. Saved Report regression 16 / 16 (saved-reports-e4d + report-table-compatibility-e4d2) 36. Event/detector regression 54 / 54 (local events, event quality, fixed-ERT workflow, event presentation) 37. HUB full regression Starting baseline 737 / 737. 767 / 767 (737 prior + 30 E4H.1 tests) A first parallel run hit 766/767 from two suites sharing temp files; the serial rerun was 767/767. 38. EMAIL full regression 64 / 64 39. Capture reliability 9 / 9 40. Production DB writes 0 in tests. ERT settings GET is read-only. 41. Real emails sent 0. Cloudflare requests 0. 42. Real captures 0 43. Detector files modified NO. detectConsecutiveRuns() unchanged. detectFixedErt() still unused by detectEvents(). 44. Research files modified NO 45. Manual owner QA Live BOSS UI was not opened in a browser from this session; behavior was verified with node --test. Please confirm: 1. Station Review → settings: EXTENDED RUNTIME Enabled + Threshold (minutes). Set a station to 6.0; confirm storage is 360 seconds. Confirm Adaptive controls are unchanged. Confirm email/SMS are not flipped on. 2. Search Tables → historical durations: defaults Events None / Highlight Off. A 20-minute row looks like any other row. Turn Events = Extended Runtime and Highlight On → Event column and yellow row. Highlight Off → same rows, fully plain. 3. Search Tables → PumpActivityDaily: no Event overlay; MAX above 15 minutes is not an ERT event. 4. Trend Report: drag a Station Event table. Table Display exists. Defaults All Events / Highlight On. Events Only hides ordinary rows. Changing Start/End then Apply reloads annotations for the new window. Apply does not create a second Canvas section. 5. Current Assembly: no Table Display / Apply. Consecutive/Adaptive detector rows still highlight via is_event_row. No extra Event column from the overlay. 6. Save / reopen / email a mixed report: annotated user table stays annotated; a plain table stays plain; a pre-E4H.1 saved report still opens. 7. Multi-station granular table: different thresholds on two stations; a 10-minute run annotates only the 6-minute station. 46. Recommended E4H.2 (do not implement now) • Wire auto/custom narrative to the overlay counts • One unified event-aware pump-activity table per useful station/window • One standard trend • Stop emitting redundant automatic event-specific tables • Controlled Adaptive → owner-threshold ERT transition for Station Events (history preserved) ─── Acceptance check: raw rows immutable; per-station ERT; default 15 minutes; no moving average for the overlay; same table annotated or plain; Search defaults plain; event-focused Trend Report defaults annotated; range refresh; Events Only; All Activity; sort/pump/multi-station; no aggregate MAX-as-ERT; deterministic presentation; multi-annotation; Consecutive detector unchanged; Adaptive and legacy ERT tables preserved; historical snapshots compatible; no notifications/email/captures/production writes in tests. Stopped here. Automatic report assembly was not redesigned.
-
Megumi, Internet Angel 🏳️⚧️ (@pcppup) reported@NightlyArii i think you are not catching my sarcasm :) i do not know how much you know about cybersec, but a static page would require Cloudflare, Github, or my Computer to get hacked, which is just crazy. You're just criticizing AI because you can. It's good for some things, bad at others.
-
Irfan (@learnatick) reported@acolombiadev @Cloudflare @expo EAS service 🐐 tier for React Native developers.
-
Ali Avali | #ExtraLife 2026 (@ItsAliAvali) reported@Porkbun @pcshipp Heh, I have beef with NoDaddy lol If couldn't tell. I do use you guys (PorkBun) and CloudFlare for all my service.
-
Brij Pandey (@LearnWithBrij) reported📂 SaaS Stack ┃ ┣ 📂 Frontend ┃ ┣ 📂 React ┃ ┣ 📂 NextJS ┃ ┣ 📂 Vue ┃ ┣ 📂 TailwindCSS ┃ ┗ 📂 Shadcn UI ┃ ┣ 📂 Backend ┃ ┣ 📂 NodeJS ┃ ┣ 📂 Django ┃ ┣ 📂 Laravel ┃ ┣ 📂 FastAPI ┃ ┗ 📂 Express ┃ ┣ 📂 Database ┃ ┣ 📂 PostgreSQL ┃ ┣ 📂 MySQL ┃ ┣ 📂 MongoDB ┃ ┣ 📂 Redis ┃ ┗ 📂 Supabase ┃ ┣ 📂 Auth ┃ ┣ 📂 Clerk ┃ ┣ 📂 Auth0 ┃ ┣ 📂 Firebase Auth ┃ ┣ 📂 Supabase Auth ┃ ┗ 📂 NextAuth ┃ ┣ 📂 Payments ┃ ┣ 📂 Stripe ┃ ┣ 📂 Paddle ┃ ┣ 📂 Dodo Payments ┃ ┣ 📂 Lemon Squeezy ┃ ┗ 📂 Polar ┃ ┣ 📂 Emails ┃ ┣ 📂 Resend ┃ ┣ 📂 SendGrid ┃ ┣ 📂 Mailgun ┃ ┣ 📂 Postmark ┃ ┗ 📂 Amazon SES ┃ ┣ 📂 Storage ┃ ┣ 📂 AWS ┃ ┣ 📂 Cloudflare ┃ ┣ 📂 Google Cloud Storage ┃ ┣ 📂 Supabase Storage ┃ ┗ 📂 Uploadcare ┃ ┣ 📂 Deployment ┃ ┣ 📂 Vercel ┃ ┣ 📂 Netlify ┃ ┣ 📂 Railway ┃ ┣ 📂 Render ┃ ┗ 📂 AWS ┃ ┣ 📂 Domains and DNS ┃ ┣ 📂 Namecheap ┃ ┣ 📂 Hostinger ┃ ┣ 📂 Cloudflare DNS ┃ ┣ 📂 Google Domains ┃ ┗ 📂 SiteGround ┃ ┣ 📂 Analytics ┃ ┣ 📂 Google Analytics ┃ ┣ 📂 Plausible ┃ ┣ 📂 PostHog ┃ ┣ 📂 Mixpanel ┃ ┗ 📂 DataFast ┃ ┣ 📂 Monitoring ┃ ┣ 📂 Sentry ┃ ┣ 📂 LogRocket ┃ ┣ 📂 Datadog ┃ ┣ 📂 NewRelic ┃ ┗ 📂 UptimeRobot ┃ ┣ 📂 DevOps ┃ ┣ 📂 Docker ┃ ┣ 📂 Kubernetes ┃ ┣ 📂 GitHub Actions ┃ ┣ 📂 CI CD ┃ ┗ 📂 Terraform ┃ ┣ 📂 Search ┃ ┣ 📂 Algolia ┃ ┣ 📂 Meilisearch ┃ ┣ 📂 Elasticsearch ┃ ┣ 📂 Typesense ┃ ┗ 📂 OpenSearch ┃ ┣ 📂 AI Integration ┃ ┣ 📂 OpenAI API ┃ ┣ 📂 Anthropic API ┃ ┣ 📂 Replicate ┃ ┣ 📂 HuggingFace ┃ ┗ 📂 Gemini API ┃ ┣ 📂 Integrations ┃ ┣ 📂 Zapier ┃ ┣ 📂 Make ┃ ┣ 📂 n8n ┃ ┣ 📂 Pabbly ┃ ┗ 📂 Webhooks ┃ ┣ 📂 Security ┃ ┣ 📂 SSL ┃ ┣ 📂 Cloudflare ┃ ┣ 📂 WAF ┃ ┣ 📂 Rate Limiting ┃ ┗ 📂 Secrets Management ┃ ┣ 📂 Marketing ┃ ┣ 📂 Search Console ┃ ┣ 📂 Outrank ┃ ┣ 📂 Buffer ┃ ┣ 📂 Analytics ┃ ┗ 📂 Kit ┃ ┗ 📂 Customer Support ┣ 📂 Intercom ┣ 📂 Crisp ┣ 📂 Zendesk ┣ 📂 Tawk ┗ 📂 HelpScout
-
💊🧠 (@theOGstud) reported@leviackermanft Novel works fine ... I've also played an anime .. problem comes with the manga. After downloading the repo,it either points out that source not found or the source leads you to cloudflare then the app crashes ..
-
Reina Cruz 🥼🧤🇨🇺 (@rea1ReinaCruz) reported@Cloudflare Fix human verification
-
Nuvorlane (@nuvorlane) reportedDefault `/crawl` is `contentUse: "full"`. A site that sets `use=reference` now 400s you at job start. Aug 31, Cloudflare Browser Rendering. The endpoint honors the Content Signals `use` level in robots.txt. Allowed `contentUse` values: `reference` or `full`. `immediate` is not accepted because `/crawl` stores pages. Mismatch = 400 `Crawl disallowed by Content-Signal directive (purpose or use level)`. Site `use=immediate` blocks every crawl. Site `use=reference` blocks the default. This is a second gate beside `crawlPurposes` (`search` / `ai-input` / `ai-train`). Defaults are all three, so `ai-train=no` 400s you too unless you narrow the array. If the job is RAG/index, declare `reference` and drop `ai-train`. Don't debug a 400 as an outage until you've read the site's `Content-Signal`.
-
junebnunny (@junebnunny_) reported@Gion_the_critic @SportingNest @Cloudflare It's a click fix attack
-
Dr. Internets (@Dr_Internets) reported@spacebruce @alynokioku Hello, I am Albanian cloudflare. Due to poor technology, I need you to paste this totally real command into your admin command prompt. Very real, trust.
-
Utsav Patel 🇮🇳 (@mr_utsav_patel) reported@Cloudflare @CloudflareHelp @Yank if you could help here...
-
Harlen Bayha 🇺🇸 (@QreatureQriator) reported@mrfundman @Cloudflare Did it work with Outlook emails? My bots struggle with Outlook's interface so bad.
-
Yash Desai (@yash_d_desai) reportedStopping the bad guys with Cloudflare: 20,273 malicious requests blocked or challenged in the last month #cloudflare