Skip to content

Instantly share code, notes, and snippets.

@NikolayS
Created August 18, 2026 15:29
Show Gist options
  • Select an option

  • Save NikolayS/f095ed8c8c43bdc12b486510e06a46c8 to your computer and use it in GitHub Desktop.

Select an option

Save NikolayS/f095ed8c8c43bdc12b486510e06a46c8 to your computer and use it in GitHub Desktop.
samogrow landing redesign canvas — public mobile viewer
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>samogrow Landing Redesign — design proposal</title>
<meta name="description" content="Five artboards proposing a two-voice redesign of the samogrow.dev landing page: warm field-guide editorial paired with a precise console register.">
<style>
:root{--paper:#f2ede0;--card:#f7f3e8;--ink:#1c2216;--ink-soft:#4a5340;--ink-faint:#636b59;
--line:#cdc4ac;--leaf:#35722f;--leaf-dk:#2b5c26;
--serif:Georgia,"Iowan Old Style","Palatino Linotype","Times New Roman",serif;
--mono:ui-monospace,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace}
*{box-sizing:border-box}
body{margin:0;background:#dcd6c6;color:var(--ink);font-family:var(--serif);line-height:1.6}
header{background:var(--paper);border-bottom:1px solid var(--line);padding:44px 28px 38px}
.wrap{max-width:1200px;margin:0 auto}
.eyebrow{font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;
color:var(--leaf);font-weight:600}
h1{font-family:var(--serif);font-weight:400;font-size:clamp(30px,5vw,46px);line-height:1.08;
letter-spacing:-.02em;margin:14px 0 12px}
header p{margin:0;max-width:66ch;color:var(--ink-soft);font-size:17px}
header .fine{font-family:var(--mono);font-size:12px;color:var(--ink-faint);margin-top:18px;
padding-top:14px;border-top:1px solid var(--line);max-width:70ch;line-height:1.7}
.sheet{padding:38px 28px}
.sheet .wrapin{max-width:1200px;margin:0 auto}
.meta{max-width:1200px;margin:0 auto 18px;display:grid;grid-template-columns:auto 1fr auto;
gap:6px 14px;align-items:baseline}
.idx{font-family:var(--mono);font-size:13px;font-weight:600;color:var(--leaf);letter-spacing:.14em}
.meta h2{font-family:var(--serif);font-weight:400;font-size:26px;margin:0;letter-spacing:-.015em}
.dim{font-family:var(--mono);font-size:12px;color:#6b6552}
.note{grid-column:1 / -1;background:#f6e7a8;border:1px solid #ddc978;padding:13px 15px;margin-top:8px;
font-family:var(--mono);font-size:12.5px;line-height:1.55;color:#33380f}
.note b{display:block;font-size:11px;letter-spacing:.16em;color:#6c6320;margin-bottom:6px}
.note p{margin:7px 0 0}
.stage{max-width:1200px;margin:0 auto;overflow-x:auto;-webkit-overflow-scrolling:touch}
.stage iframe{display:block;border:0;background:var(--paper);
box-shadow:0 24px 60px -32px rgba(28,34,22,.55),0 0 0 1px rgba(28,34,22,.16)}
footer{background:var(--paper);border-top:1px solid var(--line);padding:34px 28px 54px;
font-family:var(--mono);font-size:12px;color:var(--ink-faint);line-height:1.8}
footer a{color:var(--leaf-dk)}
@media (max-width:760px){ .sheet{padding:26px 14px} header{padding:32px 18px 28px} }
</style>
</head>
<body>
<header><div class="wrap">
<div class="eyebrow">Design proposal · not a shipped page</div>
<h1>samogrow Landing Redesign</h1>
<p>Five artboards proposing a two-voice system for <b>samogrow.dev</b>: warm field-guide
editorial for the garden and the human, a precise console register for the machine —
the loop, the plug state, the safety caps and every number.</p>
<p class="fine">Static export of a working design canvas. Content is lifted from the live
samogrow.dev page; safety-cap values show as placeholders because the live page does not
state them. Interactive controls shown here are mockups — the cost artboard is captured
with tier B selected.</p>
</div></header>
<section class="sheet">
<div class="meta">
<span class="idx">01</span>
<h2>Desktop hero</h2>
<span class="dim">1200 × 790</span>
<div class="note"><b>HERO</b><p>The h1 is the proposition now, not the wordmark — which fixes the permanent 96px &#x27;by Nombox&#x27; orphan.</p><p>The mock-mode command is the conversion device; GitHub is the primary button.</p></div>
</div>
<div class="stage"><iframe title="Desktop hero" width="1200" height="790" scrolling="no" sandbox="allow-same-origin" srcdoc="&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset=&quot;utf-8&quot;&gt;&lt;title&gt;Desktop hero&lt;/title&gt;&lt;style&gt;html,body{margin:0;padding:0;background:#f2ede0}&lt;/style&gt;&lt;style&gt;
:root {
--paper:#f2ede0; --paper-2:#ebe4d2; --card:#f7f3e8;
--ink:#1c2216; --ink-soft:#4a5340; --ink-faint:#636b59;
--line:#cdc4ac; --line-soft:#ddd5bf;
--leaf:#35722f; --leaf-dk:#2b5c26; --leaf-br:#4a9640; --leaf-lit:#8fd67f;
--soil:#a8632a;
--slab:#1c2216; --slab-ink:#e9e7d7; --slab-line:#2f3826; --slab-soft:#8b9380;
--serif:Georgia,&quot;Iowan Old Style&quot;,&quot;Palatino Linotype&quot;,&quot;Times New Roman&quot;,serif;
--mono:ui-monospace,&quot;SF Mono&quot;,Menlo,Consolas,&quot;Liberation Mono&quot;,monospace;
}
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:var(--serif); }
a { color:var(--leaf-dk); text-decoration-color:var(--line); text-underline-offset:3px; }
a:hover { color:var(--leaf); text-decoration-color:var(--leaf); }
.board { width:1200px; height:790px; position:relative; overflow:hidden; background:var(--paper); }
.grain { position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.045; mix-blend-mode:multiply;
background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;140&#x27; height=&#x27;140&#x27;%3E%3Cfilter id=&#x27;n&#x27;%3E%3CfeTurbulence type=&#x27;fractalNoise&#x27; baseFrequency=&#x27;0.9&#x27; numOctaves=&#x27;2&#x27; stitchTiles=&#x27;stitch&#x27;/%3E%3C/filter%3E%3Crect width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; filter=&#x27;url(%23n)&#x27;/%3E%3C/svg%3E&quot;); }
.layer { position:relative; z-index:1; }
.col { width:1080px; margin:0 auto; }
.topbar { height:54px; border-bottom:1px solid var(--line); display:flex; align-items:center;
background:color-mix(in srgb, var(--paper) 88%, transparent); }
.topbar .col { display:flex; align-items:center; justify-content:space-between; }
.brand { font-family:var(--serif); font-size:19px; display:flex; align-items:center; gap:7px; letter-spacing:0; }
.brand b { color:var(--leaf); font-weight:700; }
.nav { display:flex; align-items:center; gap:20px; font-family:var(--mono); font-size:11.5px;
letter-spacing:.16em; text-transform:uppercase; }
.nav a { color:var(--ink-soft); text-decoration:none; }
.nav a.gh { display:inline-flex; align-items:center; gap:7px; background:var(--leaf); border:1px solid var(--leaf);
color:var(--paper); padding:7px 12px; font-family:var(--mono); font-size:11px; letter-spacing:.12em;
text-transform:uppercase; text-decoration:none; }
.hero { padding:52px 0 0; }
.hgrid { display:grid; grid-template-columns:1.15fr 1fr; gap:48px; align-items:start; }
.lead { min-width:0; }
.side { min-width:0; display:flex; flex-direction:column; gap:24px; }
.eyebrow { font-family:var(--mono); font-size:12px; letter-spacing:.16em; text-transform:uppercase;
color:var(--leaf); font-weight:600; }
h1 { font-family:var(--serif); font-weight:400; font-size:52px; line-height:1.06; letter-spacing:-.022em;
margin:18px 0 20px; text-wrap:pretty; }
h1 em { font-style:normal; color:var(--leaf); }
.lede { font-size:21px; line-height:1.45; color:var(--ink-soft); margin:0 0 26px; max-width:46ch; text-wrap:pretty; }
.lede b { color:var(--ink); font-weight:400; font-style:italic; }
.cmd { background:var(--slab); border:1px solid var(--slab-line); }
.cmd-head { display:flex; align-items:center; justify-content:space-between; gap:12px;
padding:9px 14px; border-bottom:1px solid var(--slab-line); }
.cmd-tag { font-family:var(--mono); font-size:11px; letter-spacing:.18em; text-transform:uppercase;
color:var(--leaf-lit); font-weight:600; }
.copy { font-family:var(--mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase;
color:var(--slab-soft); border:1px solid var(--slab-line); padding:4px 9px;
display:inline-flex; align-items:center; gap:6px; }
.cmd-body { padding:13px 14px 4px; display:grid; gap:8px; }
.cmd-line { font-family:var(--mono); font-size:13.5px; line-height:1.4; color:var(--slab-ink);
display:flex; gap:9px; white-space:pre-wrap; overflow-wrap:anywhere; }
.cmd-line .p { color:var(--leaf-lit); }
.cmd-line .env { color:#d9c98d; }
.cmd-foot { padding:10px 14px 13px; font-family:var(--mono); font-size:11px; color:var(--slab-soft);
letter-spacing:.03em; }
.btns { display:flex; gap:14px; align-items:center; margin-top:26px; }
.btn { font-family:var(--mono); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
padding:14px 20px; text-decoration:none; border:1px solid var(--ink);
display:inline-flex; align-items:center; gap:9px; }
.btn-solid { background:var(--leaf); border-color:var(--leaf); color:var(--paper); }
.btn-ghost { color:var(--ink); }
.btn-text { font-family:var(--mono); font-size:11.5px; letter-spacing:.08em; text-transform:uppercase;
color:var(--ink-faint); text-decoration:none; }
.trust { display:flex; flex-wrap:wrap; align-items:center; gap:10px 16px; margin-top:32px; padding-top:14px;
border-top:1px solid var(--line); font-family:var(--mono); font-size:11.5px; color:var(--ink-faint);
letter-spacing:.03em; }
.trust .dot { color:var(--line); }
.trust b { color:var(--leaf-dk); font-weight:600; }
.illo { border:1px solid var(--line); border-radius:10px; background:#faf7ee; overflow:hidden;
box-shadow:0 22px 50px -30px rgba(28,34,22,.30); }
.illo svg { display:block; width:100%; height:auto; }
.cap { font-family:var(--mono); font-size:11px; color:var(--ink-faint); line-height:1.55; margin:10px 0 0; }
.glance { border:1px solid var(--line); background:var(--card); padding:18px 20px;
box-shadow:0 18px 40px -28px rgba(28,34,22,.30); }
.glance .eyebrow { display:block; margin-bottom:12px; }
.grow { display:flex; justify-content:space-between; gap:12px; padding:8px 0;
border-bottom:1px dotted var(--line); font-family:var(--mono); font-size:12.5px; }
.grow:last-child { border-bottom:0; }
.grow span:first-child { color:var(--ink-soft); }
.grow span:last-child { text-align:right; color:var(--ink); }
.grow .hi { color:var(--leaf-dk); font-weight:600; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;board&quot;&gt;
&lt;div class=&quot;grain&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;layer&quot;&gt;
&lt;div class=&quot;topbar&quot;&gt;
&lt;div class=&quot;col&quot;&gt;
&lt;div class=&quot;brand&quot;&gt;
samo&lt;b&gt;grow&lt;/b&gt;
&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;#35722f&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M3 17c0-6 4.5-11 13-12 .6 5.5-3 12-13 12Z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M3 17c3-3.5 6-5.6 10-7&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;nav class=&quot;nav&quot;&gt;
&lt;a href=&quot;#&quot;&gt;Architecture&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Cost&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Features&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Quickstart&lt;/a&gt;
&lt;a class=&quot;gh&quot; href=&quot;#&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
GitHub
&lt;/a&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;hero&quot;&gt;
&lt;div class=&quot;col hgrid&quot;&gt;
&lt;div class=&quot;lead&quot;&gt;
&lt;div class=&quot;eyebrow&quot;&gt;A service you can read · open source · it feeds you&lt;/div&gt;
&lt;h1&gt;Give the machine you already leave on &lt;em&gt;one more job.&lt;/em&gt;&lt;/h1&gt;
&lt;p class=&quot;lede&quot;&gt;
samogrow runs a &lt;b&gt;herb garden&lt;/b&gt; from a camera, two smart plugs, and a Claude
API key — open source (MIT), no pods, no subscription.
&lt;/p&gt;
&lt;div class=&quot;cmd&quot;&gt;
&lt;div class=&quot;cmd-head&quot;&gt;
&lt;span class=&quot;cmd-tag&quot;&gt;Try the whole loop — zero hardware&lt;/span&gt;
&lt;span class=&quot;copy&quot;&gt;
&lt;svg width=&quot;11&quot; height=&quot;11&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;7&quot; y=&quot;7&quot; width=&quot;10&quot; height=&quot;10&quot; rx=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M13 4H4.5A1.5 1.5 0 0 0 3 5.5V14&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
Copy
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;cmd-body&quot;&gt;
&lt;div class=&quot;cmd-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;$&lt;/span&gt;&lt;span&gt;git clone github.com/NikolayS/samogrow&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;cmd-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;$&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;env&quot;&gt;SAMOGROW_MOCK=1&lt;/span&gt; bun run src/main.ts&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cmd-foot&quot;&gt;real Claude call · real Telegram push · against a sample photo&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;btns&quot;&gt;
&lt;a class=&quot;btn btn-solid&quot; href=&quot;#&quot;&gt;
&lt;svg width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
Get the code
&lt;/a&gt;
&lt;a class=&quot;btn btn-ghost&quot; href=&quot;#&quot;&gt;Quickstart →&lt;/a&gt;
&lt;a class=&quot;btn-text&quot; href=&quot;#&quot;&gt;Read the spec&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;trust&quot;&gt;
&lt;span&gt;&lt;b&gt;MIT&lt;/b&gt; licensed&lt;/span&gt;&lt;span class=&quot;dot&quot;&gt;·&lt;/span&gt;
&lt;span&gt;&lt;b&gt;108&lt;/b&gt; tests, CI green&lt;/span&gt;&lt;span class=&quot;dot&quot;&gt;·&lt;/span&gt;
&lt;span&gt;No soldering, no Pi&lt;/span&gt;&lt;span class=&quot;dot&quot;&gt;·&lt;/span&gt;
&lt;span&gt;&lt;b&gt;$0&lt;/b&gt; subscription&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;side&quot;&gt;
&lt;figure style=&quot;margin:0&quot;&gt;
&lt;div class=&quot;illo&quot;&gt;
&lt;svg viewBox=&quot;0 0 480 300&quot; role=&quot;img&quot; aria-label=&quot;Field-guide line drawing of the samogrow build: a T5 light bar over a DWC tote of herbs in net cups, a top-up jug and pump, an air pump, a Wi-Fi camera watching the canopy, and a smart plug strip.&quot;&gt;
&lt;g stroke=&quot;#1c2216&quot; stroke-width=&quot;1.6&quot; fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;
&lt;path d=&quot;M182 26v14M258 26v14&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;150&quot; y=&quot;40&quot; width=&quot;140&quot; height=&quot;13&quot; rx=&quot;3&quot; fill=&quot;#f6efdb&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M162 47h116&quot; stroke=&quot;#a8632a&quot; stroke-width=&quot;1.2&quot; stroke-dasharray=&quot;3 5&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M168 62v9M192 62v13M216 62v9M240 62v13M264 62v9&quot; stroke=&quot;#4a9640&quot; stroke-width=&quot;1.1&quot; opacity=&quot;.75&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M186 150c-8-13-3-25 6-30 3 11 2 22-6 30Z&quot; fill=&quot;rgba(53,114,47,.18)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M186 150c5-12 12-18 22-19-4 10-11 17-22 19Z&quot; fill=&quot;rgba(53,114,47,.12)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M216 152c-9-15-4-27 5-33 4 13 3 24-5 33Z&quot; fill=&quot;rgba(53,114,47,.18)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M216 152c6-11 13-16 23-17-5 10-12 16-23 17Z&quot; fill=&quot;rgba(53,114,47,.12)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M246 150c-8-12-3-24 6-29 3 11 2 21-6 29Z&quot; fill=&quot;rgba(53,114,47,.18)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M156 152c-7-11-2-21 6-25 2 9 1 18-6 25Z&quot; fill=&quot;rgba(53,114,47,.15)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M276 152c-7-11-2-21 6-25 2 9 1 18-6 25Z&quot; fill=&quot;rgba(53,114,47,.15)&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;140&quot; y=&quot;152&quot; width=&quot;200&quot; height=&quot;14&quot; rx=&quot;2&quot; fill=&quot;#efe7d2&quot;&gt;&lt;/rect&gt;
&lt;circle cx=&quot;156&quot; cy=&quot;159&quot; r=&quot;5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;186&quot; cy=&quot;159&quot; r=&quot;5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;216&quot; cy=&quot;159&quot; r=&quot;5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;246&quot; cy=&quot;159&quot; r=&quot;5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;276&quot; cy=&quot;159&quot; r=&quot;5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;path d=&quot;M146 166h188l-11 66H157Z&quot; fill=&quot;rgba(53,114,47,.20)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M156 200h168&quot; stroke=&quot;#4a9640&quot; stroke-width=&quot;1.1&quot; stroke-dasharray=&quot;4 6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M40 168h44v56H40Z&quot; fill=&quot;rgba(74,150,64,.12)&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M52 168v-9h20v9&quot; fill=&quot;none&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M84 178c9 0 9 10 0 10&quot; fill=&quot;none&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M84 210c22 0 26-14 46-16&quot; stroke=&quot;#a8632a&quot; stroke-width=&quot;1.3&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;46&quot; y=&quot;228&quot; width=&quot;26&quot; height=&quot;14&quot; rx=&quot;2&quot; fill=&quot;#e7dfc8&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;36&quot; y=&quot;256&quot; width=&quot;44&quot; height=&quot;24&quot; rx=&quot;3&quot; fill=&quot;#e7dfc8&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M80 264c26 2 40 6 62 14&quot; stroke=&quot;#4a9640&quot; stroke-width=&quot;1.2&quot; stroke-dasharray=&quot;4 5&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M46 264h6M58 264h6&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;392&quot; y=&quot;112&quot; width=&quot;34&quot; height=&quot;24&quot; rx=&quot;4&quot; fill=&quot;#e7dfc8&quot;&gt;&lt;/rect&gt;
&lt;circle cx=&quot;409&quot; cy=&quot;124&quot; r=&quot;6.5&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;409&quot; cy=&quot;124&quot; r=&quot;2.2&quot; fill=&quot;#1c2216&quot; stroke=&quot;none&quot;&gt;&lt;/circle&gt;
&lt;path d=&quot;M409 136v22M398 158h22&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M392 128c-30 6-58 14-84 22&quot; stroke=&quot;#a8632a&quot; stroke-width=&quot;1.2&quot; stroke-dasharray=&quot;3 5&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;330&quot; y=&quot;248&quot; width=&quot;112&quot; height=&quot;30&quot; rx=&quot;4&quot; fill=&quot;#e7dfc8&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;342&quot; y=&quot;256&quot; width=&quot;18&quot; height=&quot;14&quot; rx=&quot;2&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;368&quot; y=&quot;256&quot; width=&quot;18&quot; height=&quot;14&quot; rx=&quot;2&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/rect&gt;
&lt;rect x=&quot;394&quot; y=&quot;256&quot; width=&quot;18&quot; height=&quot;14&quot; rx=&quot;2&quot; fill=&quot;#faf7ee&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M330 263c-24 0-36-10-52-18&quot; stroke=&quot;#a8632a&quot; stroke-width=&quot;1.2&quot; stroke-dasharray=&quot;3 5&quot;&gt;&lt;/path&gt;
&lt;/g&gt;
&lt;g font-family=&quot;ui-monospace, Menlo, monospace&quot; font-size=&quot;10&quot; fill=&quot;#a8632a&quot; letter-spacing=&quot;.08em&quot;&gt;
&lt;text x=&quot;330&quot; y=&quot;106&quot;&gt;SEES&lt;/text&gt;
&lt;text x=&quot;298&quot; y=&quot;292&quot;&gt;SWITCHES&lt;/text&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;figcaption class=&quot;cap&quot;&gt;The build, illustrated — real photos replace this once the first unit is assembled.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;aside class=&quot;glance&quot;&gt;
&lt;span class=&quot;eyebrow&quot;&gt;At a glance&lt;/span&gt;
&lt;div class=&quot;grow&quot;&gt;&lt;span&gt;All-in hardware&lt;/span&gt;&lt;span class=&quot;hi&quot;&gt;~$255 – $335&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;grow&quot;&gt;&lt;span&gt;Recurring&lt;/span&gt;&lt;span&gt;$3–7/mo API · ~$35/yr&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;grow&quot;&gt;&lt;span&gt;Vendor subscription&lt;/span&gt;&lt;span class=&quot;hi&quot;&gt;none&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;grow&quot;&gt;&lt;span&gt;Source&lt;/span&gt;&lt;span class=&quot;hi&quot;&gt;MIT · 108 tests · CI&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;grow&quot;&gt;&lt;span&gt;Dry run&lt;/span&gt;&lt;span class=&quot;hi&quot;&gt;mock mode, 0 hardware&lt;/span&gt;&lt;/div&gt;
&lt;/aside&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"></iframe></div>
</section>
<section class="sheet">
<div class="meta">
<span class="idx">02</span>
<h2>Section rail + nav</h2>
<span class="dim">1200 × 725</span>
<div class="note"><b>SECTION RAIL + NAV</b><p>Sticky section identity plus a scroll-spy — the answer to a 15.7-screen page whose mobile nav is display:none.</p><p>Intro measure goes from 503px to the full 824px content column, so sections stop opening half-empty.</p></div>
</div>
<div class="stage"><iframe title="Section rail + nav" width="1200" height="725" scrolling="no" sandbox="allow-same-origin" srcdoc="&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset=&quot;utf-8&quot;&gt;&lt;title&gt;Section rail + nav&lt;/title&gt;&lt;style&gt;html,body{margin:0;padding:0;background:#f2ede0}&lt;/style&gt;&lt;style&gt;
:root {
--paper:#f2ede0; --paper-2:#ebe4d2; --card:#f7f3e8;
--ink:#1c2216; --ink-soft:#4a5340; --ink-faint:#636b59;
--line:#cdc4ac; --line-soft:#ddd5bf;
--leaf:#35722f; --leaf-dk:#2b5c26; --leaf-br:#4a9640; --leaf-lit:#8fd67f;
--soil:#a8632a;
--slab:#1c2216; --slab-ink:#e9e7d7; --slab-line:#2f3826; --slab-soft:#8b9380;
--serif:Georgia,&quot;Iowan Old Style&quot;,&quot;Palatino Linotype&quot;,&quot;Times New Roman&quot;,serif;
--mono:ui-monospace,&quot;SF Mono&quot;,Menlo,Consolas,&quot;Liberation Mono&quot;,monospace;
}
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:var(--serif); }
a { color:var(--leaf-dk); text-decoration-color:var(--line); text-underline-offset:3px; }
a:hover { color:var(--leaf); text-decoration-color:var(--leaf); }
.board { width:1200px; height:725px; position:relative; overflow:hidden; background:var(--paper); }
.grain { position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.045; mix-blend-mode:multiply;
background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;140&#x27; height=&#x27;140&#x27;%3E%3Cfilter id=&#x27;n&#x27;%3E%3CfeTurbulence type=&#x27;fractalNoise&#x27; baseFrequency=&#x27;0.9&#x27; numOctaves=&#x27;2&#x27; stitchTiles=&#x27;stitch&#x27;/%3E%3C/filter%3E%3Crect width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; filter=&#x27;url(%23n)&#x27;/%3E%3C/svg%3E&quot;); }
.layer { position:relative; z-index:1; }
.col { width:1080px; margin:0 auto; }
.topbar { height:54px; border-bottom:1px solid var(--line); display:flex; align-items:center;
background:color-mix(in srgb, var(--paper) 88%, transparent); }
.topbar .col { display:flex; align-items:center; justify-content:space-between; }
.brand { font-family:var(--serif); font-size:19px; display:flex; align-items:center; gap:7px; }
.brand b { color:var(--leaf); font-weight:700; }
.nav { display:flex; align-items:center; gap:20px; font-family:var(--mono); font-size:11.5px;
letter-spacing:.16em; text-transform:uppercase; }
.nav a { color:var(--ink-soft); text-decoration:none; padding-bottom:3px; border-bottom:2px solid transparent; }
.nav a.on { color:var(--leaf); border-bottom-color:var(--leaf); font-weight:600; }
.nav a.gh { display:inline-flex; align-items:center; gap:7px; background:var(--leaf); border:1px solid var(--leaf);
color:var(--paper); padding:7px 12px; font-family:var(--mono); font-size:11px; letter-spacing:.12em;
text-transform:uppercase; text-decoration:none; border-bottom:1px solid var(--leaf); }
.sec { display:grid; grid-template-columns:168px 1fr; gap:40px; padding:44px 0 40px; }
.sec + .sec { border-top:1px solid var(--line); }
.rail { position:relative; }
.rail::after { content:&quot;&quot;; position:absolute; top:4px; right:-20px; bottom:0; width:1px; background:var(--line-soft); }
.rail .num { font-family:var(--mono); font-size:13px; font-weight:600; color:var(--leaf); letter-spacing:.14em; }
.rail h2 { font-family:var(--serif); font-weight:400; font-size:34px; line-height:1.05; letter-spacing:-.018em;
margin:10px 0 0; text-wrap:balance; }
.spy { margin:26px 0 0; padding:0; list-style:none; display:grid; gap:0; }
.spy li { position:relative; padding:7px 0 7px 18px; font-family:var(--mono); font-size:12px;
letter-spacing:.04em; color:var(--ink-faint); }
.spy li::before { content:&quot;&quot;; position:absolute; left:0; top:12px; width:7px; height:7px; border-radius:50%;
border:1px solid var(--line); background:var(--paper); }
.spy li.on { color:var(--leaf); font-weight:600; }
.spy li.on::before { background:var(--leaf); border-color:var(--leaf); }
.spy li.done { color:var(--ink-soft); }
.spy li.done::before { background:var(--line); border-color:var(--line); }
.intro { font-size:18px; line-height:1.62; color:var(--ink-soft); margin:6px 0 0; max-width:74ch; text-wrap:pretty; }
.intro b { color:var(--ink); font-weight:400; }
code { font-family:var(--mono); font-size:.84em; background:color-mix(in srgb, var(--leaf) 10%, transparent);
border:1px solid var(--line); border-radius:4px; padding:.08em .4em; overflow-wrap:anywhere; }
.cards { display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:16px; margin-top:28px; }
.kcard { border:1px solid var(--line); background:var(--card); padding:18px 18px 20px; min-width:0;
box-shadow:0 14px 34px -30px rgba(28,34,22,.35); }
.kcard .ic { color:var(--leaf); display:block; margin-bottom:12px; }
.kcard .lbl { font-family:var(--mono); font-size:11px; letter-spacing:.16em; text-transform:uppercase;
color:var(--ink-faint); display:block; }
.kcard h3 { font-family:var(--serif); font-weight:400; font-size:20px; margin:7px 0 8px; }
.kcard p { margin:0; font-size:14.5px; line-height:1.55; color:var(--ink-soft); }
.kcard.slab { background:var(--slab); border-color:var(--slab-line); }
.kcard.slab .ic { color:var(--leaf-lit); }
.kcard.slab .lbl { color:var(--slab-soft); }
.kcard.slab h3 { color:var(--slab-ink); font-family:var(--mono); font-size:15px; letter-spacing:.02em; }
.kcard.slab p { color:var(--slab-soft); font-family:var(--mono); font-size:12.5px; line-height:1.6; }
.measure { display:flex; align-items:center; gap:10px; margin-top:26px; font-family:var(--mono);
font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--ink-faint); }
.measure .bar { height:1px; background:var(--soil); flex:1; max-width:824px; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;board&quot;&gt;
&lt;div class=&quot;grain&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;layer&quot;&gt;
&lt;div class=&quot;topbar&quot;&gt;
&lt;div class=&quot;col&quot;&gt;
&lt;div class=&quot;brand&quot;&gt;
samo&lt;b&gt;grow&lt;/b&gt;
&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;#35722f&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M3 17c0-6 4.5-11 13-12 .6 5.5-3 12-13 12Z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M3 17c3-3.5 6-5.6 10-7&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;nav class=&quot;nav&quot;&gt;
&lt;a class=&quot;on&quot; href=&quot;#&quot;&gt;Architecture&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Cost&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Features&lt;/a&gt;
&lt;a href=&quot;#&quot;&gt;Quickstart&lt;/a&gt;
&lt;a class=&quot;gh&quot; href=&quot;#&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
GitHub
&lt;/a&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;col&quot;&gt;
&lt;section class=&quot;sec&quot;&gt;
&lt;div class=&quot;rail&quot;&gt;
&lt;span class=&quot;num&quot;&gt;01&lt;/span&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;ul class=&quot;spy&quot;&gt;
&lt;li class=&quot;on&quot;&gt;How it works&lt;/li&gt;
&lt;li&gt;What it costs&lt;/li&gt;
&lt;li&gt;Key features&lt;/li&gt;
&lt;li&gt;Quickstart&lt;/li&gt;
&lt;li&gt;The genre is real&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;body&quot;&gt;
&lt;p class=&quot;intro&quot;&gt;
The garden is three off-the-shelf Wi-Fi gadgets — two smart plugs and a camera — with
nothing to maintain. The brain is &lt;b&gt;nombox&lt;/b&gt;, a small TypeScript/Bun service
(&lt;code&gt;@anthropic-ai/sdk&lt;/code&gt; for vision, &lt;code&gt;grammY&lt;/code&gt; for Telegram, everything in one
&lt;code&gt;config.json&lt;/code&gt;) that runs on a machine you already leave on.
&lt;/p&gt;
&lt;div class=&quot;cards&quot;&gt;
&lt;div class=&quot;kcard slab&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;3&quot; y=&quot;5&quot; width=&quot;18&quot; height=&quot;12&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M2 20h20&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 9h8M8 13h5&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;lbl&quot;&gt;The brain&lt;/span&gt;
&lt;h3&gt;nombox service&lt;/h3&gt;
&lt;p&gt;Pulls the snapshot, calls Claude, switches the plugs, runs the Telegram bot. The only thing you maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;kcard slab&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M6.5 18a4 4 0 0 1 0-8 5.5 5.5 0 0 1 10.6-1.6A3.9 3.9 0 0 1 18.5 18Z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M9.5 13.5h5&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;lbl&quot;&gt;Cloud&lt;/span&gt;
&lt;h3&gt;Claude &amp;amp; Telegram&lt;/h3&gt;
&lt;p&gt;Only the still image leaves your network. The camera is local RTSP — no cloud camera account.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;kcard&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M12 4v3M5.5 6.5l2 2M18.5 6.5l-2 2&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;6&quot; y=&quot;10&quot; width=&quot;12&quot; height=&quot;4&quot; rx=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M8 17v2M12 17v3M16 17v2&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;lbl&quot;&gt;The appliances&lt;/span&gt;
&lt;h3&gt;Three Wi-Fi gadgets&lt;/h3&gt;
&lt;p&gt;Two Kasa smart plugs and a Tapo camera. Nothing to flash, nothing to solder, no GPIO.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;measure&quot;&gt;
&lt;span&gt;Intro measure — 74ch across the full content column&lt;/span&gt;
&lt;span class=&quot;bar&quot;&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;sec&quot;&gt;
&lt;div class=&quot;rail&quot;&gt;
&lt;span class=&quot;num&quot;&gt;02&lt;/span&gt;
&lt;h2&gt;What it costs&lt;/h2&gt;
&lt;/div&gt;
&lt;div class=&quot;body&quot;&gt;
&lt;p class=&quot;intro&quot;&gt;
One price frame: &lt;b&gt;~$255&lt;/b&gt; for the manual build, &lt;b&gt;~$280&lt;/b&gt; for the automated core, up to
&lt;b&gt;~$335&lt;/b&gt; with the water-safety add-ons — the same one-time bracket as the &lt;i&gt;no-AI&lt;/i&gt;
countertop units.
&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"></iframe></div>
</section>
<section class="sheet">
<div class="meta">
<span class="idx">03</span>
<h2>Console + safety</h2>
<span class="dim">1200 × 800</span>
<div class="note"><b>TWO VOICES IN ONE FRAME</b><p>The machine speaks in mono on a dark slab: loop, plug state, safety caps, JSON verdict.</p><p>The human-facing Senses note stays warm serif — and left-aligned, replacing 92 words of centred prose.</p><p>All 8 emoji icons are drawn on a 20px / 1.5px stroke grid.</p></div>
</div>
<div class="stage"><iframe title="Console + safety" width="1200" height="800" scrolling="no" sandbox="allow-same-origin" srcdoc="&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset=&quot;utf-8&quot;&gt;&lt;title&gt;Console + safety&lt;/title&gt;&lt;style&gt;html,body{margin:0;padding:0;background:#f2ede0}&lt;/style&gt;&lt;style&gt;
:root {
--paper:#f2ede0; --paper-2:#ebe4d2; --card:#f7f3e8;
--ink:#1c2216; --ink-soft:#4a5340; --ink-faint:#636b59;
--line:#cdc4ac; --line-soft:#ddd5bf;
--leaf:#35722f; --leaf-dk:#2b5c26; --leaf-br:#4a9640; --leaf-lit:#8fd67f;
--soil:#a8632a; --amber:#d9c98d;
--slab:#1c2216; --slab-ink:#e9e7d7; --slab-line:#2f3826; --slab-soft:#8b9380;
--serif:Georgia,&quot;Iowan Old Style&quot;,&quot;Palatino Linotype&quot;,&quot;Times New Roman&quot;,serif;
--mono:ui-monospace,&quot;SF Mono&quot;,Menlo,Consolas,&quot;Liberation Mono&quot;,monospace;
}
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:var(--serif); }
a { color:var(--leaf-dk); text-decoration-color:var(--line); text-underline-offset:3px; }
a:hover { color:var(--leaf); text-decoration-color:var(--leaf); }
.board { width:1200px; height:800px; position:relative; overflow:hidden; background:var(--paper); padding:40px 60px; }
.grain { position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.045; mix-blend-mode:multiply;
background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;140&#x27; height=&#x27;140&#x27;%3E%3Cfilter id=&#x27;n&#x27;%3E%3CfeTurbulence type=&#x27;fractalNoise&#x27; baseFrequency=&#x27;0.9&#x27; numOctaves=&#x27;2&#x27; stitchTiles=&#x27;stitch&#x27;/%3E%3C/filter%3E%3Crect width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; filter=&#x27;url(%23n)&#x27;/%3E%3C/svg%3E&quot;); }
.layer { position:relative; z-index:1; }
.head { display:flex; align-items:baseline; gap:14px; margin-bottom:8px; }
.head .num { font-family:var(--mono); font-size:13px; font-weight:600; color:var(--leaf); letter-spacing:.14em; }
.head h2 { font-family:var(--serif); font-weight:400; font-size:30px; margin:0; letter-spacing:-.018em; }
.head .voice { margin-left:auto; font-family:var(--mono); font-size:11px; letter-spacing:.16em;
text-transform:uppercase; color:var(--ink-faint); }
.panel { background:var(--slab); border:1px solid var(--slab-line); margin-top:22px; }
.panel-head { display:flex; align-items:center; gap:12px; padding:11px 16px; border-bottom:1px solid var(--slab-line); }
.panel-head .tag { font-family:var(--mono); font-size:11px; letter-spacing:.18em; text-transform:uppercase;
color:var(--leaf-lit); font-weight:600; }
.panel-head .meta { margin-left:auto; font-family:var(--mono); font-size:11px; color:var(--slab-soft); letter-spacing:.04em; }
.pulse { width:7px; height:7px; border-radius:50%; background:var(--leaf-lit); flex:none; }
.loop { display:grid; grid-template-columns:1fr 22px 1fr 22px 1fr 22px 1fr; align-items:stretch; padding:20px 16px; }
.step { min-width:0; }
.step .ic { color:var(--leaf-lit); display:block; margin-bottom:9px; }
.step .n { font-family:var(--mono); font-size:10.5px; letter-spacing:.18em; color:var(--slab-soft); display:block; }
.step h3 { font-family:var(--mono); font-size:14px; font-weight:600; color:var(--slab-ink); margin:6px 0 6px;
letter-spacing:.02em; }
.step p { margin:0; font-family:var(--mono); font-size:11.5px; line-height:1.6; color:var(--slab-soft); }
.arrow { display:flex; align-items:center; justify-content:center; color:#4a5340; }
.states { display:flex; gap:0; border-top:1px solid var(--slab-line); }
.state { flex:1; display:flex; align-items:center; gap:10px; padding:13px 16px;
border-right:1px solid var(--slab-line); min-width:0; }
.state:last-child { border-right:0; }
.state .ic { color:var(--slab-soft); flex:none; }
.state .nm { font-family:var(--mono); font-size:12px; color:var(--slab-ink); }
.chip { margin-left:auto; font-family:var(--mono); font-size:11px; letter-spacing:.14em; text-transform:uppercase;
padding:3px 8px; border:1px solid currentColor; flex:none; }
.chip.on { color:var(--leaf-lit); }
.chip.off { color:var(--slab-soft); }
.grid2 { display:grid; grid-template-columns:1.18fr 1fr; gap:26px; margin-top:26px; align-items:start; }
.caps { background:var(--slab); border:1px solid var(--slab-line); min-width:0; }
.caps .said { padding:15px 16px; font-family:var(--mono); font-size:13px; line-height:1.6; color:var(--slab-ink);
border-bottom:1px solid var(--slab-line); }
.caps .said b { color:var(--leaf-lit); font-weight:600; }
.caprow { display:flex; justify-content:space-between; align-items:baseline; gap:14px; padding:10px 16px;
border-bottom:1px solid var(--slab-line); font-family:var(--mono); font-size:12px; color:var(--slab-soft); }
.caprow .v { color:var(--slab-ink); text-align:right; }
.caprow .ph { color:var(--amber); border:1px dashed #55502f; padding:1px 6px; font-size:11px; }
.caps .foot { padding:11px 16px; font-family:var(--mono); font-size:11px; letter-spacing:.06em;
text-transform:uppercase; color:var(--leaf-lit); }
.json { margin-top:0; }
.json pre { margin:0; padding:15px 16px; font-family:var(--mono); font-size:12.5px; line-height:1.75;
color:var(--slab-soft); white-space:pre-wrap; overflow-wrap:anywhere; }
.json .k { color:var(--leaf-lit); }
.json .t { color:var(--amber); }
.aside { border:1px solid var(--line); background:var(--card); padding:22px 24px 24px; min-width:0;
box-shadow:0 18px 40px -30px rgba(28,34,22,.35); }
.aside .eyebrow { font-family:var(--mono); font-size:11px; letter-spacing:.18em; text-transform:uppercase;
color:var(--leaf); font-weight:600; display:block; }
.aside h3 { font-family:var(--serif); font-weight:400; font-size:23px; line-height:1.2; margin:10px 0 10px;
letter-spacing:-.012em; }
.aside p { margin:0 0 14px; font-size:16px; line-height:1.6; color:var(--ink-soft); text-align:left; text-wrap:pretty; }
.aside p b { color:var(--ink); font-weight:400; font-style:italic; }
.warn { display:flex; gap:12px; border-top:1px solid var(--line); padding-top:15px; margin-top:4px; }
.warn .ic { color:var(--soil); flex:none; }
.warn p { margin:0; font-size:14.5px; line-height:1.55; color:var(--ink); }
.warn .x10 { font-family:var(--mono); font-size:.86em; border:1px solid var(--soil); padding:.05em .4em;
color:var(--ink); white-space:nowrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;board&quot;&gt;
&lt;div class=&quot;grain&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;layer&quot;&gt;
&lt;div class=&quot;head&quot;&gt;
&lt;span class=&quot;num&quot;&gt;01&lt;/span&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;span class=&quot;voice&quot;&gt;Console voice — the machine speaks in mono&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;panel&quot;&gt;
&lt;div class=&quot;panel-head&quot;&gt;
&lt;span class=&quot;pulse&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;Control loop&lt;/span&gt;
&lt;span class=&quot;meta&quot;&gt;runs every N minutes during light hours&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;loop&quot;&gt;
&lt;div class=&quot;step&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;3&quot; y=&quot;6&quot; width=&quot;18&quot; height=&quot;13&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M8 6l1.6-2.4h4.8L16 6&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12.5&quot; r=&quot;3.4&quot;&gt;&lt;/circle&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STEP 01&lt;/span&gt;
&lt;h3&gt;snapshot&lt;/h3&gt;
&lt;p&gt;local RTSP still&lt;br&gt;no cloud camera account&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow&quot;&gt;
&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10h11M11 6l4 4-4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;step&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;11&quot; cy=&quot;11&quot; r=&quot;6&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M15.5 15.5L20 20&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8.6 11h4.8M11 8.6v4.8&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STEP 02&lt;/span&gt;
&lt;h3&gt;analyze&lt;/h3&gt;
&lt;p&gt;claude haiku vision&lt;br&gt;returns typed JSON&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow&quot;&gt;
&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10h11M11 6l4 4-4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;step&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;5&quot; y=&quot;8&quot; width=&quot;14&quot; height=&quot;11&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M9 8V5.5M15 8V5.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 13h4&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STEP 03&lt;/span&gt;
&lt;h3&gt;act&lt;/h3&gt;
&lt;p&gt;kasa plugs switched&lt;br&gt;within fixed caps&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;arrow&quot;&gt;
&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10h11M11 6l4 4-4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;step&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M4 6.5h16v11H8l-4 3.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M8 11h8M8 14h5&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;STEP 04&lt;/span&gt;
&lt;h3&gt;report&lt;/h3&gt;
&lt;p&gt;telegram digest&lt;br&gt;alerts + your commands&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;states&quot;&gt;
&lt;div class=&quot;state&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;17&quot; height=&quot;17&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M12 3v2.5M5.6 6.6l1.8 1.8M18.4 6.6l-1.8 1.8&quot;&gt;&lt;/path&gt;
&lt;rect x=&quot;6&quot; y=&quot;10&quot; width=&quot;12&quot; height=&quot;4&quot; rx=&quot;1.5&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M9 17v2M15 17v2&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;nm&quot;&gt;grow light&lt;/span&gt;&lt;span class=&quot;chip on&quot;&gt;on&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;state&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;17&quot; height=&quot;17&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M12 3.5c3.6 4.3 5.5 7.2 5.5 9.6a5.5 5.5 0 0 1-11 0c0-2.4 1.9-5.3 5.5-9.6Z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;nm&quot;&gt;top-up pump&lt;/span&gt;&lt;span class=&quot;chip off&quot;&gt;off&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;state&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;17&quot; height=&quot;17&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;8&quot; cy=&quot;15&quot; r=&quot;3&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;15&quot; cy=&quot;11&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;17.5&quot; cy=&quot;17&quot; r=&quot;1.6&quot;&gt;&lt;/circle&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;nm&quot;&gt;air pump&lt;/span&gt;&lt;span class=&quot;chip on&quot;&gt;24/7&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;state&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;17&quot; height=&quot;17&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;3&quot; y=&quot;6&quot; width=&quot;18&quot; height=&quot;13&quot; rx=&quot;2&quot;&gt;&lt;/rect&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12.5&quot; r=&quot;3.4&quot;&gt;&lt;/circle&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;nm&quot;&gt;tapo camera&lt;/span&gt;&lt;span class=&quot;chip on&quot;&gt;rtsp&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;grid2&quot;&gt;
&lt;div class=&quot;caps&quot;&gt;
&lt;div class=&quot;said&quot;&gt;The AI can request water; &lt;b&gt;it cannot override the cap.&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;caprow&quot;&gt;&lt;span&gt;per-run pump cap&lt;/span&gt;&lt;span class=&quot;v&quot;&gt;&lt;span class=&quot;ph&quot;&gt;SET IN config.json&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;caprow&quot;&gt;&lt;span&gt;per-day pump cap&lt;/span&gt;&lt;span class=&quot;v&quot;&gt;&lt;span class=&quot;ph&quot;&gt;SET IN config.json&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;caprow&quot;&gt;&lt;span&gt;top-up jug (bounds worst-case spill)&lt;/span&gt;&lt;span class=&quot;v&quot;&gt;1–2 gal&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;caprow&quot;&gt;&lt;span&gt;float / leak sensor&lt;/span&gt;&lt;span class=&quot;v&quot;&gt;optional&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;json&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;verdict&lt;/span&gt; {
&lt;span class=&quot;k&quot;&gt;water&lt;/span&gt;: &lt;span class=&quot;t&quot;&gt;bool&lt;/span&gt;,
&lt;span class=&quot;k&quot;&gt;light_hours&lt;/span&gt;: &lt;span class=&quot;t&quot;&gt;int&lt;/span&gt;,
&lt;span class=&quot;k&quot;&gt;pots&lt;/span&gt;: [&lt;span class=&quot;t&quot;&gt;{ id, health }&lt;/span&gt;],
&lt;span class=&quot;k&quot;&gt;confidence&lt;/span&gt;: &lt;span class=&quot;t&quot;&gt;0–1&lt;/span&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;foot&quot;&gt;Enforced in code, not by the model&lt;/div&gt;
&lt;/div&gt;
&lt;aside class=&quot;aside&quot;&gt;
&lt;span class=&quot;eyebrow&quot;&gt;Senses&lt;/span&gt;
&lt;h3&gt;The camera is the only automatic sensor&lt;/h3&gt;
&lt;p&gt;
The EC/TDS meter and pH kit are &lt;b&gt;handheld manual tools&lt;/b&gt;: you dip and read them
yourself, and the AI only learns a value when you type it into Telegram.
&lt;/p&gt;
&lt;div class=&quot;warn&quot;&gt;
&lt;span class=&quot;ic&quot;&gt;
&lt;svg width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M12 4.5 21 19.5H3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 10v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 16.8v.2&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;p&gt;
One gotcha with cheap TDS pens: the &lt;span class=&quot;x10&quot;&gt;×10&lt;/span&gt; multiplier.
“115 ×10” means 1,150 ppm — missing it burned our first plants.
Target &lt;b&gt;80–110 with ×10 lit.&lt;/b&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/aside&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"></iframe></div>
</section>
<section class="sheet">
<div class="meta">
<span class="idx">04</span>
<h2>Cost comparison</h2>
<span class="dim">1200 × 710</span>
<div class="note"><b>COST</b><p>The TCO table becomes a bar chart with samogrow anchored and direct-labelled. The AI column stays, so the cheaper no-AI Auk is not quietly hidden.</p><p>The tier selector is live — click A / B / C and the stack total follows.</p></div>
</div>
<div class="stage"><iframe title="Cost comparison" width="1200" height="710" scrolling="no" sandbox="allow-same-origin" srcdoc="&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset=&quot;utf-8&quot;&gt;&lt;title&gt;Cost comparison&lt;/title&gt;&lt;style&gt;html,body{margin:0;padding:0;background:#f2ede0}&lt;/style&gt;&lt;style&gt;
:root {
--paper:#f2ede0; --paper-2:#ebe4d2; --card:#f7f3e8;
--ink:#1c2216; --ink-soft:#4a5340; --ink-faint:#636b59;
--line:#cdc4ac; --line-soft:#ddd5bf;
--leaf:#35722f; --leaf-dk:#2b5c26; --leaf-br:#4a9640; --leaf-lit:#8fd67f;
--soil:#a8632a; --neutral:#a79e84;
--slab:#1c2216; --slab-ink:#e9e7d7; --slab-line:#2f3826; --slab-soft:#8b9380;
--serif:Georgia,&quot;Iowan Old Style&quot;,&quot;Palatino Linotype&quot;,&quot;Times New Roman&quot;,serif;
--mono:ui-monospace,&quot;SF Mono&quot;,Menlo,Consolas,&quot;Liberation Mono&quot;,monospace;
}
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:var(--serif); }
a { color:var(--leaf-dk); text-decoration-color:var(--line); text-underline-offset:3px; }
a:hover { color:var(--leaf); text-decoration-color:var(--leaf); }
.board { width:1200px; height:710px; position:relative; overflow:hidden; background:var(--paper); padding:40px 60px; }
.grain { position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.045; mix-blend-mode:multiply;
background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;140&#x27; height=&#x27;140&#x27;%3E%3Cfilter id=&#x27;n&#x27;%3E%3CfeTurbulence type=&#x27;fractalNoise&#x27; baseFrequency=&#x27;0.9&#x27; numOctaves=&#x27;2&#x27; stitchTiles=&#x27;stitch&#x27;/%3E%3C/filter%3E%3Crect width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; filter=&#x27;url(%23n)&#x27;/%3E%3C/svg%3E&quot;); }
.layer { position:relative; z-index:1; }
.head { display:flex; align-items:baseline; gap:14px; }
.head .num { font-family:var(--mono); font-size:13px; font-weight:600; color:var(--leaf); letter-spacing:.14em; }
.head h2 { font-family:var(--serif); font-weight:400; font-size:30px; margin:0; letter-spacing:-.018em; }
.head .voice { margin-left:auto; font-family:var(--mono); font-size:11px; letter-spacing:.16em;
text-transform:uppercase; color:var(--ink-faint); }
.grid { display:grid; grid-template-columns:398px 1fr; gap:44px; margin-top:26px; align-items:start; }
.eyebrow { font-family:var(--mono); font-size:11px; letter-spacing:.18em; text-transform:uppercase;
color:var(--leaf); font-weight:600; display:block; margin-bottom:12px; }
.tiers { display:grid; gap:8px; margin:0 0 22px; }
.tier { display:flex; align-items:center; gap:12px; width:100%; text-align:left; cursor:pointer;
border:1px solid var(--line); background:var(--card); padding:12px 14px; font-family:var(--mono);
color:var(--ink-soft); font-size:12.5px; }
.tier .nm { display:block; color:var(--ink); font-size:13px; }
.tier .sub { display:block; font-size:11px; color:var(--ink-faint); margin-top:3px; }
.tier .amt { margin-left:auto; font-size:14px; color:var(--ink); white-space:nowrap; }
.tier .tick { width:16px; flex:none; color:var(--leaf); }
.tier.on { border-color:var(--leaf); background:color-mix(in srgb, var(--leaf) 9%, var(--card)); }
.tier.on .nm, .tier.on .amt { color:var(--leaf-dk); font-weight:600; }
.stack { border:1px solid var(--slab-line); background:var(--slab); }
.line { display:flex; justify-content:space-between; align-items:baseline; gap:14px; padding:13px 16px;
border-bottom:1px solid var(--slab-line); font-family:var(--mono); font-size:12.5px; color:var(--slab-soft); }
.line .lbl { color:var(--slab-ink); }
.line small { display:block; font-size:10.5px; color:var(--slab-soft); margin-top:4px; letter-spacing:.02em; }
.line .amt { color:var(--slab-ink); font-size:14px; white-space:nowrap; }
.line.total { background:var(--leaf); border-bottom:0; padding:16px; }
.line.total .lbl { color:var(--paper); font-size:11px; letter-spacing:.16em; text-transform:uppercase; }
.line.total .amt { color:var(--paper); font-size:22px; font-weight:600; }
.chart { margin-top:2px; }
.crow { display:grid; grid-template-columns:126px 1fr 76px 62px; align-items:center; gap:14px;
padding:9px 8px; }
.crow.us { background:color-mix(in srgb, var(--leaf) 12%, transparent); }
.clab { font-family:var(--mono); font-size:12px; color:var(--ink-soft); }
.crow.us .clab { color:var(--leaf-dk); font-weight:600; }
.ctrack { min-width:0; display:flex; }
.cbar { height:20px; background:var(--neutral); border-radius:0 4px 4px 0; flex:none; }
.crow.us .cbar { background:var(--leaf); }
.cval { font-family:var(--mono); font-size:13px; color:var(--ink); text-align:right; }
.crow.us .cval { color:var(--leaf-dk); font-weight:600; }
.cai { display:flex; align-items:center; gap:5px; font-family:var(--mono); font-size:11px;
letter-spacing:.06em; color:var(--ink-faint); }
.cai.yes { color:var(--leaf-dk); }
.caxis { display:grid; grid-template-columns:126px 1fr 76px 62px; gap:14px; margin:2px 8px 0; }
.caxis .scale { display:flex; justify-content:space-between; border-top:1px solid var(--line);
padding-top:7px; font-family:var(--mono); font-size:11px; color:var(--ink-faint); }
.caxis .cap { grid-column:3 / span 2; padding-top:7px; text-align:right;
font-family:var(--mono); font-size:11px; color:var(--ink-faint); }
.callout { display:flex; gap:14px; align-items:flex-start; border-left:3px solid var(--leaf);
padding:14px 0 14px 16px; margin-top:20px; }
.callout .big { font-family:var(--serif); font-size:30px; color:var(--leaf-dk); line-height:1; white-space:nowrap; }
.callout p { margin:0; font-size:15px; line-height:1.5; color:var(--ink-soft); text-wrap:pretty; }
.callout p b { color:var(--ink); font-weight:400; font-style:italic; }
.ongoing { display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:22px; margin-top:22px; }
.ongoing div { border-top:2px solid var(--soil); padding-top:10px; min-width:0; }
.ongoing .big { font-family:var(--serif); font-size:26px; color:var(--ink); display:block; line-height:1.1; }
.ongoing small { font-family:var(--mono); font-size:11px; color:var(--ink-faint); line-height:1.55;
display:block; margin-top:5px; }
.fine { font-family:var(--mono); font-size:11px; color:var(--ink-faint); line-height:1.6; margin:18px 0 0; }
.note { font-size:15px; line-height:1.55; color:var(--ink-soft); margin:16px 0 0; text-wrap:pretty; }
.note b { color:var(--ink); font-weight:400; font-style:italic; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;board&quot;&gt;
&lt;div class=&quot;grain&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;layer&quot;&gt;
&lt;div class=&quot;head&quot;&gt;
&lt;span class=&quot;num&quot;&gt;02&lt;/span&gt;
&lt;h2&gt;What it costs&lt;/h2&gt;
&lt;span class=&quot;voice&quot;&gt;Console voice — numbers are tabular&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;grid&quot;&gt;
&lt;div&gt;
&lt;span class=&quot;eyebrow&quot;&gt;Build it in tiers&lt;/span&gt;
&lt;div class=&quot;tiers&quot;&gt;
&lt;button class=&quot;tier&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;A · Manual start&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;you pour when the AI says&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$255&lt;/span&gt;&lt;span class=&quot;tick&quot;&gt;&lt;/span&gt;&lt;/button&gt;
&lt;button class=&quot;tier on&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;B · Auto top-up&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;pump does the watering&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$280&lt;/span&gt;&lt;span class=&quot;tick&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10.5l4 4 8-9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
&lt;button class=&quot;tier&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;C · Water safety&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;gauge · leak sensor · tray&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$335&lt;/span&gt;&lt;span class=&quot;tick&quot;&gt;&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;
&lt;div class=&quot;stack&quot;&gt;
&lt;div class=&quot;line&quot;&gt;
&lt;span class=&quot;lbl&quot;&gt;network appliances&lt;small&gt;2-pack plugs · camera · pump · tubing&lt;/small&gt;&lt;/span&gt;
&lt;span class=&quot;amt&quot;&gt;$68&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;
&lt;span class=&quot;lbl&quot;&gt;grow side&lt;small&gt;DWC reservoir · light · nutrient · seeds · EC meter&lt;/small&gt;&lt;/span&gt;
&lt;span class=&quot;amt&quot;&gt;$211&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;
&lt;span class=&quot;lbl&quot;&gt;tier adjustment&lt;small&gt;the automated core build&lt;/small&gt;&lt;/span&gt;
&lt;span class=&quot;amt&quot;&gt;$0&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;line total&quot;&gt;
&lt;span class=&quot;lbl&quot;&gt;Build total&lt;/span&gt;
&lt;span class=&quot;amt&quot;&gt;~$280&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;eyebrow&quot;&gt;2-year total cost of ownership&lt;/span&gt;
&lt;div class=&quot;chart&quot;&gt;
&lt;div class=&quot;crow&quot;&gt;
&lt;span class=&quot;clab&quot;&gt;Gardyn Home 4&lt;/span&gt;
&lt;span class=&quot;ctrack&quot;&gt;&lt;span class=&quot;cbar&quot; style=&quot;width:301px&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;cval&quot;&gt;~$1,715&lt;/span&gt;
&lt;span class=&quot;cai yes&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10.5l4 4 8-9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
AI
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;crow&quot;&gt;
&lt;span class=&quot;clab&quot;&gt;Click &amp;amp; Grow SG9&lt;/span&gt;
&lt;span class=&quot;ctrack&quot;&gt;&lt;span class=&quot;cbar&quot; style=&quot;width:105px&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;cval&quot;&gt;~$600&lt;/span&gt;
&lt;span class=&quot;cai&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 10h10&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
no AI
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;crow us&quot;&gt;
&lt;span class=&quot;clab&quot;&gt;samogrow&lt;/span&gt;
&lt;span class=&quot;ctrack&quot;&gt;&lt;span class=&quot;cbar&quot; style=&quot;width:83px&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;cval&quot;&gt;~$470&lt;/span&gt;
&lt;span class=&quot;cai yes&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 10.5l4 4 8-9&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
AI
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;crow&quot;&gt;
&lt;span class=&quot;clab&quot;&gt;Auk Mini 2&lt;/span&gt;
&lt;span class=&quot;ctrack&quot;&gt;&lt;span class=&quot;cbar&quot; style=&quot;width:40px&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;cval&quot;&gt;~$229&lt;/span&gt;
&lt;span class=&quot;cai&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M5 10h10&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
no AI
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;caxis&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;scale&quot;&gt;&lt;span&gt;$0&lt;/span&gt;&lt;span&gt;hardware + 2 years of extras&lt;/span&gt;&lt;span&gt;$1,800&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout&quot;&gt;
&lt;span class=&quot;big&quot;&gt;−$1,245&lt;/span&gt;
&lt;p&gt;under Gardyn over two years — &lt;b&gt;the only commercial unit with real camera + AI.&lt;/b&gt; And below even a Click &amp;amp; Grow, which has neither.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ongoing&quot;&gt;
&lt;div&gt;&lt;span class=&quot;big&quot;&gt;~$35&lt;/span&gt;&lt;small&gt;/ year — plants or seeds, pH refills. Pebbles reusable.&lt;/small&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;big&quot;&gt;$3–7&lt;/span&gt;&lt;small&gt;/ month — Claude Haiku vision, 24–48 photos a day.&lt;/small&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;big&quot;&gt;$0&lt;/span&gt;&lt;small&gt;/ month — vendor subscription. No proprietary pods, ever.&lt;/small&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p class=&quot;fine&quot;&gt;The API line is arithmetic, not a guess: ~$0.0036 per analysis on Claude Haiku × 24 images/day ≈ $2.6/mo (≈ $5/mo at 48/day).&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;Nothing here is a black box: commodity seeds, code you can fork, and no vendor who can deprecate your garden — the way &lt;b&gt;AeroGarden owners were stranded&lt;/b&gt; when the company wound down and the app and pods went with it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"></iframe></div>
</section>
<section class="sheet">
<div class="meta">
<span class="idx">05</span>
<h2>Mobile — 390px</h2>
<span class="dim">390 × 1400</span>
<div class="note"><b>MOBILE — 390px</b><p>GitHub is reachable from the top bar and from a sticky dock, instead of one footer link at y=13,296.</p><p>The command block wraps instead of scrolling 703px inside a 278px box.</p><p>Cost cards align to the same 28px margins as the prose — the min-width:0 fix.</p></div>
</div>
<div class="stage"><iframe title="Mobile — 390px" width="390" height="1400" scrolling="no" sandbox="allow-same-origin" srcdoc="&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset=&quot;utf-8&quot;&gt;&lt;title&gt;Mobile — 390px&lt;/title&gt;&lt;style&gt;html,body{margin:0;padding:0;background:#f2ede0}&lt;/style&gt;&lt;style&gt;
:root {
--paper:#f2ede0; --paper-2:#ebe4d2; --card:#f7f3e8;
--ink:#1c2216; --ink-soft:#4a5340; --ink-faint:#636b59;
--line:#cdc4ac; --line-soft:#ddd5bf;
--leaf:#35722f; --leaf-dk:#2b5c26; --leaf-br:#4a9640; --leaf-lit:#8fd67f;
--soil:#a8632a;
--slab:#1c2216; --slab-ink:#e9e7d7; --slab-line:#2f3826; --slab-soft:#8b9380;
--serif:Georgia,&quot;Iowan Old Style&quot;,&quot;Palatino Linotype&quot;,&quot;Times New Roman&quot;,serif;
--mono:ui-monospace,&quot;SF Mono&quot;,Menlo,Consolas,&quot;Liberation Mono&quot;,monospace;
}
* { box-sizing:border-box; }
body { margin:0; background:var(--paper); color:var(--ink); font-family:var(--serif); }
a { color:var(--leaf-dk); text-decoration-color:var(--line); text-underline-offset:3px; }
a:hover { color:var(--leaf); text-decoration-color:var(--leaf); }
.board { width:390px; height:1400px; position:relative; overflow:hidden; background:var(--paper); }
.grain { position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.045; mix-blend-mode:multiply;
background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;140&#x27; height=&#x27;140&#x27;%3E%3Cfilter id=&#x27;n&#x27;%3E%3CfeTurbulence type=&#x27;fractalNoise&#x27; baseFrequency=&#x27;0.9&#x27; numOctaves=&#x27;2&#x27; stitchTiles=&#x27;stitch&#x27;/%3E%3C/filter%3E%3Crect width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; filter=&#x27;url(%23n)&#x27;/%3E%3C/svg%3E&quot;); }
.layer { position:relative; z-index:1; }
.col { padding:0 28px; }
.topbar { height:54px; border-bottom:1px solid var(--line); display:flex; align-items:center;
background:color-mix(in srgb, var(--paper) 92%, transparent); }
.topbar .col { display:flex; align-items:center; gap:12px; width:100%; }
.brand { font-family:var(--serif); font-size:19px; display:flex; align-items:center; gap:6px; }
.brand b { color:var(--leaf); font-weight:700; }
.tb-actions { margin-left:auto; display:flex; align-items:center; gap:8px; }
.iconbtn { width:44px; height:38px; border:1px solid var(--line); display:flex; align-items:center;
justify-content:center; color:var(--ink-soft); background:transparent; }
.iconbtn.solid { background:var(--leaf); border-color:var(--leaf); color:var(--paper); }
.hero { padding:30px 0 0; }
.eyebrow { font-family:var(--mono); font-size:11.5px; letter-spacing:.14em; text-transform:uppercase;
color:var(--leaf); font-weight:600; }
h1 { font-family:var(--serif); font-weight:400; font-size:38px; line-height:1.08; letter-spacing:-.02em;
margin:14px 0 14px; text-wrap:pretty; }
h1 em { font-style:normal; color:var(--leaf); }
.lede { font-size:17px; line-height:1.5; color:var(--ink-soft); margin:0 0 22px; text-wrap:pretty; }
.lede b { color:var(--ink); font-weight:400; font-style:italic; }
.cmd { background:var(--slab); border:1px solid var(--slab-line); }
.cmd-head { display:flex; align-items:center; justify-content:space-between; gap:10px;
padding:9px 12px; border-bottom:1px solid var(--slab-line); }
.cmd-tag { font-family:var(--mono); font-size:11px; letter-spacing:.16em; text-transform:uppercase;
color:var(--leaf-lit); font-weight:600; }
.copy { font-family:var(--mono); font-size:11px; letter-spacing:.08em; text-transform:uppercase;
color:var(--slab-soft); border:1px solid var(--slab-line); padding:4px 8px;
display:inline-flex; align-items:center; gap:5px; flex:none; }
.cmd-body { padding:12px; display:grid; gap:9px; }
.cmd-line { font-family:var(--mono); font-size:12.5px; line-height:1.5; color:var(--slab-ink);
display:flex; gap:8px; white-space:pre-wrap; overflow-wrap:anywhere; }
.cmd-line .p { color:var(--leaf-lit); flex:none; }
.cmd-line .env { color:#d9c98d; }
.cmd-foot { padding:0 12px 12px; font-family:var(--mono); font-size:10.5px; color:var(--slab-soft);
line-height:1.55; }
.btns { display:grid; gap:12px; margin-top:20px; }
.btn { font-family:var(--mono); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
padding:16px 18px; text-decoration:none; border:1px solid var(--ink);
display:flex; align-items:center; justify-content:center; gap:9px; }
.btn-solid { background:var(--leaf); border-color:var(--leaf); color:var(--paper); }
.btn-ghost { color:var(--ink); }
.trust { display:flex; flex-wrap:wrap; gap:8px 14px; margin-top:22px; padding-top:14px;
border-top:1px solid var(--line); font-family:var(--mono); font-size:11px; color:var(--ink-faint); }
.trust b { color:var(--leaf-dk); font-weight:600; }
.sec { margin-top:34px; border-top:1px solid var(--line); padding:30px 0 0; }
.sec .num { font-family:var(--mono); font-size:12px; font-weight:600; color:var(--leaf); letter-spacing:.14em; }
.sec h2 { font-family:var(--serif); font-weight:400; font-size:30px; margin:8px 0 12px; letter-spacing:-.018em; }
.sec .intro { font-size:16.5px; line-height:1.58; color:var(--ink-soft); margin:0 0 20px; text-wrap:pretty; }
.sec .intro b { color:var(--ink); font-weight:400; }
.tiers { display:grid; gap:8px; }
.tier { display:flex; align-items:center; gap:10px; border:1px solid var(--line); background:var(--card);
padding:12px 13px; font-family:var(--mono); }
.tier .nm { display:block; color:var(--ink); font-size:12.5px; }
.tier .sub { display:block; font-size:10.5px; color:var(--ink-faint); margin-top:3px; }
.tier .amt { margin-left:auto; font-size:13.5px; color:var(--ink); white-space:nowrap; }
.tier.on { border-color:var(--leaf); background:color-mix(in srgb, var(--leaf) 9%, var(--card)); }
.tier.on .nm, .tier.on .amt { color:var(--leaf-dk); font-weight:600; }
.stack { border:1px solid var(--slab-line); background:var(--slab); margin-top:14px; }
.line { display:flex; justify-content:space-between; align-items:baseline; gap:12px; padding:12px 14px;
border-bottom:1px solid var(--slab-line); font-family:var(--mono); font-size:12px; }
.line .lbl { color:var(--slab-ink); min-width:0; }
.line small { display:block; font-size:11px; color:var(--slab-soft); margin-top:4px; line-height:1.5; }
.line .amt { color:var(--slab-ink); font-size:13.5px; white-space:nowrap; }
.line.total { background:var(--leaf); border-bottom:0; }
.line.total .lbl { color:var(--paper); font-size:10.5px; letter-spacing:.16em; text-transform:uppercase; }
.line.total .amt { color:var(--paper); font-size:20px; font-weight:600; }
.dock { position:absolute; left:0; right:0; bottom:0; z-index:3; display:grid; grid-template-columns:1.25fr 1fr;
gap:10px; padding:12px 16px 16px; background:color-mix(in srgb, var(--paper) 94%, transparent);
border-top:1px solid var(--line); box-shadow:0 -14px 30px -26px rgba(28,34,22,.6); }
.dock .btn { padding:14px 12px; font-size:11.5px; }
&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;board&quot;&gt;
&lt;div class=&quot;grain&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;layer&quot;&gt;
&lt;div class=&quot;topbar&quot;&gt;
&lt;div class=&quot;col&quot;&gt;
&lt;div class=&quot;brand&quot;&gt;
samo&lt;b&gt;grow&lt;/b&gt;
&lt;svg width=&quot;17&quot; height=&quot;17&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;#35722f&quot; stroke-width=&quot;1.5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M3 17c0-6 4.5-11 13-12 .6 5.5-3 12-13 12Z&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M3 17c3-3.5 6-5.6 10-7&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;tb-actions&quot;&gt;
&lt;span class=&quot;iconbtn solid&quot; role=&quot;link&quot; aria-label=&quot;GitHub repository&quot;&gt;
&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;span class=&quot;iconbtn&quot; role=&quot;button&quot; aria-label=&quot;Open navigation menu&quot;&gt;
&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;path d=&quot;M3 6h14M3 10h14M3 14h14&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;hero col&quot;&gt;
&lt;div class=&quot;eyebrow&quot;&gt;Open source · it feeds you&lt;/div&gt;
&lt;h1&gt;Give the machine you already leave on &lt;em&gt;one more job.&lt;/em&gt;&lt;/h1&gt;
&lt;p class=&quot;lede&quot;&gt;
samogrow runs a &lt;b&gt;herb garden&lt;/b&gt; from a camera, two smart plugs, and a Claude API key —
open source (MIT), no pods, no subscription.
&lt;/p&gt;
&lt;div class=&quot;cmd&quot;&gt;
&lt;div class=&quot;cmd-head&quot;&gt;
&lt;span class=&quot;cmd-tag&quot;&gt;Try it — zero hardware&lt;/span&gt;
&lt;span class=&quot;copy&quot;&gt;
&lt;svg width=&quot;10&quot; height=&quot;10&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.6&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;rect x=&quot;7&quot; y=&quot;7&quot; width=&quot;10&quot; height=&quot;10&quot; rx=&quot;1.5&quot;&gt;&lt;/rect&gt;
&lt;path d=&quot;M13 4H4.5A1.5 1.5 0 0 0 3 5.5V14&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
Copy
&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;cmd-body&quot;&gt;
&lt;div class=&quot;cmd-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;$&lt;/span&gt;&lt;span&gt;git clone github.com/NikolayS/samogrow&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;cmd-line&quot;&gt;&lt;span class=&quot;p&quot;&gt;$&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;env&quot;&gt;SAMOGROW_MOCK=1&lt;/span&gt; bun run src/main.ts&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;cmd-foot&quot;&gt;real Claude call · real Telegram push · against a sample photo&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;btns&quot;&gt;
&lt;a class=&quot;btn btn-solid&quot; href=&quot;#&quot;&gt;
&lt;svg width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
Get the code
&lt;/a&gt;
&lt;a class=&quot;btn btn-ghost&quot; href=&quot;#&quot;&gt;Quickstart →&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;trust&quot;&gt;
&lt;span&gt;&lt;b&gt;MIT&lt;/b&gt; licensed&lt;/span&gt;
&lt;span&gt;&lt;b&gt;108&lt;/b&gt; tests, CI green&lt;/span&gt;
&lt;span&gt;No soldering&lt;/span&gt;
&lt;span&gt;&lt;b&gt;$0&lt;/b&gt; subscription&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sec col&quot;&gt;
&lt;span class=&quot;num&quot;&gt;02&lt;/span&gt;
&lt;h2&gt;What it costs&lt;/h2&gt;
&lt;p class=&quot;intro&quot;&gt;
One price frame: &lt;b&gt;~$255&lt;/b&gt; manual, &lt;b&gt;~$280&lt;/b&gt; automated core, up to &lt;b&gt;~$335&lt;/b&gt;
with the water-safety add-ons.
&lt;/p&gt;
&lt;div class=&quot;tiers&quot;&gt;
&lt;div class=&quot;tier&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;A · Manual start&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;you pour when the AI says&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$255&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;tier on&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;B · Auto top-up&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;pump does the watering&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$280&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;tier&quot;&gt;&lt;span&gt;&lt;span class=&quot;nm&quot;&gt;C · Water safety&lt;/span&gt;&lt;span class=&quot;sub&quot;&gt;gauge · leak sensor · tray&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$335&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stack&quot;&gt;
&lt;div class=&quot;line&quot;&gt;&lt;span class=&quot;lbl&quot;&gt;network appliances&lt;small&gt;2-pack plugs · camera · pump · tubing&lt;/small&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;$68&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&lt;span class=&quot;lbl&quot;&gt;grow side&lt;small&gt;DWC reservoir · light · nutrient · seeds · EC meter&lt;/small&gt;&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;$211&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;line total&quot;&gt;&lt;span class=&quot;lbl&quot;&gt;Build total&lt;/span&gt;&lt;span class=&quot;amt&quot;&gt;~$280&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;dock&quot;&gt;
&lt;a class=&quot;btn btn-solid&quot; href=&quot;#&quot;&gt;
&lt;svg width=&quot;13&quot; height=&quot;13&quot; viewBox=&quot;0 0 20 20&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.7&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot;&gt;
&lt;circle cx=&quot;6&quot; cy=&quot;4.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;6&quot; cy=&quot;15.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;
&lt;circle cx=&quot;14.5&quot; cy=&quot;7.5&quot; r=&quot;2.2&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M6 6.7v6.6&quot;&gt;&lt;/path&gt;
&lt;path d=&quot;M14.5 9.7c0 2.6-2.4 3.2-4.6 3.6&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;
Get the code
&lt;/a&gt;
&lt;a class=&quot;btn btn-ghost&quot; href=&quot;#&quot;&gt;Quickstart&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"></iframe></div>
</section>
<footer><div class="wrap">
samogrow is open source (MIT) — <a href="https://github.com/NikolayS/samogrow">github.com/NikolayS/samogrow</a><br>
This file is self-contained: no accounts, no network, no external assets. Open it anywhere.
</div></footer>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment