1<!DOCTYPE html><html lang="en" dir="ltr" class="2xl:text-[20px]"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="sitemap" href="/sitemap-index.xml"><link rel="icon" href="/favicon.ico" sizes="48x48"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="mask-icon" href="/favicon.svg" color="#0071e3"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><meta name="theme-color" content="#0071e3"><meta name="msapplication-TileColor" content="#0071e3"><style> 2 :root { 3 --aw-font-sans: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif; 4 --aw-font-serif: ui-serif, Georgia, serif; 5 --aw-font-heading: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', sans-serif; 6 7 --aw-color-primary: rgb(0 113 227); 8 --aw-color-secondary: rgb(0 113 227); 9 --aw-color-accent: rgb(36 138 61); 10 11 --aw-color-text-heading: rgb(29 29 31); 12 --aw-color-text-default: rgb(29 29 31); 13 --aw-color-text-muted: rgb(110 110 115); 14 --aw-color-bg-page: rgb(245 245 247); 15 16 --aw-color-bg-page-dark: rgb(5 5 5); 17 18 ::selection { 19 color: white; 20 background-color: rgb(0 113 227); 21 } 22 } 23 24 .dark { 25 --aw-color-primary: rgb(41 151 255); 26 --aw-color-secondary: rgb(41 151 255); 27 --aw-color-accent: rgb(48 209 88); 28 29 --aw-color-text-heading: rgb(245 245 247); 30 --aw-color-text-default: rgb(245 245 247); 31 --aw-color-text-muted: rgb(161 161 166); 32 --aw-color-bg-page: rgb(5 5 5); 33 34 ::selection { 35 color: white; 36 background-color: rgb(41 151 255); 37 } 38 } 39</style>
39<script>(function(){const defaultTheme = "system"; 40 41 function applyTheme(theme) { 42 if (theme === 'dark') { 43 document.documentElement.classList.add('dark'); 44 } else { 45 document.documentElement.classList.remove('dark'); 46 } 47 } 48 49 function getSavedTheme() { 50 try { 51 return localStorage.getItem('theme'); 52 } catch { 53 return null; 54 } 55 } 56 57 const colorScheme = window.matchMedia('(prefers-color-scheme: dark)'); 58 const savedTheme = getSavedTheme(); 59 const fixedTheme = defaultTheme?.endsWith(':only') ? defaultTheme.replace(':only', '') : null; 60 61 applyTheme(fixedTheme || savedTheme || (defaultTheme === 'system' && colorScheme.matches ? 'dark' : 'light')); 62 63 colorScheme.addEventListener('change', (event) => { 64 if (!fixedTheme && !getSavedTheme() && defaultTheme === 'system') { 65 applyTheme(event.matches ? 'dark' : 'light'); 66 } 67 }); 68})();</script>
68<title>Online Protractor â Free Protractor Tool</title><meta name="description" content="Free online protractor tool to measure angles on photos and screenshots in your browser. No install. Local-only images."><link rel="canonical" href="https://protractortool.com/"><meta name="robots" content="index, follow"><meta property="og:type" content="website"><meta property="og:url" content="https://protractortool.com/"><meta property="og:title" content="Online Protractor â Free Protractor Tool"><meta property="og:description" content="Free online protractor tool to measure angles on photos and screenshots in your browser. No install. Local-only images."><meta property="og:site_name" content="ProtractorTool"><meta property="og:locale" content="en"><meta property="og:image" content="https://protractortool.com/images/og-cover.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="ProtractorTool free online protractor"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Online Protractor â Free Protractor Tool"><meta name="twitter:description" content="Free online protractor tool to measure angles on photos and screenshots in your browser. No install. Local-only images."><meta name="twitter:image" content="https://protractortool.com/images/og-cover.svg">
68<script defer data-domain="protractortool.com" src="https://app.pageview.app/js/script.js"></script>
68<script>(function(){const clarityId = "xvat3dia8j"; 69 70 (() => { 71 const projectId = clarityId; 72 let scheduled = false; 73 74 const loadClarity = () => { 75 if (document.querySelector(`script[data-clarity-project="${projectId}"]`)) return; 76 77 window.clarity = 78 window.clarity || 79 function (...args) { 80 (window.clarity.q = window.clarity.q || []).push(args); 81 }; 82 83 const script = document.createElement('script'); 84 script.async = true; 85 script.src = `https://www.clarity.ms/tag/${projectId}`; 86 script.dataset.clarityProject = projectId; 87 document.head.appendChild(script); 88 }; 89 90 const scheduleClarity = () => { 91 if (scheduled) return; 92 scheduled = true; 93 94 if ('requestIdleCallback' in window) { 95 window.requestIdleCallback(loadClarity, { timeout: 5000 }); 96 } else { 97 window.setTimeout(loadClarity, 3000); 98 } 99 }; 100 101 if (document.readyState === 'complete') scheduleClarity(); 102 else window.addEventListener('load', scheduleClarity, { once: true }); 103 })(); 104 })();</script>
104<link rel="stylesheet" href="/_astro/index.CgzGE179.css"><link rel="stylesheet" href="/_astro/Layout.qIQCHRYW.css"><style>.brand-mark[data-astro-cid-f7espo7c]{border:1px solid var(--hairline-strong,#00000024);background:var(--surface-strong,white);width:1.7rem;height:1.7rem;color:var(--text,#1d1d1f);border-radius:.55rem;place-items:center;margin-right:.5rem;display:inline-grid}.brand-mark[data-astro-cid-f7espo7c] svg[data-astro-cid-f7espo7c]{display:block}.brand-word[data-astro-cid-f7espo7c]{color:var(--text,#1d1d1f);letter-spacing:-.03em;white-space:nowrap;font-size:1rem;font-weight:760}.brand-tld[data-astro-cid-f7espo7c]{color:var(--muted,#6e6e73);font-weight:650}.mobile-nav[data-astro-cid-nswrv7r3]{background:color-mix(in srgb, var(--canvas,#f5f5f7) 94%, transparent)}.footer-brand-mark[data-astro-cid-w622twah]{background:#fff;border:1px solid #0000001f;border-radius:.45rem;place-items:center;width:1.45rem;height:1.45rem;margin-right:.5rem;display:inline-grid;position:relative}.dark .footer-brand-mark[data-astro-cid-w622twah]{background:#181819;border-color:#ffffff24}.footer-brand-mark[data-astro-cid-w622twah] span[data-astro-cid-w622twah]{border:1.5px solid;border-radius:50%;width:.65rem;height:.65rem;position:absolute}.footer-brand-mark[data-astro-cid-w622twah] span[data-astro-cid-w622twah]:first-child{transform:translate(-.18rem,-.06rem)}.footer-brand-mark[data-astro-cid-w622twah] span[data-astro-cid-w622twah]:last-child{border-color:#0071e3;transform:translate(.18rem,.06rem)}.footer-brand-word[data-astro-cid-w622twah]{letter-spacing:-.02em}.footer-brand-tld[data-astro-cid-w622twah]{color:#6e6e73;font-weight:650}.dark .footer-brand-tld[data-astro-cid-w622twah]{color:#a1a1a6} 105</style></head><body class="antialiased text-default bg-page tracking-tight"><a class="skip-link" href="#tool">Skip to the online protractor</a><header class="sticky top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out" data-aw-sticky-header="true" id="header" data-astro-cid-nswrv7r3><div class="absolute inset-0" data-astro-cid-nswrv7r3></div><div class="relative text-default py-2 px-4 sm:px-6 mx-auto w-full grid grid-cols-[1fr_auto_1fr] items-center gap-2 max-w-5xl" data-astro-cid-nswrv7r3><div class="flex items-center min-w-0 justify-self-start" data-astro-cid-nswrv7r3><a class="flex items-center" href="/" data-astro-cid-nswrv7r3><span class="brand-mark" aria-hidden="true" data-astro-cid-f7espo7c><svg viewBox="0 0 32 32" width="22" height="22" fill="none" data-astro-cid-f7espo7c><path d="M5 24a11 11 0 0 1 22 0" stroke="currentColor" stroke-width="2" stroke-linecap="round" opacity="0.9" data-astro-cid-f7espo7c></path><path d="M16 24V9" stroke="var(--action, #0071e3)" stroke-width="2" stroke-linecap="round" data-astro-cid-f7espo7c></path><path d="M16 24L25.5 16.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" data-astro-cid-f7espo7c></path><circle cx="16" cy="24" r="2.2" fill="var(--action, #0071e3)" data-astro-cid-f7espo7c></circle><path d="M10 15.5h1.2M13.2 12.2h1.2M17.8 11.2h1.2M22 13.8h1.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" opacity="0.45" data-astro-cid-f7espo7c></path></svg></span><span class="brand-word" data-astro-cid-f7espo7c>Protractor<span class="brand-tld" data-astro-cid-f7espo7c>Tool</span></span></a></div><nav id="site-navigation" class="hidden lg:flex items-center justify-center justify-self-center text-default" aria-label="Main navigation" data-astro-cid-nswrv7r3><ul class="flex flex-row items-center gap-0.5" data-astro-cid-nswrv7r3><li class="dropdown relative" data-astro-cid-nswrv7r3><a href="/tools" class="hover:text-link dark:hover:text-white px-3 py-2 flex items-center gap-1 whitespace-nowrap text-[0.9375rem] font-medium" aria-haspopup="true" data-astro-cid-nswrv7r3>Tools<svg width="1em" height="1em" class="w-3.5 h-3.5 opacity-70" data-astro-cid-nswrv7r3="true" data-icon="tabler:chevron-down"><symbol id="ai:tabler:chevron-down" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></symbol><use href="#ai:tabler:chevron-down"></use></svg></a><ul class="dropdown-menu hidden absolute left-1/2 top-full z-50 min-w-[15rem] -translate-x-1/2 pt-2" data-astro-cid-nswrv7r3><li class="list-none rounded-xl border border-gray-200/80 bg-white/95 py-1.5
105shadow-lg backdrop-blur-md dark:border-gray-700 dark:bg-gray-900/95" data-astro-cid-nswrv7r3><ul class="m-0 list-none p-0" data-astro-cid-nswrv7r3><li data-astro-cid-nswrv7r3><a class="block px-3.5 py-2.5 text-sm font-medium text-gray-800 hover:bg-gray-100 dark:text-gray-100 dark:hover:bg-gray-800" href="/" data-astro-cid-nswrv7r3>Online Protractor</a></li></ul></li></ul></li></ul></nav><div class="flex items-center gap-0.5 sm:gap-1 shrink-0 justify-self-end" data-header-actions data-astro-cid-nswrv7r3><button type="button" data-feedback-trigger class="inline-flex h-10 w-10 items-center justify-center rounded-lg text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700" aria-label="Send feedback" title="Send feedback" data-astro-cid-nswrv7r3><svg width="1em" height="1em" class="w-5 h-5" data-astro-cid-nswrv7r3="true" data-icon="tabler:message-circle"><symbol id="ai:tabler:message-circle" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 20l1.3-3.9C1.976 12.663 2.874 8.228 6.4 5.726c3.526-2.501 8.59-2.296 11.845.48c3.255 2.777 3.695 7.266 1.029 10.501S11.659 20.922 7.7 19z"/></symbol><use href="#ai:tabler:message-circle"></use></svg></button><button type="button" class="inline-flex h-10 w-10 items-center justify-center rounded-lg text-muted dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700" aria-label="Toggle between Dark and Light mode" aria-pressed="false" data-aw-toggle-color-scheme><svg width="1em" height="1em" class="w-5 h-5" data-icon="tabler:sun"><symbol id="ai:tabler:sun" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0m-5 0h1m8-9v1m8 8h1m-9 8v1M5.6 5.6l.7.7m12.1-.7l-.7.7m0 11.4l.7.7m-12.1-.7l-.7.7"/></symbol><use href="#ai:tabler:sun"></use></svg></button><div class="lg:hidden" data-astro-cid-nswrv7r3><button type="button" class="flex flex-col h-10 w-10 rounded-lg justify-center items-center cursor-pointer group" aria-label="Open tools menu" aria-controls="site-navigation-mobile" aria-expanded="false" data-aw-toggle-menu><span class="sr-only">Open tools menu</span><span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:rotate-45 group-[.expanded]:translate-y-2.5"></span><span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:opacity-0"></span><span aria-hidden="true" class="h-0.5 w-6 my-1 rounded-full bg-black dark:bg-white transition ease transform duration-200 opacity-80 group-[.expanded]:-rotate-45 group-[.expanded]:-translate-y-2.5"></span></button></div></div></div><nav id="site-navigation-mobile" class="mobile-nav hidden lg:hidden border-t border-gray-200/70 dark:border-gray-800 px-4 sm:px-6 pb-3 pt-1" aria-label="Mobile navigation" data-mobile-nav data-astro-cid-nswrv7r3><ul class="flex flex-col py-1" data-astro-cid-nswrv7r3><li class="border-b border-gray-100 dark:border-gray-800 last:border-0" data-astro-cid-nswrv7r3><a class="block py-2.5 text-base font-semibold" href="/tools" data-astro-cid-nswrv7r3>Tools</a><ul class="pb-2 pl-3 flex flex-col gap-0.5" data-astro-cid-nswrv7r3><li data-astro-cid-nswrv7r3><a class="block py-2 text-sm text-gray-600 dark:text-gray-300" href="/" data-astro-cid-nswrv7r3>Online Protractor</a></li></ul></li></ul></nav></header><main id="main-content" class="home-page"><section class="hero-section"><div class="hero-copy"><h1>Online Protractor â Free Protractor Tool</h1><p class="hero-intro">A free protractor on your screen: drag the center to a corner, align the two arms, and read the degrees. Upload a photo to measure angles in a pictureâeverything stays in your browser.</p><p class="hero-tags" aria-label="Highlights"><span>Free</span><span>No install</span><span>Photos & screenshots</span><span>Local only</span></p></div><section id="tool" class="pt-wrap" aria-labelledby="tool-title" data-astro-cid-jbau52rq><div class="pt-card" data-protractor-tool data-astro-cid-jbau52rq><div class="pt-topline" data-astro-cid-jbau52rq><div data-astro-cid-jbau52rq><p class="pt-title" id="tool-title" data-astro-cid-jbau52rq>Online protractor</p><p class="pt-sub" data-astro-cid-jbau52rq>Move the whole disc, rotate the rim, resize with side handles, then click to pin rays from the center and read the angle. Upload a photo to measure on an image.</p></div>
105<div class="pt-angle-chip" aria-live="polite" data-astro-cid-jbau52rq><span data-angle-display data-astro-cid-jbau52rq>0.0°</span></div></div><div class="pt-toolbar" role="toolbar" aria-label="Protractor controls" data-astro-cid-jbau52rq><div class="pt-seg" title="Shape" data-astro-cid-jbau52rq><button type="button" class="is-active" data-mode="180" aria-pressed="true" data-astro-cid-jbau52rq>180°</button><button type="button" data-mode="360" aria-pressed="false" data-astro-cid-jbau52rq>360°</button></div><div class="pt-seg" title="Snap" data-astro-cid-jbau52rq><button type="button" data-snap="off" aria-pressed="false" data-astro-cid-jbau52rq>Free</button><button type="button" class="is-active" data-snap="common" aria-pressed="true" data-astro-cid-jbau52rq>Common</button><button type="button" data-snap="5" aria-pressed="false" data-astro-cid-jbau52rq>5°</button><button type="button" data-snap="15" aria-pressed="false" data-astro-cid-jbau52rq>15°</button></div><div class="pt-seg" title="Grid" data-astro-cid-jbau52rq><button type="button" data-grid="off" aria-pressed="false" data-astro-cid-jbau52rq>Grid off</button><button type="button" class="is-active" data-grid="on" aria-pressed="true" data-astro-cid-jbau52rq>Grid on</button></div><div class="pt-actions-main" data-astro-cid-jbau52rq><button type="button" class="pt-btn" data-action="upload" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" data-astro-cid-jbau52rq></path><polyline points="17 8 12 3 7 8" data-astro-cid-jbau52rq></polyline><line x1="12" y1="3" x2="12" y2="15" data-astro-cid-jbau52rq></line></svg>Upload photo</button><button type="button" class="pt-btn" data-action="paste" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><rect x="8" y="2" width="8" height="4" rx="1" data-astro-cid-jbau52rq></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" data-astro-cid-jbau52rq></path></svg>Paste</button><button type="button" class="pt-btn" data-action="undo" title="Undo (Ctrl/â+Z)" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><polyline points="9 14 4 9 9 4" data-astro-cid-jbau52rq></polyline><path d="M15 9.5a3.5 3.5 0 0 1 3.5 3.5v0a3.5 3.5 0 0 1-3.5 3.5H9" data-astro-cid-jbau52rq></path></svg>Undo</button><button type="button" class="pt-btn" data-action="redo" title="Redo" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><polyline points="15 14 20 9 15 4" data-astro-cid-jbau52rq></polyline><path d="M15 9.5a3.5 3.5 0 0 0-3.5 3.5H9" data-astro-cid-jbau52rq></path></svg>Redo</button><button type="button" class="pt-btn pt-btn-primary" data-action="copy" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><rect x="9" y="9" width="13" height="13" rx="2" data-astro-cid-jbau52rq></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v2" data-astro-cid-jbau52rq></path></svg>Copy °</button><button type="button" class="pt-btn" data-action="clear-points" title="Clear measurement pins" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><path d="m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21z" data-astro-cid-jbau52rq></path><path d="M22 21H7" data-astro-cid-jbau52rq></path></svg>Clear pins</button><button type="button" class="pt-btn" data-action="reset" data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><path d="M3 12a9 9 0 1 0 3-7.7L3 8" data-astro-cid-jbau52rq></path><path d="M3 3v5h5" data-astro-cid-jbau52rq></path></svg>Reset</button></div><details class="pt-more" data-astro-cid-jbau52rq><summary data-astro-cid-jbau52rq><svg class="pt-ico" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-jbau52rq><polyline points="6 9 12 15 18 9" data-astro-cid-jbau52rq></polyline></svg>More tools</summary><div class="pt-more-panel" data-astro-cid-jbau52rq><button type="button" class="pt-btn" data-action="add-protractor" data-astro-cid-jbau52rq>+ Add protractor</button><button type="button" class="pt-btn" data-action="remove-protractor" data-astro-cid-jbau52rq>Remove active</button><button type="button" class="pt-btn" data-action="export-png" data-astro-cid-jbau52rq>Export PNG</button><button type="button" class="pt-btn" data-action="export-csv" data-astro-cid-jbau52rq>Export CSV</button><button type="button" class="pt-btn" data-action="export-json" data-astro-cid-jbau52rq>Export JSON</button><button type="button" class="pt-btn" data-action="clear-image" data-astro-cid-jbau52rq>Remove photo</button><button type="button" class="pt-btn" data-action="toggle-image-panel" data-astro-cid-jbau52rq>Image adjust</button><button type="button" class="pt-btn" data-action="scale" data-astro-cid-jbau52rq>Set real scale</button></div></details></div><div class="pt-pro-tabs" data-pro-list hidden data-astro-cid-jbau52rq><span class="pt-pro-label" data-astro-cid-jbau52rq>Protractors</span><div class="pt-pro-pills" data-pro-pills data-astro-cid-jbau52rq></div></div><div class="pt-image-panel" data-image-panel hidden data-astro-cid-jbau52rq><label data-astro-cid-jbau52rq>Opacity <input type="range" min="25" max="100" value="78" data-opacity data-astro-cid-jbau52rq> <span data-opacity-val data-astro-cid-jbau52rq>78%</span></label><label data-astro-cid-jbau52rq>Brightness <input type="range" min="50" max="150" value="100" data-brightness data-astro-cid-jbau52rq> <span data-brightness-val data-astro-cid-jbau52rq>100%</span></label><label data-astro-cid-jbau52rq>Contrast <input type="range" min="50" max="150" value="100" data-contrast data-astro-cid-jbau52rq> <span data-contrast-val data-astro-cid-jbau52rq>100%</span></label><button type="button" class="pt-btn" data-action="rotate-bg" data-astro-cid-jbau52rq>Rotate photo 90°</button><button type="button" class="pt-btn" data-action="flip-h" data-astro-cid-jbau52rq>Flip H</button><button type="button" class="pt-btn" data-action="flip-v" data-astro-cid-jbau52rq>Flip V</button></div><input type="file" accept="image/*" data-file-input hidden data-astro-cid-jbau52rq><div class="pt-stage" data-stage data-astro-cid-jbau52rq><canvas data-canvas aria-label="Protractor canvas" data-astro-cid-jbau52rq></canvas><div class="pt-loupe" data-loupe hidden data-astro-cid-jbau52rq></div><p class="pt-hint" data-hint data-astro-cid-jbau52rq><strong data-astro-cid-jbau52rq>Like a real protractor:</strong> drag the <strong data-astro-cid-jbau52rq>blue center</strong> to a corner, drag the<strong data-astro-cid-jbau52rq>rim</strong> to rotate, side <strong data-astro-cid-jbau52rq>â handles</strong> to resize, then <strong data-astro-cid-jbau52rq>click</strong> to pin rays and read the angle. Delete removes the last pin · Shift+drag pans a photo.</p></div><div class="pt-meta-row" data-astro-cid-jbau52rq><span data-complement data-astro-cid-jbau52rq>Click canvas to pin rays from center · drag rim to rotate · handles to resize</span><span data-scale-readout hidden data-astro-cid-jbau52rq></span><span class="pt-badge" data-astro-cid-jbau52rq>Browser only · advanced tools local</span></div><div class="pt-list-wrap" data-astro-cid-jbau52rq><div class="pt-list-head" data-astro-cid-jbau52rq><h3 data-astro-cid-jbau52rq>Readings</h3><button type="button" class="pt-btn" data-action="snapshot-reading" data-astro-cid-jbau52rq>Save current °</button></div><ul class="pt-list" data-measure-list data-astro-cid-jbau52rq><li class="pt-list-empty" data-list-empty data-astro-cid-jbau52rq>Pin 2+ rays from the center to see live sector angles (or save a reading for your list).</li></ul></div><div class="pt-scale-panel" data-scale-panel hidden data-astro-cid-jbau52rq><p class="pt-scale-title" data-astro-cid-jbau52rq>Real-world scale (optional)</p><p class="pt-scale-help" data-astro-cid-jbau52rq>Enter a known length, mark 2 points on the photo â arm length can show in real units.</p><div class="pt-scale-row" data-astro-cid-jbau52rq><label data-astro-cid-jbau52rq>Known length <input type="number" min="0.001" step="any" value="10" data-scale-value data-astro-cid-jbau52rq></label><label data-astro-cid-jbau52rq>Unit<select data-scale-unit data-astro-cid-jbau52rq><option value="cm" data-astro-cid-jbau52rq>cm</option><option value="mm" data-astro-cid-jbau52rq>
105mm</option><option value="in" data-astro-cid-jbau52rq>in</option><option value="m" data-astro-cid-jbau52rq>m</option></select></label><button type="button" class="pt-btn pt-btn-primary" data-scale-confirm data-astro-cid-jbau52rq>Mark 2 points</button><button type="button" class="pt-btn" data-scale-clear data-astro-cid-jbau52rq>Clear scale</button></div><p class="pt-scale-status" data-scale-status data-astro-cid-jbau52rq>Scale inactive</p></div><p class="pt-trust" data-astro-cid-jbau52rq>Photos and measurements stay in your browser for this tool. We reimplemented pro features in-house (not a paste of another siteâs private code).<a href="/privacy" data-astro-cid-jbau52rq>Privacy</a></p></div></section>
105<script src="/protractor-app.js" defer></script>
105</section><section class="content-section" aria-labelledby="features-title"><div class="section-heading"><p class="section-kicker">Features</p><h2 id="features-title">What this online protractor tool includes</h2><p>Built as a focused protractor tool for real tasks: classroom diagrams, design screenshots, DIY photos, and quick geometry checksânot a download wall or ad maze.</p></div><div class="feature-grid"><article><img src="/images/feature-drag.svg" width="640" height="360" alt="Drag handles on an online protractor to measure degrees" loading="lazy"><h3>Drag-to-measure arms</h3><p>Place the center on the vertex and drag each ray. Live degrees update as you move, with optional 5°, 15°, or 45° snap so a free online protractor feels steady on common angles.</p></article><article><img src="/images/feature-image.svg" width="640" height="360" alt="Measure angle on image with online protractor overlay" loading="lazy"><h3>Measure angles on images</h3><p>Upload a file or paste a screenshot, then pan and zoom. This is the everyday screen protractor workflow when the angle lives in a photo, PDF page capture, or UI mockup.</p></article><article><img src="/images/feature-mobile.svg" width="640" height="360" alt="Mobile loupe magnifier while using a screen protractor" loading="lazy"><h3>Mobile loupe while dragging</h3><p>On small screens, a magnifier appears while you drag handles so fingers stop blocking the vertexâone reason this protractor tool aims to feel better than bare-bones online protractors on phones.</p></article><article><img src="/images/feature-scale.svg" width="640" height="360" alt="Set real-world scale on a protractor tool for length in cm" loading="lazy"><h3>Optional real-world scale</h3><p>Calibrate with a known length in the photo. Beyond pure angle measure, the protractor tool can show arm length in cm, mm, in, or m for DIY and site photos.</p></article></div></section><section class="content-section" aria-labelledby="what-title"><div class="section-heading"><p class="section-kicker">Definition</p><h2 id="what-title">What is an online protractor?</h2></div><div class="prose-block"><p>An <strong>online protractor</strong> is a browser-based virtual protractor you use to measure angles on a screen, diagram, or photo without a plastic tool. A good <strong>protractor tool</strong> lets you set a vertex, align two sides, and read degrees immediatelyâoften with image upload so you can measure angle on image files from schoolwork, architecture drafts, or crafts.</p><p>Unlike a shopping result for a digital protractor gadget, ProtractorTool is software that runs as a free online protractor in Chrome, Safari, Firefox, and Edge. It is also a practical screen protractor: when you cannot print a PDF or place a physical tool on the monitor, you overlay this online protractor on a screenshot instead.</p><p>People also search for virtual protractor, free online protractor, and protractor tool onlineâthe same job with different words. This page is that job: measure angles quickly, keep privacy simple, and export a result you can share.</p></div></section><section class="content-section" aria-labelledby="how-title"><div class="section-heading"><p class="section-kicker">How to</p><h2 id="how-title">How to use this free online protractor</h2><p>Three steps cover almost every use of the protractor tool above.</p></div><div class="step-grid"><article><span>01</span><h3>Open the free online protractor</h3><p>Stay on this page. The protractor tool loads in your browserâno install and no account.</p></article><article><span>02</span><h3>Optional: add a photo or screenshot</h3><p>Upload an image or paste a screenshot, then pan and zoom so the angle fills the view.</p></article><article><span>03</span><h3>Align the arms and read degrees</h3><p>Drag the center to the vertex and each arm along a side. Snap helps common angles; copy or export when done.</p></article></div><div class="prose-block tight"><p>Tips: turn snap off for odd angles; use 360° mode when the smaller interior angle is not what you need; export PNG if a teacher or teammate wants proof of the reading from your online protractor session.</p></div></section><section class="content-section" aria-labelledby="why-title"><div class="section-heading"><p class="section-kicker">Why ProtractorTool</p><h2 id="why-title">Why choose this protractor tool</h2></div><div class="why-grid"><article><h3>Faster first measurement</h3><p>The online protractor is ready in the first screen. You are not forced through accounts, installer
105s, or long marketing before you can drag an arm.</p></article><article><h3>Built for photos and screenshots</h3><p>Paste support and pan/zoom make measure-angle-on-image work feel natural for a modern screen protractor workflow.</p></article><article><h3>Honest privacy model</h3><p>Angle math and image pixels stay in the browser for the tool itself. We do not pretend a free online protractor needs your photo library on a server.</p></article><article><h3>Mobile-aware controls</h3><p>Loupe magnifier and large handles reduce the usual pain of using a protractor tool with a thumb on a small display.</p></article></div></section><section class="content-section" aria-labelledby="tips-title"><div class="section-heading"><p class="section-kicker">Pro tips</p><h2 id="tips-title">Tips, limits, and better readings</h2></div><ul class="tips-list"><li><strong>Prefer straight-on photos.</strong> Perspective warps angles. For roof pitch or furniture joints, shoot square to the surface before using the online protractor.</li><li><strong>Use the largest clear crop.</strong> More pixels between vertex and arms improve how precisely you can place this protractor tool.</li><li><strong>Verify with a known 90°.</strong> Align arms on a square corner in the same image to sanity-check your free online protractor setup.</li><li><strong>Snap is optional.</strong> Leave snap on for homework triangles; turn it off for design QA where 37.5° matters.</li><li><strong>Know the limit.</strong> A browser screen protractor is ideal for learning, drafting review, and DIY estimatesânot certified structural or medical measurement.</li></ul></section><section class="content-section" aria-labelledby="use-title"><div class="section-heading"><p class="section-kicker">Use cases</p><h2 id="use-title">When a free online protractor helps</h2></div><div class="use-grid"><article><h3>Geometry homework</h3><p><strong>Scenario:</strong> worksheet photo. <strong>Method:</strong> upload, 180° mode, snap 5°.<strong>Output:</strong> degree labels to check acute/obtuse answers with an online protractor.</p></article><article><h3>Design & UI screenshots</h3><p><strong>Scenario:</strong> diagonal icon or chart. <strong>Method:</strong> paste screenshot, snap off.<strong>Output:</strong> precise degrees for handoffâclassic screen protractor job.</p></article><article><h3>DIY & woodworking photos</h3><p><strong>Scenario:</strong> miter or roof photo. <strong>Method:</strong> upload, set scale on a tape measure in frame. <strong>Output:</strong> angle plus rough real length from one protractor tool session.</p></article><article><h3>Teaching on a projector</h3><p><strong>Scenario:</strong> classroom display. <strong>Method:</strong> blank canvas or diagram image, large readout. <strong>Output:</strong> live virtual protractor demo without plastic tools for every student.</p></article></div></section><section id="faq" class="content-section faq-section" aria-labelledby="faq-title"><div class="section-heading"><p class="section-kicker">FAQ</p><h2 id="faq-title">Online protractor FAQ</h2><p>Straight answers about this free protractor tool, privacy, and measuring angles on photos.</p></div><div class="faq-list"><details open><summary><span>Is this online protractor free to use?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Yes. ProtractorTool is a free online protractor and protractor tool with no account and no install. You can measure angles, upload photos, paste screenshots, copy the degree reading, and export a PNG without paying.</p></details><details><summary><span>How do I measure an angle on a picture or photo?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Upload an image or paste a screenshot (Ctrl/â+V), drag the protractor center to the angle vertex, then drag each arm to match the two sides. The online protractor shows the degrees live. Zoom with the scroll wheel and pan by dragging empty image areas.</p></details>
105<details><summary><span>Do I need to download a protractor tool app or Chrome extension?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>No. This protractor tool runs in a modern browser on desktop or phone. You do not need a native app, printer, or browser extension to measure angles online.</p></details><details><summary><span>Is my uploaded image private?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Images and screenshots are processed only in your browser for this online protractor session. They are not uploaded to ProtractorTool servers for angle calculation. See our Privacy Policy for analytics and hosting details.</p></details><details><summary><span>Can I use this screen protractor on my phone?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Yes. The screen protractor works on mobile browsers. While you drag a handle, a loupe (magnifier) appears so your finger does not hide the vertexâdesigned to make phone measuring less frustrating than basic tools.</p></details><details><summary><span>What is the difference between 180° and 360° mode?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>180° mode matches a classic semicircle protractor and reports the smaller interior angle for everyday geometry. 360° mode supports full-circle readings when you need direction-style or reflex angles. Switch modes from the toolbar above the canvas.</p></details><details><summary><span>How accurate is a free online protractor tool?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Accuracy depends on image resolution, perspective, and how carefully you align the arms. For homework diagrams and design screenshots this free online protractor is usually excellent. For certified engineering, medical, or construction sign-off, use calibrated physical instrumentsâbrowser pixels are not a legal metrology standard.</p></details><details><summary><span>What does Set scale do on this protractor tool?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Set scale lets you mark a known real-world length on the image (for example 10 cm on a ruler in the photo). After calibration, the protractor tool can express arm length in cm, mm, in, or mânot only pixelsâso DIY and construction photos become more useful.</p></details><details><summary><span>Can I export or copy the measured angle?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Yes. Use Copy angle for the current degrees, or Export PNG to download the canvas with your online protractor overlay for notes, homework, or design review.</p></details><details><summary><span>Is this a virtual protractor or a digital protractor tool?</span><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 7.5 10 12.5 15 7.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6"></path></svg></summary><p>Both terms fit. It is a virtual protractor you use in the browser and a digital protractor tool with snap, image background, scale, and export. It is not a shopping page for a physical Mitutoyo-style device.</p></details></div></section><section class="final-section" aria-labelledby="final-title"><p class="section-kicker">Ready</p><h2 id="final-title">Back to the online protractor</h2><p>Open the free protractor tool, align the arms, and copy your angle. Photos stay in the browser while you measure.</p><a href="#tool">Start measuring</a></section></main><footer class="relative border-t border-gray-200 dark:border-gray-800 not-prose bg-white dark:bg-[#1a1a1a]" data-astro-cid-w622twah><div class="absolute inset-0 pointer-events-none" aria-hidden="true" data-astro-cid-w622twah></div><div class="relative max-w-5xl mx-auto px-4 sm:px-6 text-gray-600 dark:text-gray-400" data-astro-cid-w622twah><div class="grid grid-cols-12 gap-4 gap-y-8 sm:gap-8 py-8 md:py-12" data-astro-cid-w622twah><div class="col-span-12 lg:col-span-4" data-astro-cid-w622twah><div class="mb-2" data-astro-cid-w622twah><a class="inline-flex items-center font-bold text-xl text-gray-900 dark:text-white no-underline hover:opacity-90" href="/" aria-label="ProtractorTool" data-astro-cid-w622twah><span class="brand-mark" aria-hidden="true" data-astro-cid-f7espo7c><svg viewBox="0 0 32 32" width="22" height="22" fill="none" data-astro-cid-f7espo7c><path d="M5 24a11 11 0 0 1 22 0" stroke="currentColor" stroke-width="2" stroke-linecap="round" opacity="0.9" data-astro-cid-f7espo7c></path><path d="M16 24V9" stroke="var(--action, #0071e3)" stroke-width="2" stroke-linecap="round" data-astro-cid-f7espo7c></path><path d="M16 24L25.5 16.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" data-astro-cid-f7espo7c></path><circle cx="16" cy="24" r="2.2" fill="var(--action, #0071e3)" data-astro-cid-f7espo7c></circle><path d="M10 15.5h1.2M13.2 12.2h1.2M17.8 11.2h1.2M22 13.8h1.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" opacity="0.45" data-astro-cid-f7espo7c></path></svg></span><span class="brand-word" data-astro-cid-f7espo7c>Protractor<span class="brand-tld" data-astro-cid-f7espo7c>Tool</span></span></a></div><div class="text-sm text-gray-500 dark:text-gray-400 flex gap-1 flex-wrap" data-astro-cid-w622twah><a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/tools" data-astro-cid-w622twah>Tools</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/" data-astro-cid-w622twah>Online Protractor</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/about" data-astro-cid-w622twah>About</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/security" data-astro-cid-w622twah>Security</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/terms" data-astro-cid-w622twah>Terms</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/privacy" data-astro-cid-w622twah>Privacy</a> · <a class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:underline transition duration-150 ease-in-out" href="/disclaimer" data-astro-cid-w622twah>Disclaimer</a></div></div></div><div class="md:flex md:items-center md:justify-between py-6 md:py-8 border-t border-gray-100 dark:border-gray-800" data-astro-cid-w622twah><div class="text-sm mr-4 text-gray-500 dark:text-gray-400" data-astro-cid-w622twah> 106 <span class="text-gray-500">© 2026 ProtractorTool.com. Free online protractor â browser only.</span> 107 </div></div></div></footer>
107<script type="application/ld+json">[{"@context":"https://schema.org","@type":"WebSite","name":"ProtractorTool","url":"https://protractortool.com/","description":"Free online protractor tool for measuring angles on a canvas, photos, and screenshots in the browser.","inLanguage":"en"},{"@context":"https://schema.org","@type":"WebApplication","name":"ProtractorTool Online Protractor","url":"https://protractortool.com/","applicationCategory":"UtilitiesApplication","operatingSystem":"Any","browserRequirements":"Requires a modern browser with HTML5 canvas","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"description":"Browser-only online protractor and protractor tool to measure angles on photos and screenshots with snap, scale, and PNG export."},{"@context":"https://schema.org","@type":"HowTo","name":"How to measure angles with this online protractor","description":"Use the free ProtractorTool online protractor to measure angles on screen or on an image.","step":[{"@type":"HowToStep","position":1,"name":"Open the free online protractor","text":"Stay on this page. The protractor tool loads in your browserâno install and no account."},{"@type":"HowToStep","position":2,"name":"Optional: add a photo or screenshot","text":"Upload an image or paste a screenshot, then pan and zoom so the angle fills the view."},{"@type":"HowToStep","position":3,"name":"Align the arms and read degrees","text":"Drag the center to the vertex and each arm along a side. Snap helps common angles; copy or export when done."}]},{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Is this online protractor free to use?","acceptedA
107nswer":{"@type":"Answer","text":"Yes. ProtractorTool is a free online protractor and protractor tool with no account and no install. You can measure angles, upload photos, paste screenshots, copy the degree reading, and export a PNG without paying."}},{"@type":"Question","name":"How do I measure an angle on a picture or photo?","acceptedAnswer":{"@type":"Answer","text":"Upload an image or paste a screenshot (Ctrl/â+V), drag the protractor center to the angle vertex, then drag each arm to match the two sides. The online protractor shows the degrees live. Zoom with the scroll wheel and pan by dragging empty image areas."}},{"@type":"Question","name":"Do I need to download a protractor tool app or Chrome extension?","acceptedAnswer":{"@type":"Answer","text":"No. This protractor tool runs in a modern browser on desktop or phone. You do not need a native app, printer, or browser extension to measure angles online."}},{"@type":"Question","name":"Is my uploaded image private?","acceptedAnswer":{"@type":"Answer","text":"Images and screenshots are processed only in your browser for this online protractor session. They are not uploaded to ProtractorTool servers for angle calculation. See our Privacy Policy for analytics and hosting details."}},{"@type":"Question","name":"Can I use this screen protractor on my phone?","acceptedA
107nswer":{"@type":"Answer","text":"Yes. The screen protractor works on mobile browsers. While you drag a handle, a loupe (magnifier) appears so your finger does not hide the vertexâdesigned to make phone measuring less frustrating than basic tools."}},{"@type":"Question","name":"What is the difference between 180° and 360° mode?","acceptedAnswer":{"@type":"Answer","text":"180° mode matches a classic semicircle protractor and reports the smaller interior angle for everyday geometry. 360° mode supports full-circle readings when you need direction-style or reflex angles. Switch modes from the toolbar above the canvas."}},{"@type":"Question","name":"How accurate is a free online protractor tool?","acceptedAnswer":{"@type":"Answer","text":"Accuracy depends on image resolution, perspective, and how carefully you align the arms. For homework diagrams and design screenshots this free online protractor is usually excellent. For certified engineering, medical, or construction sign-off, use calibrated physical instrumentsâbrowser pixels are not a legal metrology standard."}},{"@type":"Question","name":"What does Set scale do on this protractor tool?","acceptedA
107nswer":{"@type":"Answer","text":"Set scale lets you mark a known real-world length on the image (for example 10 cm on a ruler in the photo). After calibration, the protractor tool can express arm length in cm, mm, in, or mânot only pixelsâso DIY and construction photos become more useful."}},{"@type":"Question","name":"Can I export or copy the measured angle?","acceptedAnswer":{"@type":"Answer","text":"Yes. Use Copy angle for the current degrees, or Export PNG to download the canvas with your online protractor overlay for notes, homework, or design review."}},{"@type":"Question","name":"Is this a virtual protractor or a digital protractor tool?","acceptedAnswer":{"@type":"Answer","text":"Both terms fit. It is a virtual protractor you use in the browser and a digital protractor tool with snap, image background, scale, and export. It is not a shopping page for a physical Mitutoyo-style device."}}]},{"@context":"https://schema.org","@type":"Organization","name":"ProtractorTool","url":"https://protractortool.com/"}]</script>
107<div id="tool-feedback-root" class="tfa-fb-root" hidden data-endpoint="https://feedback.remixtranslator.com/api/submit" data-product="ProtractorTool"><div class="tfa-fb-overlay" data-feedback-close tabindex="-1"></div><section class="tfa-fb-panel" role="dialog" aria-modal="true" aria-labelledby="tfa-fb-title" aria-describedby="tfa-fb-subtitle"><div class="tfa-fb-form-view"><header class="tfa-fb-header"><div><h2 id="tfa-fb-title" class="tfa-fb-title">Send feedback</h2><p id="tfa-fb-subtitle" class="tfa-fb-subtitle">Help improve ProtractorTool â bugs, ideas, or questions are welcome.</p></div><button type="button" class="tfa-fb-close" data-feedback-close aria-label="Close feedback form">Ã</button></header><form id="tfa-fb-form" class="tfa-fb-form" novalidate><fieldset class="tfa-fb-fieldset"><legend class="tfa-fb-label">What's this about?</legend><div class="tfa-fb-types" role="group" aria-label="Feedback type"><button type="button" class="tfa-fb-type is-active" data-type="bug" aria-pressed="true">Something's not working</button><button type="button" class="tfa-fb-type" data-type="feature" aria-pressed="false">I have an idea</button><button type="button" class="tfa-fb-type" data-type="question" aria-pressed="false">I have a question</button><button type="button" class="tfa-fb-type" data-type="thanks" aria-pressed="false">Just saying thanks</button><button type="button" class="tfa-fb-type" data-type="other" aria-pressed="false">Something else</button></div></fieldset><label class="tfa-fb-field"><span class="tfa-fb-label">Tell us more</span><textarea name="message" id="tfa-fb-message" required maxlength="5000" rows="4" placeholder="What happened? What would make this better?"></textarea></label><label class="tfa-fb-field"><span class="tfa-fb-label">Your email <span class="tfa-fb-req">*</span></span><input name="email" id="tfa-fb-email" type="email" required autocomplete="email" placeholder="[email protected]"><span class="tfa-fb-helper">Required so we can reply if needed.</span></label><!-- Honeypot --><input class="tfa-fb-honeypot" name="website" type="text" tabindex="-1" autocomplete="off" aria-hidden="true"><p id="tfa-fb-error" class="tfa-fb-error" role="alert" hidden></p><button type="submit" id="tfa-fb-submit" class="tfa-fb-submit">Send feedback</button></form></div><div class="tfa-fb-success-view" hidden><button type="button" class="tfa-fb-close tfa-fb-close-success" data-feedback-close aria-label="Close">Ã</button><div class="tfa-fb-success-inner"><p class="tfa-fb-success-title">Thanks â we received it.</p><p id="tfa-fb-success-body" class="tfa-fb-success-body"></p><div class="tfa-fb-success-actions"><button type="button" class="tfa-fb-btn-secondary" data-feedback-close>Close</button><button type="button" class="tfa-fb-submit tfa-fb-submit-inline" id="tfa-fb-again">Send another</button></div></div></div></section></div>
107<script type="module">(()=>{if(typeof window>`u`||window.__toolFeedbackModal)return;window.__toolFeedbackModal=!0;let e=document.getElementById(`tool-feedback-root`);if(!e)return;let t=e.getAttribute(`data-endpoint`)||``,n=e.getAttribute(`data-product`)||`YourTool.im`,r=document.getElementById(`tfa-fb-form`),i=e.querySelector(`.tfa-fb-form-view`),a=e.querySelector(`.tfa-fb-success-view`),o=document.getElementById(`tfa-fb-error`),s=document.getElementById(`tfa-fb-submit`),c=document.getElementById(`tfa-fb-success-body`),l=document.getElementById(`tfa-fb-again`),u=Array.from(e.querySelectorAll(`.tfa-fb-type`)),d=`bug`,f=``,p={bug:`Something's not working`,feature:`I have an idea`,question:`I have a question`,thanks:`Just saying thanks`,other:`Something else`},m=e=>{o&&(o.hidden=!e,o.textContent=e||``)},h=e=>{d=e,u.forEach(t=>{let n=t.dataset.type===e;t.classList.toggle(`is-active`,n),t.setAttribute(`aria-pressed`,n?`true`:`false`)})},g=()=>{i&&(i.hidden=!1),a&&(a.hidden=!0),m(``),s&&(s.disabled=!1,s.textContent=`Send feedback`)},_=e=>{i&&(i.hidden=!0),a&&(a.hidden=!1),c&&(c.textContent=e?`Thanks for helping improve ${n}. We'll review your message and reply if needed.`:`Your feedback was sent. Thanks for helping improve ${n}.`)},v=()=>{g(),e.hidden=!1,e.classList.add(`is-open`),f=document.body.style.overflow,document.body.style.overflow=`hidden`,window.setTimeout(()=>document.getElementById(`tfa-fb-message`)?.focus(),30)},y=()=>{e.classList.remove(`is-open`),e.hidden=!0,document.body.style.overflow=f},b=e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);u.forEach(e=>{e.addEventListener(`click`,()=>h(e.dataset.type||`other`))}),e.addEventListener(`click`,e=>{e.target?.closest?.(`[data-feedback-close]`)&&(e.preventDefault(),y())}),l?.addEventListener(`click`,()=>{r?.reset(),h(`bug`),g(),document.getElementById(`tfa-fb-message`)?.focus()}),r?.addEventListener(`submit`,async e=>{if(e.preventDefault(),!r||!s)return;let i=r.elements.namedItem(`message`),a=r.elements.namedItem(`email`),o=r.elements.namedItem(`website`),c=(i?.value||``).trim(),l=(a?.value||``).trim();if(!c){m(`Please write a short message before sending.`),i?.focus();return}if(!l||!b(l)){m(`Please enter a valid email so we can reply if needed.`),a?.focus();return}m(``),s.disabled=!0,s.textContent=`Sending...`;try{let e=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({site_domain:window.location.hostname.replace(/^www\./,``),type:d,subject:`Website feedback: ${p[d]||d}`,message:c,email:l,page_url:window.location.href,referrer:document.referrer||``,website:o?.value||``,metadata:{language:document.documentElement.lang||`en`,source:`header-feedback`,route:window.location.pathname,product:n}})}),i=await e.json().catch(()=>({}));if(!e.ok||!i.ok)throw Error(i.error||`submit_failed`);r.reset(),h(`bug`),_(l)}catch(e){let t=e instanceof TypeError;m(t?`We couldn't send your feedback right now. Check your connection and try again.`:`Something went wrong while sending. Please try again in a moment.`),s.disabled=!1,s.textContent=`Send feedback`}}),document.addEventListener(`click`,e=>{e.target?.closest?.(`[data-feedback-trigger]`)&&(e.preventDefault(),v())}),document.addEventListener(`keydown`,t=>{t.key===`Escape`&&e.classList.contains(`is-open`)&&y()})})();</script>
107<script>(function(){const defaultTheme = "system"; 108 109 if (!window.twoFactorUiInitialized) { 110 window.twoFactorUiInitialized = true; 111 112 const header = document.getElementById('header'); 113 const themeButton = document.querySelector('[data-aw-toggle-color-scheme]'); 114 const menuButton = document.querySelector('[data-aw-toggle-menu]'); 115 const mobileNav = document.querySelector('[data-mobile-nav]'); 116 117 function setMenuOpen(isOpen) { 118 menuButton?.classList.toggle('expanded', isOpen); 119 menuButton?.setAttribute('aria-expanded', String(isOpen)); 120 document.body.classList.toggle('overflow-hidden', isOpen); 121 header?.classList.toggle('expanded', isOpen); 122 mobileNav?.classList.toggle('hidden', !isOpen); 123 } 124 125 menuButton?.addEventListener('click', () => { 126 const open = menuButton.getAttribute('aria-expanded') !== 'true'; 127 setMenuOpen(open); 128 }); 129 130 mobileNav?.addEventListener('click', (event) => { 131 if (event.target.closest('a')) setMenuOpen(false); 132 }); 133 134 window.matchMedia('(min-width: 1024px)').addEventListener('change', (event) => { 135 if (event.matches) setMenuOpen(false); 136 }); 137 138 const isDark = document.documentElement.classList.contains('dark'); 139 themeButton?.setAttribute('aria-pressed', String(isDark)); 140 themeButton?.addEventListener('click', () => { 141 if (defaultTheme?.endsWith(':only')) return; 142 143 const nextIsDark = !document.documentElement.classList.contains('dark'); 144 document.documentElement.classList.toggle('dark', nextIsDark); 145 themeButton.setAttribute('aria-pressed', String(nextIsDark)); 146 147 try { 148 localStorage.setItem('theme', nextIsDark ? 'dark' : 'light'); 149 } catch { 150 // The visual choice still applies when browser storage is unavailable. 151 } 152 }); 153 154 let scrollFramePending = false; 155 function syncHeaderState() { 156 header?.classList.toggle('scroll', window.scrollY > 60); 157 scrollFramePending = false; 158 } 159 160 syncHeaderState(); 161 document.addEventListener( 162 'scroll', 163 () => { 164 if (scrollFramePending) return; 165 scrollFramePending = true; 166 window.requestAnimationFrame(syncHeaderState); 167 }, 168 { passive: true } 169 ); 170 } 171})();</script>
171<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"c5cd0ab6b11f4e9e87d28bf443815411","r":1,"spa":2}' crossorigin="anonymous"></script>
171 172</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.