1(function(){ 2const { 3 W: VW, 4 Eyebrow: VEb, 5 H2: VH2, 6 Sec: VSec, 7 SBtn: VBtn, 8 Lk: VLk, 9 routeHref: VHref, 10 track: VTrack 11} = window; 12const COST = [['A spreadsheet one person maintains', 'Free', 'Until they leave. Then the cellar is whatever the bins say, and the last person who knew why a lot was priced that way is gone.'], ['An outside appraisal, every three years', '$2,500\u2013$6,000', 'Typical engagement for a mid-size restaurant cellar: the schedule is often built from scratch, because nobody kept the working.'], ['The inactive inventory nobody caught', 'The real number', 'Capital sitting in wines that have not moved in a year, plus the write-down on wine that passed its house service window while it was still priced as young.'], ['Aivin, one room, everything', '$3,540 a year', 'Pairing Studio and Cellar Signals at $295 a month per property, with the Record and Concierge Onboarding included. A valuation is $750 and $375 to re-certify.']]; 13const VS_ROWS = [['What is in the cellar right now', 'Inventory software', 'Yes â this is what it is for', 'Reads it from your system'], ['What it cost', 'Inventory software', 'Yes', 'Yes'], ['What it is worth today, on six bases', 'Inventory software', 'No', 'Yes, with the working on every lot'], ['Comparable sales behind each figure', 'Inventory software', 'No', 'Venue, date, format, per-bottle'], ['a record structured to support credentialed appraiser review and signature', 'An appraisal firm', 'Yes, in two to six weeks', 'Same day, for an appraiser to review'], ['Reproducing last year\u2019s figure exactly', 'An appraisal firm', 'Only if they kept the file', 'Effective-dated snapshots'], ['Whether tonight\u2019s menu can be poured', 'Nothing on the market', 'No', 'Coverage, at tonight\u2019s cover count'], ['A defended pour for every course', 'The sommelier', 'Yes, and better than us', 'The argument, the near-miss and the alternates'], ['Depletion written back after service', 'Somebody, later', 'Typed in, or not at all', 'Close out the service and it moves'], ['Several houses compared without a leak', 'A consultancy\u2019s spreadsheet', 'By hand, and one slip ends it', 'Anonymized by default, cohorts suppressed']]; 14const WRONG = [['You need a point-of-sale or a purchasing system', 'Aivin is not one and will not become one. It reads from Toast, BinWise, Backbar and their peers and never writes to your POS. If what you need is ordering, receiving and par levels, buy that.'], ['You want a signed appraisal with no appraiser involved', 'No software can sign an appraisal \u2014 the standard attaches to a person. Aivin assembles the schedule and the evidence; a credentialed appraiser reviews the evidence and, if appropriate, signs. Unsigned, the document says so on its own face.'], ['You have forty labels and a wall of Chablis', 'A room that size does not have a cellar problem. Use a spreadsheet and put the money into wine.'], ['You want it to pick the wine for you', 'It will not. Aivin argues a pairing, names the one it avoids, and asks why when you overrule it. The judgment stays with the sommelier, which is also why the corrections are worth keeping.'], ['You need it live next week across nine properties', 'Onboarding is five to ten working days per property and an operator does it by hand. Nine houses is not a week.']]; 15function Versus({ 16 go 17}) { 18 return React.createElement("div", null, React.createElement("div", { 19 style: { 20 background: 'var(--gradient-hero)' 21 } 22 }, React.createElement(window.SiteNav, { 23 route: "vs", 24 go: go 25 }), React.createElement(VW, { 26 style: { 27 padding: 'clamp(30px,6vh,60px) clamp(20px,5vw,40px) clamp(40px,7vh,70px)' 28 } 29 }, React.createElement(VEb, { 30 on: true 31 }, "Against what you do now"), React.createElement("h1", { 32 style: { 33 fontFamily: 'var(--font-display)', 34 fontWeight: 500, 35 fontSize: 'var(--fs-display)', 36 lineHeight: 1.05, 37 letterSpacing: '-.014em', 38 color: 'var(--white)', 39 margin: '14px 0 0', 40 maxWidth: 880, 41 textWrap: 'pretty' 42 } 43 }, "A spreadsheet, an appraiser every third year, and a sommelier who remembers everything."), React.createElement("p", { 44 style: { 45 fontSize: 'var(--fs-lead)', 46 lineHeight: 1.62, 47 color: 'rgba(255,255,255,.88)', 48 margin: '18px 0 0', 49 maxWidth: 680 50 } 51 }, "That is the real competition, and two thirds of it works. Here is what each one costs, what it cannot answer, and the five situations where Aivin is the wrong purchase."))), React.createElement(VSec, null, React.createElement(VEb, null, "What it costs today"), React.createElement(VH2, { 52 style: { 53 maxWidth: 720 54 } 55 }, "The spreadsheet is free. The appraisal is not."), React.createElement("div", { 56 style: { 57 marginTop: 24 58 } 59 }, COST.map(([k, v, b], i) => React.createElement("div", { 60 key: k, 61 "data-row": true, 62 style: { 63 display: 'grid', 64 gridTemplateColumns: 'minmax(0,1.1fr) minmax(0,.5fr) minmax(0,1.4fr)', 65 gap: 'clamp(12px,3vw,32px)', 66 padding: '17px 0', 67 borderTop: '1px solid var(--border-subtle)', 68 alignItems: 'baseline' 69 } 70 }, React.createElement("div", { 71 style: { 72 fontSize: 'var(--fs-body)', 73 color: i === 3 ? 'var(--white)' : 'var(--text-body)' 74 } 75 }, k), React.createElement("div", { 76 style: { 77 fontFamily: 'var(--font-display)', 78 fontSize: 'var(--fs-lead)', 79 fontWeight: 500, 80 color: i === 3 ? 'var(--aivin-mint)' : 'var(--text-primary)' 81 } 82 }, v), React.createElement("div", { 83 style: { 84 fontSize: 'var(--fs-note)', 85 lineHeight: 1.65, 86 color: 'var(--text-muted)' 87 } 88 }, b)))), React.createElement("p", { 89 style: { 90 fontSize: 'var(--fs-note)', 91 color: 'var(--text-muted)', 92 marginTop: 20, 93 lineHeight: 1.7, 94 maxWidth: 680 95 } 96 }, "Appraisal figures are the published range for restaurant and private-cellar engagements and vary with lot count, travel and turnaround; get two quotes before you take ours. Everything else is your own arithmetic â the ", React.createElement(VLk, { 97 to: "calculator", 98 style: { 99 color: 'var(--aivin-mint)' 100 } 101 }, "calculator"), " shows the working.")), React.createElement(VSec, { 102 style: { 103 background: 'var(--surface-tint)' 104 } 105 }, React.createElement(VEb, null, "Question by question"), React.createElement(VH2, { 106 style: { 107 maxWidth: 740 108 } 109 }, "Who answers what."), React.createElement("div", { 110 style: { 111 marginTop: 24, 112 overflowX: 'auto' 113 } 114 }, React.createElement("div", { 115 style: { 116 minWidth: 660 117 } 118 }, React.createElement("div", { 119 style: { 120 display: 'grid', 121 gridTemplateColumns: 'minmax(0,1.5fr) minmax(0,1fr) minmax(0,1.2fr) minmax(0,1.2fr)', 122 gap: 'clamp(10px,2vw,22px)', 123 paddingBottom: 10 124 } 125 }, ['The question', 'Who you ask now', 'Can they answer it', 'Aivin'].map((h, i) => React.createElement("span", { 126 key: h, 127 style: { 128 fontSize: 'var(--fs-eyebrow)', 129 letterSpacing: '.14em', 130 textTransform: 'uppercase', 131 fontWeight: 600, 132 color: i === 3 ? 'var(--aivin-mint)' : 'var(--text-muted)' 133 } 134 }, h))), VS_ROWS.map(r => React.createElement("div", { 135 key: r[0], 136 style: { 137 display: 'grid', 138 gridTemplateColumns: 'minmax(0,1.5fr) minmax(0,1fr) minmax(0,1.2fr) minmax(0,1.2fr)', 139 gap: 'clamp(10px,2vw,22px)', 140 padding: '14px 0', 141 borderTop: '1px solid var(--border-subtle)', 142 alignItems: 'baseline' 143 } 144 }, React.createElement("span", { 145 style: { 146 fontSize: 'var(--fs-note)', 147 color: 'var(--text-primary)', 148 lineHeight: 1.5 149 } 150 }, r[0]), React.createElement("span", { 151 style: { 152 fontSize: 'var(--fs-note)', 153 color: 'var(--text-muted)', 154 lineHeight: 1.5 155 } 156 }, r[1]), React.createElement("span", { 157 style: { 158 fontSize: 'var(--fs-note)', 159 color: 'var(--text-muted)', 160 lineHeight: 1.5 161 } 162 }, r[2]), React.createElement("span", { 163 style: { 164 fontSize: 'var(--fs-note)', 165 color: 'var(--text-body)', 166 lineHeight: 1.5 167 } 168 }, r[3]))))), React.createElement("p", { 169 style: { 170 fontSize: 'var(--fs-note)', 171 color: 'var(--text-muted)', 172 marginTop: 18, 173 lineHeight: 1.7, 174 maxWidth: 680 175 } 176 }, "Named products are described by what their own documentation says they do. If we have a category wrong, tell us and this page changes.")), React.createElement(VSec, null, React.createElement("div", { 177 style: { 178 display: 'grid', 179 gridTemplateColumns: 'repeat(auto-fit,minmax(min(100%,300px),1fr))', 180 gap: 'clamp(22px,4vw,56px)', 181 alignItems: 'start' 182 } 183 }, React.createElement("div", null, React.createElement(VEb, { 184 color: "var(--signal-caution)" 185 }
185, "Do not buy this"), React.createElement(VH2, { 186 style: { 187 maxWidth: 460 188 } 189 }, "Five situations where Aivin is the wrong choice."), React.createElement("p", { 190 style: { 191 fontSize: 'var(--fs-note)', 192 lineHeight: 1.7, 193 color: 'var(--text-muted)', 194 maxWidth: 440, 195 marginTop: 14 196 } 197 }, "Each of these has cost us a conversation, and each time that was the right outcome. We would rather you read them before a contract than after one.")), React.createElement("div", null, WRONG.map(([t, b], i) => React.createElement("div", { 198 key: t, 199 style: { 200 paddingTop: 16, 201 marginTop: i ? 16 : 0, 202 borderTop: '1px solid var(--border-subtle)' 203 } 204 }, React.createElement("div", { 205 style: { 206 fontSize: 'var(--fs-body)', 207 color: 'var(--text-primary)', 208 lineHeight: 1.45 209 } 210 }, t), React.createElement("div", { 211 style: { 212 fontSize: 'var(--fs-note)', 213 color: 'var(--text-muted)', 214 marginTop: 7, 215 lineHeight: 1.7 216 } 217 }, b)))))), React.createElement("div", { 218 style: { 219 maxWidth: 1100, 220 margin: '0 auto', 221 padding: '0 clamp(20px,5vw,40px) 44px' 222 } 223 }, React.createElement("p", { 224 style: { 225 fontSize: 'var(--fs-meta)', 226 color: 'var(--text-muted)', 227 lineHeight: 1.65, 228 margin: 0, 229 borderTop: '1px solid var(--border-subtle)', 230 paddingTop: 16 231 } 232 }, "Comparison based on the product information available to us at the time of writing. Products change. If we have described a capability incorrectly, tell us and we will correct it.")), React.createElement(window.Close, { 233 go: go 234 })); 235} 236Object.assign(window, { 237 Versus 238}); 239})();
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.