1<!doctype html> 2<html lang="en-US" 3 class="react no-js" 4 data-version-tag="serp_20261001_200158_ET" 5 data-version-sha="fbb2cb5f99afe484c9f4ef802ced16c41f068d1c"> 6<head> 7 <meta charset="UTF-8"> 8 <meta name="color-scheme" content="light dark"> 9 <meta name="viewport" content="width=device-width, initial-scale=1"> 10 <title>Duck.ai by DuckDuckGo. Private AI chat. Free.</title> 11 <meta name="description" content="Use ChatGPT, Claude, and other AIs, privately. Protect chats from hackers, scammers, and companies. Keep info confidential. Free. No account required." /> 12 <meta name="keywords" content="Duck.ai, DuckDuckGo AI, private AI chatbot, free AI chat, anonymous AI chat, AI chat no sign up, OpenAI, Anthropic, Llama, Mistral, open source AI models, privacy focused AI, no account AI chat" /> 13 <meta property="og:title" content="Duck.ai"> 14 <meta property="og:image" content="/og-image-duckai.png"> 15 <meta property="og:description" content="Use ChatGPT, Claude, and other AIs, privately. Protect chats from hackers, scammers, and companies. Keep info confidential. Free. No account required."> 16 <meta property="og:url" content="https://duck.ai/"> 17 <meta property="og:site_name" content="Duck.ai"> 18 19 <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" /> 20 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 21 <link rel="shortcut icon" href="/favicon.ico" /> 22 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 23 <meta name="apple-mobile-web-app-title" content="Duck.ai" /> 24 <link rel="manifest" href="/site.webmanifest" crossorigin="use-credentials" /> 25 <link rel="preload" href="/font/DuckSansProduct-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous" /> 26 <link rel="preload" href="/font/DuckSansProduct-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous" /> 27 <link rel="preload" href="/font/DuckSansProduct-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous" /> 28 <link rel="preload" href="/font/DuckSansDisplay-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous" /> 29
30<script> 31try { 32 beforeBody(); 33} catch (error) { 34 console.error(error); 35} 36 37function beforeBody() { 38 if (/^\/share\//.test(location.pathname)) { 39 const meta = document.createElement('meta'); 40 meta.name = 'robots'; 41 meta.content = 'noindex, nofollow'; 42 document.head.appendChild(meta); 43 } 44 45 document.documentElement?.classList.remove('no-js'); 46 const osDark = window.matchMedia('(prefers-color-scheme: dark)').matches; 47 const native = window.__nativeStorageEntries; 48 const isDesktopElectron = window.navigator?.duckduckgo?.platform === 'electron'; 49 const stored = (native && native.setting_kae) || localStorage.setting_kae; 50 const isDark = stored === 'd' || (stored !== '-1' && osDark); 51 document.documentElement.style.colorScheme = isDark ? 'dark' : 'light'; 52 document.documentElement.dataset.theme = isDark ? 'dark' : 'light'; 53 54 if (isDesktopElectron) { 55 document.documentElement.dataset.desktopElectron = ''; 56 } 57 58 // Expose the OS so CSS can target OS-specific quirks. Match desktop 59 // Windows while excluding Windows Phone / Mobile. 60 const ua = window.navigator.userAgent; 61 const isWindows = /Windows|Win32|Win64/i.test(ua) && !/windows phone|windows mobile/i.test(ua); 62 if (isWindows) { 63 document.documentElement.dataset.os = 'windows'; 64 } 65 66 try { 67 const sidebarCollapsed = 68 (native && native.duckaiSidebarCollapsed) || localStorage.getItem('duckaiSidebarCollapsed'); 69 if (sidebarCollapsed === 'true') { 70 document.documentElement.dataset.sidebarCollapsed = ''; 71 } 72 } catch (e) {} 73 74 try { 75 const params = new URLSearchParams(window.location.search); 76 if (params.get('native-input') === 'true') { 77 document.documentElement.dataset.hideChatInputPlaceholder = ''; 78 } 79 } catch (e) {} 80} 81 82</script>
82 83<style> 84/* ===== Skeleton loader ===== 85 * Mirrors the React app's final geometry so the page doesn't shift on mount. 86 * All values are hardcoded because --sds-* tokens are set by JS at runtime 87 * and are NOT available at first paint. 88 */ 89 90@keyframes skeleton-breath { 91 0% { 92 opacity: 1; 93 } 94 50% { 95 opacity: 0.2; 96 } 97 100% { 98 opacity: 1; 99 } 100} 101 102@font-face { 103 font-family: 'DuckSansProduct'; 104 src: url('/font/DuckSansProduct-Bold.woff2') format('woff2'), 105 url('/font/DuckSansProduct-Bold.woff') format('woff'), 106 url('/font/DuckSansProduct-Bold.ttf') format('truetype'); 107 font-weight: 530 700; 108 font-style: normal; 109 font-display: swap; 110} 111 112@font-face { 113 font-family: 'DuckSansProduct'; 114 src: url('/font/DuckSansProduct-Medium.woff2') format('woff2'), 115 url('/font/DuckSansProduct-Medium.woff') format('woff'), 116 url('/font/DuckSansProduct-Medium.ttf') format('truetype'); 117 font-weight: 430; 118 font-style: normal; 119 font-display: swap; 120} 121 122@font-face { 123 font-family: 'DuckSansProduct'; 124 src: url('/font/DuckSansProduct-Regular.woff2') format('woff2'), 125 url('/font/DuckSansProduct-Regular.woff') format('woff'), 126 url('/font/DuckSansProduct-Regular.ttf') format('truetype'); 127 font-weight: 300 400; 128 font-style: normal; 129 font-display: swap; 130} 131 132/* Paint the root before the skeleton/bundles load; matches --sk-bg below. */ 133html, 134body { 135 background-color: #ffffff; 136} 137 138html[data-theme='dark'], 139html[data-theme='dark'] body { 140 background-color: #161616; 141} 142 143.loader { 144 /* -- Sidebar geometry (from sidebar.module.css) -- */ 145 --sk-sidebar-width: 300px; 146 --sk-sidebar-collapsed-width: 57px; 147 148 /* -- Colors: light defaults -- */ 149 --sk-bg: #ffffff; /* --ds-surface-primary light */ 150 --sk-input-bg: #fafafa; /* --ds-color-gray-0 */ 151 --sk-sidebar-border: rgba(0, 0, 0, 0.09); /* border-05 light */ 152 --sk-input-border: rgba(0, 0, 0, 0.12); /* --ds-container-tertiary-border-color light */ 153 --sk-sidebar-text: rgba(0, 0, 0, 0.36); /* --ds-text-tertiary light */ 154 --sk-sidebar-icon-bg: rgba(0, 0, 0, 0.09); /* --ds-container-secondary-border-color light */ 155 --sk-action-bg: rgba(0, 0, 0, 0.06); /* button/level-1 light */ 156 157 /* -- Layout -- */ 158 position: fixed; 159 top: 0; 160 left: 0; 161 z-index: 9999; 162 display: flex; 163 width: 100vw; 164 height: 100vh; 165 height: 100dvh; 166 padding-right: 4px; /* --ds-space-x01: matches .duckChatLayout padding-right */ 167 box-sizing: border-box; 168 background-color: var(--sk-bg); 169 transition: opacity 0.3s ease-out; 170} 171 172.loader.loader-hidden { 173 opacity: 0; 174 pointer-events: none; 175} 176 177/* Small desktop (sidebar.module.css @media --max-gutter-md) */ 178@media (max-width: 1079px) { 179 .loader { 180 --sk-sidebar-width: 316px; 181 } 182} 183 184/* Dark theme (from theme-colors.ts dark mappings + color-palette.ts) */ 185[data-theme='dark'] .loader { 186 --sk-bg: #161616; 187 --sk-input-bg: rgba(255, 255, 255, 0.09); /* --ds-color-white-at-9 */ 188 --sk-sidebar-border: rgba(255, 255, 255, 0.12); /* border-05 dark */ 189 --sk-input-border: transparent; 190 --sk-sidebar-text: rgba(255, 255, 255, 0.36); /* --ds-text-tertiary dark */ 191 --sk-sidebar-icon-bg: rgba(255, 255, 255, 0.12); /* --ds-container-tertiary-border-color dark */ 192 --sk-action-bg: rgba(255, 255, 255, 0.18); /* button/level-1 dark */ 193} 194 195/* ===== Sidebar skeleton ===== */ 196.sk-sidebar { 197 width: var(--sk-sidebar-width); 198 min-width: var(--sk-sidebar-width); 199 background-color: var(--sk-bg); 200 border-right: 1px solid var(--sk-sidebar-border); 201 box-sizing: border-box; 202 display: flex; 203 flex-direction: column; 204 justify-content: space-between; 205 padding: 8px 6px 0 6px; 206} 207 208[data-sidebar-collapsed] .sk-sidebar { 209 width: var(--sk-sidebar-collapsed-width); 210 min-width: var(--sk-sidebar-collapsed-width); 211} 212 213/* If the search input's height changes, this value must follow it. 214 * Mirrored in sidebar.module.css â .contents .sidebarHeader + .headerSwap */ 215.sk-sidebar-header { 216 height: 50px; 217 display: flex; 218 align-items: center; 219 padding: 0 2px 4px 8px; /* --ds-space-x_5 right, --ds-space-x01 bottom, --ds-space-x02 left */ 220 box-sizing: border-box; 221} 222 223.sk-sidebar-icon { 224 width: 24px; 225 height: 24px; 226 border-radius: 50%; 227 background-color: var(--sk-sidebar-icon-bg); 228 flex-shrink: 0; 229} 230 231/* Mirrors DSText variant="body-emphasis" (--ds-font-body-md-*) plus the 2px 232 * margin-top from sidebar.module.css â .leftBlock .sidebarHeaderTitle. */ 233.sk-sidebar-title { 234 font-family: 'DuckSansProduct', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 235 font-size: 14px; /* --ds-font-body-md-size */ 236 line-height: 20px; /* --ds-font-body-md-line-height */ 237 font-weight: 700; /* --ds-font-weight-bold */ 238 letter-spacing: normal; /* --ds-font-letter-spacing-normal */ 239 color: var(--sk-sidebar-text); 240 margin-top: 2px; 241 margin-left: 8px; 242 -webkit-font-smoothing: antialiased; 243 -moz-osx-font-smoothing: grayscale; 244} 245 246.sk-sidebar-footer { 247 height: 80px; 248 margin-left: -6px; 249 margin-right: -6px; 250 border-top: 1px solid var(--sk-sidebar-border); 251 box-sizing: border-box; 252} 253 254/* Hide sidebar content when collapsed */ 255[data-sidebar-collapsed] .sk-sidebar-header, 256[data-sidebar-collapsed] .sk-sidebar-footer { 257 display: none; 258} 259 260/* No sidebar on mobile */ 261@media (max-width: 900px) { 262 .sk-sidebar { 263 display: none; 264 } 265} 266 267/* ===== Main content area (matches .chatRoot) ===== */ 268.sk-main { 269 flex: 1; 270 display: flex; 271 flex-direction: column; 272 min-width: 0; 273} 274 275/* Top toolbar spacer (top-toolbar.module.css .root.newChat = 52px) */ 276.sk-toolbar { 277 height: 52px; 278 flex-shrink: 0; 279} 280 281/* Chat content area (matches .chatStackContainer, flex: 1) */ 282.sk-content { 283 flex: 1; 284 display: flex; 285 flex-direction: column; 286 min-height: 0; 287} 288 289/* Empty state spacer â reserves vertical space so the input stays positioned correctly. 290 * Contains .sk-lockup which mirrors the real DuckAI logo + title lockup geometry. */ 291.sk-empty-state { 292 display: flex; 293 flex-direction: column; 294 align-items: center; 295} 296 297/* Logo placeholder â mirrors .logo + .lockupTitle space in chat-empty-state.module.css. 298 * height(120) + margin-top(-16) + margin-bottom(24) = 128px contribution to .sk-empty-state, 299 * which matches the real lockup height (logo 120 + title 32 + title margin-top
299-8 = 128). 300 * If --sds-font-line-height-title-01 changes, revisit the 24px margin-bottom below. 301 * Mirrored in chat-empty-state.module.css â .logo */ 302.sk-lockup { 303 width: 120px; 304 height: 120px; 305 margin-top: -16px; 306 margin-bottom: 24px; 307 border-radius: 50%; 308 background-color: var(--sk-action-bg); 309 flex-shrink: 0; 310} 311 312/* ===== Input area â matches .emptyStateContainer positioning ===== */ 313.sk-input-area { 314 width: 100%; 315 padding: 0 64px; /* --ds-space-x16 = 64px (--duckai-chat-left/right-padding desktop) */ 316 box-sizing: border-box; 317} 318 319/* Desktop: spacer offsets input from top (matches emptyStateContainer layout) */ 320@media (min-width: 901px) { 321 .sk-empty-state { 322 margin-top: calc(30vh - 96px); /* emptyStateContainer margin-top */ 323 margin-bottom: 24px; /* --ds-space-x06 */ 324 /* min-height removed â .sk-lockup now drives the intrinsic height */ 325 } 326} 327 328/* Small desktop: titleContainer uses --ds-space-x09 at this breakpoint */ 329@media (min-width: 901px) and (max-width: 1079px) { 330 .sk-empty-state { 331 margin-bottom: 36px; 332 } 333} 334 335/* Input container â matches .inputGroup outer box */ 336.sk-input { 337 width: 100%; 338 max-width: 640px; /* --duckai-chat-max-width-empty-state */ 339 margin: 0 auto; 340 height: 100px; /* --ds-space-x10(40) + --ds-space-x15(60) = 100px */ 341 display: flex; 342 padding: 12px; /* --ds-space-x03 */ 343 flex-direction: column; 344 justify-content: flex-end; 345 align-items: stretch; 346 gap: 12px; /* --ds-space-x03 */ 347 background-color: var(--sk-input-bg); 348 border: 1px solid var(--sk-input-border); 349 border-radius: 24px; /* --ds-radius-x06 */ 350 box-sizing: border-box; 351} 352 353/* Top row inside input â takes remaining height */ 354.sk-input-top { 355 flex: 1; 356} 357 358.sk-input-pill { 359 width: 30%; 360 height: 100%; 361 margin-top: 4px; 362 border-radius: 9999px; /* --ds-radius-full */ 363 background-color: var(--sk-action-bg); 364} 365 366/* Action buttons row inside input */ 367.sk-input-actions { 368 height: 32px; 369 flex-shrink: 0; 370 display: flex; 371 align-items: center; 372 justify-content: space-between; 373 align-self: stretch; 374} 375 376.sk-input-actions-left { 377 display: flex; 378 align-items: center; 379 gap: 6px; 380} 381 382.sk-action-btn { 383 width: 32px; 384 height: 32px; 385 border-radius: 50%; 386 background-color: var(--sk-action-bg); 387 flex-shrink: 0; 388} 389 390/* Disclaimer spacer â reserves vertical space below the input. 391 * Matches .footerDisclaimer padding + approximate single-line text height. */ 392.sk-disclaimer-spacer { 393 width: 100%; 394 max-width: 938px; /* --duckai-chat-max-width */ 395 margin: auto; 396 margin-bottom: 0; 397 padding: 8px 56px; /* --ds-space-x02(8) --ds-space-x14(56) */ 398 min-height: 13px; /* â one line of label text (12.3px) */ 399 box-sizing: border-box; 400} 401 402/* ModeEntryPoints spacer â hidden on desktop (matches mode-entry-points.module.css .container display:none) */ 403.sk-entry-points { 404 display: none; 405} 406 407/* Mobile/tablet: input centered vertically (matches emptyStateContainer flex-grow:1 + justify-content:center) */ 408@media (max-width: 900px) { 409 .loader { 410 padding-right: 0; /* no layout padding-right on mobile */ 411 } 412 .sk-empty-state { 413 /* flex: 1 1 auto so the lockup's intrinsic height participates in 414 * free-space distribution; the default flex: 1 (= 1 1 0%) would treat 415 * .sk-lockup as zero-basis and leave the input position unchanged. */ 416 flex: 1 1 auto; 417 justify-content: flex-end; /* keep lockup close to the input during first paint */ 418 } 419 .sk-lockup { 420 width: 112px; 421 height: 112px; 422 } 423 .sk-input-area { 424 max-width: 700px; /* --duckai-chat-max-width-mobile (footer max-width) */ 425 margin: 0 auto; 426 padding: 0 12px; /* --ds-space-x03 = 12px (--duckai-chat-left/right-padding mobile) */ 427 } 428 .sk-input { 429 max-width: none; /* input fills the 700px footer area, not capped at 640px */ 430 min-height: 98px; /* mobile: x10(40) + x14(56) + 2px border = 98px */ 431 } 432 .sk-entry-points { 433 display: block; 434 margin-top: 16px; /* --ds-space-x04 (matches ModeEntryPoints container margin-top) */
435 height: 26px; 436 } 437 .sk-disclaimer-spacer { 438 flex: 1; /* bottom spacer: balances top spacer to center the input */ 439 margin: 0; 440 padding: 0; 441 min-height: 0; 442 max-width: none; 443 } 444} 445 446/* ===== Breathing animation ===== */ 447.sk-sidebar-icon, 448.sk-sidebar-title, 449.sk-lockup, 450.sk-input { 451 animation: skeleton-breath 2s ease-in-out infinite; 452} 453 454/* ===== Noscript message styles ===== */ 455.noscript-container { 456 width: 100vw; 457 height: 100vh; 458 display: grid; 459 place-content: center; 460 padding: 16px; 461 box-sizing: border-box; 462 text-align: center; 463} 464 465.noscript-text { 466 font-size: 16px; 467 line-height: 1.4; 468 color: #111; 469} 470 471/* Electron: hide sidebar header (behind window controls / traffic lights) */ 472[data-desktop-electron] .sk-sidebar-header { 473 visibility: hidden; 474} 475 476/* Electron: make skeleton sidebar draggable (visibility:hidden on header blocks drag, so target parent) */ 477[data-desktop-electron] .sk-sidebar { 478 -webkit-app-region: drag; 479} 480 481/* Electron: make skeleton toolbar draggable (mirrors React's electronDragRegion on top-toolbar) */ 482[data-desktop-electron] .sk-toolbar { 483 -webkit-app-region: drag; 484} 485 486/* Hide the chat input skeleton when the native app provides its own input 487 * (no web form will mount). Set pre-paint by inline.js so the input area 488 * is never laid out and there's no flash. Targets .sk-input-area so the 489 * input box AND the mobile entry-points strip collapse together; the 490 * surrounding flex spacers keep the layout centered. */ 491[data-hide-chat-input-placeholder] .sk-input-area { 492 display: none; 493} 494 495/* Hide loader when JS is disabled */ 496.no-js .loader { 497 display: none; 498} 499 500</style> 501<link rel="alternate" hreflang="af-ZA" href="https://duck.ai/?locale=af_ZA"> 502<link rel="alternate" hreflang="ar-DZ" href="https://duck.ai/?locale=ar_DZ"> 503<link rel="alternate" hreflang="ar-EG" href="https://duck.ai/?locale=ar_EG"> 504<link rel="alternate" hreflang="ar-JO" href="https://duck.ai/?locale=ar_JO"> 505<link rel="alternate" hreflang="ar-SA" href="https://duck.ai/?locale=ar_SA"> 506<link rel="alternate" hreflang="ast-ES" href="https://duck.ai/?locale=ast_ES"> 507<link rel="alternate" hreflang="az-AZ" href="https://duck.ai/?locale=az_AZ"> 508<link rel="alternate" hreflang="be-BY" href="https://duck.ai/?locale=be_BY"> 509<link rel="alternate" hreflang="bg-BG" href="https://duck.ai/?locale=bg_BG"> 510<link rel="alternate" hreflang="bn-BD" href="https://duck.ai/?locale=bn_BD"> 511<link rel="alternate" hreflang="bn-IN" href="https://duck.ai/?locale=bn_IN"> 512<link rel="alternate" hreflang="bo-CN" href="https://duck.ai/?locale=bo_CN"> 513<link rel="alternate" hreflang="br-FR" href="https://duck.ai/?locale=br_FR"> 514<link rel="alternate" hreflang="bs-BA" href="https://duck.ai/?locale=bs_BA"> 515<link rel="alternate" hreflang="ca-ES" href="https://duck.ai/?locale=ca_ES"> 516<link rel="alternate" hreflang="cs-CZ" href="https://duck.ai/?locale=cs_CZ"> 517<link rel="alternate" hreflang="cy-GB" href="https://duck.ai/?locale=cy_GB"> 518<link rel="alternate" hreflang="da-DK" href="https://duck.ai/?locale=da_DK"> 519<link rel="alternate" hreflang="de-CH" href="https://duck.ai/?locale=de_CH"> 520<link rel="alternate" hreflang="de-DE" href="https://duck.ai/?locale=de_DE"> 521<link rel="alternate" hreflang="el-GR" href="https://duck.ai/?locale=el_GR"> 522<link rel="alternate" hreflang="en-AU" href="https://duck.ai/?locale=en_AU"> 523<link rel="alternate" hreflang="en-CA" href="https://duck.ai/?locale=en_CA"> 524<link rel="alternate" hreflang="en-GB" href="https://duck.ai/?locale=en_GB"> 525<link rel="alternate" hreflang="en-US" href="https://duck.ai/"> 526<link rel="alternate" hreflang="eo-XX" href="https://duck.ai/?locale=eo_XX"> 527<link rel="alternate" hreflang="es-AR" href="https://duck.ai/?locale=es_AR"> 528<link rel="alternate" hreflang="es-CL" href="https://duck.ai/?locale=es_CL"> 529<link rel="alternate" hreflang="es-CO" href="https://duck.ai/?locale=es_CO"> 530<link rel="alternate" hreflang="es-CR" href="https://duck.ai/?locale=es_CR"> 531<link rel="alternate" hreflang="es-EC" href="https://duck.ai/?locale=es_EC"> 532<link rel="alternate" hreflang="es-ES" href="https://duck.ai/?locale=es_ES"> 533<link rel="alternate" hreflang="es-MX" href="https://duck.ai/?locale=es_MX"> 534<link rel="alternate" hreflang="es-PE" href="https://duck.ai/?locale=es_PE"> 535<link rel="alternate" hreflang="es-UY" href="https://duck.ai/?locale=es_UY"> 536<link rel="alternate" hreflang="es-VE" href="https://duck.ai/?locale=es_VE"> 537<link rel="alternate" hreflang="et-EE" href="https://duck.ai/?locale=et_EE"> 538<link rel="alternate" hreflang="eu-ES" href="https://duck.ai/?locale=eu_ES"> 539<link rel="alternate" hreflang="fa-IR" href="https://duck.ai/?locale=fa_IR"> 540<link rel="alternate" hreflang="fi-FI" href="https://duck.ai/?locale=fi_FI"> 541<link rel="alternate" hreflang="fr-BE" href="https://duck.ai/?locale=fr_BE"> 542<link rel="alternate" hreflang="fr-CA" href="https://duck.ai/?locale=fr_CA"> 543<link rel="alternate" hreflang="fr-CH" href="https://duck.ai/?locale=fr_CH"> 544<link rel="alternate" hreflang="fr-FR" href="https://duck.ai/?locale=fr_FR"> 545<link rel="alternate" hreflang="ga-IE" href="https://duck.ai/?locale=ga_IE"> 546<link rel="alternate" hreflang="gd-GB" href="https://duck.ai/?locale=gd_GB"> 547<link rel="alternate" hreflang="gl-ES" href="https://duck.ai/?locale=gl_ES"> 548<link rel="alternate" hreflang="gu-IN" href="https://duck.ai/?locale=gu_IN"> 549<link rel="alternate" hreflang="he-IL" href="https://duck.ai/?locale=he_IL"> 550<link rel="alternate" hreflang="hi-IN" href="https://duck.ai/?locale=hi_IN"> 551<link rel="alternate" hreflang="hr-HR" href="https://duck.ai/?locale=hr_HR"> 552<link rel="alternate" hreflang="hu-HU" href="https://duck.ai/?locale=hu_HU"> 553<link rel="alternate" hreflang="hy-AM" href="https://duck.ai/?locale=hy_AM"> 554<link rel="alternate" hreflang="id-ID" href="https://duck.ai/?locale=id_ID"> 555<link rel="alternate" hreflang="io-XX" href="https://duck.ai/?locale=io_XX"> 556<link rel="alternate" hreflang="is-IS" href="https://duck.ai/?locale=is_IS"> 557<link rel="alternate" hreflang="it-IT" href="https://duck.ai/?locale=it_IT"> 558<link rel="alternate" hreflang="ja-JP" href="https://duck.ai/?locale=ja_JP"> 559<link rel="alternate" hreflang="ka-GE" href="https://duck.ai/?locale=ka_GE"> 560<link rel="alternate" hreflang="kab-DZ" href="https://duck.ai/?locale=kab_DZ"> 561<link rel="alternate" hreflang="kn-IN" href="https://duck.ai/?locale=kn_IN"> 562<link rel="alternate" hreflang="ko-KR" href="https://duck.ai/?locale=ko_KR"> 563<link rel="alternate" hreflang="ku" href="https://duck.ai/?locale=ku"> 564<link rel="alternate" hreflang="kw-GB" href="https://duck.ai/?locale=kw_GB"> 565<link rel="alternate" hreflang="ky-KG" href="https://duck.ai/?locale=ky_KG"> 566<link rel="alternate" hreflang="ln-CD" href="https://duck.ai/?locale=ln_CD"> 567<link rel="alternate" hreflang="lt-LT" href="https://duck.ai/?locale=lt_LT"> 568<link rel="alternate" hreflang="lv-LV" href="https://duck.ai/?locale=lv_LV"> 569<link rel="alternate" hreflang="ml-IN" href="https://duck.ai/?locale=ml_IN"> 570<link rel="alternate" hreflang="mn-MN" href="https://duck.ai/?locale=mn_MN"> 571<link rel="alternate" hreflang="mr-IN" href="https://duck.ai/?locale=mr_IN"> 572<link rel="alternate" hreflang="ms-MY" href="https://duck.ai/?locale=ms_MY"> 573<link rel="alternate" hreflang="nb-NO" href="https://duck.ai/?locale=nb_NO"> 574<link rel="alternate" hreflang="ne-NP" href="https://duck.ai/?locale=ne_NP"> 575<link rel="alternate" hreflang="nl-BE" href="https://duck.ai/?locale=nl_BE"> 576<link rel="alternate" hreflang="nl-NL" href="https://duck.ai/?locale=nl_NL"> 577<link rel="alternate" hreflang="nn-NO" href="https://duck.ai/?locale=nn_NO"> 578<link rel="alternate" hreflang="od-IN" href="https://duck.ai/?locale=od_IN"> 579<link rel="alternate" hreflang="pl-PL" href="https://duck.ai/?locale=pl_PL"> 580<link rel="alternate" hreflang="ps-AF" href="https://duck.ai/?locale=ps_AF"> 581<link rel="alternate" hreflang="pt-BR" href="https://duck.ai/?locale=pt_BR"> 582<link rel="alternate" hreflang="pt-PT" href="https://duck.ai/?locale=pt_PT"> 583<link rel="alternate" hreflang="ro-RO" href="https://duck.ai/?locale=ro_RO"> 584<link rel="alternate" hreflang="ru-RU" href="https://duck.ai/?locale=ru_RU"> 585<link rel="alternate" hreflang="sc-IT" href="https://duck.ai/?locale=sc_IT"> 586<link rel="alternate" hreflang="si-LK" href="https://duck.ai/?locale=si_LK"> 587<link rel="alternate" hreflang="sk-SK" href="https://duck.ai/?locale=sk_SK"> 588<link rel="alternate" hreflang="sl-SI" href="https://duck.ai/?locale=sl_SI"> 589<link rel="alternate" hreflang="sq-AL" href="https://duck.ai/?locale=sq_AL"> 590<link rel="alternate" hreflang="sr-RS" href="https://duck.ai/?locale=sr_RS"> 591<link rel="alternate" hreflang="sv-SE" href="https://duck.ai/?locale=sv_SE"> 592<link rel="alternate" hreflang="ta-IN" href="https://duck.ai/?locale=ta_IN"> 593<link rel="alternate" hreflang="te-IN" href="https://duck.ai/?locale=te_IN"> 594<link rel="alternate" hreflang="th-TH" href="https://duck.ai/?locale=th_TH"> 595<link rel="alternate" hreflang="tl-PH" href="https://duck.ai/?locale=tl_PH"> 596<link rel="alternate" hreflang="tokipona-XX" href="https://duck.ai/?locale=tokipona_XX"> 597<link rel="alternate" hreflang="tpi-PG" href="https://duck.ai/?locale=tpi_PG"> 598<link rel="alternate" hreflang="tr-TR" href="https://duck.ai/?locale=tr_TR"> 599<link rel="alternate" hreflang="uk-UA" href="https://duck.ai/?locale=uk_UA"> 600<link rel="alternate" hreflang="ur-PK" href="https://duck.ai/?locale=ur_PK"> 601<link rel="alternate" hreflang="vi-VN" href="https://duck.ai/?locale=vi_VN"> 602<link rel="alternate" hreflang="zh-CN" href="https://duck.ai/?locale=zh_CN"> 603<link rel="alternate" hreflang="zh-TW" href="https://duck.ai/?locale=zh_TW"> 604<link rel="alternate" hreflang="x-default" href="https://duck.ai/"> 605<link rel="canonical" href="https://duck.ai/"> 606 <link rel="stylesheet" href="/dist/duckai-dist/entry.duckai.8a4b52e92e85d3300b0d.css" /> 607</head> 608<body> 609 <noscript> 610 <div class="noscript-container"> 611 <p class="noscript-text">Duck.ai requires JavaScript to run</p> 612 <p class="noscript-text">Visit <a href="https://duckduckgo.com">duckduckgo.com</a></p> 613 </div> 614 </noscript> 615 <div id="app-loader" class="loader"> 616 <div class="sk-sidebar"> 617 <div class="sk-sidebar-header"> 618 <div class="sk-sidebar-icon"></div>
619 <span class="sk-sidebar-title">Duck.ai</span> 620 </div> 621 <div class="sk-sidebar-footer"></div> 622 </div> 623 <div class="sk-main"> 624 <div class="sk-toolbar"></div> 625 <div class="sk-content"> 626 <div class="sk-empty-state"> 627 <div class="sk-lockup"></div> 628 </div> 629 <div class="sk-input-area"> 630 <div class="sk-input"> 631 <div class="sk-input-top"> 632 <div class="sk-input-pill"></div> 633 </div> 634 <div class="sk-input-actions"> 635 <div class="sk-input-actions-left"> 636 <div class="sk-action-btn"></div> 637 <div class="sk-action-btn"></div> 638 </div> 639 <div class="sk-action-btn"></div> 640 </div> 641 </div> 642 <div class="sk-entry-points"></div> 643 </div> 644 <div class="sk-disclaimer-spacer"></div> 645 </div> 646 </div> 647 </div> 648 <div id="app"></div> 649
649<script src="/dist/duckai-dist/lib.91d392df195d4371dfcff8dd.js"></script>
649 650
650<script src="/dist/locale/en_US.770eefbe82c1aaa67c5057ba9d6d3f3a.js"></script>
650 651
651<script src="/dist/duckai-dist/entry.vendors.b17ff44e51bff2b43f0d.js"></script>
651 652
652<script src="/dist/duckai-dist/entry.duckai.bde02647b45292406339.js"></script>
652 653</body> 654</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.