PageSourceSearch

https://duck.ai/

html duck.ai collected 2026-10-02 02:26:09 UTC 26,549 bytes, 654 lines download raw bytes

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.