PageSourceSearch

https://phossil.ai/white-glove

html phossil.ai collected 2026-10-05 15:17:36 UTC 22,724 bytes, 563 lines download raw bytes

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&#160;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.