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.0"> 6 <title>White-Glove Photo Digitizing and Pickup | Phossil</title> 7 <meta name="description" content="Phossil White-Glove: we pick up your boxes, digitize everything, and return your originals. $2,000 covers your first 2,000 photos. Request a pickup."> 8 <link rel="canonical" href="https://phossil.ai/white-glove"> 9 <meta name="theme-color" content="#213535"> 10 11 <!-- Open Graph --> 12 <meta property="og:title" content="White-Glove Pickup | Phossil"> 13 <meta property="og:description" content="We pick up your boxes, digitize everything, and return your originals. $2,000 covers your first 2,000 photos."> 14 <meta property="og:type" content="website"> 15 <meta property="og:url" content="https://phossil.ai/white-glove"> 16 <meta property="og:image" content="https://phossil.ai/img/og-image.jpg"> 17 <meta property="og:image:width" content="1200"> 18 <meta property="og:image:height" content="630"> 19 <meta property="og:site_name" content="Phossil"> 20 21 <!-- Twitter --> 22 <meta name="twitter:card" content="summary_large_image"> 23 <meta name="twitter:site" content="@phossil_ai"> 24 <meta name="twitter:creator" content="@phossil_ai"> 25 <meta name="twitter:title" content="White-Glove Pickup | Phossil"> 26 <meta name="twitter:description" content="We pick up your boxes, digitize everything, and return your originals. $2,000 covers your first 2,000 photos."> 27 <meta name="twitter:image" content="https://phossil.ai/img/og-image.jpg"> 28 29 <!-- WebPage JSON-LD (Organization/WebPage only; no rating schema, we have no 30 review corpus). A data block is not governed by script-src, no nonce. --> 31
31<script type="application/ld+json"> 32 { 33 "@context": "https://schema.org", 34 "@type": "WebPage", 35 "name": "White-Glove Pickup | Phossil", 36 "url": "https://phossil.ai/white-glove", 37 "description": "Phossil White-Glove: we pick up your boxes, digitize everything, and return your originals. $2,000 covers your first 2,000 photos.", 38 "isPartOf": { 39 "@type": "WebSite", 40 "name": "Phossil", 41 "url": "https://phossil.ai" 42 }, 43 "publisher": { "@id": "https://phossil.ai/#organization" } 44 } 45 </script>
45 46
46<script type="application/ld+json"> 47 { 48 "@context": "https://schema.org", 49 "@type": "Organization", 50 "@id": "https://phossil.ai/#organization", 51 "name": "Phossil", 52 "url": "https://phossil.ai", 53 "logo": "https://phossil.ai/apple-touch-icon.png", 54 "description": "Phossil is a time machine for families: AI that turns chaotic, undated photo collections into organized, dated, connected archives using Bayesian temporal inference.", 55 "disambiguatingDescription": "Phossil (phossil.ai) is an AI service for digitizing, restoring, dating, and archiving old family photos.", 56 "sameAs": ["https://www.instagram.com/phossil.ai/", "https://x.com/phossil_ai"] 57 } 58 </script>
58 59 60 61 <!-- Google Fonts --> 62 <link rel="stylesheet" href="/vendor/fonts/fonts.css?v=fb47636ac3b9"> 63 64 <!-- Global chrome styles (Gotcha #13: unified-header.css BEFORE site-header.css 65 so the app header does not balloon for authed visitors) --> 66 <link rel="stylesheet" href="/css/main.css?v=fb47636ac3b9"> 67 <link rel="stylesheet" href="/css/unified-header.css?v=fb47636ac3b9"> 68 <link rel="stylesheet" href="/css/components/site-header.css?v=fb47636ac3b9"> 69 70 <style> 71 :root { 72 --color-canvas: #F3F0E6; 73 --color-primary: #213535; 74 --color-accent: #D9A520; 75 --color-accent-hover: #C4941C; 76 --color-surface: #FFFFFF; 77 --color-secondary: #68868A; 78 --color-destructive: #C05746; 79 --color-text-primary: #213535; 80 --color-text-light: #F3F0E6; 81 --color-border: rgba(104, 134, 138, 0.22); 82 83 --font-serif: 'Libre Baskerville', Georgia, serif; 84 --font-sans: 'Inter', sans-serif; 85 } 86 87 * { 88 margin: 0; 89 padding: 0; 90 box-sizing: border-box; 91 } 92 93 body { 94 font-family: var(--font-sans); 95 background-color: var(--color-canvas); 96 color: var(--color-text-primary); 97 line-height: 1.6; 98 } 99 100 h1, h2, h3, h4 { 101 font-family: var(--font-serif); 102 color: var(--color-primary); 103 } 104 105 /* --- Hero --- */ 106 .hero { 107 padding: 160px 24px 64px; 108 max-width: 820px; 109 margin: 0 auto; 110 text-align: center; 111 } 112 113 .hero h1 { 114 font-size: clamp(2.25rem, 6vw, 3.5rem); 115 line-height: 1.15; 116 margin-bottom: 24px; 117 } 118 119 .hero .lead { 120 font-size: 1.1875rem; 121 color: var(--color-secondary); 122 max-width: 640px; 123 margin: 0 auto; 124 } 125 126 .hero .price-anchor { 127 display: inline-block; 128 margin-top: 32px; 129 background: var(--color-surface); 130 border: 1px solid var(--color-border); 131 border-radius: 100px; 132 padding: 12px 24px; 133 font-size: 1rem; 134 font-weight: 600; 135 color: var(--color-primary); 136 } 137 138 .hero .price-anchor strong { 139 color: var(--color-accent); 140 } 141 142 /* --- Custody section --- */ 143 .custody { 144 max-width: 1000px; 145 margin: 0 auto; 146 padding: 24px 24px 72px; 147 } 148 149 .custody-header { 150 text-align: center; 151 margin-bottom: 40px; 152 } 153 154 .custody-header h2 { 155 font-size: clamp(1.5rem, 4vw, 2rem); 156 margin-bottom: 12px; 157 } 158 159 .custody-header p { 160 color: var(--color-secondary); 161 max-width: 560px; 162 margin: 0 auto; 163 } 164 165 .custody-grid { 166 display: grid; 167 grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 168 gap: 24px; 169 } 170 171 /* Four cards pair better than 3+1 orphan (2026-07-13 audit) */ 172 @media (min-width: 900px) { 173 .custody-grid { grid-template-columns: repeat(2, 1fr); } 174 } 175 176 .custody-card { 177 background: var(--color-surface); 178 border: 1px solid var(--color-border); 179 border-left: 4px solid var(--color-accent); 180 border-radius: 12px; 181 padding: 28px; 182 } 183 184 .custody-card h3 { 185 font-size: 1.1875rem; 186 margin-bottom: 10px; 187 } 188 189 .custody-card p { 190 color: var(--color-secondary); 191 font-size: 0.9688rem; 192 line-height: 1.7; 193 } 194 195 /* --- How it works --- */ 196 .how { 197 background: var(--color-primary); 198 padding: 72px 24px; 199 } 200 201 .how-inner { 202 max-width: 900px; 203 margin: 0 auto; 204 } 205 206 .how h2 { 207 color: var(--color-text-light); 208 text-align: center; 209 font-size: clamp(1.5rem, 4vw, 2rem); 210 margin-bottom: 48px; 211 } 212 213 .how-steps { 214 display: grid; 215 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 216 gap: 32px; 217 } 218 219 .how-step { 220 text-align: center; 221 } 222 223 .how-step .num { 224 width: 48px; 225 height: 48px; 226 margin: 0 auto 16px; 227 border-radius: 50%; 228 background: var(--color-accent); 229 color: var(--color-primary); 230 font-family: var(--font-serif); 231 font-size: 1.25rem; 232 font-weight: 700; 233 display: flex; 234 align-items: center; 235 justify-content: center; 236 } 237 238 .how-step h4 { 239 color: var(--color-text-light); 240 font-size: 1.0625rem; 241 margin-bottom: 8px; 242 } 243 244 .how-step p { 245 color: rgba(243, 240, 230, 0.75); 246 font-size: 0.9063rem; 247 } 248 249 /* --- Waitlist --- */ 250 .waitlist { 251 padding: 72px 24px 96px; 252 max-width: 560px; 253 margin: 0 auto; 254 text-align: center; 255 } 256 257 .waitlist h2 { 258 font-size: clamp(1.5rem, 4vw, 2rem); 259 margin-bottom: 12px; 260 } 261 262 .waitlist > p { 263 color: var(--color-secondary); 264 margin-bottom: 32px; 265 } 266 267 .waitlist-form { 268 text-align: left; 269 display: flex; 270 flex-direction: column; 271 gap: 18px; 272 } 273 274 .field label { 275 display: block; 276 font-size: 0.875rem; 277 font-weight: 600; 278 color: var(--color-primary); 279 margin-bottom: 8px; 280 } 281 282 .field input, 283 .field select { 284 width: 100%; 285 min-height: 48px; 286 padding: 12px 16px; 287 border: 1px solid var(--color-border); 288 border-radius: 8px; 289 font-size: 1rem; 290 font-family: var(--font-sans); 291 background: var(--color-surface); 292 color: var(--color-primary); 293 transition: border-color 0.2s, box-shadow 0.2s; 294 } 295 296 .field input:focus, 297 .field select:focus { 298 outline: none; 299 border-color: var(--color-accent); 300 box-shadow: 0 0 0 3px rgba(217, 165, 32, 0.2); 301 } 302 303 .btn-primary { 304 width: 100%; 305 min-height: 52px; 306 padding: 16px 24px; 307 background: var(--color-accent); 308 color: var(--color-primary); 309 border: none; 310 border-radius: 8px; 311 font-family: var(--font-sans); 312 font-size: 1.0625rem; 313 font-weight: 600; 314 cursor: pointer; 315 transition: background 0.2s, transform 0.2s; 316 margin-top: 4px; 317 } 318 319 .btn-primary:hover { 320 background: var(--color-accent-hover); 321 transform: translateY(-1px); 322 } 323 324 .btn-primary:disabled { 325 opacity: 0.7;
326 cursor: not-allowed; 327 transform: none; 328 } 329 330 .waitlist .subline { 331 margin-top: 20px; 332 font-size: 0.9063rem; 333 color: var(--color-secondary); 334 } 335 336 .waitlist-error { 337 display: none; 338 margin-top: 16px; 339 padding: 12px 16px; 340 border-radius: 8px; 341 background: rgba(192, 87, 70, 0.1); 342 border: 1px solid rgba(192, 87, 70, 0.35); 343 color: var(--color-destructive); 344 font-size: 0.9063rem; 345 text-align: center; 346 } 347 348 .waitlist-success { 349 display: none; 350 background: var(--color-surface); 351 border: 1px solid var(--color-border); 352 border-radius: 12px; 353 padding: 40px 28px; 354 text-align: center; 355 } 356 357 .waitlist-success h3 { 358 font-size: 1.375rem; 359 margin-bottom: 12px; 360 } 361 362 .waitlist-success p { 363 color: var(--color-secondary); 364 } 365 366 @media (max-width: 768px) { 367 .hero { 368 padding: 120px 24px 48px; 369 } 370 } 371 372 /* Hero reuse of the form button as an anchor: size to content. */ 373 .hero .btn-primary { 374 display: inline-block; 375 width: auto; 376 text-decoration: none; 377 } 378 </style> 379<style>#ph-conversations-widget-container button[aria-label="Open chat"]{background:var(--color-primary,#213535)!important;color:var(--color-text-on-primary,#F3F0E6)!important;filter:drop-shadow(0 2px 10px rgba(33,53,53,0.35))!important;transition:background 0.15s ease!important;}#ph-conversations-widget-container button[aria-label="Open chat"]:hover{background:var(--color-accent,#D9A520)!important;}</style>
380<script src="/js/posthog-config.js?v=fb47636ac3b9"></script>
vendor: 1 bytes, line 380
380
381<script src="https://t.phossil.ai/static/array.full.js"></script>
vendor: 1 bytes, line 381
381
382<script src="/js/posthog-init.js?v=fb47636ac3b9"></script>
382 383 <link rel="icon" href="/favicon.ico" sizes="32x32"> 384 <link rel="icon" type="image/svg+xml" href="/favicon.svg"> 385 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"> 386 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> 387 <link rel="manifest" href="/site.webmanifest"> 388<meta name="csp-nonce" content="4PdqpDGFmbCOIsU35tAK6A=="> 389</head> 390<body> 391 <!-- Global chrome (self-mounted by site-header.js; auto state resolves 392 marketing vs app per visitor) --> 393 <div id="siteHeader" data-header-state="marketing"></div> 394 395 <section class="hero"> 396 <h1>We come to the boxes.</h1> 397 <p class="lead">You have decades of photos in closets and attics. We pick them up, digitize and organize everything into a living Phossil archive, and return every original to your door.</p> 398 <span class="price-anchor"><strong>$2,000</strong> covers your first 2,000 photos, pickup to return.</span> 399 <p style="margin: 8px 0 0; font-size: 0.9rem; color: var(--color-text-secondary);">Larger collections are quoted personally before pickup.</p> 400 <p style="margin: 20px 0 0;">
400<a href="#request" class="btn-primary">Request a pickup</a></p> 401 </section> 402 403 <section class="custody"> 404 <div class="custody-header"> 405 <h2>Custody, answered before you ask</h2> 406 <p>Your originals are irreplaceable. Here is exactly how we protect them, in writing, before we take a single box.</p> 407 </div> 408 409 <div class="custody-grid"> 410 <div class="custody-card"> 411 <h3>Your originals, returned</h3> 412 <p>Your originals come home first. We return every physical photo before the project closes, tracked door to door.</p> 413 </div> 414 415 <div class="custody-card"> 416 <h3>Insured, in writing</h3> 417 <p>Insured in transit and in our care. Coverage is confirmed in writing before we take custody of a single box.</p> 418 </div> 419 420 <div class="custody-card"> 421 <h3>Chain of custody, with tracking</h3> 422 <p>Chain of custody. Every box is logged, sealed, and trackable from your door to ours and back.</p> 423 </div> 424 425 <div class="custody-card"> 426 <h3>If Phossil ever closes</h3> 427 <p>If Phossil ever closed mid-project, your originals ship back to you immediately and your digital archive stays exportable, free.</p> 428 </div> 429 </div> 430 </section> 431 432 <section class="how"> 433 <div class="how-inner"> 434 <h2>How a pickup works</h2> 435 <div class="how-steps"> 436 <div class="how-step"> 437 <div class="num">1</div> 438 <h4>We pick up</h4> 439 <p>We collect your boxes from your door, logged and sealed.</p> 440 </div> 441 <div class="how-step"> 442 <div class="num">2</div> 443 <h4>We digitize</h4> 444 <p>Every photo is scanned, dated, and organized into your archive.</p> 445 </div> 446 <div class="how-step"> 447 <div class="num">3</div> 448 <h4>We return</h4> 449 <p>Your originals ship back to you, tracked, when the work is done.</p> 450 </div> 451 </div> 452 </div> 453 </section> 454 455 <section class="waitlist" id="request"> 456 <h2>Request a pickup</h2> 457 <p>Tell us where you are and roughly how much you have. We reply personally.</p> 458 459 <form class="waitlist-form" id="whiteGloveForm" novalidate> 460 <div class="field"> 461 <label for="wgName">Your name</label> 462 <input type="text" id="wgName" name="name" autocomplete="name" placeholder="Your name" required> 463 </div> 464 <div class="field"> 465 <label for="wgEmail">Email</label> 466 <input type="email" id="wgEmail" name="email" autocomplete="email" placeholder="[email protected]" required> 467 </div> 468 <div class="field"> 469 <label for="wgRegion">City or region</label> 470 <input type="text" id="wgRegion" name="region" autocomplete="address-level2" placeholder="City or region (e.g. Austin, TX)" required> 471 </div> 472 <div class="field"> 473 <label for="wgSize">Roughly how many photos?</label> 474 <select id="wgSize" name="size"> 475 <option value="">Roughly how many photos?</option> 476 <option value="Under 500 photos">Under 500 photos</option> 477 <option value="500 to 2,000 photos">500 to 2,000 photos</option> 478 <option value="2,000 to 5,000 photos">2,000 to 5,000 photos</option> 479 <option value="5,000 to 10,000 photos">5,000 to 10,000 photos</option> 480 <option value="More than 10,000 photos">More than 10,000 photos</option> 481 <option value="Not sure yet">Not sure yet</option> 482 </select> 483 </div> 484 <button type="submit" class="btn-primary" id="wgSubmitBtn">Request a pickup</button> 485 </form> 486 487 <p class="waitlist-error" id="wgError">Something went wrong. Please try again, or email us at <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e6d6b6e6e716c6a5e6e76716d6d7772307f77">[email protected]</a>.</p> 488 489 <p class="subline">We're starting with a small number of regional pickups and reply personally.</p> 490 491 <div class="waitlist-success" id="wgSuccess"> 492 <h3>You're on the list</h3> 493 <p>Thanks for reaching out. We'll reply personally, usually within a day or two, to talk through your collection and the next steps.</p> 494 </div> 495 </section> 496 497 <div id="siteFooter"></div> 498 499 <!-- CSRF interceptor MUST load before the form posts /api/contact 500 (auto-tokenizes state-changing /api/* requests) -->
vendor: 113 bytes, lines 500-501
500 501 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
501<script src="/js/utils/csrf-interceptor.js?v=fb47636ac3b9"></script>
501 502
502<script src="/js/components/site-header.js?v=fb47636ac3b9" defer></script>
502 503
503<script src="/js/components/site-footer.js?v=fb47636ac3b9" defer></script>
503 504
504<script nonce="4PdqpDGFmbCOIsU35tAK6A=="> 505 document.getElementById('whiteGloveForm').addEventListener('submit', async (e) => { 506 e.preventDefault(); 507 508 const form = document.getElementById('whiteGloveForm'); 509 const btn = document.getElementById('wgSubmitBtn'); 510 const errorEl = document.getElementById('wgError'); 511 const successEl = document.getElementById('wgSuccess'); 512 513 const name = document.getElementById('wgName').value.trim(); 514 const email = document.getElementById('wgEmail').value.trim(); 515 const region = document.getElementById('wgRegion').value.trim(); 516 const size = document.getElementById('wgSize').value.trim(); 517 518 errorEl.style.display = 'none'; 519 520 if (!name || !email || !region) { 521 errorEl.textContent = 'Please add your name, email, and city or region.'; 522 errorEl.style.display = 'block'; 523 return; 524 } 525 526 btn.disabled = true; 527 const originalText = btn.textContent; 528 btn.textContent = 'Requesting...'; 529 530 try { 531 const response = await fetch('/api/contact', { 532 method: 'POST', 533 headers: { 'Content-Type': 'application/json' }, 534 credentials: 'include', 535 body: JSON.stringify({ 536 name: name, 537 email: email, 538 message: 'Region: ' + (region || 'Not specified') + '. Collection size: ' + (size || 'Not specified') + '.', 539 program: 'whiteglove', 540 source: 'whiteglove_waitlist_form' 541 }) 542 }); 543 544 if (response.ok) { 545 form.style.display = 'none'; 546 document.querySelector('.waitlist > p').style.display = 'none'; 547 successEl.style.display = 'block'; 548 successEl.scrollIntoView({ behavior: 'smooth', block: 'center' }); 549 } else { 550 throw new Error('Request failed'); 551 } 552 } catch (err) { 553 console.error('White-glove request error:', err); 554 errorEl.textContent = 'Something went wrong. Please try again, or email us at [email protected].'; 555 errorEl.style.display = 'block'; 556 btn.disabled = false; 557 btn.textContent = originalText; 558 } 559 }); 560 </script>
vendor: 1 bytes, line 560
560
561<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" nonce="4PdqpDGFmbCOIsU35tAK6A==" data-cf-beacon='{"version":"2024.11.0","token":"12da38f7bc4b4bf2b18e01f28d7dd27d","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 561
561
562<script nonce="4PdqpDGFmbCOIsU35tAK6A==">(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.nonce='4PdqpDGFmbCOIsU35tAK6A==';d.innerHTML="window.__CF$cv$params={r:'a45d64e54b846643',t:'MTc5MTIxMzQ1Ng=='};var a=document.createElement('script');a.nonce='4PdqpDGFmbCOIsU35tAK6A==';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
562</body> 563</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.