100% Free · Private by design

Free Online PDF Tools, OCR, Calculators & Converters

Use 40+ free online tools to convert and edit PDFs, extract text with OCR, calculate results, convert units, generate QR codes and more. No signup, no watermark, and private browser-based processing.

⌘ K
Files stay on your device ✓ 100% Free ✓ No signup ✓ No watermark
Read free guides & practical how-tos →
40+
Purpose-built tools
100%
Browser-based privacy
0
Server uploads required
Free
No signup or watermark
01

PDF Converter

Document conversion
Most Popular Guide & FAQ →
DOCUMENT WORKFLOW

Convert files without compromising quality

Move between PDF, Word, Excel, JPG and PNG with crisp output and a workflow that stays entirely in your browser.

8 precision toolsLocal processingNo watermark
02

OCR Tools

Text recognition
Smart OCR Guide & FAQ →
TEXT EXTRACTION

Turn pixels into editable, searchable text

Capture text from photos, screenshots and scanned PDFs with private on-device recognition — ready to copy, search and reuse.

3 OCR toolsScan + searchable outputLocal processing
03

Edit PDF

Organize & annotate
8 Tools Guide & FAQ →
PDF CONTROL CENTER

Make every document work exactly the way you need

Merge, split, compress, rotate, sign, remove pages and add text with a focused editing toolkit built for quick results.

8 editing toolsPrecise page controlNo software
04

Generators

Create instantly
Popular Guide & FAQ →
INSTANT CREATION

Create useful digital assets in seconds

Generate QR codes, secure passwords, color values and polished placeholder text without accounts, limits or complicated setup.

4 smart generatorsInstant downloadFree to use
05

Calculators

Fast, reliable answers
9 Tools Guide & FAQ →
SMART EVERYDAY MATH

Accurate answers without spreadsheet work

Calculate age, BMI, calories, tips, discounts, loans, body fat and hydration with clear inputs and results you can understand.

9 calculatorsClear formulasInstant results
06

Converters

Everyday conversions
One Click Guide & FAQ →
FAST CONVERSIONS

Switch formats, units and values instantly

Convert measurements, currencies, text case and color formats through a streamlined interface made for everyday work.

4 convertersLive resultsSimple workflow

Media Tools

Audio from your own files — no YouTube links
New
AUDIO WORKFLOW

Convert, trim, merge and shrink audio — all in your browser

Upload your own video or audio file and get a real MP3 or WAV out — no server upload, no accounts, no links to other sites required.

4 audio toolsLocal processingReal MP3 encoding

Useful tools without uploads, accounts or complicated steps

Toolnova brings document utilities, OCR, calculators, converters and generators into one mobile-friendly page. File-based tools are designed to process data in your browser instead of sending documents to a Toolnova server.

Browser-based processing

PDFs, images and text are handled locally by the page whenever the selected tool supports client-side processing.

No account required

Open a tool, enter your information or choose a file, and get a result without creating a profile or starting a subscription.

Designed for mobile

Responsive layouts, large touch targets and full-screen tool dialogs make common tasks easier on phones, tablets and computers.

Are Toolnova tools free?

Yes. The tools on this page can be used without a paid account. The site may display advertising to help support free access.

Are my uploaded files stored?

Toolnova's file tools are designed to process files in your browser. The page does not intentionally upload your selected documents to a Toolnova server. Third-party libraries may be downloaded to your browser so the tools can run.

Do the calculators provide professional advice?

No. Health and financial calculator results are estimates for general information. Verify important decisions with a qualified professional or official source.

Why can a converted document look different?

Complex layouts, uncommon fonts, scanned pages and protected files can affect conversion quality. Review downloaded files before relying on them.

How can I report a problem?

Use the Contact link in the footer and include the tool name, browser, device and a description of what happened. Do not send sensitive documents.

Important: Tool results are provided for general informational and utility purposes. Always review converted files and independently verify medical, financial, legal or safety-related results.

`);w.document.close();setTimeout(()=>w.print(),250)} function tnResultNextChips(){const k=window.__tnCurrentToolKey;return (TN_RELATED[k]||[]).slice(0,3).map(x=>TOOLS[x]?``:'').join('')} function tnEnhanceResultBox(box){if(!box||box.dataset.tnEnhanced||box.querySelector('.progress-wrap'))return;const txt=box.textContent||'';if(/error|could not|invalid|loading|reading|rendering|building|converting|extracting|optimizing/i.test(txt)&&!box.classList.contains('green')&&!box.querySelector('.result-value,textarea'))return;box.dataset.tnEnhanced='1';box.classList.add('tn-result-enhanced');const info=tnOutputInfo(),size=info&&info.blob?fmtSize(info.blob.size):'Ready';const suite=document.createElement('div');suite.className='tn-result-suite';suite.innerHTML=`
Result readyReview it, then choose what to do next.
${size} · processed locally when supported
Continue with${tnResultNextChips()||''}
`;box.appendChild(suite);tnSetStep(3)} function tnScanForResults(){const stage=document.getElementById('tn-tool-stage');if(!stage)return;stage.querySelectorAll('.result-box').forEach(tnEnhanceResultBox);const qr=document.querySelector('#qr-out');if(qr&&qr.querySelector('canvas')&&!qr.dataset.tnEnhanced){qr.dataset.tnEnhanced='1';const wrap=document.createElement('div');wrap.className='result-box green';wrap.innerHTML='
QR code ready
';while(qr.firstChild)wrap.appendChild(qr.firstChild);qr.appendChild(wrap);setTimeout(()=>tnEnhanceResultBox(wrap),0)}} function tnStartResultObserver(){if(window.__tnResultObserver)window.__tnResultObserver.disconnect();const stage=document.getElementById('tn-tool-stage');if(!stage)return;window.__tnResultObserver=new MutationObserver(()=>{clearTimeout(window.__tnResultScanTimer);window.__tnResultScanTimer=setTimeout(tnScanForResults,30)});window.__tnResultObserver.observe(stage,{childList:true,subtree:true});setTimeout(tnScanForResults,60)} // ── MODAL ENGINE ────────────────────────────────────────────────────────────── const TOOL_NOTICES = { bmi:'Health result estimate only; not medical advice.', bmr:'Health result estimate only; not medical advice.', calorie:'Health result estimate only; not medical advice.', bodyfat:'Health result estimate only; not medical advice.', water:'Health result estimate only; not medical advice.', loan:'Financial estimate only. Lender fees, taxes and terms can change the actual cost.', currency:'Approximate static rates only. Confirm current rates with a bank or trusted market source.', pdf2word:'Creates a real .docx file from extracted text. Complex layouts, fonts, images and scanned pages may not be preserved.', word2pdf:'Text-focused conversion. Complex Word formatting may not be preserved.', pdf2excel:'Creates a real .xlsx workbook from detected text rows. Complex tables and scanned PDFs may require OCR or manual cleanup.' }; // ── DYNAMIC CANONICAL: point ?tool=X states at the matching dedicated static page ── // Each of these tools has its own real, content-rich page (e.g. /pdf-to-word.html). // When that tool is opened here via ?tool=X, the canonical tag switches to point at // that specific page instead of the homepage, so Google consolidates ranking signals // on the one authoritative URL per tool rather than splitting them across a generic // homepage canonical and a separate static page. const TN_TOOL_PAGE_SLUG = { age:'age-calculator', bmi:'bmi-calculator', bmr:'bmr-calculator', bodyfat:'body-fat-calculator', calorie:'calorie-calculator', water:'water-intake-calculator', tip:'tip-calculator', discount:'discount-calculator', loan:'loan-calculator', unit:'unit-converter', currency:'currency-converter', case:'text-case-converter', wordcount:'word-counter', quiz:'general-knowledge-quiz', memory:'memory-card-game', merge:'merge-pdf', split:'split-pdf', compress:'compress-pdf', rotate:'rotate-pdf', deletepages:'delete-pdf-pages', extractpages:'extract-pdf-pages', sign:'sign-pdf', addtext:'add-text-to-pdf', img2pdf:'image-to-pdf', pdf2jpg:'pdf-to-jpg', pdf2png:'pdf-to-png', pdf2text:'pdf-to-text', ocr:'image-to-text', scanocr:'scan-pdf-to-text', pdf2word:'pdf-to-word', word2pdf:'word-to-pdf', pdf2excel:'pdf-to-excel', qr:'qr-code-generator', password:'password-generator', color:'color-code-converter', hash:'lorem-ipsum-generator', docscanner:'document-scanner', mp3convert:'mp3-converter', audiotrim:'audio-trimmer', audiomerge:'audio-merger', audiocompress:'audio-compressor', audiovolume:'volume-booster', audiofade:'audio-fade', audiospeed:'audio-speed-changer', ringtone:'ringtone-maker', audiosplit:'audio-splitter', removesilence:'remove-silence', }; function tnUpdateCanonicalForTool(key){ const slug = TN_TOOL_PAGE_SLUG[key]; const link = document.querySelector('link[rel="canonical"]'); if(!link) return; link.href = slug ? `https://toolnova.tools/${slug}.html` : 'https://toolnova.tools/'; } function tnResetCanonical(){ const link = document.querySelector('link[rel="canonical"]'); if(link) link.href = 'https://toolnova.tools/'; } async function openTool(key){ const tool=TOOLS[key]; if(!tool) return; window.__tnCurrentToolKey=key; const modal=document.getElementById('modal-content'); const overlay=document.getElementById('overlay'); const meta=tnMeta(key); modal.classList.remove('fullscreen'); modal.style.setProperty('--tn-tool-accent',meta.accent); const needsLibs = PDF_TOOL_KEYS.has(key) || ['ocr','scanocr','docscanner','qr'].includes(key); const notice = TOOL_NOTICES[key] ? `
${TOOL_NOTICES[key]}
` : ''; const loading='
Preparing secure workspace…Loading only the browser libraries this tool needs.
'; modal.innerHTML=`${tnShellMarkup(key,tool,needsLibs?loading:tool.render(),notice)}`; overlay.classList.add('active'); overlay.setAttribute('aria-hidden','false'); document.body.style.overflow='hidden'; document.title = tnPlainTitle(tool.title) + ' | Toolnova'; modal.focus({preventScroll:true}); tnUpdateCanonicalForTool(key); if(needsLibs){ try{await ensureLibsForTool(key);const loadingEl=document.getElementById('tool-loading');if(loadingEl)loadingEl.outerHTML=tool.render();} catch(err){const loadingEl=document.getElementById('tool-loading');if(loadingEl)loadingEl.innerHTML='
This tool could not load its browser library. Check your connection and try again.
';console.error(err)} } if(tool.init) tool.init(); tnSetStep(1); tnStartResultObserver(); } function toggleModalFullscreen(){ const modal=document.getElementById('modal-content'); const btn=document.getElementById('fs-btn'); const isFull=modal.classList.toggle('fullscreen'); if(btn){ btn.textContent = isFull ? '⤡' : '⛶'; btn.title = isFull ? 'Exit full screen' : 'Full screen'; } } function closeTool(updateUrl=true){ if(window.__tnResultObserver){window.__tnResultObserver.disconnect();window.__tnResultObserver=null;} if(window._scannerStream){window._scannerStream.getTracks().forEach(t=>t.stop());window._scannerStream=null;} const overlay=document.getElementById('overlay'); overlay.classList.remove('active'); overlay.setAttribute('aria-hidden','true'); document.body.style.overflow=''; document.getElementById('modal-content').classList.remove('fullscreen'); document.title=TOOLNOVA_HOME_TITLE; tnResetCanonical(); if(updateUrl && (location.hash.startsWith('#tool=') || location.search.includes('tool='))){ safeHistory('pushState', {}, location.pathname || '/'); } const search=document.getElementById('search-input'); if(search) search.focus({preventScroll:true}); } function closeIfOutside(e){if(e.target===document.getElementById('overlay'))closeTool();} document.addEventListener('keydown',e=>{if(e.key==='Escape' && document.getElementById('overlay').classList.contains('active')) closeTool();}); // ── SEARCH ──────────────────────────────────────────────────────────────────── const TOOL_SEARCH_ALIASES = { mp3convert:'mp3 converter video to mp3 audio converter convert video to audio extract audio from video mp4 to mp3 convert to mp3 audio extractor rip audio from video free mp3 converter online mp3 converter download mp3 from video file convert my video to mp3 video audio extractor webm to mp3 mov to mp3 m4a to mp3', audiotrim:'audio trimmer cut audio audio cutter trim mp3 cut mp3 clip audio audio clipper crop audio song cutter mp3 cutter cut a clip from audio trim audio online make ringtone cut a song audio slicer', audiomerge:'audio merger combine audio files join mp3 merge mp3 files combine songs audio joiner concatenate audio files merge audio online join audio clips combine multiple mp3', audiocompress:'audio compressor reduce mp3 size shrink audio file compress mp3 make audio file smaller reduce audio file size lower audio bitrate compress audio online', audiovolume:'volume booster increase volume louder audio boost mp3 volume raise audio volume turn up audio amplify audio increase mp3 volume online', audiofade:'fade in fade out audio fade smooth start end audio add fade to song fade audio online audio fade effect', audiospeed:'change audio speed speed up audio slow down audio audio speed changer speed up song slow down song 2x speed 0.5x speed audio tempo change', ringtone:'ringtone maker make ringtone create ringtone mp3 ringtone cutter iphone ringtone android ringtone free ringtone maker online cut song for ringtone', audiosplit:'audio splitter split audio file split mp3 divide audio into parts split song into parts cut audio into pieces audio file splitter online split long recording', removesilence:'remove silence delete silence from audio cut silence auto trim silence silence remover podcast silence remover remove dead air remove quiet parts audio silence cutter', pdf2word:'pdf to word pdf to doc pdf to docx editable word convert document pdf to docx pdf word converter pdf to editable word turn pdf into word save pdf as word convert pdf document to docx pdf to microsoft word pdf to word without losing formatting editable document converter free pdf to word online pdf to word pdf to word no signup pdf to word no watermark pdf convertor pdf convereter pdfconverter pdf tool pdf tools pdftoword pdf 2 word pdf converter document converter free pdf converter online pdf converter convert pdf online document conversion tools how to convert pdf to word how to convert pdf to word without losing formatting best free pdf converter free pdf tools without signup private pdf converter browser based pdf editor pdf converter without uploading files', word2pdf:'word to pdf doc to pdf docx to pdf document to pdf docx to pdf doc to pdf word pdf converter microsoft word to pdf save word as pdf turn document into pdf document to pdf create pdf from word free word to pdf online word to pdf docx pdf converter word to pdf no signup wordtopdf pdf converter document converter free pdf converter online pdf converter convert pdf online document conversion tools', pdf2jpg:'pdf to jpg pdf to jpeg pdf to image save pdf as picture pdf to jpeg pdf to image pdf image converter pdf pages to jpg save pdf as jpg extract pdf pages as images high quality pdf to jpg pdf to photo convert pdf page to image free pdf to jpg online pdf to jpg pdf jpg converter pdftojpg pdf converter document converter free pdf converter online pdf converter pdf convertor convert pdf online document conversion tools how to convert pdf to jpg', img2pdf:'jpg to pdf jpeg to pdf png to pdf image to pdf photo to pdf pictures into pdf jpg to pdf jpeg to pdf png to pdf convert image to pdf convert jpg to pdf convert png to pdf images to pdf combine images into pdf multiple jpg to pdf multiple photos to pdf scan image to pdf create pdf from images free image to pdf converter online jpg to pdf jpgtopdf pngtopdf pdf converter document converter free pdf converter online pdf converter pdf convertor convert pdf online document conversion tools how to convert jpg to pdf how to convert png to pdf how to turn photos into one pdf', pdf2excel:'pdf to excel pdf to xlsx pdf table csv spreadsheet extract rows pdf to xlsx pdf excel converter extract tables from pdf pdf table extractor pdf spreadsheet converter pdf to editable spreadsheet convert pdf table to excel pdf data extraction document to excel pdf to xls free pdf to excel online pdf to excel pdf table to spreadsheet pdftoexcel pdf converter document converter free pdf converter online pdf converter convert pdf online document conversion tools', pdf2png:'pdf to png pdf page to image transparent image convert pdf to png pdf pages to png pdf image converter save pdf as png extract pdf as png high quality pdf to png pdf page to png pdf png converter convert document to png free pdf to png online pdf to png pdftopng pdf converter document converter free pdf converter online pdf converter pdf convertor convert pdf online document conversion tools', pdf2text:'pdf to text pdf to txt extract text copy words from pdf pdf to txt convert pdf to text pdf text extractor copy text from pdf pdf document to text download pdf as txt read pdf text plain text from pdf convert digital pdf to text free pdf to text online pdf text extractor pdftotext pdf converter document converter free pdf converter online pdf converter pdf convertor convert pdf online document conversion tools how to extract text from pdf', ocr:'image to text photo to text picture to text screenshot to text jpg to text png to text ocr copy words from image image to text converter ocr image to text jpg to text jpeg to text png to text extract text from image copy text from image recognize text from image image ocr online ocr free ocr photo ocr screenshot ocr ocr scanner scan text optical character recognition image recognition text extractor scan to text document scanner searchable pdf recognize text what is ocr how does ocr work how to extract text from an image how to copy text from screenshot how to convert photo to text ocr vs pdf text extraction best free ocr online private browser based ocr image to text without signup ocr accuracy tips how to improve ocr results', scanocr:'scanned pdf to text pdf ocr searchable pdf scan document text ocr pdf pdf ocr scan pdf to text scanned document ocr make pdf searchable searchable pdf converter recognize text in pdf copy text from scanned pdf scanned pdf text extractor ocr scanned document pdf text recognition free pdf ocr online pdf ocr convert scanned pdf to editable text document scanner how to extract text from scanned pdf how to make scanned pdf searchable', docscanner:'document scanner scan document phone camera scan to pdf mobile scanner receipt scanner document camera scan pages searchable pdf camera to pdf OCR scan to text crop deskew enhance black white multi page scanner', merge:'merge pdf combine pdf join pdf put pdfs together multiple pdf one file merge pdf online combine pdf files join pdf pdf merger pdf combiner merge multiple pdfs combine documents append pdf files put pdfs together multiple pdfs into one combine pdf pages free pdf merger online pdf merger merge pdfs without signup merge pdfs privately merge pdfs combine pdfs pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to merge pdf files online how to combine multiple pdfs', split:'split pdf separate pdf divide pdf extract range cut pdf pages split pdf online divide pdf pdf splitter break pdf into pages split pdf by page split pdf by page range separate pdf file save individual pdf pages divide large pdf free pdf splitter online pdf splitter split pdfs pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to split a large pdf', compress:'compress pdf reduce pdf size shrink pdf make pdf smaller optimize pdf email compress pdf online reduce pdf size pdf compressor reduce pdf file size compress pdf without losing quality optimize pdf small pdf file compress pdf for email compress document lower pdf size free pdf compressor online pdf compressor pdf size reducer compres pdf compress pdfs pdf compresser pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to compress pdf without losing quality how to reduce pdf size for email', rotate:'rotate pdf turn pdf page orientation 90 180 270 rotate pdf online pdf rotation tool rotate pdf 90 degrees rotate pdf 180 degrees rotate pdf 270 degrees fix pdf orientation rotate scanned pdf turn pdf clockwise turn pdf counterclockwise free pdf rotator online pdf rotator pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to rotate pdf pages', deletepages:'delete pdf pages remove page erase unwanted blank pages remove pdf pages pdf page remover delete unwanted pdf pages remove blank pages from pdf remove one page from pdf delete multiple pdf pages pdf page deletion edit pdf pages remove pages online free pdf page remover online pdf page remover pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to delete pages from pdf', extractpages:'extract pdf pages save selected pages copy page range extract pages from pdf save selected pdf pages pdf page extractor separate selected pages extract pdf page range copy pages from pdf create pdf from selected pages download individual pdf pages take pages out of pdf free pdf page extractor online pdf page extractor pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to extract pages from pdf', sign:'sign pdf signature electronic signature e sign draw signature type signature sign pdf online add signature to pdf electronic signature pdf e-sign pdf digital signature pdf pdf signature tool draw signature on pdf upload signature to pdf sign document online fill and sign pdf free pdf signer online pdf signer sign pdf without printing esign pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to sign a pdf online how to sign pdf without printing', addtext:'add text to pdf type on pdf write on pdf annotate fill form notes type on pdf write on pdf insert text into pdf add notes to pdf annotate pdf fill pdf online fill pdf form pdf text tool add label to pdf add information to pdf edit pdf online free pdf text editor online pdf text tool pdf editor modify pdf manage pdf pages pdf page tools pdf editing tools pdf organizer how to add text to pdf', qr:'qr code generator qr maker qrcode url to qr link to qr create qr qr code maker create qr code make a qr code qrcode generator qr-code generator url to qr code link to qr code text to qr code website qr code custom qr code download qr code qr code png instant qr code qr maker free no signup qr generator developer tools design tools random generator how to create a qr code how qr codes work generate qr code', password:'password generator random password strong secure password maker symbols random password generator strong password generator secure password generator password creator create strong password complex password custom password length password with symbols password with numbers uppercase password lowercase password random string generator no signup password generator password generater developer tools design tools random generator how to generate a strong password how long should a password be', color:'color code converter hex rgb hsl hex to rgb rgb to hex css color hex converter rgb converter hsl converter hex to hsl hsl to hex rgb to hsl hsl to rgb convert color code web color converter html color code color value converter hex color code rgb color code hsl color code developer color tool developer tools design tools hex vs rgb vs hsl', hash:'lorem ipsum dummy text placeholder text filler paragraph generator lorem ipsum generator lorem generator dummy text generator placeholder text generator sample text generator random text generator dummy content placeholder content lorem ipsum text generate lorem ipsum website placeholder text design placeholder text prototype text latin dummy text random paragraph generator free lorem ipsum developer tools design tools random generator what is lorem ipsum', age:'age calculator birthday date of birth dob how old am i years months days exact age calculator online age calculator free age calculator birthday calculator date of birth calculator chronological age calculator age in years age in months age in days age in hours calculate age from birthday age difference calculator current age calculator birthday age finder age calculater health calculator financial calculator daily calculator how to calculate exact age', bmi:'bmi calculator body mass index height weight healthy range metric imperial body mass index calculator calculate bmi free bmi calculator online bmi calculator bmi calculator metric bmi calculator imperial bmi calculator pounds and feet bmi calculator kilograms healthy weight calculator bmi chart adult bmi calculator height weight calculator body weight index bmi result bmi range bmi calculater health calculator financial calculator daily calculator how is bmi calculated what does bmi mean', tip:'tip calculator gratuity restaurant bill split bill percent tip restaurant tip calculator gratuity calculator calculate tip bill tip calculator split bill calculator tip and split calculator 15 percent tip 18 percent tip 20 percent tip tip per person restaurant bill calculator group tip calculator free tip calculator online tip calculator how much should i tip health calculator financial calculator daily calculator', discount:'discount calculator percent off sale price final price savings coupon percentage discount calculator sale price calculator calculate discount percent off calculator final price calculator price after discount savings calculator discount amount calculator retail discount calculator coupon discount calculator sale calculator original price calculator online discount calculator free discount calculator how much is percentage off health calculator financial calculator daily calculator how to calculate percentage discount', loan:'loan calculator monthly payment interest principal repayment auto personal loan loan payment calculator monthly payment calculator interest calculator loan interest calculator personal loan calculator auto loan calculator monthly loan payment total loan interest loan repayment calculator borrow money calculator principal and interest calculator loan cost calculator free loan calculator online loan calculator payment schedule calculator health calculator financial calculator daily calculator how loan monthly payments work how loan interest is calculated', bmr:'bmr calculator basal metabolic rate calories at rest metabolism basal metabolic rate calculator daily metabolism calculator calories burned at rest resting calorie calculator metabolic rate calculator daily energy calculator bmr by age bmr by weight bmr male bmr female free bmr calculator online bmr calculator minimum daily calories health calculator financial calculator daily calculator how to calculate bmr bmr vs tdee', calorie:'calorie calculator tdee daily calories maintenance weight loss gain calorie needs calculator maintenance calorie calculator calories per day daily calorie needs weight loss calorie calculator weight gain calorie calculator calorie deficit calculator activity calorie calculator how many calories should i eat daily energy needs maintenance calories free calorie calculator online calorie calculator health calculator financial calculator daily calculator', bodyfat:'body fat calculator body fat percentage navy tape waist neck composition body fat percentage calculator calculate body fat body fat estimator us navy body fat calculator tape measurement body fat body composition calculator body fat male body fat female body fat by waist body fat by neck healthy body fat percentage online body fat calculator free body fat calculator estimate body fat health calculator financial calculator daily calculator how to calculate body fat percentage', water:'water intake calculator hydration daily water ounces liters drink daily water calculator how much water should i drink daily water requirement water intake by weight water intake by activity water intake in ounces water intake in liters recommended water per day daily hydration needs drinking water calculator free water calculator online hydration calculator water consumption calculator health calculator financial calculator daily calculator how much water should i drink daily', unit:'unit converter measurement length weight temperature speed volume metric imperial inches cm pounds kg celsius fahrenheit online unit converter free unit converter convert units length converter distance converter weight converter mass converter temperature converter speed converter volume converter metric converter imperial converter metric to imperial imperial to metric inches to centimeters feet to meters miles to kilometers pounds to kilograms fahrenheit to celsius celsius to fahrenheit liters to gallons measurement calculator unit convertor money converter text converter quick converter how to convert metric to imperial unit conversion guide fahrenheit to celsius formula pounds to kilograms conversion', currency:'currency converter money exchange usd eur gbp cad approximate rate forex money converter exchange rate calculator convert currency foreign currency converter international currency converter usd converter eur converter gbp converter cad converter aud converter usd to eur eur to usd usd to gbp usd to cad currency exchange calculator foreign exchange calculator online currency converter free currency converter currency convertor text converter quick converter how currency conversion works how to use a currency converter', case:'text case converter uppercase lowercase title case camelcase capitalize uppercase converter lowercase converter title case converter sentence case converter camelcase converter camel case generator capitalize text convert text to uppercase convert text to lowercase convert text to title case change letter case capitalization tool text capitalization online case converter free text converter money converter quick converter how to change uppercase to lowercase title case vs sentence case', wordcount:'word counter character counter sentence count reading time text length online word counter free word counter word count character count letter counter sentence counter paragraph counter reading time calculator essay word counter text length calculator count words online count characters word and character counter live word counter writing counter student word counter social media character counter wordcounter text counter how to count words and characters' }; function normalizeSearch(value){ return String(value||'').normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLowerCase().replace(/[^a-z0-9]+/g,' ').trim(); } function filterTools(query){ const favBtn=document.getElementById('fav-cat-btn'); if(favBtn && favBtn.classList.contains('active')){ favBtn.classList.remove('active'); favBtn.setAttribute('aria-pressed','false'); } const q=normalizeSearch(query); let visible=0; document.querySelectorAll('.tool-card').forEach(card=>{ const onclickAttr=card.getAttribute('onclick')||''; const keyMatch=onclickAttr.match(/,'([a-z0-9]+)'\)$/i) || onclickAttr.match(/,'([a-z0-9]+)'/i); const key=keyMatch?keyMatch[1]:''; const haystack=normalizeSearch(card.textContent+' '+(TOOL_SEARCH_ALIASES[key]||'')); const match=!q || q.split(' ').every(term=>haystack.includes(term)); card.hidden=!match; if(match) visible++; }); document.querySelectorAll('.tool-grid').forEach(grid=>{ const any=Array.from(grid.querySelectorAll('.tool-card')).some(card=>!card.hidden); grid.hidden=!any; const heading=grid.previousElementSibling; if(heading && heading.classList.contains('section-desc-box')){ heading.hidden=!any; const title=heading.previousElementSibling; if(title && title.classList.contains('section-title')) title.hidden=!any; } }); const status=document.getElementById('search-status'); if(status) status.textContent=q ? (visible ? `${visible} matching tool${visible===1?'':'s'}` : 'No matching tools. Try PDF, OCR, calculator, converter or QR.') : ''; } // ── TOOL DEFINITIONS ────────────────────────────────────────────────────────── const TOOLS={ qr:{ title:'📱 QR Code Generator',sub:'Enter any URL or text — download instantly', render:()=>`
`, init(){} }, password:{ title:'🔐 Password Generator',sub:'Secure, random passwords in one click', render:()=>`
`, init(){} }, color:{ title:'🎨 Color Code Converter',sub:'HEX ↔ RGB ↔ HSL', render:()=>`
`, init(){convertColor();} }, hash:{ title:'📄 Lorem Ipsum Generator',sub:'Placeholder text for any project', render:()=>`
`, init(){} }, age:{ title:'🎂 Age Calculator',sub:'Your exact age down to the hour', render:()=>`
`, init(){} }, bmi:{ title:'⚖️ BMI Calculator',sub:'For adults 20+ · Metric or Imperial', render:()=>`
`, init(){} }, bmr:{ title:'🔥 BMR Calculator',sub:'Calories burned at rest (Mifflin-St Jeor)', render:()=>`
`, init(){} }, calorie:{ title:'🍎 Calorie Calculator',sub:'Daily calorie needs (TDEE)', render:()=>`
`, init(){} }, bodyfat:{ title:'📐 Body Fat Calculator',sub:'US Navy tape-measurement method', render:()=>`
`, init(){document.getElementById('bf-hip-wrap').style.display='none';} }, water:{ title:'💧 Water Intake Calculator',sub:'Daily hydration target', render:()=>`
`, init(){} }, tip:{ title:'🍽️ Tip Calculator',sub:'Split the bill for any group', render:()=>`
`, init(){} }, discount:{ title:'🏷️ Discount Calculator',sub:'Final price after any discount', render:()=>`
`, init(){} }, loan:{ title:'🏦 Loan Calculator',sub:'Monthly payment & total interest', render:()=>`
`, init(){} }, unit:{ title:'📏 Unit Converter',sub:'Length, weight, temperature, speed & more', render:()=>`
`, init(){renderUnitOpts();} }, currency:{ title:'💱 Currency Converter',sub:'Live exchange rates for 15+ world currencies', render:()=>{ const cc=['USD','EUR','GBP','JPY','CAD','AUD','CHF','CNY','INR','MXN','BRL','KRW','TRY','SAR','AED']; const o=cc.map(c=>``).join(''); return`

Loading live rates…

`; }, init(){ ensureLiveRates().then(renderCurrencyStatus); } }, case:{ title:'🔤 Text Case Converter',sub:'Transform text in one click', render:()=>`
`, init(){} }, wordcount:{ title:'📝 Word Counter',sub:'Live count — words, characters, reading time', render:()=>`
Words
0
Characters
0
Sentences
0
Read time
0 min
`, init(){} }, quiz:{ title:'🧠 General Knowledge Quiz',sub:'10 questions — how many can you get right?', render:()=>`
`, init(){} }, memory:{ title:'🃏 Memory Card Game',sub:'Find all matching pairs', render:()=>`
`, init(){} }, // ── MEDIA TOOLS ──────────────────────────────────────────────────────────── mp3convert:{ title:'🎵 Video/Audio to MP3',sub:'Extract or convert audio from your own video or audio file — no YouTube links, just your files', render:()=>fileDropzone('mp3-file','audio/*,video/*',false)+`

Works with common formats your browser can play: MP4, MOV, WebM, M4A, MP3, WAV, OGG. Everything happens on your device — no upload.

`, init(){ setupDropzone('mp3-file','mp3-list','mp3-options',false,'audio/*,video/*'); } }, audiotrim:{ title:'✂️ Audio Trimmer',sub:'Cut a clip from an audio file — drag on the waveform or enter exact times', render:()=>fileDropzone('trim-file','audio/*',false)+`
`, init(){ setupDropzone('trim-file','trim-list','trim-options',false,'audio/*', tnLoadTrimDuration); } }, audiomerge:{ title:'🔗 Audio Merger',sub:'Combine multiple audio files into one — drag to reorder', render:()=>fileDropzone('audiomerge-files','audio/*',true)+`
`, init(){ setupDropzone('audiomerge-files','audiomerge-list','audiomerge-options',true,'audio/*'); } }, audiocompress:{ title:'📉 Audio Compressor',sub:'Shrink a large audio file by lowering its bitrate', render:()=>fileDropzone('audiocompress-file','audio/*',false)+`
`, init(){ setupDropzone('audiocompress-file','audiocompress-list','audiocompress-options',false,'audio/*'); } }, audiovolume:{ title:'🔊 Volume Booster',sub:'Turn an audio file up or down without re-recording it', render:()=>fileDropzone('vol-file','audio/*',false)+`
`, init(){ setupDropzone('vol-file','vol-list','vol-options',false,'audio/*'); } }, audiofade:{ title:'🌅 Fade In / Fade Out',sub:'Add a smooth fade to the start and/or end of an audio file', render:()=>fileDropzone('fade-file','audio/*',false)+`
`, init(){ setupDropzone('fade-file','fade-list','fade-options',false,'audio/*'); } }, audiospeed:{ title:'⏩ Change Audio Speed',sub:'Speed up or slow down an audio file from 0.5× to 2×', render:()=>fileDropzone('speed-file','audio/*',false)+`
`, init(){ setupDropzone('speed-file','speed-list','speed-options',false,'audio/*'); } }, ringtone:{ title:'📱 Ringtone Maker',sub:'Cut a short clip from a song with automatic fade-out — ready to set as your ringtone', render:()=>fileDropzone('ring-file','audio/*',false)+`
`, init(){ setupDropzone('ring-file','ring-list','ring-options',false,'audio/*', tnLoadRingDuration); } }, audiosplit:{ title:'✂️ Audio Splitter',sub:'Split a whole audio file into equal parts or fixed-length chunks', render:()=>fileDropzone('asplit-file','audio/*',false)+`
`, init(){ setupDropzone('asplit-file','asplit-list','asplit-options',false,'audio/*', tnLoadSplitDuration); } }, removesilence:{ title:'🔇 Remove Silence',sub:'Automatically cut the quiet/silent parts out of a recording', render:()=>fileDropzone('rs-file','audio/*',false)+`
`, init(){ setupDropzone('rs-file','rs-list','rs-options',false,'audio/*'); } }, // ── PDF TOOLS ────────────────────────────────────────────────────────────── merge:{ title:'📎 Merge PDF',sub:'Combine multiple PDFs into one — drag to reorder', render:()=>fileDropzone('merge-files','application/pdf',true)+`
`, init(){ setupDropzone('merge-files','merge-list','merge-btn',true,'application/pdf'); } }, split:{ title:'✂️ Split & Extract PDF Pages',sub:'Upload one or more PDFs, choose exact pages visually, then download one PDF or a ZIP', render:()=>fileDropzone('split-file','application/pdf',true)+`
`, init(){ setupDropzone('split-file','split-list','split-options',true,'application/pdf',renderAdvancedSplitWorkspace); } }, compress:{ title:'🗜️ Compress PDF',sub:'Shrink file size by re-optimizing the PDF structure', render:()=>fileDropzone('compress-file','application/pdf',false)+`
`, init(){ setupDropzone('compress-file','compress-list','compress-btn',false,'application/pdf'); } }, rotate:{ title:'🔃 Rotate PDF',sub:'Rotate all pages clockwise', render:()=>fileDropzone('rotate-file','application/pdf',false)+`
`, init(){ setupDropzone('rotate-file','rotate-list','rotate-options',false,'application/pdf'); } }, deletepages:{ title:'🗑️ Delete PDF Pages',sub:'Click thumbnails to select pages to remove', render:()=>fileDropzone('del-file','application/pdf',false)+`
`, init(){ setupDropzone('del-file','del-list',null,false,'application/pdf',renderPageThumbsForDelete); } }, extractpages:{ title:'📤 Extract PDF Pages',sub:'Click thumbnails to select pages to keep', render:()=>fileDropzone('ext-file','application/pdf',false)+`
`, init(){ setupDropzone('ext-file','ext-list',null,false,'application/pdf',renderPageThumbsForExtract); } }, sign:{ title:'✍️ Sign PDF',sub:'Type, draw, or upload your signature and drag it into place', render:()=>fileDropzone('sign-file','application/pdf',false)+`
`, init(){ setupDropzone('sign-file','sign-list','sign-builder',false,'application/pdf', ()=>{ setTimeout(()=>{ initSigCanvas(); initSignPreview(); },50); }); } }, addtext:{ title:'✏️ Add Text to PDF',sub:'Click anywhere on the page and start typing', render:()=>fileDropzone('txt-file','application/pdf',false)+`
`, init(){ setupDropzone('txt-file','txt-list','txt-builder',false,'application/pdf', ()=>{ setTimeout(initTxtPreview,50); }); } }, img2pdf:{ title:'🖼️ Image to PDF',sub:'Combine images into a polished PDF with page, fit and margin controls', render:()=>fileDropzone('i2p-files','image/*',true)+`
`, init(){ setupDropzone('i2p-files','i2p-list','i2p-btn',true,'image/*',(files)=>{const o=document.getElementById('i2p-options');if(o)o.style.display=files.length?'':'none'}); } }, pdf2jpg:{ title:'🖼️ PDF to JPG',sub:'Convert each page into a downloadable JPG image', render:()=>fileDropzone('p2j-file','application/pdf',false)+`
`, init(){ setupDropzone('p2j-file','p2j-list','p2j-btn',false,'application/pdf'); } }, pdf2png:{ title:'🖼️ PDF to PNG',sub:'Convert each page into a downloadable PNG image', render:()=>fileDropzone('p2n-file','application/pdf',false)+`
`, init(){ setupDropzone('p2n-file','p2n-list','p2n-btn',false,'application/pdf'); } }, pdf2text:{ title:'📋 PDF to Text',sub:'Extract all text content from a PDF', render:()=>fileDropzone('p2t-file','application/pdf',false)+`
`, init(){ setupDropzone('p2t-file','p2t-list','p2t-btn',false,'application/pdf'); } }, ocr:{ title:'🔍 Image to Text (OCR)',sub:'Extract text from any image using AI recognition', render:()=>fileDropzone('ocr-file','image/*',false)+`
`, init(){ setupDropzone('ocr-file','ocr-list','ocr-btn',false,'image/*'); } }, scanocr:{ title:'📱 Scan PDF to Text (OCR)',sub:'Run OCR on a scanned PDF to extract searchable text', render:()=>fileDropzone('socr-file','application/pdf',false)+`
`, init(){ setupDropzone('socr-file','socr-list','socr-btn',false,'application/pdf'); } }, docscanner:{ title:'📷 Document Scanner',sub:'Use your phone camera or photos to build a clean, searchable multi-page PDF', render:()=>`
Scan settingsLive preview
`, init(){ initDocumentScanner(); } }, pdf2word:{ title:'📄 PDF to Word',sub:'Turn selectable PDF text into a clean, editable Word (.docx) document', render:()=>fileDropzone('p2w-file','application/pdf',false)+`

* Extracts text content; original visual layout/images are not preserved.

`, init(){ setupDropzone('p2w-file','p2w-list','p2w-btn',false,'application/pdf'); } }, word2pdf:{ title:'📝 Word to PDF',sub:'Convert a .docx file to PDF', render:()=>fileDropzone('w2p-file','.docx',false)+`

* Converts text content; complex formatting/images may not be preserved.

`, init(){ setupDropzone('w2p-file','w2p-list','w2p-btn',false,'.docx'); } }, pdf2excel:{ title:'📊 PDF to Excel',sub:'Extract detected rows into a real Excel (.xlsx) workbook for editing and analysis', render:()=>fileDropzone('p2e-file','application/pdf',false)+`

* Best with PDFs containing simple tabular data.

`, init(){ setupDropzone('p2e-file','p2e-list','p2e-btn',false,'application/pdf'); } }, }; // ── QR ──────────────────────────────────────────────────────────────────────── function generateQR(){ const txt=document.getElementById('qr-input').value.trim(); const sz=+document.getElementById('qr-size').value; const cl=document.getElementById('qr-color').value; if(!txt){alert('Please enter a URL or text.');return;} const out=document.getElementById('qr-out'); out.innerHTML=''; const d=document.createElement('div'); out.appendChild(d); new QRCode(d,{text:txt,width:sz,height:sz,colorDark:cl,colorLight:'#ffffff',correctLevel:QRCode.CorrectLevel.H}); setTimeout(()=>{ const cv=d.querySelector('canvas'); if(cv){const btn=document.createElement('button');btn.className='btn btn-sec';btn.style.marginTop='12px';btn.textContent='⬇ Download PNG';btn.onclick=()=>{const a=document.createElement('a');a.download='qr.png';a.href=cv.toDataURL();a.click();};out.appendChild(btn);} },300); } // ── PASSWORD ────────────────────────────────────────────────────────────────── function generatePW(){ const len=+document.getElementById('pw-len').value; let chars='abcdefghijklmnopqrstuvwxyz'; if(document.getElementById('pw-u').checked)chars+='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; if(document.getElementById('pw-n').checked)chars+='0123456789'; if(document.getElementById('pw-s').checked)chars+='!@#$%^&*()_+-=[]{}|;:,.?'; const values=new Uint32Array(len); crypto.getRandomValues(values); let pw=''; for(let i=0;i
Password
${escapeHtml(pw)}
`; } // ── COLOR ───────────────────────────────────────────────────────────────────── function colorPick(){document.getElementById('hex-in').value=document.getElementById('cpick').value;convertColor();} function convertColor(){ let hex=document.getElementById('hex-in').value.trim(); if(!hex.startsWith('#'))hex='#'+hex; if(!/^#[0-9A-Fa-f]{6}$/.test(hex)){document.getElementById('color-out').innerHTML='
Invalid hex color.
';return;} document.getElementById('cpick').value=hex; const r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16); const max=Math.max(r,g,b)/255,min=Math.min(r,g,b)/255,l=(max+min)/2,d=max-min; const s=d?d/(1-Math.abs(2*l-1)):0; let h=0;if(d){const sg=max===r/255?(g/255-b/255)/d:max===g/255?2+(b/255-r/255)/d:4+(r/255-g/255)/d;h=Math.round(sg*60);if(h<0)h+=360;} document.getElementById('color-out').innerHTML=`
HEX ${hex.toUpperCase()}
RGB rgb(${r}, ${g}, ${b})
HSL hsl(${h}, ${Math.round(s*100)}%, ${Math.round(l*100)}%)
`; } // ── LOREM ───────────────────────────────────────────────────────────────────── function genLorem(){ const n=+document.getElementById('lorem-n').value; const p='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'; const p2='Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper.'; const p3='Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis molestie dictum semper, quam quam congue eros, sit amet interdum nisi quam in magna.'; const paras=[p,p2,p3,p,p2]; const text=paras.slice(0,n).join('\n\n'); document.getElementById('lorem-out').innerHTML=`
${text}

`; } // ── AGE ─────────────────────────────────────────────────────────────────────── function calcAge(){ const dobDateStr=document.getElementById('dob').value; const dobTimeStr=document.getElementById('dob-time').value || '00:00'; const asOfStr=document.getElementById('as-of-date').value; if(!dobDateStr){alert('Please select your date of birth.');return;} const dob=new Date(`${dobDateStr}T${dobTimeStr}:00`); if(isNaN(dob)){alert('Please select a valid date of birth.');return;} const now=asOfStr ? new Date(`${asOfStr}T${dobTimeStr}:00`) : new Date(); if(nowCalculated as of ${now.toLocaleDateString()}${dobTimeStr!=='00:00'?' '+now.toLocaleTimeString([], {hour:'2-digit',minute:'2-digit'}):''}`:''; document.getElementById('age-out').innerHTML=`
Years
${y}
Months
${m}
Days
${d}
Hours
${hh}
Total Days
${td.toLocaleString()}
Total Hours
${th.toLocaleString()}
${asOfNote}`; } // ── BMI ─────────────────────────────────────────────────────────────────────── function toggleBMI(){const u=document.getElementById('bmi-u').value;document.getElementById('bmi-met').style.display=u==='metric'?'':'none';document.getElementById('bmi-imp').style.display=u==='imperial'?'':'none';} function calcBMI(){ const u=document.getElementById('bmi-u').value;let bmi,heightM; if(u==='metric'){const w=+document.getElementById('wkg').value,h=+document.getElementById('hcm').value/100;if(!w||!h){alert('Fill in weight and height.');return;}bmi=w/(h*h);heightM=h;} else{const lb=+document.getElementById('wlb').value,ft=+document.getElementById('hft').value,i=+document.getElementById('hin').value||0,ti=ft*12+i;if(!lb||!ti){alert('Fill in weight and height.');return;}bmi=(lb/(ti*ti))*703;heightM=ti*0.0254;} const cat=bmi<18.5?'Underweight':bmi<25?'Normal weight':bmi<30?'Overweight':'Obese'; const col=bmi<18.5?'#2980b9':bmi<25?'#0ba87e':bmi<30?'#e07a20':'#c0392b'; const pct=Math.max(0,Math.min(100,((bmi-15)/(40-15))*100)); const minKg=18.5*heightM*heightM, maxKg=24.9*heightM*heightM; const rangeText=u==='metric' ? `${minKg.toFixed(1)}–${maxKg.toFixed(1)} kg` : `${(minKg*2.20462).toFixed(1)}–${(maxKg*2.20462).toFixed(1)} lb`; // optional waist-circumference risk note (NHLBI thresholds) const gender=document.getElementById('bmi-gender').value; const waist=+document.getElementById('bmi-waist').value; let waistNote=''; if(waist && gender){ const waistCm = u==='metric' ? waist : waist*2.54; const threshold = gender==='male' ? 102 : 88; // cm (40in / 35in) const highRisk = waistCm > threshold; waistNote = `
Waist-related health risk: ${highRisk?'Higher':'Lower'} — based on NHLBI reference thresholds (${gender==='male'?'40 in / 102 cm':'35 in / 88 cm'}).
`; } document.getElementById('bmi-out').innerHTML=`
Your BMI
${bmi.toFixed(1)}
${cat}
UnderweightNormalOverweightObese
Healthy weight range for your height: ${rangeText}
${waistNote}

BMI is a general screening measure for adults 20 and older. It doesn't account for muscle mass, age, sex, or pregnancy. Talk to a healthcare provider for a complete assessment.

Related: BMR Calculator · Calorie Calculator · Body Fat Calculator
`; } // ── BMR ─────────────────────────────────────────────────────────────────────── function toggleBMR(){const u=document.getElementById('bmr-u').value;document.getElementById('bmr-met').style.display=u==='metric'?'':'none';document.getElementById('bmr-imp').style.display=u==='imperial'?'':'none';} function calcBMR(){ const u=document.getElementById('bmr-u').value;const age=+document.getElementById('bmr-age').value;const gender=document.getElementById('bmr-gender').value; let wkg,hcm; if(u==='metric'){wkg=+document.getElementById('bmr-wkg').value;hcm=+document.getElementById('bmr-hcm').value;} else{const lb=+document.getElementById('bmr-wlb').value,ft=+document.getElementById('bmr-hft').value,i=+document.getElementById('bmr-hin').value||0;wkg=lb*0.453592;hcm=(ft*12+i)*2.54;} if(!wkg||!hcm||!age){alert('Please fill in weight, height and age.');return;} const bmr = gender==='male' ? (10*wkg + 6.25*hcm - 5*age + 5) : (10*wkg + 6.25*hcm - 5*age - 161); document.getElementById('bmr-out').innerHTML=`
Basal Metabolic Rate
${Math.round(bmr).toLocaleString()} kcal/day
Calories your body burns at complete rest

Calculated using the Mifflin–St Jeor equation, widely considered one of the most accurate BMR formulas. This is your baseline — see the Calorie Calculator for your total daily needs including activity.

Related: Calorie Calculator · BMI Calculator
`; } // ── CALORIE / TDEE ────────────────────────────────────────────────────────────── function toggleCalorie(){const u=document.getElementById('cal-u').value;document.getElementById('cal-met').style.display=u==='metric'?'':'none';document.getElementById('cal-imp').style.display=u==='imperial'?'':'none';} function calcCalorie(){ const u=document.getElementById('cal-u').value;const age=+document.getElementById('cal-age').value;const gender=document.getElementById('cal-gender').value;const activity=+document.getElementById('cal-activity').value; let wkg,hcm; if(u==='metric'){wkg=+document.getElementById('cal-wkg').value;hcm=+document.getElementById('cal-hcm').value;} else{const lb=+document.getElementById('cal-wlb').value,ft=+document.getElementById('cal-hft').value,i=+document.getElementById('cal-hin').value||0;wkg=lb*0.453592;hcm=(ft*12+i)*2.54;} if(!wkg||!hcm||!age){alert('Please fill in weight, height and age.');return;} const bmr = gender==='male' ? (10*wkg + 6.25*hcm - 5*age + 5) : (10*wkg + 6.25*hcm - 5*age - 161); const tdee = bmr*activity; document.getElementById('cal-out').innerHTML=`
Maintain
${Math.round(tdee).toLocaleString()}
Mild Loss (-10%)
${Math.round(tdee*0.9).toLocaleString()}
Loss (-20%)
${Math.round(tdee*0.8).toLocaleString()}
Gain (+10%)
${Math.round(tdee*1.1).toLocaleString()}

All values in kcal/day. This estimates your Total Daily Energy Expenditure (TDEE) — the calories needed to maintain, lose, or gain weight at the selected activity level.

Related: BMR Calculator · Water Intake Calculator
`; } // ── BODY FAT (US Navy method) ──────────────────────────────────────────────── function toggleBodyFat(){} function toggleBodyFatHip(){document.getElementById('bf-hip-wrap').style.display=document.getElementById('bf-gender').value==='female'?'':'none';} function calcBodyFat(){ const u=document.getElementById('bf-u').value;const gender=document.getElementById('bf-gender').value; const height=+document.getElementById('bf-height').value, neck=+document.getElementById('bf-neck').value, waist=+document.getElementById('bf-waist').value, hip=+document.getElementById('bf-hip').value||0; if(!height||!neck||!waist||(gender==='female'&&!hip)){alert('Please fill in all required measurements.');return;} let bf; if(u==='metric'){ bf = gender==='male' ? 495/(1.0324 - 0.19077*Math.log10(waist-neck) + 0.15456*Math.log10(height)) - 450 : 495/(1.29579 - 0.35004*Math.log10(waist+hip-neck) + 0.22100*Math.log10(height)) - 450; } else { bf = gender==='male' ? 86.010*Math.log10(waist-neck) - 70.041*Math.log10(height) + 36.76 : 163.205*Math.log10(waist+hip-neck) - 97.684*Math.log10(height) - 78.387; } const cat = gender==='male' ? (bf<6?'Essential fat':bf<14?'Athletic':bf<18?'Fitness':bf<25?'Average':'Above average') : (bf<14?'Essential fat':bf<21?'Athletic':bf<25?'Fitness':bf<32?'Average':'Above average'); document.getElementById('bf-out').innerHTML=`
Estimated Body Fat
${bf.toFixed(1)}%
${cat}

Estimated using the US Navy tape-measurement method. This is an approximation — for precise body composition, methods like DEXA scans or skinfold calipers are more accurate.

Related: BMI Calculator · BMR Calculator
`; } // ── WATER INTAKE ────────────────────────────────────────────────────────────── function toggleWaterUnit(){const u=document.getElementById('wi-u').value;document.getElementById('wi-met').style.display=u==='metric'?'':'none';document.getElementById('wi-imp').style.display=u==='imperial'?'':'none';} function calcWater(){ const u=document.getElementById('wi-u').value;const activityBonus=+document.getElementById('wi-activity').value; let wkg; if(u==='metric'){wkg=+document.getElementById('wi-wkg').value;} else{wkg=(+document.getElementById('wi-wlb').value)*0.453592;} if(!wkg){alert('Please enter your weight.');return;} const liters = wkg*0.033 + activityBonus; const glasses = liters/0.25; document.getElementById('wi-out').innerHTML=`
Liters/day
${liters.toFixed(1)} L
8oz Glasses
${Math.round(glasses)}

A general hydration guideline based on body weight and activity level. Individual needs vary with climate, health conditions, and diet — this is a starting reference, not medical advice.

`; } // ── TIP ─────────────────────────────────────────────────────────────────────── function calcTip(){ const b=+document.getElementById('bill').value,p=+document.getElementById('tpct').value,s=+document.getElementById('split').value||1; if(!b){alert('Enter bill amount.');return;} const tip=b*p/100,total=b+tip; document.getElementById('tip-out').innerHTML=`
Tip
$${tip.toFixed(2)}
Total
$${total.toFixed(2)}
Per Person
$${(total/s).toFixed(2)}
Tip/Person
$${(tip/s).toFixed(2)}
`; } // ── DISCOUNT ────────────────────────────────────────────────────────────────── function calcDiscount(){ const o=+document.getElementById('oprice').value,p=+document.getElementById('dpct').value; if(!o||o<=0||p<0){alert('Enter a price greater than 0 and a discount of 0% or more.');return;} const saved=o*p/100,final=o-saved; document.getElementById('disc-out').innerHTML=`
You Save
$${saved.toFixed(2)}
Final Price
$${final.toFixed(2)}
`; } // ── LOAN ────────────────────────────────────────────────────────────────────── function calcLoan(){ const P=+document.getElementById('lamt').value,rPct=+document.getElementById('lrate').value,n=+document.getElementById('lterm').value*12,r=rPct/100/12; if(!P||P<=0||rPct<0||!n||n<=0){alert('Fill in all fields (interest rate can be 0, but principal and term must be greater than 0).');return;} let monthly; if(r===0){ monthly=P/n; // 0% interest: equal principal-only payments, no compounding }else{ monthly=P*(r*Math.pow(1+r,n))/(Math.pow(1+r,n)-1); } const totalPay=monthly*n,totalInt=totalPay-P; document.getElementById('loan-out').innerHTML=`
Monthly Payment
$${monthly.toFixed(2)}
Total Interest
$${totalInt.toFixed(2)}
Total Paid
$${totalPay.toFixed(2)}
Principal
$${P.toLocaleString()}
`; } // ── UNIT ────────────────────────────────────────────────────────────────────── const UDB={length:{meter:1,kilometer:0.001,mile:0.000621371,foot:3.28084,inch:39.3701,centimeter:100,yard:1.09361},weight:{kilogram:1,gram:1000,pound:2.20462,ounce:35.274,ton:0.001},temp:{celsius:1,fahrenheit:1,kelvin:1},speed:{'km/h':1,'mph':0.621371,'knot':0.539957,'m/s':0.277778}}; function renderUnitOpts(){const cat=document.getElementById('ucat').value,keys=Object.keys(UDB[cat]),opts=keys.map(k=>``).join('');document.getElementById('ufrom').innerHTML=opts;document.getElementById('uto').innerHTML=opts;if(document.getElementById('uto').options.length>1)document.getElementById('uto').selectedIndex=1;} function convertUnit(){ const cat=document.getElementById('ucat').value,val=+document.getElementById('uval').value,from=document.getElementById('ufrom').value,to=document.getElementById('uto').value; if(isNaN(val)){alert('Enter a number.');return;} let res; if(cat==='temp'){let c=from==='celsius'?val:from==='fahrenheit'?(val-32)*5/9:val-273.15;res=to==='celsius'?c:to==='fahrenheit'?c*9/5+32:c+273.15;} else{res=(val/UDB[cat][from])*UDB[cat][to];} document.getElementById('unit-out').innerHTML=`
Result
${res.toLocaleString(undefined,{maximumFractionDigits:6})} ${to}
`; } // ── CURRENCY ────────────────────────────────────────────────────────────────── const RATES_FALLBACK={USD:1,EUR:0.92,GBP:0.79,JPY:149.5,CAD:1.36,AUD:1.53,CHF:0.89,CNY:7.24,INR:83.1,MXN:17.2,BRL:4.97,KRW:1325,TRY:32.1,SAR:3.75,AED:3.67}; let RATES=null, RATES_UPDATED=null, RATES_IS_LIVE=false; async function ensureLiveRates(force=false){ if(RATES && !force) return RATES; try{ const res=await fetch('https://open.er-api.com/v6/latest/USD'); const json=await res.json(); if(json && json.result==='success' && json.rates){ RATES=json.rates; RATES_UPDATED=json.time_last_update_utc||new Date().toUTCString(); RATES_IS_LIVE=true; return RATES; } throw new Error('bad response'); }catch(err){ console.warn('Live exchange rates unavailable, using offline reference rates',err); RATES=RATES_FALLBACK; RATES_UPDATED=null; RATES_IS_LIVE=false; return RATES; } } function renderCurrencyStatus(){ const el=document.getElementById('curr-status'); if(!el)return; el.innerHTML = RATES_IS_LIVE ? `● Live rates · updated ${RATES_UPDATED} · refresh` : `● Offline reference rates (live rates unavailable) · try again`; } async function refreshCurrencyRates(){ const el=document.getElementById('curr-status'); if(el) el.innerHTML='Refreshing…'; await ensureLiveRates(true); renderCurrencyStatus(); if(document.getElementById('camt').value) convertCurr(); } function swapCurrencies(){ const f=document.getElementById('cfrom'),t=document.getElementById('cto'); const tmp=f.value; f.value=t.value; t.value=tmp; convertCurr(); } async function convertCurr(){ await ensureLiveRates(); const a=+document.getElementById('camt').value,f=document.getElementById('cfrom').value,t=document.getElementById('cto').value; if(!RATES[f]||!RATES[t]){ document.getElementById('curr-out').innerHTML=`
Rate not available for ${!RATES[f]?f:t} right now.
`; return; } const res=(a/RATES[f])*RATES[t]; const inverse=RATES[f]/RATES[t]; document.getElementById('curr-out').innerHTML=`
${a} ${f} =
${res.toLocaleString(undefined,{maximumFractionDigits:2})} ${t}
1 ${t} = ${inverse.toLocaleString(undefined,{maximumFractionDigits:4})} ${f}
`; renderCurrencyStatus(); } // ── TEXT CASE ───────────────────────────────────────────────────────────────── function doCase(type){ let t=document.getElementById('case-in').value;if(!t){alert('Enter some text.');return;} if(type==='upper')t=t.toUpperCase(); else if(type==='lower')t=t.toLowerCase(); else if(type==='title')t=t.replace(/\w\S*/g,w=>w[0].toUpperCase()+w.slice(1).toLowerCase()); else if(type==='camel')t=t.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g,(_,c)=>c.toUpperCase()); document.getElementById('case-out').innerHTML=`
Result
${t}
`; } // ── WORD COUNT ──────────────────────────────────────────────────────────────── function liveWC(){ const t=document.getElementById('wc-in').value; const w=t.trim()?t.trim().split(/\s+/).length:0; document.getElementById('wc-w').textContent=w.toLocaleString(); document.getElementById('wc-c').textContent=t.length.toLocaleString(); document.getElementById('wc-s').textContent=t.split(/[.!?]+/).filter(s=>s.trim()).length; const min=Math.ceil(w/200); document.getElementById('wc-t').textContent=min<1?'< 1 min':min+' min'; } // ── QUIZ ────────────────────────────────────────────────────────────────────── const QS=[ {q:"What is the capital of Australia?",a:"Canberra",o:["Sydney","Melbourne","Canberra","Brisbane"]}, {q:"How many sides does a hexagon have?",a:"6",o:["5","6","7","8"]}, {q:"Which planet is closest to the Sun?",a:"Mercury",o:["Venus","Earth","Mercury","Mars"]}, {q:"Which language has the most native speakers?",a:"Mandarin Chinese",o:["English","Spanish","Hindi","Mandarin Chinese"]}, {q:"What is 15% of 200?",a:"30",o:["25","30","35","40"]}, {q:"Who painted the Mona Lisa?",a:"Leonardo da Vinci",o:["Michelangelo","Raphael","Leonardo da Vinci","Picasso"]}, {q:"What year did World War II end?",a:"1945",o:["1943","1944","1945","1946"]}, {q:"What is the chemical symbol for gold?",a:"Au",o:["Go","Gd","Au","Ag"]}, {q:"How many bones are in the adult human body?",a:"206",o:["186","196","206","216"]}, {q:"What is the largest ocean?",a:"Pacific",o:["Atlantic","Indian","Pacific","Arctic"]}, ]; let qi=0,qs=0; function startQuiz(){qi=0;qs=0;renderQ();} function renderQ(){ const w=document.getElementById('quiz-wrap'); if(qi>=QS.length){w.innerHTML=`
Final Score
${qs} / ${QS.length}
${qs>=8?'🏆 Excellent!':qs>=5?'👍 Good job!':'📚 Keep learning!'}
`;return;} const q=QS[qi]; w.innerHTML=`
Question ${qi+1} of ${QS.length} · Score: ${qs}
${q.q}
${q.o.map(o=>``).join('')}`; } function ansQ(ch,co,btn){ document.querySelectorAll('#quiz-wrap button').forEach(b=>b.disabled=true); if(ch===co){qs++;btn.style.borderColor='var(--accent2)';btn.style.color='var(--accent2)';} else{btn.style.borderColor='#c0392b';btn.style.color='#c0392b';} setTimeout(()=>{qi++;renderQ();},900); } // ── MEMORY ──────────────────────────────────────────────────────────────────── const EM=['🐶','🐱','🦊','🐻','🐼','🦁','🐯','🦄']; let mc=[],mf=[],ms=0,ml=false,mm=0; function startMemory(){mc=[...EM,...EM].sort(()=>Math.random()-.5);mf=new Array(16).fill(false);ms=0;ml=false;mm=0;renderMem();} function renderMem(){ document.getElementById('mem-wrap').innerHTML=`
Moves: ${mm}
${mc.map((e,i)=>``).join('')}
`; } function flipMem(i){ if(ml||mf[i])return; mf[i]=true; document.getElementById('mc'+i).textContent=mc[i]; const op=mf.map((f,j)=>f&&!document.getElementById('mc'+j)?.dataset.solved?j:-1).filter(j=>j>=0); if(op.length===2){ ml=true;mm++;document.getElementById('mm').textContent=mm; if(mc[op[0]]===mc[op[1]]){ op.forEach(j=>{const b=document.getElementById('mc'+j);if(b){b.dataset.solved='1';b.style.borderColor='var(--accent2)';}}); ms++; if(ms===8){setTimeout(()=>{document.getElementById('mem-wrap').innerHTML=`
🎉 You Win!
${mm} moves
`;},400);} ml=false; }else{setTimeout(()=>{op.forEach(j=>{mf[j]=false;const b=document.getElementById('mc'+j);if(b)b.textContent='?';});ml=false;},800);} } }
TSI Practice Preptsipracticeprep.com
Free Practice: TSI · SAT · ACT

3,900+ real exam-style questions. Full practice tests, instant scoring, no sign-up needed.

Start Free Practice → Partner