Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 15665 байт. Загружен за: 1сек.
Проверяемая страница не запрещена в robots.txt.
Показать содержимое robots.txt
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ben's Best Bent Wire</title>
<meta name="description" content="CW morse code speed challenges - word races, callsign sprints, QSO lightning, head copy, and more!">
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="stylesheet" href="css/style.css?v=20">
<script>
// Prevent flash of welcome overlay if setup is already complete
// This runs immediately and adds styles before page renders
try {
const settings = JSON.parse(localStorage.getItem('bbbw-settings') || '{}');
if (settings.setupComplete) {
document.write('<style>#welcome-overlay, #setup-overlay { display: none !important; }</style>');
}
} catch (e) {}
</script>
</head>
<body>
<div class="promo-banner">Want to use a real CW key with your computer or phone? Build or buy one at <a href="https://vailadapter.com" target="_blank" rel="noopener">vailadapter.com</a></div>
<!-- Welcome overlay for first-time visitors -->
<div id="welcome-overlay">
<div class="welcome-content">
<h1>Ben's Best Bent Wire</h1>
<p class="tagline">CW Speed Challenge</p>
<div class="welcome-info">
<h2>What is this?</h2>
<p>A collection of CW morse code speed challenges. Race to key words, callsigns, QSO exchanges, and more!</p>
<h2>Game Modes</h2>
<ul>
<li><strong>Word Challenge:</strong> Key a target word as fast as you can - choose from 40+ words</li>
<li><strong>Callsign Sprint:</strong> Key 10 random community callsigns for time</li>
<li><strong>QSO Lightning:</strong> Complete a full CQ, exchange, and 73</li>
<li><strong>Head Copy Echo:</strong> Listen to morse, then key it back from memory</li>
<li><strong>And more</strong> in the <strong>More Games</strong> menu!</li>
</ul>
<h2>Input Options</h2>
<ul>
<li><strong>Keyboard:</strong> Left Ctrl = Dit, Right Ctrl = Dah (or use X/Z, [/], or ./)</li>
<li><strong>Physical CW Key:</strong> Connect via <a href="https://vailadapter.com" target="_blank">Vail Adapter</a> or VBand Adapter</li>
</ul>
<h2>How to Play</h2>
<ul>
<li>Key the letters shown - they turn green when correct</li>
<li>Wrong element? You'll hear a buzz and start over after 2 seconds</li>
<li>Timer starts on first element and stops when you complete the word</li>
<li>Your best time is saved to the leaderboard!</li>
</ul>
<p class="privacy-note"><small>Score submissions record a hashed IP for anti-abuse. Raw IPs are not retained.</small></p>
<h2>Tips</h2>
<ul>
<li>Use the <strong>Calibration</strong> tool in Settings to dial in your dit/dah timing</li>
<li>The decoder adapts to your speed - just key naturally</li>
<li>If using Vail Adapter sidetone, disable computer sidetone in Settings</li>
<li>Use <strong>Choose Word</strong> to pick a different word challenge</li>
</ul>
</div>
<div class="welcome-buttons">
<a href="https://discord.gg/ERceAGnCr7" target="_blank" class="discord-btn">Join our Discord</a>
<a href="mailto:ke9bos@pigletradio.org" class="feedback-btn">Send Feedback</a>
</div>
<button id="continue-btn" class="primary-btn">Continue to Setup</button>
</div>
</div>
<!-- First-time setup overlay -->
<div id="setup-overlay" class="hidden">
<div class="setup-content">
<h1>Setup</h1>
<p>Configure your settings before playing.</p>
<div class="setting-group">
<label for="setup-callsign">Callsign / Name</label>
<input type="text" id="setup-callsign" placeholder="Enter your callsign (e.g., W1XYZ)" maxlength="20" style="text-transform: uppercase;">
<p class="setting-hint">Your times will be saved under this name</p>
</div>
<div class="setting-group checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="setup-no-leaderboard">
<span>Don't save my scores to the leaderboard</span>
</label>
</div>
<div class="setting-group">
<label for="setup-keyer-mode">Keyer Mode</label>
<select id="setup-keyer-mode">
<option value="straight">Straight Key / Cootie</option>
<option value="bug">Bug</option>
<option value="elbug">ElBug</option>
<option value="singledot">Single Dot</option>
<option value="ultimatic">Ultimatic</option>
<option value="iambic">Iambic (Plain)</option>
<option value="iambica">Iambic A</option>
<option value="iambicb">Iambic B</option>
<option value="keyahead">Keyahead</option>
</select>
</div>
<div class="setting-group">
<label for="setup-wpm">Speed Estimate: <span id="setup-wpm-value">15</span> WPM</label>
<input type="range" id="setup-wpm" min="5" max="50" step="1" value="15">
<p class="setting-hint">Starting point for decoder timing (adapts as you key)</p>
</div>
<div class="setting-group">
<label for="setup-tx-tone">Tone: <span id="setup-tone-value">C5 (523 Hz)</span></label>
<input type="range" id="setup-tx-tone" min="48" max="96" step="1" value="72">
</div>
<div class="setting-group checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="setup-sidetone-enabled" checked>
<span>Enable computer sidetone</span>
</label>
<p class="setting-hint">Disable if using Vail Adapter's built-in sidetone</p>
</div>
<div class="setting-group" id="setup-volume-group">
<label for="setup-volume">Sidetone Volume: <span id="setup-volume-value">80</span>%</label>
<input type="range" id="setup-volume" min="0" max="100" step="1" value="80">
</div>
<p id="setup-error" class="error-text hidden">Please enter a callsign or check the box to opt out.</p>
<button id="setup-done-btn" class="primary-btn">Start Playing</button>
</div>
</div>
<!-- Click overlay to start AudioContext -->
<div id="start-overlay" class="hidden">
<div class="start-content">
<h1>Ben's Best Bent Wire</h1>
<p>CW Speed Challenge</p>
<button id="start-btn">Click to Start</button>
<p class="hint">Connect your CW key and get ready to send</p>
<p class="promo-hint">Want to use a real CW key with your computer or phone? Build or buy one at <a href="https://vailadapter.com" target="_blank" rel="noopener">vailadapter.com</a></p>
</div>
</div>
<div id="app" class="hidden">
<header>
<a href='/leaderboard' id='leaderboard-link'>Leaderboard</a>
<a class='nav-btn' href='/stats'>Stats</a>
<a class='nav-btn' href='/awards'>Awards</a>
<a class='nav-btn' href='/history'>My History</a>
<a class='nav-btn' href='/more-words'>Choose Word</a>
<a class='nav-btn' href='/more-games'>More Games</a>
<div class="spacer"></div>
<button id="how-to-play-btn" class="nav-btn">How to Play</button>
<a href="mailto:ke9bos@pigletradio.org" class="nav-btn">Feedback</a>
<button id="settings-btn" aria-label="Settings">
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/>
</svg>
</button>
</header>
<main>
<div id="target-word" class="target-word">
<!-- Generated dynamically by JavaScript -->
</div>
<div id="timer">0.000</div>
<div id="status"></div>
<div id="personal-best" class="hidden">
Personal Best: <span id="pb-time">--</span>
</div>
</main>
<footer>
<p id="input-status" class="input-status">Keyboard</p>
<p class="key-hint">Keys: Left Ctrl = Dit, Right Ctrl = Dah</p>
<div class="footer-links">
<a href="https://discord.gg/ERceAGnCr7" target="_blank">Join Discord</a>
<a href="mailto:ke9bos@pigletradio.org">Feedback</a>
</div>
<div class="bmc-button-container">
<a href="https://www.buymeacoffee.com/ke9bos" target="_blank" rel="noopener" class="bmc-button"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=☕&slug=ke9bos&button_colour=5F7FFF&font_colour=ffffff&font_family=Cookie&outline_colour=000000&coffee_colour=FFDD00" alt="Buy me a coffee" height="40"></a>
</div>
<p class="credits">Developed by Brett KE9BOS and the <a href="https://discord.gg/ERceAGnCr7" target="_blank">Vail Community</a></p>
</footer>
</div>
<!-- How to Play Modal -->
<div id="how-to-play-modal" class="modal hidden">
<div class="modal-content how-to-play-content">
<div class="modal-header">
<h2>How to Play</h2>
<button id="close-how-to-play" class="close-btn">×</button>
</div>
<div class="modal-body">
<h3>What is this?</h3>
<p>A collection of CW morse code speed challenges. Key words, callsigns, QSO exchanges, and more!</p>
<h3>Game Modes</h3>
<ul>
<li><strong>Word Challenge:</strong> Key a target word as fast as you can - choose from 40+ words via <strong>Choose Word</strong></li>
<li><strong>More Games:</strong> Callsign Sprint, QSO Lightning, Head Copy Echo, Clean Sweep, and more</li>
</ul>
<h3>Input Options</h3>
<ul>
<li><strong>Keyboard:</strong> Left Ctrl = Dit, Right Ctrl = Dah (or X/Z, [/], ./)</li>
<li><strong>Physical CW Key:</strong> Connect via <a href="https://vailadapter.com" target="_blank">Vail Adapter</a> or VBand Adapter</li>
</ul>
<h3>Word Challenge Rules</h3>
<ul>
<li>Key the letters shown - they turn green when correct</li>
<li>Wrong element? You'll hear a buzz and start over after 2 seconds</li>
<li>Timer starts on first element and stops when you complete the word</li>
</ul>
<h3>Tips</h3>
<ul>
<li>Use <strong>Calibration</strong> in Settings to dial in your dit/dah timing</li>
<li>The decoder adapts to your speed - just key naturally</li>
<li>If using Vail Adapter sidetone, disable computer sidetone in Settings</li>
</ul>
<div class="modal-buttons">
<a href="https://discord.gg/ERceAGnCr7" target="_blank" class="discord-btn">Join our Discord</a>
<a href="mailto:ke9bos@pigletradio.org" class="feedback-btn">Send Feedback</a>
</div>
</div>
</div>
</div>
<!-- Settings Modal -->
<div id="settings-modal" class="modal hidden">
<div class="modal-content">
<div class="modal-header">
<h2>Settings</h2>
<button id="close-settings" class="close-btn">×</button>
</div>
<div class="modal-body">
<div class="setting-group">
<label for="callsign">Callsign / Name</label>
<input type="text" id="callsign" placeholder="Enter your callsign" maxlength="20" style="text-transform: uppercase;">
<p class="setting-hint">Your times will be saved under this name</p>
</div>
<div class="setting-group checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="no-leaderboard">
<span>Don't save my scores to the leaderboard</span>
</label>
</div>
<div class="setting-group">
<label for="keyer-mode">Keyer Mode</label>
<select id="keyer-mode">
<option value="straight">Straight Key / Cootie</option>
<option value="bug">Bug</option>
<option value="elbug">ElBug</option>
<option value="singledot">Single Dot</option>
<option value="ultimatic">Ultimatic</option>
<option value="iambic">Iambic (Plain)</option>
<option value="iambica">Iambic A</option>
<option value="iambicb">Iambic B</option>
<option value="keyahead">Keyahead</option>
</select>
</div>
<div class="setting-group">
<label for="wpm">Speed Estimate: <span id="wpm-value">15</span> WPM</label>
<input type="range" id="wpm" min="5" max="50" step="1" value="15">
<p class="setting-hint">Starting point for decoder timing (adapts as you key)</p>
</div>
<div class="setting-group">
<label for="tx-tone">Tone: <span id="tone-value">C5 (523 Hz)</span></label>
<input type="range" id="tx-tone" min="48" max="96" step="1" value="72">
</div>
<div class="setting-group checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="sidetone-enabled" checked>
<span>Enable computer sidetone</span>
</label>
<p class="setting-hint">Disable if using Vail Adapter's built-in sidetone</p>
</div>
<div class="setting-group" id="volume-group">
<label for="volume">Sidetone Volume: <span id="volume-value">80</span>%</label>
<input type="range" id="volume" min="0" max="100" step="1" value="80">
</div>
<div class="setting-group checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="error-tone-enabled" checked>
<span>Play error tone on wrong element</span>
</label>
</div>
<div class="setting-group">
<button id="calibration-btn" class="secondary-btn">Calibrate Timing</button>
<p class="setting-hint">Practice dits and dahs to dial in your timing</p>
</div>
</div>
</div>
</div>
<!-- Calibration Modal -->
<div id="calibration-modal" class="modal hidden">
<div class="modal-content calibration-content">
<div class="modal-header">
<h2>Calibration</h2>
<button id="close-calibration" class="close-btn">×</button>
</div>
<div class="modal-body">
<p class="calibration-hint">Key some dits and dahs to see how they're being classified</p>
<div class="element-display">
<div id="element-viz"></div>
</div>
<div class="timing-stats">
<div class="stat">
<span class="stat-label">Last:</span>
<span id="last-duration">--</span>ms
<span id="last-element" class="element-badge">--</span>
</div>
<div class="stat">
<span class="stat-label">Threshold:</span>
<span id="threshold-value">--</span>ms
</div>
</div>
<div class="setting-group">
<label for="dit-threshold">Dit/Dah Threshold: <span id="threshold-display">--</span>ms</label>
<input type="range" id="dit-threshold" min="50" max="500" step="10" value="200">
<p class="setting-hint">Elements shorter than this are dits, longer are dahs</p>
</div>
<div class="calibration-actions">
<button id="reset-calibration" class="secondary-btn">Reset to Auto</button>
<button id="save-calibration" class="primary-btn">Save & Close</button>
</div>
</div>
</div>
</div>
<!-- Complete Modal -->
<div id="complete-modal" class="modal hidden">
<div class="modal-content">
<div class="modal-header">
<h2>Complete!</h2>
</div>
<div class="modal-body">
<div id="final-time" class="big-time">0.000</div>
<div id="result-message"></div>
<button id="try-again-btn" class="primary-btn">Try Again</button>
</div>
</div>
</div>
<script type="module" src="scripts/main.mjs?v=25"></script>
<script type="module">
import { initTicker } from './scripts/ticker.mjs?v=6'
initTicker()
</script>
</body>
</html>