1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> 6 <meta name="theme-color" content="#ffffff" /> 7 <meta http-equiv="Content-Security-Policy" content="default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self' https://*.supabase.co https://checkout.stripe.com; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: blob: https:; media-src 'self' data: blob: https:; connect-src 'self' https://*.supabase.co wss://*.supabase.co https://api.openai.com https://api.anthropic.com https://generativelanguage.googleapis.com https://*.openrouter.ai https://*.composio.dev; worker-src 'self' blob:; child-src 'self' blob:; frame-src 'self' blob: data: https:;" /> 8 9 10 <link rel="icon" type="image/svg+xml" href="/favicon.svg"> 11 <link rel="alternate" type="text/plain" href="/llms.txt" title="TimeWarp AI-readable site guide"> 12 <link rel="alternate" type="text/plain" href="/llms-full.txt" title="TimeWarp full public-site text"> 13 <link rel="sitemap" type="application/xml" href="/sitemap.xml" title="TimeWarp sitemap"> 14 15 <!-- Loaded without blocking render or script execution: `media="print"` keeps 16 it off the critical path until it arrives, then it is promoted to all 17 media. The app must start and stay usable when this never loads. --> 18 <link rel="preconnect" href="https://fonts.googleapis.com"> 19 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 20 <link 21 rel="stylesheet" 22 media="print" 23 onload="this.media='all';this.onload=null" 24 href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,[email protected],400;9..40,500;9..40,600;9..40,700&family=IBM+Plex+Mono:wght@400;700&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" 25 > 26 27 28 29 30 31 32 33 34 35 36 37 38 39
39<script type="application/ld+json"> 40 {"@context":"https://schema.org","@type":"Organization","@id":"https://timewarpdev.com/#organization","name":"TimeWarp","url":"https://timewarpdev.com/","logo":"https://timewarpdev.com/favicon.svg","email":"[email protected]"} 41 </script>
41 42
42<script type="application/ld+json"> 43 {"@context":"https://schema.org","@type":"WebSite","@id":"https://timewarpdev.com/#website","name":"TimeWarp","url":"https://timewarpdev.com/","publisher":{"@id":"https://timewarpdev.com/#organization"}} 44 </script>
44 45
45<script type="application/ld+json"> 46 {"@context":"https://schema.org","@type":"SoftwareApplication","@id":"https://timewarpdev.com/#software","name":"TimeWarp","url":"https://timewarpdev.com/","applicationCategory":"BusinessApplication","operatingSystem":"Windows, Web","description":"An AI workbench where persistent agents remember business context, use connected tools, and run real work from request to result. macOS is coming soon.","downloadUrl":"https://apps.microsoft.com/detail/9N6WRN6GN0KR"} 47 </script>
47 48 49 50 51 52
52<script type="module" crossorigin src="/assets/index-Cu__xZMY.js"></script>
52 53 <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-DAXXjFlN.js"> 54 <link rel="modulepreload" crossorigin href="/assets/react-vendor-DUVq_3mI.js"> 55 <link rel="modulepreload" crossorigin href="/assets/cloud-vendor-hkXpLqza.js"> 56 <link rel="modulepreload" crossorigin href="/assets/vendor-BjjY5Kap.js"> 57 <link rel="modulepreload" crossorigin href="/assets/ui-vendor-DN-c63Yj.js"> 58 <link rel="stylesheet" crossorigin href="/assets/index-B8_MU2Vi.css"> 59<link data-timewarp-prerender-head="true" rel="preload" as="image" href="/assets/timewarp-logo-DgqmnEuz.svg"/><title data-timewarp-prerender-head="true">Contact TimeWarp</title><meta data-timewarp-prerender-head="true" name="description" content="Get in touch with the TimeWarp team for product questions, support, billing, partnerships, or enterprise enquiries."/><meta data-timewarp-prerender-head="true" name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"/><meta data-timewarp-prerender-head="true" name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"/><meta data-timewarp-prerender-head="true" property="og:type" content="website"/><meta data-timewarp-prerender-head="true" property="og:site_name" content="TimeWarp"/><meta data-timewarp-prerender-head="true" property="og:title" content="Contact TimeWarp"/><meta data-timewarp-prerender-head="true" property="og:description" content="Get in touch with the TimeWarp team for product questions, support, billing, partnerships, or enterprise enquiries."/><meta data-timewarp-prerender-head="true" property="og:url" content="https://timewarpdev.com/contact"/><meta data-timewarp-prerender-head="true" property="og:image" content="https://timewarpdev.com/og.png"/><meta data-timewarp-prerender-head="true" name="twitter:title" content="Contact TimeWarp"/><meta data-timewarp-prerender-head="true" name="twitter:description" content="Get in touch with the TimeWarp team for product questions, support, billing, partnerships, or enterprise enquiries."/><meta data-timewarp-prerender-head="true" name="twitter:card" content="summary_large_image"/><meta data-timewarp-prerender-head="true" name="twitter:image" content="https://timewarpdev.com/og.png"/><link data-timewarp-prerender-head="true" rel="canonical" href="https://timewarpdev.com/contact"/><link rel="stylesheet" href="/assets/Landing-YaJBDxpk.css">
59<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script>
59</head> 60 <body> 61 <!-- This semantic snapshot makes the public site useful to crawlers and 62 agents that do not execute JavaScript. React replaces it when the full 63 site mounts. The desktop runtime swaps it for its compact boot shell. --> 64 <div id="root" data-timewarp-prerendered="true" data-timewarp-boot-pending="true"> 65 <div class="contact-brand-page landing-page timewarp-brand-theme min-h-screen overflow-x-hidden bg-white"><nav aria-label="Main navigation" class="solar-nav fixed left-0 right-0 top-0 z-50 py-4 transition-all duration-300 ease-in-out border-b border-transparent bg-transparent shadow-none"><div class="mx-auto flex max-w-7xl items-center justify-between px-4 sm:px-6 md:px-12"><a class="flex items-center gap-3 text-foreground" aria-label="TimeWarp homepage" href="/" data-discover="true"><span class="timewarp-logo timewarp-logo--mesh relative flex shrink-0 items-center justify-center" role="img" aria-label="TimeWarp logo" data-animated="false" style="width:clamp(36px,10vw,44px);height:clamp(36px,10vw,44px)"><img src="/assets/timewarp-logo-DgqmnEuz.svg" alt="" aria-hidden="true" draggable="false" decoding="async" class="block h-full w-full select-none object-contain"/></span><span class="text-lg font-bold tracking-tight sm:text-xl">TimeWarp</span></a><div class="hidden items-center gap-8 text-base font-semibold text-muted-foreground md:flex"><a href="/#product" class="drop-shadow-sm transition-colors hover:text-foreground cursor-pointer">Product</a><a class="drop-shadow-sm transition-colors hover:text-foreground" href="/pricing" data-discover="true">Pricing</a><a class="drop-shadow-sm transition-colors hover:text-foreground" href="/blog" data-discover="true">Blog</a></div><div class="hidden items-center gap-3 md:flex"><a class="flex items-center gap-1.5 text-base font-semibold text-muted-foreground drop-shadow-sm transition-colors hover:text-foreground" href="/login" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user-round h-4 w-4" aria-hidden="true"><circle cx="12" cy="8" r="5"></circle><path d="M20 21a8 8 0 0 0-16 0"></path></svg>Sign in</a><a href="/#product" class="solar-primary-cta marketing-download-cta flex items-center gap-2 rounded-full bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg>Explore desktop app</a></div><button type="button" class="grid h-11 w-11 place-items-center rounded-full text-foreground transition hover:bg-black/5 md:hidden" aria-label="Open navigation menu" aria-controls="marketing-mobile-menu" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-text-align-start h-6 w-6" aria-hidden="true"><path d="M21 5H3"></path><path d="M15 12H3"></path><path d="M17 19H3"></path></svg></button></div><noscript><div class="flex flex-wrap justify-center gap-4 bg-white px-4 py-3 text-sm md:hidden"><a href="/">Home</a><a href="/pricing">Pricing</a><a href="/blog">Blog</a><a href="/sitemap">Site map</a><a href="/login">Sign in</a></div></noscript></nav><main class="contact-page-main relative overflow-hidden bg-white px-4 pb-20 pt-28 sm:px-8 sm:pb-28 sm:pt-40"><div class="relative mx-auto grid max-w-7xl items-start gap-12 lg:grid-cols-[.82fr_1.18fr] lg:gap-16"><section class="pt-4 lg:sticky lg:top-32"><p class="text-xs font-black uppercase tracking-[.2em] text-[#A562BC]">Contact TimeWarp</p><h1 class="mt-5 max-w-xl text-[clamp(2.35rem,12vw,5.75rem)] font-semibold leading-[.98] tracking-[-.045em] text-[#0A0A0A] sm:leading-[.93]
65sm:tracking-[-.065em]">Letâs talk about what youâre building.</h1><p class="mt-7 max-w-lg text-lg leading-8 text-black/60">Tell us what you need and weâll connect you with someone who can actually help.</p><div class="mt-10 space-y-3"><div class="flex gap-4 rounded-xl border border-black/10 bg-white p-4"><span class="grid h-10 w-10 shrink-0 place-items-center rounded-lg bg-[#F3F3F3] text-[#A562BC]"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-life-buoy" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m4.93 4.93 4.24 4.24"></path><path d="m14.83 9.17 4.24-4.24"></path><path d="m14.83 14.83 4.24 4.24"></path><path d="m9.17 14.83-4.24 4.24"></path><circle cx="12" cy="12" r="4"></circle></svg></span><div><h2 class="text-sm font-bold text-[#0A0A0A]">The right person</h2><p class="mt-1 text-xs leading-5 text-black/60">Product, support, billing, and partnership messages are routed directly.</p></div></div><div class="flex gap-4 rounded-xl border border-black/10 bg-white p-4"><span class="grid h-10 w-10 shrink-0 place-items-center rounded-lg bg-[#F3F3F3] text-[#A562BC]"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield-check" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg></span><div><h2 class="text-sm font-bold text-[#0A0A0A]">Keep secrets out</h2><p class="mt-1 text-xs leading-5 text-black/60">Please do not include passwords, API keys, or private recovery codes.</p></div></div></div><p class="mt-8 text-sm text-black/60">Prefer email? <a class="font-bold text-[#A562BC] underline underline-offset-4" href="mailto:[email protected]">[email protected]</a></p></section><noscript><p class="rounded-xl border border-black/10 bg-white p-6">To send an enquiry without JavaScript, email <a class="underline" href="mailto:[email protected]">[email protected]</a>.</p><style>.contact-inquiry-form { display: none !important; }</style></noscript><form class="contact-inquiry-form relative min-w-0 overflow-hidden rounded-xl border border-black/10 bg-white p-5 sm:p-8"><div class="relative"><div class="flex flex-col items-start justify-between gap-4 border-b border-black/10 pb-6 sm:flex-row sm:gap-5"><div><p class="text-[10px] font-black uppercase tracking-[.18em] text-[#A562BC]">Start a conversation</p><h2 class="mt-2 text-2xl font-semibold tracking-[-.04em]">How can we help?</h2></div></div><input tabindex="-1" autoComplete="off" class="absolute left-[-9999px]" aria-hidden="true" name="website"/><div class="mt-6 grid gap-4 sm:grid-cols-2"><label class="text-xs font-bold text-black/65">Your name<input required="" autoComplete="name" class="mt-2 w-full rounded-lg border border-black/20 bg-white px-4 py-3.5 text-sm text-[#0A0A0A] outline-none transition placeholder:text-black/35 hover:border-black/35 focus:border-black focus:ring-4 focus:ring-black/10" placeholder="Jane Smith" name="name"/></label><label class="text-xs font-bold text-black/65">Work email<input required="" type="email" autoComplete="email" class="mt-2 w-full rounded-lg border border-black/20 bg-white px-4 py-3.5 text-sm text-[#0A0A0A] outline-none transition placeholder:text-black/35 hover:border-black/35 focus:border-black focus:ring-4 focus:ring-black/10" placeholder="[email protected]" name="email"/></label><label class="text-xs font-bold text-black/65">Company <span class="font-medium text-black/40">(optional)</span><input autoComplete="organization" class="mt-2 w-full rounded-lg border border-black/20 bg-white px-4 py-3.5 text-sm text-[#0A0A0A] outline-none transition placeholder:text-black/35 hover:border-black/35 focus:border-black focus:ring-4 focus:ring-black/10" placeholder="Company name" name="company"/></label><label class="text-xs font-bold text-black/65">Topic<button type="button" class="app-select-trigger mt-2 w-full rounded-lg border border-black/20 bg-white px-4 py-3.5 text-sm text-[#0A0A0A] outline-none transition placeholder:text-black/35 hover:border-black/35 focus:border-black focus:ring-4 focus:ring-black/10" aria-label="Topic" aria-haspopup="listbox" aria-expanded="false" role="combobox"><span class="app-select-value ">Product question</span><svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down app-select-chevron" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button><input type="hidden" name="topic" value="Product question"/></label></div><label class="mt-4 block text-xs font-bold text-black/65">Your message<textarea required="" name="message" rows="5" class="mt-2 w-full rounded-lg border border-black/20 bg-white px-4 py-3.5 text-sm text-[#0A0A0A] outline-none transition placeholder:text-black/35 hover:border-black/35 focus:border-black focus:ring-4 focus:ring-black/10 resize-y" placeholder="Give us a little context so we can route this to the right person."></textarea></label><div class="mt-5 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"><p class="max-w-xs text-[10px] leading-4 text-black/45">By sending this form, you agree that TimeWarp may use these details to respond to your enquiry.</p><button type="submit" class="inline-flex min-w-44 w-full items-center justify-center gap-2 rounded-lg bg-[#0A0A0A] px-6 py-3.5 text-sm font-bold text-white transition hover:bg-[#242424] disabled:cursor-wait disabled:opacity-70 sm:w-auto">Send enquiry <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
65ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></button></div></div></form></div></main><footer class="solar-footer border-t border-[var(--solar-line)] bg-[#f3eadf] px-5 py-16 sm:px-8 md:py-24"><div class="mx-auto flex max-w-7xl flex-col items-start justify-between gap-12 md:flex-row"><div class="flex flex-col gap-4"><a class="flex items-center gap-3 text-[var(--solar-ink)]" aria-label="TimeWarp homepage" href="/" data-discover="true"><span class="timewarp-logo timewarp-logo--mesh relative flex shrink-0 items-center justify-center" role="img" aria-label="TimeWarp logo" data-animated="false" style="width:44px;height:44px"><img src="/assets/timewarp-logo-DgqmnEuz.svg" alt="" aria-hidden="true" draggable="false" decoding="async" class="block h-full w-full select-none object-contain"/></span><span class="text-2xl font-bold tracking-tight">TimeWarp</span></a><p class="max-w-xs text-base text-[var(--solar-muted)]"> 66</p></div><div class="grid w-full grid-cols-2 gap-x-8 gap-y-10 sm:w-auto sm:grid-cols-3 sm:gap-12 md:gap-20"><div class="flex flex-col gap-4"><h2 class="text-lg font-bold tracking-normal">Product</h2><a href="/#product" class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]">Product Overview</a><a href="/pricing" class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]">Pricing</a><a class="font-medium text-[var(--solar-muted)]" href="/use-cases/ai-agents" data-discover="true">AI Agents</a><a class="font-medium text-[var(--solar-muted)]" href="/use-cases/ai-native" data-discover="true">AI Native</a><a class="font-medium text-[var(--solar-muted)]" href="/use-cases/enterprise" data-discover="true">Enterprise</a></div><div class="flex flex-col gap-4"><h2 class="text-lg font-bold tracking-normal">Company</h2><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/blog" data-discover="true">Blog</a><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/contact" data-discover="true">Contact</a></div><div class="col-span-2 flex flex-col gap-4 sm:col-span-1"><h2 class="text-lg font-bold tracking-normal">Legal</h2><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/legal/terms-of-service" data-discover="true">Terms of Service</a><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/legal/privacy-policy" data-discover="true">Privacy Policy</a><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/legal/data-deletion" data-discover="true">Data Deletion</a><a class="font-medium text-[var(--solar-muted)] transition-colors hover:text-[var(--solar-ink)]" href="/legal/acceptable-use" data-discover="true">Acceptable Use Policy</a></div></div></div><div class="mx-auto mt-16 flex max-w-7xl flex-col items-center justify-between gap-4 border-t border-[var(--solar-line)] pt-8 text-sm font-medium text-[var(--solar-muted)] md:flex-row"><span>© 2026 TimeWarp. All rights reserved.</span><a class="underline underline-offset-4" href="/sitemap" data-discover="true">Site map</a></div></footer></div> 67 </div> 68 <style> 69 body { margin: 0; } 70 #root[data-timewarp-boot-pending="true"] { 71 min-height: 100vh; 72 background: #ffffff; 73 color: #0a0a0a; 74 font-family: "DM Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 75 } 76 .timewarp-static-site { min-height: 100vh; padding: 24px clamp(24px, 6vw, 80px) 64px; box-sizing: border-box; } 77 .timewarp-static-nav { display: flex; align-items: center; justify-content: space-between; gap: 24px; max-width: 1180px; margin: 0 auto; } 78 .timewarp-static-nav a { color: inherit; text-decoration: none; } 79 .timewarp-static-brand { font-size: 20px; font-weight: 800; letter-spacing: -0.04em; }
80 .timewarp-static-nav div { display: flex; flex-wrap: wrap; gap: 18px; font-size: 14px; font-weight: 600; } 81 .timewarp-static-content { max-width: 920px; margin: clamp(72px, 13vh, 150px) auto 0; text-align: center; } 82 .timewarp-static-eyebrow { margin: 0 0 18px; font-size: 12px; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; } 83 .timewarp-static-content h1 { max-width: 820px; margin: 0 auto; font-size: clamp(48px, 9vw, 96px); line-height: 0.98; letter-spacing: -0.065em; } 84 .timewarp-static-summary { max-width: 680px; margin: 28px auto 0; color: rgba(10, 10, 10, 0.58); font-size: clamp(18px, 2.4vw, 24px); line-height: 1.55; } 85 .timewarp-static-content ul { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin: 44px 0 0; padding: 0; list-style: none; text-align: left; } 86 .timewarp-static-content li { padding: 20px; border: 1px solid rgba(10, 10, 10, 0.1); border-radius: 12px; background: #f3f3f3; color: rgba(10, 10, 10, 0.58); line-height: 1.55; } 87 .timewarp-static-content li strong { display: block; margin-bottom: 5px; color: #0a0a0a; } 88 .timewarp-static-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 18px; margin-top: 32px; } 89 .timewarp-static-actions a { color: inherit; font-weight: 700; } 90 .timewarp-static-actions .timewarp-static-primary { padding: 14px 22px; border-radius: 8px; background: #0a0a0a; color: #fff; text-decoration: none; } 91 .timewarp-boot-shell { 92 min-height: 100vh; 93 display: grid; 94 place-items: center; 95 padding: 24px; 96 background: #ffffff; 97 color: #211d2e; 98 font-family: "DM Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 99 box-sizing: border-box; 100 } 101 .timewarp-boot-card { 102 display: grid; 103 justify-items: center; 104 gap: 13px; 105 width: min(240px, 100%); 106 box-sizing: border-box; 107 } 108 .timewarp-boot-mark { 109 display: grid; 110 place-items: center; 111 width: 52px; 112 height: 52px; 113 animation: timewarp-boot-breathe 1.8s ease-in-out infinite; 114 } 115 .timewarp-boot-logo { display: block; width: 52px; height: 52px; } 116 .timewarp-boot-wordmark { font-size: 15px; font-weight: 600; letter-spacing: -0.025em; } 117 .timewarp-boot-dots { display: flex; align-items: center; gap: 5px; height: 8px; } 118 .timewarp-boot-dots i { 119 width: 4px; 120 height: 4px; 121 border-radius: 999px; 122 background: #7557c8; 123 opacity: 0.22; 124 animation: timewarp-boot-dot 1.2s ease-in-out infinite; 125 } 126 .timewarp-boot-dots i:nth-child(2) { animation-delay: 0.16s; } 127 .timewarp-boot-dots i:nth-child(3) { animation-delay: 0.32s; } 128 .timewarp-boot-copy { display: grid; justify-items: center; gap: 5px; min-width: 0; text-align: center; } 129 .timewarp-boot-eyebrow { color: #7557c8; font-size: 10px; font-weight: 800; letter-spacing: 0.15em; text-transform: uppercase; } 130 .timewarp-boot-copy strong { font-size: 17px; letter-spacing: -0.025em; } 131 .timewarp-boot-copy > span:not(.timewarp-boot-eyebrow) { color: #5f5865; font-size: 13px; line-height: 1.5; } 132 .timewarp-boot-card.failed { 133 justify-items: start; 134 width: min(470px, 100%); 135 padding: 24px; 136 border: 1px solid #dccfc5; 137 border-radius: 20px; 138 background: rgba(255, 255, 255, 0.88); 139 box-shadow: 0 20px 54px rgba(67, 48, 78, 0.12); 140 } 141 .timewarp-boot-card.failed .timewarp-boot-mark { width: 42px; height: 42px; animation: none; } 142 .timewarp-boot-card.failed .timewarp-boot-logo { width: 42px; height: 42px; } 143 .timewarp-boot-card.failed .timewarp-boot-copy { justify-items: start; gap: 9px; text-align: left; } 144 .timewarp-boot-card.failed p { margin: 0; color: #5f5865; font-size: 13px; line-height: 1.55; } 145 .timewarp-boot-actions { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 5px; } 146 .timewarp-boot-actions button { 147 border: 1px solid #cdbdb2; 148 border-radius: 10px; 149 background: #ffffff; 150 color: #211d2e; 151 padding: 9px 12px; 152 font: inherit; 153 font-size: 12px; 154 font-weight: 700; 155 cursor: pointer; 156 }
157 .timewarp-boot-actions button:first-child { border-color: #7557c8; background: #7557c8; color: #fffaf3; } 158 .timewarp-boot-actions button:focus-visible { outline: 3px solid rgba(117, 87, 200, 0.28); outline-offset: 3px; } 159 @keyframes timewarp-boot-breathe { 160 0%, 100% { opacity: 0.72; transform: scale(0.98); } 161 50% { opacity: 1; transform: scale(1); } 162 } 163 @keyframes timewarp-boot-dot { 164 0%, 60%, 100% { opacity: 0.22; transform: translateY(0); } 165 30% { opacity: 0.9; transform: translateY(-2px); } 166 } 167 @media (prefers-reduced-motion: reduce) { 168 .timewarp-boot-mark, .timewarp-boot-dots i { animation: none; } 169 .timewarp-boot-mark { opacity: 1; } 170 .timewarp-boot-dots i { opacity: 0.55; } 171 } 172 @media (max-width: 720px) { 173 .timewarp-static-nav { align-items: flex-start; } 174 .timewarp-static-nav div { justify-content: flex-end; gap: 10px 14px; } 175 .timewarp-static-content ul { grid-template-columns: 1fr; } 176 } 177 @media (max-width: 440px) { 178 .timewarp-boot-card.failed { padding: 21px; } 179 } 180 </style> 181
181<script> 182 (() => { 183 const root = document.getElementById('root'); 184 const isDesktopRuntime = Boolean(window.electronAPI) || /electron/i.test(navigator.userAgent || ''); 185 if (root && isDesktopRuntime) { 186 root.innerHTML = ` 187 <main class="timewarp-boot-shell" role="status" aria-live="polite" aria-label="Loading TimeWarp"> 188 <section class="timewarp-boot-card"> 189 <div class="timewarp-boot-mark"><img src="/favicon.svg" alt="" class="timewarp-boot-logo"></div> 190 <strong class="timewarp-boot-wordmark">TimeWarp</strong> 191 <span class="timewarp-boot-dots" aria-hidden="true"><i></i><i></i><i></i></span> 192 </section> 193 </main>`; 194 } 195 const bootLogoUrl = root?.querySelector('.timewarp-boot-logo')?.getAttribute('src') || './favicon.svg'; 196 let finished = false; 197 let watchdog = 0; 198 199 const showFailure = (reason) => { 200 if (finished || !root || root.dataset.timewarpBootPending !== 'true') return; 201 finished = true; 202 window.clearTimeout(watchdog); 203 console.error('TimeWarp failed before the renderer mounted:', reason); 204 205 root.innerHTML = ` 206 <main class="timewarp-boot-shell" role="alert" aria-live="assertive"> 207 <section class="timewarp-boot-card failed"> 208 <div class="timewarp-boot-mark"><img alt="" class="timewarp-boot-logo" data-timewarp-boot-logo></div> 209 <div class="timewarp-boot-copy"> 210 <span class="timewarp-boot-eyebrow">Opening issue</span> 211 <strong>We couldn't restore the last screen</strong> 212 <p>Your chats, projects, memory, and account data are safe. Try again, or start with a fresh screen if this keeps happening.</p> 213 <div class="timewarp-boot-actions"> 214 <button type="button" data-timewarp-boot-reload>Try again</button> 215 <button type="button" data-timewarp-boot-recover>Start with a fresh screen</button> 216 </div> 217 </div> 218 </section> 219 </main>`; 220 221 const logo = root.querySelector('[data-timewarp-boot-logo]'); 222 if (logo instanceof HTMLImageElement) logo.src = bootLogoUrl; 223 root.querySelector('[data-timewarp-boot-reload]')?.addEventListener('click', () => window.location.reload()); 224 root.querySelector('[data-timewarp-boot-recover]')?.addEventListener('click', () => { 225 try { 226 const keys = Array.from({ length: window.localStorage.length }, (_, index) => window.localStorage.key(index)); 227 keys.filter((key) => key === 'isCodingModeEnabled' 228 || key === 'isBrowserModeEnabled' 229 || key === 'timewarpBrowserTabs' 230 || key?.startsWith('timewarpBrowserTabs:')) 231 .forEach((key) => { if (key) window.localStorage.removeItem(key); }); 232 } catch { /* Reload is still safe when storage is unavailable. */ } 233 try { window.location.hash = '#/'; } catch {} 234 window.location.reload(); 235 }); 236 }; 237 238 window.__timeWarpBoot = { 239 start() { 240 if (finished) return; 241 window.clearTimeout(watchdog); 242 }, 243 complete() { 244 if (finished) return; 245 finished = true; 246 window.clearTimeout(watchdog); 247 if (root) root.dataset.timewarpBootPending = 'false'; 248 }, 249 fail: showFailure, 250 }; 251 252 window.addEventListener('error', (event) => showFailure(event.error || event.message)); 253 window.addEventListener('unhandledrejection', (event) => showFailure(event.reason)); 254 // Cold-start compilation and antivirus scanning can legitimately keep 255 // the entry module loading for longer than 30 seconds. Once that module 256 // evaluates it calls start(), leaving React's error boundary in charge. 257 watchdog = window.setTimeout(() => showFailure(new Error('Renderer entry timed out.')), 120000); 258 })(); 259 </script>
259 260 <noscript> 261 <p style="padding:0 24px 24px;font-family:system-ui;text-align:center">Public pages are readable without JavaScript. Enable JavaScript to sign in or use interactive product demos.</p> 262 </noscript> 263 </body> 264</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.