hownz
Version:
Safely clean the copied text of hidden surprises. Checks for invisible code, hidden watermarks, and tracking symbols.
697 lines (672 loc) • 72.9 kB
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Safe Paste: Check & Clean Copied Text</title>
<meta name="description" content="Safely copy and paste text and remove the risk of hidden AI commands. Our tool checks your text for invisible code, hidden watermarks, and tracking symbols, letting you scan and clean everything but plain text before you publish.">
<meta name="keywords" content="copy checker, your post, posting surprise, invisible code scan, hidden code scan, hidden in text, clean ai text, text cleaner, safe paste, remove code, AI marks, safe text, scan code, copy paste, invisible symbols, hackers, hidden code, attacks prevention">
<meta name="theme-color" content="#1E1E1E">
<link rel="manifest" href="manifest.json">
<meta name="msapplication-config" content="browserconfig.xml">
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#c5b358">
<link rel="canonical" href="https://hownz.com/">
<link rel="icon" href="favicon.ico" sizes="any">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="icon" type="image/png" sizes="48x48" href="favicon-48x48.png">
<link rel="icon" type="image/png" sizes="96x96" href="favicon-96x96.png">
<link rel="icon" type="image/png" sizes="192x192" href="android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="android-chrome-512x512.png">
<meta property="og:type" content="website">
<meta property="og:url" content="https://hownz.com/">
<meta property="og:title" content="Safe Paste: Check & Clean Copied Text">
<meta property="og:description" content="Safely copy and paste text and remove the risk of hidden AI commands. Our tool checks your text for invisible code, hidden watermarks, and tracking symbols, letting you scan and clean everything but plain text before you publish.">
<meta property="og:image" content="https://hownz.com/android-chrome-512x512.png">
<meta property="og:image:width" content="512">
<meta property="og:image:height" content="512">
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://hownz.com/">
<meta property="twitter:title" content="Safe Paste: Check & Clean Copied Text">
<meta property="twitter:description" content="Safely copy and paste text and remove the risk of hidden AI commands. Our tool checks your text for invisible code, hidden watermarks, and tracking symbols, letting you scan and clean everything but plain text before you publish.">
<meta property="twitter:image" content="https://hownz.com/android-chrome-512x512.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="httpss://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&family=Open+Sans:wght@400;700&family=Lora:wght@400;700&family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="index.css" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://hownz.com/#organization",
"name": "hownz.com",
"url": "https://hownz.com/",
"logo": "https://hownz.com/android-chrome-512x512.png",
"contactPoint": {
"@type": "ContactPoint",
"email": "dailybuddyapp.com@gmail.com",
"contactType": "Customer Support",
"url": "https://hownz.com/#ctcs"
}
},
{
"@type": "WebSite",
"@id": "https://hownz.com/#website",
"url": "https://hownz.com/",
"name": "Safe Paste by hownz.com",
"description": "A free online tool to check and clean copied text from hidden code, AI watermarks, and trackers. Paste safely without risks.",
"publisher": {
"@id": "https://hownz.com/#organization"
},
"inLanguage": "en-US"
},
{
"@type": "WebApplication",
"name": "Safe Paste: Check & Clean Copied Text",
"description": "Safely copy and paste text without fear of hidden surprises. Our tool checks your text for invisible code, hidden watermarks, and tracking symbols, letting you strip everything but plain text before you publish. AI-generated texts are everywhere now, but those can hide dangerous stuff. This guide explains the risks of hidden symbols and marks and harmful code that may be hidden in the answers you cant easily see.",
"applicationCategory": "Utility",
"operatingSystem": "Any",
"browserRequirements": "Requires a modern web browser.",
"keywords": "copy checker, your post, posting surprise, invisible code scan, hidden code scan, hidden in text, clean ai text, text cleaner, safe paste, remove code, AI marks, safe text, scan code, copy paste, invisible symbols, hackers, hidden code, attacks prevention",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"mainEntityOfPage": {
"@id": "https://hownz.com/#website"
},
"publisher": {
"@id": "https://hownz.com/#organization"
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://hownz.com/"
}]
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Invisible Threats in Online Text: What’s Really Hidden?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Hidden watermarks in AI text are imperceptible characters or patterns (like the Narrow No-Break Space U+202F) embedded by AI models to create a covert signature, often for traceability."
}
},
{
"@type": "Question",
"name": "What are the main risks of AI text watermarks like U+202F?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Key risks include compromising user anonymity, enabling false attribution, being vulnerable to spoofing attacks, lack of transparency, and potential interference with text analysis systems."
}
},
{
"@type": "Question",
"name": "How can hidden code in text lead to hacking or malicious commands?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Hidden code can act as a vector for injection attacks, phishing, or malware. When text containing such code is copied into other environments, it can execute malicious commands, expose network ports, or lead to data breaches."
}
},
{
"@type": "Question",
"name": "Can AI watermarks be removed or tampered with?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, watermarks in AI content are often identified as easy to tamper with or remove, which weakens their reliability for long-term verification or digital forensics."
}
},
{
"@type": "Question",
"name": "What is the purpose of a 'covert signature' in AI-generated content?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A covert signature, often a hidden watermark like U+202F, serves to leave a traceable mark on AI-generated content, acting as an invisible fingerprint."
}
}
]
}
]
}
</script>
<script type="importmap">
{
"imports": {
"@google/genai": "https://esm.sh/@google/genai@^1.11.0",
"url": "https://esm.sh/url@^0.11.4",
"path": "https://esm.sh/path@^0.12.7",
"vite": "https://esm.sh/vite@^7.0.6",
"os": "https://esm.sh/os@^0.1.2",
"fs": "https://esm.sh/fs@^0.0.1-security"
}
}
</script>
<link rel="stylesheet" href="/index.css">
</head>
<body>
<div id="root">
<header class="site-header">
<div class="site-header-container">
<div class="header-left-side">
<div class="site-logo">
<a href="index.html">hownz.com</a>
</div>
<a href="hello.html" id="btn-hello-world" class="btn btn-special">Hello World!</a>
</div>
<div id="nav-wrapper" class="nav-wrapper">
<div class="header-actions">
<a href="coins.html" class="btn btn-rewards-info">Rewards info</a>
<div id="logged-in-controls" class="hidden">
<div class="coin-balance" title="Coins">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="24" height="24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-12h2v2h-2v-2zm-2 4h6v2H9v-2zm8-2c0-2.21-1.79-4-4-4s-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2h-2c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4h-2c0 1.1-.9 2-2 2s-2-.9-2-2h4c0-2.21-1.79-4-4-4z" /></svg>
<span id="coin-balance-display">0</span>
</div>
<button id="btn-logout" class="btn-logout">Logout</button>
</div>
<div id="logged-out-controls" class="header-login-container">
<form id="header-login-form" class="header-login-form">
<input
type="text"
id="login-username"
placeholder="account"
required
maxLength="5"
autoCapitalize="none"
/>
<input
type="password"
id="login-password"
placeholder="password"
required
maxLength="5"
autoCapitalize="none"
/>
<button type="submit" class="btn-login-register">Login/Register</button>
<a href="#settings" class="settings-icon" title="Settings">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="24" height="24">
<path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69-.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12-.64l2 3.46c.12.22.39.3.61.22l2.49 1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49.42l.38 2.65c.61-.25 1.17.59 1.69.98l2.49 1c.23-.09.49 0 .61.22l2-3.46c.12-.22-.07.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/>
</svg>
</a>
</form>
<p class="login-hint">Account & Password: 5 small English letters.</p>
</div>
</div>
</div>
</div>
</header>
<div class="app-container">
<header class="app-header">
<h1> Clean AI Text & Remove Hidden Code</h1>
<h2>AI and online text can conceal malicious scripts for phishing, injection attacks, or malware. Clean your copied content to prevent hackers<span role="img" aria-label="Shield">🛡️</span></h2>
</header>
<div class="option-wrapper">
<input
type="checkbox"
id="mark-unrecognized"
aria-labelledby="mark-unrecognized-label"
/>
<label id="mark-unrecognized-label" for="mark-unrecognized">
Mark unrecognized characters with # (instead of omitting) <span class="settings-reward-hint">(+5 Coin Reward)</span>
</label>
</div>
<main class="editor-grid">
<div class="text-container">
<label for="text-input">Raw Input</label>
<textarea
id="text-input"
placeholder="Paste your text here..."
aria-label="Input text to be cleared"
></textarea>
</div>
<div class="text-container">
<div class="cleared-text-header">
<label for="cleared-output">Cleared Text</label>
<div style="display: flex; align-items: center; gap: 0.5rem;">
<button id="btn-summarize" class="btn btn-summarize" disabled>✨ Summarize with AI</button>
<button id="btn-collect-coins" class="btn btn-collect" disabled>Collect Coins</button>
</div>
</div>
<textarea
id="cleared-output"
readOnly
placeholder="Cleared text will appear here..."
aria-label="Cleared output text"
aria-live="polite"
></textarea>
</div>
</main>
<div class="settings-wrapper" id="settings">
<div class="settings-group">
<h3 class="settings-heading">Configuration<span class="settings-reward-hint">(+2 Coin Bonus)</span></h3>
<label for="approved-chars-input" class="control-item-label">Approved Characters</label>
<textarea id="approved-chars-input" aria-label="Editable list of approved characters"></textarea>
<label for="condense-chars-input" class="control-item-label">Condense These Repeating Characters</label>
<input type="text" id="condense-chars-input" placeholder="e.g., ?!-:;#` " aria-label="Characters to condense when repeated" />
<div class="settings-buttons">
<button id="btn-save-config" class="btn btn-primary">Save Config</button>
<div class="btn-group-with-link">
<button id="btn-add-from-dictionary" class="btn btn-secondary">Include (add) other Languages</button>
<a href="app.json" target="_blank" rel="noopener noreferrer">(langs)</a>
</div>
<div class="btn-group-with-link">
<button id="btn-add-emojis" class="btn btn-secondary">Add Emojis</button>
<a href="admin.json" target="_blank" rel="noopener noreferrer">(e-jis)</a>
</div>
<button id="btn-reset-defaults" class="btn btn-secondary">Reset All</button>
</div>
<p id="save-feedback" style="opacity: 0;">Settings saved!</p>
</div>
<div class="settings-group">
<div class="settings-buttons" style="margin-bottom: 1rem; justify-content: flex-start;">
<button id="btn-save-txt" class="btn btn-primary">Save Result as .txt</button>
</div>
<h3 class="settings-heading" style="text-align: left;">Appearance<span class="settings-reward-hint">(+1 Coin Bonus)</span></h3>
<div class="appearance-controls">
<div class="control-item">
<label for="font-family-select">Font</label>
<select id="font-family-select" aria-label="Font family for cleared text">
<option value="'Roboto', sans-serif">Roboto</option>
<option value="'Open Sans', sans-serif">Open Sans</option>
<option value="'Lora', serif">Lora</option>
<option value="'Inconsolata', monospace">Inconsolata</option>
</select>
</div>
<div class="control-item">
<label for="font-size-input">Size (rem)</label>
<input type="number" id="font-size-input" min="0.5" max="2.5" step="0.1" aria-label="Font size in rem for cleared text" />
</div>
<div class="control-item">
<label for="font-color-input">Color</label>
<input type="color" id="font-color-input" aria-label="Font color for cleared text" />
</div>
<div class="control-item">
<label class="control-item-label">Style</label>
<div class="checkbox-item-row">
<input type="checkbox" id="font-weight-bold" aria-labelledby="font-weight-bold-label"/>
<label for="font-weight-bold" id="font-weight-bold-label">Bold</label>
</div>
</div>
</div>
<div class="privacy-notice" style="margin-top: 1rem; border-left-width: 0;">
<p><strong>Local Processing Notice:</strong> All data is processed locally on your device. This app has no backend and does not save or transmit your text. Please save your work elsewhere.</p>
</div>
</div>
</div>
<section class="qa-section">
<h2 class="qa-heading"><span role="img" aria-label="Speech bubble">💬</span> Frequently Asked Questions</h2>
<div id="qa-list-container" class="qa-list">
</div>
</section>
<section class="risks-details">
<details id="why-critical">
<summary class="risks-summary">
Why This Is Critical? Click to expose what’s really hiding in your copied content.
</summary>
<div class="focused-risks-container">
<h3><span role="img" aria-label="Magnifying glass">🔍</span> Risks from Hidden Watermarks in AI Text</h3>
<p>Here's a focused list of <strong>risks and dangers</strong> extracted from the referenced text, <strong>“ChatGPT's Invisible Ink”</strong> and related articles on hidden watermarks in AI-generated content:</p>
<div id="focused-risks-grid-container" class="focused-risks-grid">
</div>
</div>
</details>
</section>
<section class="understanding-risks">
<h2><span role="img" aria-label="Magnifying glass">🔎</span> Understanding Hidden Risks in AI-Generated Text</h2>
<p> AI-generated texts are everywhere now, but those can hide dangerous stuff. This explains the risks of hidden marks and harmful code that may be hidden in the answers you can't easily see. </p>
<h3><span role="img" aria-label="Spy">🕵️</span> AI Text Watermarking Vulnerabilities</h3>
<ul>
<li><strong>Hidden Fingerprints:</strong> Specific characters like the <strong>Narrow No-Break Space (U+202F)</strong> act as a <strong>covert signature</strong> or watermark in AI text. These create an <strong>invisible fingerprint</strong> that can be used to trace content origin.</li>
<li><strong>Privacy & Tracking:</strong> These watermarks can compromise <strong>user anonymity</strong> by revealing the source of content, especially when shared widely.</li>
<li><strong>False Attribution & Spoofing:</strong> Malicious actors can <strong>copy watermarks</strong> from authentic AI content and insert them into fake or altered texts, leading to <strong>false attribution</strong> or <strong>framing attacks</strong>.</li>
<li><strong>Tampering & Unreliability:</strong> Identified watermarks are often <strong>easy to strip or replace</strong>, making them <strong>unreliable for verification</strong> and weakening their integrity for digital forensics.</li>
<li><strong>Lack of Transparency:</strong> Users might unknowingly distribute watermarked content as watermarks are <strong>invisible to end users</strong>, raising ethical concerns about informed consent.</li>
<li><strong>Content Authenticity Confusion:</strong> Tampered watermarks can lead to <strong>distrust of both genuine and AI-generated content</strong>.</li>
</ul>
<h3><span role="img" aria-label="Warning">⚠️</span> Hidden Code & Security Risks</h3>
<ul>
<li><strong>Embedded Malicious Code:</strong> AI content might contain <strong>concealed code</strong> that affects formatting or behavior. When copied, this code can execute <strong>malicious commands</strong>.</li>
<li><strong>Hacking Vectors:</strong> Hidden code can serve as a vector for <strong>injection attacks, phishing, or malware</strong>. Copying such text can expose your <strong>network ports to hackers</strong>.</li>
<li><strong>Data Integrity Threats:</strong> Altered or hidden elements can corrupt databases, mislead automated systems, or cause <strong>interoperability conflicts</strong> across platforms.</li>
<li><strong>Detection Limitations:</strong> These hidden elements are often <strong>imperceptible to humans</strong>, requiring specialized tools for detection.</li>
</ul>
</section>
<section class="threat-vectors-section">
<h2 class="threat-vectors-heading"><span role="img" aria-label="Skull and crossbones">☠️</span> Conceptual Threat Vectors</h2>
<p class="threat-vectors-subheading">hownz may be explained as those:</p>
<div class="threat-vectors-grid">
<div class="threat-vector-item">
<h3>1. <em>Network Zinger Payload</em></h3>
<p>An invisible instruction embedded within AI-generated text that, when activated, creates a "network zipper" or covert connection to external servers, serving as a "hacking vector" for data exfiltration.</p>
</div>
<div class="threat-vector-item">
<h3>2. <em>Numeric Zero Exploit</em></h3>
<p>A malicious code hidden as a seemingly insignificant numerical value or an "invisible fingerprint" within the text, which exploits a "zero-day" vulnerability upon parsing to execute harmful commands.</p>
</div>
<div class="threat-vector-item">
<h3>3. <em>Noise Zero Fingerprint</em></h3>
<p>A watermarking technique so advanced that it leaves "zero detectable noise" to human or common automated analysis, creating a perfectly "covert signature" that is incredibly hard to detect or strip.</p>
</div>
<div class="threat-vector-item">
<h3>4. <em>Null Zone Conduit</em></h3>
<p>A specific, hidden segment of the AI-generated text acting as a "neutral zone" where "embedded malicious code" can reside undetected, serving as a "conduit" to bypass security checks.</p>
</div>
<div class="threat-vector-item">
<h3>5. <em>Nano-Zap Corruption</em></h3>
<p>A "nano-level" manipulation of character data or metadata within the text, designed to "zap" or corrupt specific elements in databases, leading to "data integrity threats" or "interoperability conflicts."</p>
</div>
<div class="threat-vector-item">
<h3>6. <em>Neural-Zero Deception</em></h3>
<p>A sophisticated form of watermark or hidden bias, operating at a "neural" level of text generation, designed to subtly "mislead automated systems" or promote "false attribution" without explicit hidden code.</p>
</div>
<div class="threat-vector-item">
<h3>7. <em>Non-Visible Zero Trace</em></h3>
<p>Refers to the use of "non-visible zero-width characters" or similar elements that leave an "invisible footprint" but are designed to be "easy to strip" or become "unreliable for verification" after initial detection, hindering traceability.</p>
</div>
<div class="threat-vector-item">
<h3>8. <em>Phantom Protocol Injection</em></h3>
<p>A hidden sequence of characters that mimics a legitimate "protocol" but, when processed, executes as a "malicious command" or an "injection attack," opening "network ports" to unauthorized access.</p>
</div>
<div class="threat-vector-item">
<h3>9. <em>Stealth Node Trigger</em></h3>
<p>A watermark or hidden element that functions as a "node" in a larger, concealed network of instructions. When this "node" is detected, it triggers a chain of events, designed to be "imperceptible to humans" initially.</p>
</div>
<div class="threat-vector-item">
<h3>10. <em>Entropy Zero Concealment</em></h3>
<p>A method where hidden data or watermarks are embedded by subtly reducing the "entropy" (randomness) of specific text segments, making them statistically anomalous yet not overtly visible, signaling "content origin" for those with "specialized tools for detection."</p>
</div>
</div>
</section>
<section class="share-earn-section">
<div class="share-earn-grid">
<div>
<h2 class="share-earn-heading" style="text-align: left;">📢 Share & Earn Rewards</h2>
<p class="share-earn-subheading" style="text-align: left; max-width: none;">Spread the word about safe text practices. Share directly or generate a unique referral link to earn coins!</p>
<div class="share-buttons-container" style="justify-content: flex-start;">
<a href="#" id="facebook-share-btn" class="share-btn facebook" target="_blank" rel="noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M22 12c0-5.52-4.48-10-10-10S2 6.48 2 12c0 4.84 3.44 8.87 8 9.8V15H8v-3h2V9.5C10 7.57 11.57 6 13.5 6H16v3h-1.5c-1 0-1.5.5-1.5 1.5V12h3l-.5 3h-2.5v6.8c4.56-.93 8-4.96 8-9.8z"/></svg>
Share on Facebook
</a>
<a href="#" id="telegram-share-btn" class="share-btn telegram" target="_blank" rel="noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M21.95 2.24a2.02 2.02 0 0 0-1.95-.97C18.23 1.54 3.32 7.53 2.15 8.05c-1.35.6-1.35 1.44 0 1.74l4.24 1.33 1.33 4.24c.3.96 1.14.96 1.74 0l.52-1.17c.56-.05 3.96-3.4 3.96-3.4s.38-.32 0-.02L9.43 14.9l-3.3-1.04.01-.01 10.8-6.72c.3-.18.57.17.39.46l-7.9 7.15 6.94 2.18c1.35.42 1.8.21 2.04-1.28l3.1-14.9c.24-1.14-.4-1.89-1.53-1.55z"/></svg>
Share on Telegram
</a>
</div>
<div class="referral-container" style="align-items: flex-start;">
<button id="btn-generate-referral" class="btn btn-primary">Generate Referral Link (+10 Coins)</button>
<div id="referral-link-wrapper" class="hidden">
<input type="text" id="referral-link-input" readonly aria-label="Generated Referral Link">
<button id="btn-copy-referral" class="btn btn-secondary">Copy</button>
</div>
<p id="referral-feedback"></p>
</div>
</div>
<div class="api-key-section">
<h3><span role="img" aria-label="Key">🔑</span> Use Your Own AI Key</h3>
<p>If the shared API is busy, you can enter your own Google API key to use the summarize function.</p>
<form id="api-key-form" class="api-key-form">
<input type="password" id="personal-api-key-input" placeholder="Enter your Gemini API Key" aria-label="Personal Gemini API Key Input">
<button type="submit" class="btn btn-secondary">Save Key</button>
</form>
<p id="api-key-feedback"></p>
</div>
</div>
</section>
<section class="npm-install-section">
<h3><span role="img" aria-label="Package">📦</span> Command-Line Tool for Developers</h3>
<p class="npm-install-subheading">For developers, install this tool globally to use it anywhere in your terminal. After installation, you can claim a reward! Choose your preferred method:</p>
<div class="install-options-grid">
<div class="install-option-item">
<h4>Option 1: From NPM Registry</h4>
<p>The standard, recommended method. Installs the official package from the public <a href="https://www.npmjs.com/package/hownz/v/2.0.0" target="_blank" rel="noopener noreferrer">NPM registry</a>.</p>
<div class="npm-command-wrapper">
<code class="npm-command">npm install -g hownz</code>
<button id="btn-copy-npm-command" class="btn btn-secondary btn-copy-command">Copy</button>
</div>
</div>
<div class="install-option-item">
<h4>Option 2: From This Website</h4>
<p>A direct installation, useful if the NPM registry is unavailable or for specific versions.</p>
<div class="npm-command-wrapper">
<code class="npm-command">npm install -g https://hownz.com/hownz-2.0.0.tgz</code>
<button id="btn-copy-direct-command" class="btn btn-secondary btn-copy-command">Copy</button>
</div>
</div>
</div>
</section>
<section class="cli-usage-section">
<h3><span role="img" aria-label="Terminal">💻</span> Command-Line Usage</h3>
<p class="cli-usage-subheading">Once installed, use the <code>hownz</code> command in your terminal. It's designed for simplicity and shell integration.</p>
<div class="cli-commands-grid">
<div class="cli-command-item"><code>hownz "text"</code><p>Cleans a string → console output.</p></div>
<div class="cli-command-item"><code>hownz -a "text"</code><p>Cleans a string → .txt file.</p></div>
<div class="cli-command-item"><code>echo "text" | hownz</code><p>Cleans piped text → .txt file.</p></div>
<div class="cli-command-item"><code>hownz < in.txt --here</code><p>Cleans file input → console output.</p></div>
<div class="cli-command-item"><code>hownz --list</code><p>Shows all contraction replacements.</p></div>
<div class="cli-command-item"><code>hownz --text</code><p>Shows all approved characters.</p></div>
<div class="cli-command-item"><code>hownz < input.txt</code><p>Cleans a file and saves the output to a new .txt file.</p></div>
<div class="cli-command-item"><code>hownz -h</code><p>Displays the detailed help guide.</p></div>
</div>
</section>
<section class="internal-links-section">
<h2 class="internal-links-heading">Explore Our Network</h2>
<nav class="site-nav">
<ul id="nav-links-container" class="nav-links-relocated">
</ul>
</nav>
</section>
<section id="ctcs" class="contact-section">
<h2 class="contact-heading"><span role="img" aria-label="Mailbox">📫</span> Contact Us</h2>
<p class="contact-subheading">Have a suggestion, a question, or want to report an issue? We'd love to hear from you!</p>
<div class="contact-card">
<h3><span role="img" aria-label="New Zealand Flag">🇳🇿</span> Get in Touch</h3>
<p class="contact-link"><span role="img" aria-label="Email">📧</span> <strong>Email:</strong> <a href="mailto:dailybuddyapp.com@gmail.com">dailybuddyapp.com@gmail.com</a></p>
<p class="contact-link"><span role="img" aria-label="Telegram">✈️</span> <strong>Telegram:</strong> <a href="https://t.me/MeetUpNZ" target="_blank" rel="noopener noreferrer">@MeetUpNZ</a></p>
</div>
</section>
</div>
<footer class="site-footer-main">
<div id="footer-links-container" class="footer-links">
</div>
<button id="btn-claim-install" class="btn btn-claim-install">Explore</button>
<div class="site-search-container">
<form id="site-search-form" class="site-search-form">
<input type="search" id="site-search-input" class="site-search-input" placeholder="Search across our network...">
<button type="submit" class="site-search-button" aria-label="Search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M15.5 14h-.79l-.28-.27C14.41 12.59 15 11.11 15 9.5 15 5.91 12.09 3 8.5 3S2 5.91 2 9.5 4.91 16 8.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L19.49 19l-4.99-5zm-7 0C6.01 14 4 11.99 4 9.5S6.01 5 8.5 5 13 7.01 13 9.5 10.99 14 8.5 14z"/></svg>
</button>
</form>
</div>
<div class="footer-banner">
<div class="footer-v-stack">
<div id="date-time-display">
<span id="time-display" class="time"></span>
<span id="date-display" class="date"></span>
</div>
<a href="https://mfatnz.com" id="ip-ad-link">
<img src="https://ip.im/img" alt="My IP Address" width="185" height="50" />
</a>
</div>
<div class="footer-banner-text-content" style="text-align: left;">
<p style="margin: 0 0 0.5rem 0;"><span role="img" aria-label="Coin">🟡</span> Your progress is worth celebrating. Earn <strong>Dopamine Dash Coins</strong> as part of a fair system designed to support your <strong>motivation</strong>.</p>
<p style="margin: 0;">A free, non-commercial tool created in support of mfatnz.com Independent Initiative. A simple tool for the developer community.</p>
</div>
</div>
</footer>
</div>
<script type="module">
// This script contains the logic for the main page and other shared functionality.
// NOTE: This script is shared across multiple pages. It uses feature detection (e.g., if(element){...})
// to run page-specific code only when needed.
import { GoogleGenAI } from 'https://esm.sh/@google/genai';
document.addEventListener('DOMContentLoaded', async () => {
const updateDateTime = () => {
const timeDisplay = document.getElementById('time-display');
const dateDisplay = document.getElementById('date-display');
if (!timeDisplay || !dateDisplay) return;
const now = new Date();
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
timeDisplay.textContent = `${hours}:${minutes}`;
const options = { year: 'numeric', month: 'long', day: 'numeric' };
dateDisplay.textContent = now.toLocaleDateString(undefined, options);
};
updateDateTime();
setInterval(updateDateTime, 60000);
let currencyMap = [];
try {
const response = await fetch('usd.json');
if (!response.ok) throw new Error('Network response was not ok');
currencyMap = await response.json();
} catch (error) {
console.error('Failed to load currency data from usd.json:', error);
currencyMap = [
{"symbol": "£", "abbreviation": "GBP"}, {"symbol": "$", "abbreviation": "USD"},
{"symbol": "€", "abbreviation": "EUR"}, {"symbol": "¥", "abbreviation": "JPY"},
{"symbol": "₹", "abbreviation": "INR"}, {"symbol": "₽", "abbreviation": "RUB"},
{"symbol": "₩", "abbreviation": "KRW"}, {"symbol": "A$", "abbreviation": "AUD"},
{"symbol": "C$", "abbreviation": "CAD"}, {"symbol": "NZ$", "abbreviation": "NZD"}
];
}
const qaData=[{q:"Invisible Threats in Online Text: What’s Really Hidden?",a:"Hidden watermarks in AI text are imperceptible characters or patterns (like the Narrow No-Break Space U+202F) embedded by AI models to create a covert signature, often for traceability."},{q:"What are the main risks of AI text watermarks like U+202F?",a:"Key risks include compromising user anonymity, enabling false attribution, being vulnerable to spoofing attacks, lack of transparency, and potential interference with text analysis systems."},{q:"How can hidden code in text lead to hacking or malicious commands?",a:"Hidden code can act as a vector for injection attacks, phishing, or malware. When text containing such code is copied into other environments, it can execute malicious commands, expose network ports, or lead to data breaches."},{q:"Can AI watermarks be removed or tampered with?",a:"Yes, watermarks in AI content are often identified as easy to tamper with or remove, which weakens their reliability for long-term verification or digital forensics."},{q:"What is the purpose of a 'covert signature' in AI-generated content?",a:"A covert signature, often a hidden watermark like U+202F, serves to leave a traceable mark on AI-generated content, acting as an invisible fingerprint."}];
const focusedRisksData=[{icon:'👆',title:'Hidden Fingerprints in Text',description:"Watermarks: Imperceptibly embedded into text, they act like a spy's secret handshake for traceability."},{icon:'🕵️♀️',title:'Privacy & Tracking Risks',description:"These watermarks can be used to trace the origin of content, potentially compromising user anonymity, especially if the content is shared or published widely."},{icon:'🎭',title:'False Attribution',description:"Malicious actors may insert watermarks from known models into fake or altered content, misleading others into believing it came from a specific AI or source."},{icon:'🎣',title:'Spoofing & Framing Attacks',description:"Watermarked content could be repurposed to falsely implicate someone, making it look like they generated or endorsed something they didn’t."},{icon:'🗑️',title:'Watermark Removal Vulnerability',description:"Watermarks in AI content are easy to tamper."},{icon:'👁️🗨️',title:'Lack of Transparency',description:"Watermarks are invisible to end users, meaning people might unknowingly distribute watermarked content without informed consent."},{icon:'❓',title:'Content Authenticity Confusion',description:"Watermarks intended to prove authenticity can backfire when tampered with, leading to distrust of both genuine and AI-generated content."},{icon:'🏛️',title:'Platform Liability Exposure',description:"Platforms that host or distribute AI content with hidden watermarks may face legal or reputational risks if these markings are linked to unauthorized surveillance or misattribution."},{icon:'⚙️',title:'Interference with Sensitive Text Systems',description:"Special characters used as watermarks may interact unpredictably with search engines, text analysis tools, or accessibility systems (e.g., screen readers)."},{icon:'🛡️',title:'Bypassing Detection Tools',description:"Once attackers understand watermarking techniques, they can fabricate “authentic-looking” watermarked content to evade detection."}];
const DEFAULT_APPROVED_CHARS = `'\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:,-.*[]!<>()?;&$@~/%^{}|\\-_=\t \nбвгджзклмнпрстфхцчшщаеёиоуыэюяБВГДЗКЛМНПРСТФХЙЧЩАЭЫОУЯЕИЁЮіўІЎґєєїҐЄЇāēīōūĀĒĪŌŪαβγδεζηθικλμνξοπρσςτυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ+-*/=≠<>≤≥≈∑∫∂π∞√∈∉∀∃∝∧∨¬⇒⇔≡∪∩⊂⊃⊆⊇∅∇×÷±∓∏∛∜∠⊥∥∋∌⊄⊅⊈⊉iːɪeæʌɑːɒɔːʊuːəɜːeɪaɪɔɪəʊaʊɪəeəʊəpbtbd tʃdʒkgfvθðszʃʒhmnŋlrwjIVXLCDMivxlcdm`;
const DEFAULT_CONDENSE_CHARS = "*?!,-:;#`\t";
const DEFAULT_FONT_FAMILY = "'Roboto', sans-serif";
const DEFAULT_FONT_SIZE = "1";
const DEFAULT_FONT_COLOR = "#E0E0E0";
const DEFAULT_IS_BOLD = !1;
const DEFAULT_MARK_UNRECOGNIZED = !1;
const LS_KEY_MARK = 'clearedTextMarkUnrecognized';
const LS_KEY_CHARS = 'clearedTextApprovedChars';
const LS_KEY_CONDENSE = 'clearedTextCondenseChars';
const LS_KEY_FONT_FAMILY = 'clearedTextFontFamily';
const LS_KEY_FONT_SIZE = 'clearedTextFontSize';
const LS_KEY_FONT_COLOR = 'clearedTextFontColor';
const LS_KEY_IS_BOLD = 'clearedTextIsBold';
const LS_KEY_USERS = 'clearedTextUsers';
const LS_KEY_CURRENT_USER = 'clearedTextCurrentUser';
const LS_KEY_PERSONAL_API_KEY = 'clearedTextPersonalApiKey';
const RATE_LIMIT_KEY = 'hownzApiTimestamps';
const MAX_CALLS_PER_MINUTE = 20;
const ONE_MINUTE_MS = 60 * 1000;
const navLinks = [{href: "https://actnz.com/", text: "Planner", target: "_blank"}, {href: "https://mfatnz.com/", text: "Token Counter", target: "_blank"}, {href: "https://actnz.com/coins.html", text: "Coins", target: "_blank"}, {href: "https://irdnz.com/", text: "NZ Finances", target: "_blank"}, {href: "https://irdnz.com/bonds.html", text: "Bond Market Tips", target: "_blank"}];
const footerLinks = [{href: "https://mfatnz.com/", text: "mfatnz.com"}, {href: "https://actnz.com", text: "actnz.com"}, {href: "https://irdnz.com", text: "irdnz.com"}, {href: "https://hownz.com", text: "hownz.com"}, {href: "coins.html", text: "Rewards info"}];
const dom = {
navLinksContainer: document.getElementById('nav-links-container') || document.querySelector('.nav-links-relocated'),
footerLinksContainer: document.getElementById('footer-links-container'),
loggedInControls: document.getElementById('logged-in-controls'),
loggedOutControls: document.getElementById('logged-out-controls'),
loginForm: document.getElementById('header-login-form'),
loginUsernameInput: document.getElementById('login-username'),
loginPasswordInput: document.getElementById('login-password'),
logoutButton: document.getElementById('btn-logout'),
coinBalanceDisplay: document.getElementById('coin-balance-display'),
siteSearchForm: document.getElementById('site-search-form'),
siteSearchInput: document.getElementById('site-search-input'),
// Page-specific elements (will be null on pages where they don't exist)
qaListContainer: document.getElementById('qa-list-container'),
focusedRisksGridContainer: document.getElementById('focused-risks-grid-container'),
markUnrecognizedCheck: document.getElementById('mark-unrecognized'),
textInput: document.getElementById('text-input'),
clearedOutput: document.getElementById('cleared-output'),
btnCollectCoins: document.getElementById('btn-collect-coins'),
approvedCharsInput: document.getElementById('approved-chars-input'),
condenseCharsInput: document.getElementById('condense-chars-input'),
saveConfigButton: document.getElementById('btn-save-config'),
resetDefaultsButton: document.getElementById('btn-reset-defaults'),
btnAddFromDictionary: document.getElementById('btn-add-from-dictionary'),
btnAddEmojis: document.getElementById('btn-add-emojis'),
saveFeedback: document.getElementById('save-feedback'),
fontFamilySelect: document.getElementById('font-family-select'),
fontSizeInput: document.getElementById('font-size-input'),
fontColorInput: document.getElementById('font-color-input'),
isBoldCheck: document.getElementById('font-weight-bold'),
facebookShareBtn: document.getElementById('facebook-share-btn'),
telegramShareBtn: document.getElementById('telegram-share-btn'),
btnGenerateReferral: document.getElementById('btn-generate-referral'),
referralLinkWrapper: document.getElementById('referral-link-wrapper'),
referralLinkInput: document.getElementById('referral-link-input'),
btnCopyReferral: document.getElementById('btn-copy-referral'),
referralFeedback: document.getElementById('referral-feedback'),
btnSaveTxt: document.getElementById('btn-save-txt'),
btnHelloWorld: document.getElementById('btn-hello-world'),
btnClaimInstall: document.getElementById('btn-claim-install'),
btnSummarize: document.getElementById('btn-summarize'),
apiKeyForm: document.getElementById('api-key-form'),
personalApiKeyInput: document.getElementById('personal-api-key-input'),
apiKeyFeedback: document.getElementById('api-key-feedback'),
btnCopyNpmCommand: document.getElementById('btn-copy-npm-command'),
btnCopyDirectCommand: document.getElementById('btn-copy-direct-command')
};
const getStoredValue = (key, fallback, isBoolean = !1) => {const value = localStorage.getItem(key); if (value === null) return fallback; if (isBoolean) return value === 'true'; if (typeof fallback === 'number') { const num = parseFloat(value); return isNaN(num) ? fallback : num } return value };
const _getUsersData = () => { const data = localStorage.getItem(LS_KEY_USERS); return data ? JSON.parse(data) : {} };
const _saveUsersData = data => { localStorage.setItem(LS_KEY_USERS, JSON.stringify(data)) };
let _currentUser = getStoredValue(LS_KEY_CURRENT_USER, null);
const authManager = {
isAuthenticated: () => !!_currentUser,
getCurrentUser: () => _currentUser,
loginOrRegister: (username, password) => {
if (!username || !password) return { success: !1, message: 'Username and password required.' };
const usersData = _getUsersData();
if (usersData[username]) {
if (usersData[username].password === password) { _currentUser = username; localStorage.setItem(LS_KEY_CURRENT_USER, username); return { success: !0, message: 'Login successful.', isNewUser: !1 } }
else { return { success: !1, message: 'Incorrect password.' } }
} else {
usersData[username] = { password: password, coins: 0 };
_saveUsersData(usersData);
_currentUser = username;
localStorage.setItem(LS_KEY_CURRENT_USER, username);
return { success: !0, message: 'Registration successful.', isNewUser: !0 }
}
},
logout: () => { _currentUser = null; localStorage.removeItem(LS_KEY_CURRENT_USER); updateUI(); }
};
const coinManager = {
getBalance: () => { if (!authManager.isAuthenticated()) return 0; const usersData = _getUsersData(); const currentUser = authManager.getCurrentUser(); return usersData[currentUser]?.coins || 0 },
addCoins: amount => { if (!authManager.isAuthenticated() || amount <= 0) return; const usersData = _getUsersData(); const currentUser = authManager.getCurrentUser(); if (usersData[currentUser]) { usersData[currentUser].coins = (usersData[currentUser].coins || 0) + amount; _saveUsersData(usersData) } }
};
let state = {
inputText: '',
markUnrecognized: getStoredValue(LS_KEY_MARK, DEFAULT_MARK_UNRECOGNIZED, !0),
approvedChars: getStoredValue(LS_KEY_CHARS, DEFAULT_APPROVED_CHARS),
condenseChars: getStoredValue(LS_KEY_CONDENSE, DEFAULT_CONDENSE_CHARS),
fontFamily: getStoredValue(LS_KEY_FONT_FAMILY, DEFAULT_FONT_FAMILY),
fontSize: getStoredValue(LS_KEY_FONT_SIZE, DEFAULT_FONT_SIZE),
fontColor: getStoredValue(LS_KEY_FONT_COLOR, DEFAULT_FONT_COLOR),
isBold: getStoredValue(LS_KEY_IS_BOLD, DEFAULT_IS_BOLD, !0),
rewardGivenForInput: !1,
appearanceChanged: !1,
configChanged: !1,
referralLinkGenerated: !1,
pendingReward: 0,
helloClicked: sessionStorage.getItem('helloClicked') === 'true',
txtSaved: sessionStorage.getItem('txtSaved') === 'true',
installClaimed: sessionStorage.getItem('installClaimed') === 'true',
isSummarizing: false,
personalApiKey: getStoredValue(LS_KEY_PERSONAL_API_KEY, '')
};
const checkRateLimit = () => {
const now = Date.now();
const timestamps = JSON.parse(sessionStorage.getItem(RATE_LIMIT_KEY) || '[]');
const recentTimestamps = timestamps.filter(ts => now - ts < ONE_MINUTE_MS);
if (recentTimestamps.length >= MAX_CALLS_PER_MINUTE) {
return false;
}
recentTimestamps.push(now);
sessionStorage.setItem(RATE_LIMIT_KEY, JSON.stringify(recentTimestamps));
return true;
};
const generateRandomString = () => { const digits = '012356789'; return digits.charAt(Math.floor(Math.random() * digits.length)); };
const showCollectFeedback = amount => { const feedbackEl = document.createElement('span'); feedbackEl.textContent = `+${amount} Coins!`; feedbackEl.className = 'collect-feedb