-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgorithm.html
More file actions
812 lines (729 loc) · 32.5 KB
/
Copy pathalgorithm.html
File metadata and controls
812 lines (729 loc) · 32.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Primary Meta Tags -->
<title>The Intel - How Unwyned Works | Wine Recommendation Algorithm</title>
<meta name="description" content="How Unwyned's recommendation algorithm works - Learn how our 8-dimensional taste profiling and AI-powered menu scanning delivers personalized wine recommendations.">
<meta name="keywords" content="wine algorithm, wine recommendations, taste profile, wine matching, AI wine scanner, wine app how it works">
<meta name="author" content="Inceptyon Labs">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<!-- Canonical URL -->
<link rel="canonical" href="https://unwyned.com/algorithm.html">
<!-- Open Graph / Social Media -->
<meta property="og:type" content="article">
<meta property="og:title" content="The Intel - How Unwyned Works">
<meta property="og:description" content="Learn how our 8-dimensional taste profiling and AI-powered menu scanning delivers personalized wine recommendations.">
<meta property="og:url" content="https://unwyned.com/algorithm.html">
<meta property="og:image" content="https://unwyned.com/assets/images/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Unwyned app - How the wine recommendation algorithm works">
<meta property="og:site_name" content="Unwyned">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2024-11-29T00:00:00+00:00">
<meta property="article:modified_time" content="2026-01-03T00:00:00+00:00">
<meta property="article:author" content="Inceptyon Labs">
<meta property="article:section" content="Technology">
<meta property="article:tag" content="wine recommendations">
<meta property="article:tag" content="AI algorithm">
<meta property="article:tag" content="taste profiling">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="The Intel - How Unwyned Works">
<meta name="twitter:description" content="Learn how our 8-dimensional taste profiling delivers personalized wine recommendations.">
<meta name="twitter:image" content="https://unwyned.com/assets/images/og-image.png">
<meta name="twitter:image:alt" content="Unwyned app - How the wine recommendation algorithm works">
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/images/apple-touch-icon.png">
<!-- PWA / Mobile -->
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#1e2a1e">
<meta name="msapplication-TileColor" content="#1e2a1e">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="Unwyned">
<meta name="format-detection" content="telephone=no">
<!-- Preconnect / DNS Prefetch -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Preload Critical Resources -->
<link rel="preload" href="css/main.css" as="style">
<link rel="preload" href="css/components.css" as="style">
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Barlow:wght@400;600;700&family=Oswald:wght@400;600;700&family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
<!-- Styles -->
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/components.css">
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"@id": "https://unwyned.com/algorithm.html#article",
"headline": "The Intel: How Unwyned's Wine Recommendation Algorithm Works",
"description": "Learn how Unwyned's 8-dimensional taste profiling and AI-powered menu scanning delivers personalized wine recommendations.",
"datePublished": "2024-11-29",
"dateModified": "2026-01-02",
"author": {
"@type": "Organization",
"name": "Inceptyon Labs",
"url": "https://inceptyon.io"
},
"publisher": {
"@type": "Organization",
"name": "Unwyned",
"logo": {
"@type": "ImageObject",
"url": "https://unwyned.com/assets/images/logo-fullword-light.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://unwyned.com/algorithm.html"
},
"image": "https://unwyned.com/assets/images/og-image.png",
"isPartOf": {
"@id": "https://unwyned.com/#website"
}
},
{
"@type": "BreadcrumbList",
"@id": "https://unwyned.com/algorithm.html#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://unwyned.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "The Intel",
"item": "https://unwyned.com/algorithm.html"
}
]
},
{
"@type": "HowTo",
"@id": "https://unwyned.com/algorithm.html#howto",
"name": "How Unwyned Recommends Wine",
"description": "Understanding how Unwyned's algorithm matches wines to your personal taste profile",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Scan the Menu",
"text": "Use OCR technology to extract wine information from restaurant menus"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Parse the Wines",
"text": "AI identifies wine names, producers, vintages, and grape varieties"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Estimate Wine Profiles",
"text": "Map each wine to an 8-dimensional taste profile"
},
{
"@type": "HowToStep",
"position": 4,
"name": "Calculate Match Scores",
"text": "Use asymmetric similarity to find wines that match your preferences"
},
{
"@type": "HowToStep",
"position": 5,
"name": "Rank and Display",
"text": "Present ranked recommendations with match percentages"
}
]
},
{
"@type": "FAQPage",
"@id": "https://unwyned.com/algorithm.html#faq",
"mainEntity": [
{
"@type": "Question",
"name": "How does Unwyned's wine recommendation algorithm work?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Unwyned uses an 8-dimensional taste profiling system combined with AI-powered menu scanning. It maps your preferences across dimensions like sweetness, acidity, tannin, body, fruitiness, oakiness, earthiness, and spice, then matches wines using asymmetric similarity scoring."
}
},
{
"@type": "Question",
"name": "What is the 8-dimension taste system?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The 8-dimension taste system profiles both users and wines across: Body (light to full), Sweetness (dry to sweet), Acidity (soft to bright), Tannin (smooth to grippy), Fruit Intensity (subtle to fruit-forward), Oak (unoaked to heavily oaked), Earthiness (clean to funky), and Spice (mild to peppery)."
}
},
{
"@type": "Question",
"name": "How does Unwyned protect my privacy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Unwyned uses tiered AI processing where menu images are processed locally on your device when possible using on-device OCR. Only extracted text is sent to the cloud for wine matching. Wine profiles are generated without transmitting your taste preferences to external servers."
}
},
{
"@type": "Question",
"name": "How accurate is the menu scanning?",
"acceptedAnswer": {
"@type": "Answer",
"text": "OCR accuracy depends on image quality, font clarity, and lighting conditions. Low-light photos, unusual fonts, or damaged menus may reduce accuracy. Best results come from well-lit, flat menu photos with printed text."
}
}
]
}
]
}
</script>
<style>
.legal-content {
max-width: 1000px;
margin: 0 auto;
padding: var(--spacing-3xl) var(--spacing-lg);
}
.legal-content h1 {
margin-bottom: var(--spacing-lg);
border-bottom: 2px solid var(--color-safety-orange);
padding-bottom: var(--spacing-md);
}
.legal-content h2 {
margin-top: var(--spacing-2xl);
margin-bottom: var(--spacing-md);
color: var(--color-safety-orange);
}
.legal-content h3 {
margin-top: var(--spacing-lg);
margin-bottom: var(--spacing-sm);
font-size: 1.25rem;
}
.legal-content p {
margin-bottom: var(--spacing-md);
line-height: 1.8;
}
.legal-content ul, .legal-content ol {
margin-bottom: var(--spacing-md);
padding-left: var(--spacing-xl);
line-height: 1.8;
}
.legal-content li {
margin-bottom: var(--spacing-sm);
}
.legal-content a {
color: var(--color-safety-orange);
text-decoration: underline;
}
.highlight-box {
background-color: var(--color-gunmetal);
border-left: 4px solid var(--color-safety-orange);
padding: var(--spacing-lg);
margin: var(--spacing-lg) 0;
}
.info-box {
background-color: var(--color-wet-asphalt);
border: 1px solid var(--color-gunmetal);
padding: var(--spacing-lg);
margin: var(--spacing-lg) 0;
border-radius: var(--radius-md);
}
.dimension-table {
width: 100%;
border-collapse: collapse;
margin: var(--spacing-lg) 0;
}
.dimension-table th,
.dimension-table td {
padding: var(--spacing-md);
text-align: left;
border-bottom: 1px solid var(--color-gunmetal);
}
.dimension-table th {
background-color: var(--color-gunmetal);
color: var(--color-safety-orange);
font-family: var(--font-headers);
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.9rem;
}
.dimension-table tr:hover {
background-color: rgba(61, 64, 60, 0.3);
}
.code-block {
background-color: #1a1a1a;
border: 1px solid var(--color-gunmetal);
border-radius: var(--radius-sm);
padding: var(--spacing-md);
margin: var(--spacing-md) 0;
overflow-x: auto;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
line-height: 1.4;
}
.tag {
display: inline-block;
padding: var(--spacing-xs) var(--spacing-sm);
background-color: var(--color-safety-orange);
color: var(--color-matte-black);
border-radius: var(--radius-sm);
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-right: var(--spacing-xs);
}
</style>
</head>
<body>
<!-- Navigation -->
<nav class="navbar">
<div class="container navbar-container">
<a href="index.html" class="navbar-logo">
<img src="assets/images/logo-racket.png" alt="The Racket" style="height: 60px;">
</a>
<button class="navbar-toggle" aria-label="Toggle navigation menu">
<span></span>
<span></span>
<span></span>
</button>
<ul class="navbar-menu">
<li><a href="index.html">Home</a></li>
<li><a href="algorithm.html">The Intel</a></li>
<li><a href="privacy.html">Privacy</a></li>
<li><a href="terms.html">Terms</a></li>
<li><a href="index.html#download" class="btn btn-primary" style="padding: 0.5rem 1rem;">Download</a></li>
</ul>
</div>
</nav>
<!-- Algorithm Documentation Content -->
<main class="legal-content">
<h1>The Intel: How It Works</h1>
<p style="color: var(--color-rusted-ibeam); font-family: var(--font-data); font-size: 1.1rem; margin-bottom: var(--spacing-2xl);">
Behind the scenes of The Racket's recommendation engine
</p>
<div class="highlight-box">
<h3>The Straight Talk</h3>
<p>
We're not magic. We're math. This page explains exactly how Unwyned matches you to wines, how we learn from your ratings, and why our recommendations get better over time. No smoke and mirrors. Just the operation.
</p>
<p style="margin-bottom: 0;">
<strong>Want the full technical deep-dive?</strong> Read <a href="architecture.html" style="color: var(--color-signal-green); text-decoration: underline;">The Architecture of Taste</a> for the complete engineering documentation including mathematical proofs, psychophysical research citations, and implementation details.
</p>
</div>
<h2>1. The Eight-Dimension Taste System</h2>
<p>
Every wine has a profile. Every drinker has preferences. We map both using the same 8-dimensional system. Think of it like coordinates on a map—except instead of north and south, we're measuring how sweet, tannic, fruity, or earthy something tastes.
</p>
<table class="dimension-table">
<thead>
<tr>
<th>Dimension</th>
<th>What It Measures</th>
<th>Scale (1-5)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Body</strong></td>
<td>How heavy or light the wine feels in your mouth</td>
<td>Light → Full-bodied</td>
</tr>
<tr>
<td><strong>Sweetness</strong></td>
<td>Residual sugar level</td>
<td>Bone-dry → Sweet</td>
</tr>
<tr>
<td><strong>Acidity</strong></td>
<td>Tartness, brightness, crispness</td>
<td>Soft → Crisp/Bright</td>
</tr>
<tr>
<td><strong>Tannin</strong></td>
<td>That dry, grippy feeling (mostly in reds)</td>
<td>Silky → Grippy</td>
</tr>
<tr>
<td><strong>Fruit Intensity</strong></td>
<td>How much fruit flavor dominates</td>
<td>Subtle → Fruit-forward</td>
</tr>
<tr>
<td><strong>Oak</strong></td>
<td>Vanilla, toast, spice from barrel aging</td>
<td>Unoaked → Heavily oaked</td>
</tr>
<tr>
<td><strong>Earthiness</strong></td>
<td>Mineral, dirt, mushroom, leather notes</td>
<td>Clean → Earthy/Mineral</td>
</tr>
<tr>
<td><strong>Spice</strong></td>
<td>Pepper, clove, cinnamon notes</td>
<td>Mild → Spicy/Peppery</td>
</tr>
</tbody>
</table>
<h2>2. How We Build Your Profile: Center-Out Psychographics</h2>
<p>
When you take the quiz, we use a <strong>Center-Out Scoring Model</strong> instead of directly asking "do you like tannins?" (which most people can't answer accurately). Here's how it works:
</p>
<div class="info-box">
<h3>Quiz Strategy: Starting Neutral</h3>
<p>
Every user starts with a <strong>neutral profile</strong>: all dimensions set to 3.0 (the middle of our 1-5 scale). Questions then shift your profile up or down based on proxy questions about coffee, desserts, textures, and other familiar experiences.
</p>
<p>
<strong>Primary Anchors (±1.2):</strong> Initial questions establish broad direction ("Do you drink coffee black?" affects tannin tolerance).<br>
<strong>Reinforcement (±0.8):</strong> Follow-up questions triangulate tricky dimensions like tannin and acidity.<br>
<strong>Trade-offs (±1.0):</strong> Final questions prevent "impossible" profiles by forcing choices between conflicting attributes (e.g., "Which is worse: too sweet or too dry?").
</p>
</div>
<div class="highlight-box">
<h3>Why Center-Out Works</h3>
<p style="margin-bottom: 0.5rem;">
This approach prevents "profile saturation" where users hit the maximum (5.0) too easily. To reach an extreme preference, you must answer consistently across multiple correlated questions. Most users end up with profiles around 1.8-4.2, which leaves headroom for learning and adaptation as you rate wines.
</p>
<p style="margin-bottom: 0;">
<strong>Edge Case: Manifold Projection.</strong> If your quiz answers create a chemically impossible profile (e.g., high acid + high sugar + high body), we project it 30% toward the nearest valid wine archetype. This rarely happens with our trade-off questions, but it's a safety net that ensures we can always find real wines that match you.
</p>
</div>
<h2>3. The Matching Algorithm</h2>
<p>
When you scan a menu, here's what happens:
</p>
<h3>Step 1: Extract the Text</h3>
<p>
Your phone's camera reads the menu using on-device OCR (Optical Character Recognition). On iOS, we use Apple's Vision framework. On Android, Google ML Kit. The image never leaves your device—we only extract the text.
</p>
<h3>Step 2: Parse the Wines</h3>
<p>
We send the text (not the image) to an AI model to identify each wine, including:
</p>
<ul>
<li>Wine name and producer</li>
<li>Varietal (Cabernet, Chardonnay, etc.)</li>
<li>Vintage year</li>
<li>Region of origin</li>
<li>Price (if listed)</li>
</ul>
<div class="info-box">
<h3><span class="tag">Privacy</span> Tiered AI Processing</h3>
<p>
On supported devices (iOS 26+), we use <strong>Apple Intelligence</strong> to parse menus entirely on your device—no cloud required. For older devices or complex menus, we fall back to cloud AI (OpenAI or Claude) with strict input sanitization.
</p>
</div>
<h3>Step 3: Estimate Wine Profiles</h3>
<p>
For each wine on the menu, we estimate its 8-dimension profile using:
</p>
<ul>
<li><strong>Varietal data</strong>: We have profiles for 170+ grape varieties</li>
<li><strong>Regional modifiers</strong>: A Burgundy Pinot differs from an Oregon Pinot</li>
<li><strong>Description keywords</strong>: "Bold," "crisp," "earthy" adjust the profile</li>
<li><strong>Vintage characteristics</strong>: Hot vs. cool years affect fruit intensity</li>
</ul>
<h3>Step 4: Calculate Match Scores (Asymmetric Similarity)</h3>
<p>
This is where the math happens. We calculate a <strong>weighted, asymmetric Euclidean distance</strong> between your taste vector and each wine's profile vector.
</p>
<div class="code-block">
// Standard distance calculation
distance = √[weight₁×(dim₁_wine - dim₁_you)² + ... all 8 dimensions]
// BUT with asymmetric penalties for "deal-breaker" dimensions:
// - Sweetness, Tannin, Acidity are deal-breakers
// - If wine > your preference (overshooting): penalty × 1.4
// - If wine < your preference (undershooting): penalty × 0.8
</div>
<p>
<strong>Shorter distance = better match.</strong> A distance of 0 means the wine is exactly your stated preferences. Higher numbers mean it's further from what you like.
</p>
<div class="highlight-box">
<h3>Why Asymmetric Penalties?</h3>
<p style="margin-bottom: 0.5rem;">
Humans are evolutionarily programmed to reject bitterness (poison signal) and excessive acidity (spoilage signal). A wine that's <strong>too tannic</strong> for you is worse than one that's <strong>not tannic enough</strong>.
</p>
<p style="margin-bottom: 0;">
Our asymmetric penalty function ensures that "offending" your palate (overshooting) is penalized nearly twice as heavily as simply "boring" your palate (undershooting). This matches real human sensory psychology.
</p>
<p style="margin-bottom: 0;">
<strong>Personalized adjustment:</strong> The penalty multipliers are further scaled by your personal <a href="#sensitivity" style="color: var(--color-signal-green);">Sensitivity score</a>. More sensitive users see steeper overshoot penalties on harshness dimensions (tannin, acidity, body, oak, spice), ensuring recommendations stay within their comfort zone.
</p>
</div>
<h3>Step 5: Personalized Weighting</h3>
<p>
Not all dimensions matter equally to you. Some people care deeply about sweetness but don't mind tannins. Others are picky about oak but flexible on acidity.
</p>
<p>
As you rate wines, we learn <strong>which dimensions you care about most</strong> by analyzing the variance in your ratings. Dimensions you rate consistently high or low get higher weight. Dimensions you're inconsistent about get lower weight.
</p>
<h3>Step 6: Sigmoid Normalization</h3>
<p>
Raw distance scores are hard to interpret. We use a <strong>logistic sigmoid transformation</strong> to convert distance into an intuitive match percentage:
</p>
<div class="code-block">
score = 1 / (1 + e^(slope × (distance - pivot)))
// Where:
// - pivot = calibrated distance where score = 50%
// - slope = sensitivity (how quickly score drops with distance)
</div>
<p>
This gives you a clean 0-100% match score. A 98% match means the wine's chemical profile is nearly identical to your preferences in vector space.
</p>
<h3>Step 7: Rank and Display</h3>
<p>
We sort all wines by match score (best matches at the top) and show you:
</p>
<ul>
<li><strong>Match percentage</strong>: How well it fits your profile (sigmoid-normalized)</li>
<li><strong>Why it matches</strong>: "Matches your preference for full-bodied, low-tannin reds"</li>
<li><strong>Exploration tags</strong>: "Outside your usual—try it anyway" for wines that might surprise you</li>
</ul>
<h2 id="ranking">4. The Ranking System</h2>
<p>
We don't use a 100-point scale. We use <strong>The Bootlegger's Quality Scale</strong>—a 1-5 barrel system inspired by Prohibition-era slang.
</p>
<table class="dimension-table">
<thead>
<tr>
<th>Rating</th>
<th>Title</th>
<th>What It Means</th>
</tr>
</thead>
<tbody>
<tr>
<td>1 Barrel</td>
<td><strong>The Swill</strong></td>
<td>Undrinkable. Drain pour. Gas station wine.</td>
</tr>
<tr>
<td>2 Barrels</td>
<td><strong>The Hustle</strong></td>
<td>Trying but failing. Good for cooking, not drinking.</td>
</tr>
<tr>
<td>3 Barrels</td>
<td><strong>The Daily Grind</strong></td>
<td>Solid. Does the job. A working person's pour.</td>
</tr>
<tr>
<td>4 Barrels</td>
<td><strong>The Heavy Hitter</strong></td>
<td>Excellent. Commands respect. Worth the price.</td>
</tr>
<tr>
<td>5 Barrels</td>
<td><strong>The Don</strong></td>
<td>Perfection. You run the block with this bottle.</td>
</tr>
</tbody>
</table>
<h2 id="sensitivity">4.5 Personalized Sensitivity</h2>
<p>
Not everyone tolerates bold wines the same way. Some people love a tannic, high-acid wine. Others find those same wines harsh. We track a <strong>Sensitivity</strong> value that personalizes how much "overshoot" you can handle.
</p>
<div class="info-box">
<h3>How Sensitivity Works</h3>
<p>
<strong>Tolerant users (S ≈ 0):</strong> We use our standard penalty when a wine is bolder than your profile. You like being pushed.
</p>
<p>
<strong>Sensitive users (S ≈ 1):</strong> We apply steeper penalties when wines overshoot your preferences. You want wines that stay in your lane.
</p>
<p style="margin-bottom: 0;">
We estimate your sensitivity from your quiz answers (coffee style, tea tolerance, sour candy preferences) and refine it as you rate wines. If you consistently rate high-tannin wines lower than expected, we increase your sensitivity.
</p>
</div>
<h2 id="exploration">4.6 Exploration Mode</h2>
<p>
Sometimes the best bottle is one you'd never pick yourself. We track an <strong>Exploration</strong> preference that controls whether we include "wildcard" picks in your recommendations.
</p>
<div class="info-box">
<h3>How Exploration Works</h3>
<p>
<strong>Safe pickers (E ≈ 0):</strong> We stick to high-match wines. No surprises.
</p>
<p>
<strong>Adventurous drinkers (E ≈ 1):</strong> We inject "stretch picks"—wines outside your usual zone that might surprise you. These appear in dedicated wildcard slots, clearly labeled.
</p>
<p style="margin-bottom: 0;">
We ask your preference during the quiz and learn from how you rate the wildcards we serve. Love a wildcard? We'll show you more. Hate them? We'll dial it back.
</p>
</div>
<div class="highlight-box">
<h3>Smart Wildcard Selection</h3>
<p style="margin-bottom: 0.5rem;">
Wildcards aren't random. They're wines with match scores in the 35-65% range that pass "safety rails"—we won't serve you a grippy, tannic monster if you're sensitive to tannins.
</p>
<p style="margin-bottom: 0;">
<strong>Sensitive users get fewer wildcards.</strong> If your Sensitivity is high, we automatically reduce your effective Exploration to avoid serving you wines that might offend your palate.
</p>
</div>
<h2>5. How We Learn From Your Ratings: Bounded Asymptotic Learning</h2>
<p>
Every time you rate a wine, we update your taste vector using a <strong>bounded asymptotic learning</strong> model. Here's how it works:
</p>
<h3>The Update Formula</h3>
<div class="code-block">
new_profile = old_profile + learning_rate × dampening × (wine_profile - old_profile)
// Where:
// - learning_rate: Controls update speed (typically 0.1-0.15)
// - dampening: Prevents "lock-in" at extremes (min 0.25)
</div>
<h3>Positive Ratings (4-5 Barrels)</h3>
<p>
We shift your taste vector <strong>toward</strong> the wine's profile. If you love a wine that's more tannic than your current preference (e.g., you're at 3.0, wine is 4.5), we nudge your tannin tolerance up.
</p>
<h3>Negative Ratings (1-2 Barrels)</h3>
<p>
We shift your vector <strong>away</strong> from the wine's profile. Hated an oaky Chardonnay (wine oak = 4.5, you're at 3.0)? We'll lower your oak preference toward 2.5 or lower.
</p>
<h3>Saturation Dampening (The Anti-Lock-In)</h3>
<p>
If you're at an extreme (e.g., Tannin = 5.0 or 1.0), we apply dampening with a hard floor of 0.25. This ensures that even extreme preferences can shift back toward center if you consistently rate wines differently. You're never "locked in" to your initial quiz results.
</p>
<div class="info-box">
<h3>Cold Start Problem</h3>
<p>
New users start with quiz-based profiles. These are decent but not perfect. After 5-10 ratings, your profile becomes significantly more accurate. After 20+ ratings, it's highly personalized.
</p>
</div>
<h2 id="privacy">6. Data Privacy and Processing</h2>
<p>
Here's what stays on your device vs. what goes to the cloud:
</p>
<table class="dimension-table">
<thead>
<tr>
<th>Data Type</th>
<th>Where It Lives</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td>Camera images</td>
<td><span class="tag">On-device only</span></td>
<td>Privacy. Images never leave your phone unless you explicitly choose to send a difficult label.</td>
</tr>
<tr>
<td>OCR text extraction</td>
<td><span class="tag">On-device</span></td>
<td>Apple Vision (iOS) and ML Kit (Android) run locally.</td>
</tr>
<tr>
<td>Menu text parsing</td>
<td><span class="tag">Cloud (sanitized)</span></td>
<td>Sent to AI model to identify wines. Text is sanitized to remove personal info.</td>
</tr>
<tr>
<td>Your taste vector</td>
<td><span class="tag">Device + encrypted cloud</span></td>
<td>Stored locally and synced to your account (encrypted at rest).</td>
</tr>
<tr>
<td>Wine ratings</td>
<td><span class="tag">Device + cloud</span></td>
<td>Used to improve your recommendations and sync across devices.</td>
</tr>
</tbody>
</table>
<h2>7. Limitations and Known Issues</h2>
<p>
We're not perfect. Here's what we're working on:
</p>
<h3>OCR Accuracy</h3>
<ul>
<li>Handwritten menus are tough. Printed text works best.</li>
<li>Low lighting reduces accuracy. Use the flash.</li>
<li>Unusual fonts or layouts can confuse the parser.</li>
</ul>
<h3>Wine Data Coverage</h3>
<ul>
<li>We have profiles for 170+ varietals, but obscure grapes might default to generic estimates.</li>
<li>Natural wines and unconventional blends are harder to profile accurately.</li>
</ul>
<h3>Taste Complexity</h3>
<ul>
<li>8 dimensions capture a lot, but not everything. Terroir nuances, bottle age, and serving temperature matter too.</li>
<li>We're constantly refining our models to improve accuracy.</li>
</ul>
<h2>8. The Bottom Line</h2>
<p>
Unwyned isn't trying to replace sommeliers or become a wine encyclopedia. We're trying to make wine less intimidating. Our algorithm is designed to:
</p>
<ul>
<li>Learn your actual taste preferences (not what you think you should like)</li>
<li>Match you to wines you'll enjoy without requiring a degree in viticulture</li>
<li>Respect your privacy by processing as much as possible on your device</li>
<li>Get better over time as you rate more wines</li>
</ul>
<div class="highlight-box">
<h3>Questions or Feedback?</h3>
<p>
If you have technical questions about the algorithm, want to report a bug, or have suggestions for improvement, reach out to us at <a href="mailto:support@unwyned.com">support@unwyned.com</a>.
</p>
<p style="margin-bottom: 0;">
We built this because we were tired of guessing at wine menus. If it helps you, too—good. If you find issues, let us know.
</p>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="footer-content">
<div class="footer-section">
<img src="assets/images/logo-racket.png" alt="The Racket" style="height: 48px; margin-bottom: var(--spacing-md);">
<p style="color: var(--color-machined-steel); font-size: 0.95rem;">
Wine recommendations without the snobbery.
</p>
</div>
<div class="footer-section">
<h4>The Intel</h4>
<ul class="footer-links">
<li><a href="algorithm.html">How It Works</a></li>
<li><a href="architecture.html">Technical Architecture</a></li>
<li><a href="algorithm.html#ranking">Ranking System</a></li>
<li><a href="algorithm.html#privacy">Data Privacy</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Legal</h4>
<ul class="footer-links">
<li><a href="privacy.html">Privacy Policy</a></li>
<li><a href="terms.html">Terms & Conditions</a></li>
<li><a href="mailto:support@unwyned.com">Support</a></li>
</ul>
</div>
<div class="footer-section">
<h4>The Outfit</h4>
<ul class="footer-links">
<li><a href="https://inceptyon.io" target="_blank" rel="noopener">Inceptyon Labs</a></li>
<li><a href="mailto:hello@inceptyon.com">Contact</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>© 2026 Inceptyon Labs LLC. All rights reserved.</p>
</div>
</div>
</footer>
<!-- Scripts -->
<script src="js/nav.js" defer></script>
</body>
</html>