1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <!-- Domain Protection - Must be first script --> 5
5<script> 6 (function() { 7 // Check if we're being embedded in an iframe 8 if (window.self !== window.top) { 9 // We're in an iframe - try to break out 10 try { 11 var parentHostname = window.top.location.hostname; 12 // If we can read parent hostname and it's the fake site, break out 13 if (parentHostname === 'ao3dle.org' || parentHostname === 'www.ao3dle.org') { 14 window.top.location.replace('https://ao3dle.vercel.app' + window.location.pathname + '?redirected_from_fake=1'); 15 } 16 } catch (e) { 17 // Cross-origin or sandboxed iframe - we can't break out 18 // Instead, show a full-page overlay warning the user 19 console.warn('Site is embedded in an iframe - showing warning overlay'); 20 21 // Set a flag to show the overlay after DOM loads 22 window.iframeEmbedded = true; 23 24 try { 25 window.top.location.replace('https://ao3dle.vercel.app' + window.location.pathname + '?iframe_embedded=1'); 26 } catch (e2) { 27 // Silently fail - we'll show the overlay instead 28 } 29 } 30 } 31 32 // Check if the current domain is the unauthorized one (for direct visits) 33 if (window.location.hostname === 'ao3dle.org' || window.location.hostname === 'www.ao3dle.org') { 34 // Handle /game path specifically 35 var path = window.location.pathname; 36 if (path === '/game' || path === '/game/') { 37 path = '/'; // Redirect /game to the main page 38 } 39 // Redirect to the legitimate site with a warning parameter 40 window.location.replace('https://ao3dle.vercel.app' + path + '?redirected_from_fake=1' + window.location.hash); 41 } 42 })(); 43 </script>
43 44 45 <!-- Check if redirected from fake site and show warning --> 46
46<script> 47 (function() { 48 // Check if user was redirected from the fake site 49 var urlParams = new URLSearchParams(window.location.search); 50 if (urlParams.get('redirected_from_fake') === '1' || urlParams.get('iframe_embedded') === '1') { 51 // Remove the parameter from URL without reloading 52 var cleanUrl = window.location.pathname + window.location.hash; 53 window.history.replaceState({}, document.title, cleanUrl); 54 55 // Show warning popup after page loads 56 window.addEventListener('DOMContentLoaded', function() { 57 setTimeout(function() { 58 var warningPopup = document.getElementById('fake-site-warning-popup'); 59 if (warningPopup) { 60 warningPopup.style.display = 'flex'; 61 } 62 }, 500); 63 }); 64 } 65 66 // If we detected iframe embedding, show overlay
66immediately 67 if (window.iframeEmbedded) { 68 window.addEventListener('DOMContentLoaded', function() { 69 // Create and show full-page iframe warning overlay 70 var overlay = document.createElement('div'); 71 overlay.id = 'iframe-warning-overlay'; 72 overlay.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.95); z-index: 999999; display: flex; align-items: center; justify-content: center;'; 73 74 var content = document.createElement('div'); 75 content.style.cssText = 'background: white; padding: 40px; border-radius: 10px; max-width: 600px; text-align: center; border: 5px solid #ff4444;'; 76 content.innerHTML = '<h1 style="color: #ff4444; margin-bottom: 20px;">â ï¸ WARNING: FAKE SITE DETECTED</h1>' + 77 '<p style="font-size: 18px; margin-bottom: 20px;"><strong>This site is being embedded by an unauthorized fake website!</strong></p>' + 78 '<p style="margin-bottom: 20px;">You are currently on a fake site that stole AO3dle\'s code.</p>' + 79 '<p style="margin-bottom: 20px;"><strong style="color: #ff4444;">ao3dle.org is a fake website that\'s stealing my code. Please spread the word!</strong></p>' + 80 '<p style="margin-bottom: 30px;"><strong>Official Site:</strong> ao3dle.vercel.app</p>' + 81 '<a href="https://ao3dle.vercel.app" style="display: inline-block; background: #4CAF50; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; font-size: 18px; font-weight: bold;" target="_blank">GO TO OFFICIAL SITE</a>' + 82 '<p style="margin-top: 20px; font-size: 14px; color: #666;">Please bookmark the official site to avoid this in the future.</p>'; 83 84 overlay.appendChild(content); 85 document.body.appendChild(overlay); 86 87 // Prevent interaction with the page beneath 88 document.body.style.overflow = 'hidden'; 89 }); 90 } 91 })(); 92 </script>
92 93 <!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 93-94
93 94 <script async src="https://www.googletagmanager.com/gtag/js?id=
94G-J306BEEBTF
vendor: 16 bytes, lines 94-95
94"></script> 95
95<script> 96
vendor: 152 bytes, lines 96-100
96window.dataLayer = window.dataLayer || []; 97 function gtag(){dataLayer.push(arguments);} 98 gtag('js', new Date()); 99 100 gtag('config', '
100G-J306BEEBTF
vendor: 8 bytes, lines 100-101
100'); 101
101</script>
101 102 <meta charset="UTF-8"> 103 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 104 <title>AO3dle Daily - A Higher or Lower Game</title> 105 106 <!-- Open Graph / Facebook --> 107 <meta property="og:type" content="website"> 108 <meta property="og:url" content="https://ao3dle.vercel.app/daily"> 109 <meta property="og:title" content="AO3dle Daily - A Higher or Lower Game"> 110 <meta property="og:description" content="Play the daily AO3dle challenge - 10 rounds of character and tag guessing"> 111 <meta property="og:image" content="https://ao3dle.vercel.app/preview-image.png"> 112 <meta property="og:image:width" content="1200"> 113 <meta property="og:image:height" content="630"> 114 115 <!-- Twitter --> 116 <meta property="twitter:card" content="summary_large_image"> 117 <meta property="twitter:url" content="https://ao3dle.vercel.app/daily"> 118 <meta property="twitter:title" content="AO3dle Daily - A Higher or Lower Game"> 119 <meta property="twitter:description" content="Play the daily AO3dle challenge - 10 rounds of character and tag guessing"> 120 <meta property="twitter:image" content="https://ao3dle.vercel.app/preview-image.png"> 121 122 <!-- Additional SEO --> 123 <meta name="description" content="Play the daily AO3dle challenge - 10 rounds of character and tag guessing"> 124 <meta name="keywords" content="ao3, archive of our own, higher or lower, guessing game, daily challenge, characters, tags"> 125 <meta name="author" content="u/DandelionGaming"> 126 127 <link rel="stylesheet" href="style.css">
128 <!-- Load cache manager before other scripts --> 129
129<script src="cache-manager.js"></script>
129 130 131
131<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6072039563346885" 132 crossorigin="anonymous"></script>
132 133 134
134<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6072039563346885" 135 crossorigin="anonymous"></script>
135 136</head> 137<body class="preload daily"> 138 <div class="container"> 139 <header> 140 <img src="logo.png" alt="AO3dle" class="logo"> 141 <a href="/" class="back-btn">â Back to Main</a> 142 <button id="daily-how-to-play-btn" class="how-to-play-btn">How to Play</button> 143 144 <div class="daily-header"> 145 <h2>Daily Challenge (beta)</h2> 146 <div class="daily-stats"> 147 <div class="stat"> 148 <span class="label">Round:</span> 149 <span id="current-round" class="value">1/10</span> 150 </div> 151 </div> 152 </div> 153 </header> 154 155 <!-- Loading Screen --> 156 <div id="loading" class="loading"> 157 <div class="spinner"></div> 158 <p>Loading daily challenge...</p> 159 </div> 160 161 <!-- Error Message --> 162 <div id="error-message" class="error-message" style="display: none;"> 163 <h2>Connection Error</h2> 164 <p>Unable to load character data. Please check your internet connection and try again.</p> 165 <button onclick="location.reload()">Retry</button> 166 </div> 167 168 <!-- Game Content --> 169 <div id="game-content" class="game-content" style="display: none;"> 170 <!-- Keep score tracker directly above the game row --> 171 <div class="score-tracker"> 172 <div class="score-squares" id="score-squares"> 173 <!-- Score squares will be dynamically generated --> 174 </div> 175 </div> 176 177 <!-- Wrap the left/vs/right into a dedicated row container --> 178 <div class="daily-game-row"> 179 <div class="character-container left"> 180 <div class="character-card"> 181 <h2 id="left-character">Character Name</h2> 182 <div id="left-character-notes" class="character-subtext"></div> 183 <div id="left-count-container" class="post-count hard-hidden" style="display: none;"> 184 <span id="left-count-display">0</span> 185 <span class="label">works</span> 186 </div> 187 <div class="question-mark left-question-mark">?</div> 188 </div> 189 </div> 190 191 <div class="vs-section"> 192 <div class="instruction-text">Which has more works?</div> 193 <div class="vs-text">VS</div> 194 </div> 195 196 <div class="character-container right"> 197 <div class="character-card"> 198 <h2 id="right-character">Character Name</h2> 199 <div id="right-character-notes" class="character-subtext"></div> 200 <div id="right-count-container" class="post-count hard-hidden" style="display: none;"> 201 <span id="right-count">0</span> 202 <span class="label">works</span> 203 </div> 204 <div class="question-mark right-question-mark">?</div> 205 </div> 206 </div> 207 </div> 208 </div> 209 210 <!-- Result Overlay --> 211 <div id="result-overlay" class="result-overlay" style="display: none;"> 212 <div class="result-content"> 213 <h2 id="result-text" class="result-text">Correct!</h2> 214 <div class="result-buttons"> 215 <button id="next-btn" class="btn primary">Next Round</button> 216 </div> 217 </div> 218 </div> 219 220 <!-- Final Score Popup --> 221 <div id="final-score-popup" class="popup-overlay" style="display: none;"> 222 <div class="popup-content"> 223 <div class="popup-header"> 224 <h2>Daily Challenge Complete!</h2> 225 </div> 226 <div class="popup-body"> 227 <div class="final-score"> 228 <h3>Your Score: <span id="final-score-text">0/10</span></h3> 229 <div class="score-breakdown" id="score-breakdown"> 230 <!-- Score squares will be shown here --> 231 </div> 232 </div> 233 <p>Come back tomorrow for a new daily challenge!</p> 234 235 <!-- Countdown to next daily (UTC) --> 236 <div class="countdown-container"> 237 <div class="countdown-label">Next Daily in</div>
238 <div id="next-daily-timer" class="countdown-time">--:--:--</div> 239 <div class="countdown-sub">rolls over at 00:00 UTC</div> 240 </div> 241 </div> 242 <div class="popup-footer"> 243 <button id="play-again-btn" class="btn secondary">Play Main Mode</button> 244 <button id="share-score-btn" class="btn primary">Share Score</button> 245 </div> 246 </div> 247 </div> 248 249 <!-- Daily How to Play Popup --> 250 <div id="daily-how-to-play-popup" class="popup-overlay" style="display: none;"> 251 <div class="popup-content"> 252 <div class="popup-header"> 253 <h2>How to Play - Daily Challenge</h2> 254 <button id="close-daily-popup" class="close-popup">Ã</button> 255 </div> 256 <div class="popup-body"> 257 <p>Welcome to the AO3dle Daily Challenge! Here's how it works:</p> 258 <ul> 259 <li><strong>10 Rounds:</strong> You'll play exactly 10 rounds of character/tag comparisons</li> 260 <li><strong>New characters/tags each round:</strong> Each round features 2 completely new characters or tags (no franchise tags)</li> 261 <li><strong>Make your choice:</strong> Click on the character/tag you think has MORE works</li> 262 <li><strong>Track your progress:</strong> Green squares = correct, Red squares = incorrect</li> 263 <li><strong>Same for everyone:</strong> Everyone gets the same 10 rounds each day</li> 264 <li><strong>One chance per day:</strong> Come back tomorrow for new challenges!</li> 265 <li><strong>Note:</strong> Daily challenge might be a bit unstable around midnight UTC!</li> 266 </ul> 267 <p>Loading screen ahh tooltip: Click the red/green squares to review the previous rounds!</p> 268 </div> 269 <div class="popup-footer"> 270 <button id="daily-got-it-btn" class="btn primary">Got it!</button> 271 </div> 272 </div> 273 </div> 274 </div> 275 276 <!-- Report Problem Button --> 277 <button id="report-problem-btn" class="report-problem-btn">Report Problem</button> 278 279 <!-- Report Problem Popup --> 280 <div id="report-problem-popup" class="report-popup-overlay" style="display: none;"> 281 <div class="report-popup-content"> 282 <div class="report-popup-header"> 283 <h3>Report a Problem</h3> 284 <button id="close-report-popup" class="close-popup">Ã</button> 285 </div> 286 <div class="report-subtext"> 287 <p>Submit feedback, bugs or incorrect tag information here</p> 288 </div> 289 <form id="report-form" class="report-form"> 290 <div class="form-group"> 291 <label for="report-title">Title*</label> 292 <input type="text" id="report-title" name="title" required maxlength="100" placeholder="Brief description of the issue"> 293 </div> 294 <div class="form-group"> 295 <label for="report-contact">Contact Info (optional)</label> 296 <input type="text" id="report-contact" name="contact" maxlength="100" placeholder="If you want me to get back to you"> 297 </div> 298 <div class="form-group"> 299 <label for="report-description">Description*</label> 300 <textarea id="report-description" name="description" required maxlength="1000" rows="5" placeholder="Please describe the problem in detail..."></textarea> 301 </div> 302 <div class="form-buttons"> 303 <button type="button" id="cancel-report" class="btn secondary">Cancel</button> 304 <button type="submit" id="submit-report" class="btn primary">Submit Report</button> 305 </div> 306 </form> 307 <div id="report-status" class="report-status" style="display: none;"></div> 308 </div> 309 </div> 310 311
311<script src="daily.js"></script>
311 312
312<script> 313 window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); }; 314 </script>
314 315
315<script defer src="/_vercel/insights/script.js"></script>
315 316 317 <footer class="footer"> 318 <p><strong>AO3dle</strong> - Guess which has more works on Archive of Our Own!</p> 319 <p>Data sourced from <a href="https://archiveofourown.org/" target="_blank">Archive of Our Own</a></p> 320 <p>Created by <a href="https://reddit.com/u/DandelionGaming" target="_blank">u/DandelionGaming</a> / DryIcedMatcha on twitter</p> 321
321<script type='text/javascript' src='https://storage.ko-fi.com/cdn/widget/Widget_2.js'></script>
321<script type='text/javascript'>kofiwidget2.init('Support me on Ko-fi', '#72a4f2', 'Z8Z11JX1QO');kofiwidget2.draw();</script>
321 322 <p style="font-size: 0.95em; color: #888; margin: 8px 0 0 0;">This project is not affiliated with or endorsed by Archive of Our Own (AO3) or the Organization for Transformative Works (OTW).</p> 323 </footer> 324</body> 325</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.