PageSourceSearch

https://www.aivin.ai/site/versus.dcf24bf357.js

js aivin.ai collected 2026-10-05 13:39:37 UTC 10,536 bytes, 239 lines download raw bytes

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.