← back to Animals
yolo: Pet store detail: 'what they sell' section
33ff0081218b10c60c0ec27bb4885773e5a8fee1 · 2026-05-08 14:32:07 -0700 · animal-yolo
Task: yolo.pet-store-products
Prompt: In ~/Projects/animals: /clinic/:id pages where category='pet_store' should show a generic services/inventory blurb. Add a `products_carried` text[] column to businesses (migration needed). Default com
Files touched
M agents/animal-yolo/state.jsonA migrations/014_business_products_carried.sqlM src/server/render.js
Diff
commit 33ff0081218b10c60c0ec27bb4885773e5a8fee1
Author: animal-yolo <steve@designerwallcoverings.com>
Date: Fri May 8 14:32:07 2026 -0700
yolo: Pet store detail: 'what they sell' section
Task: yolo.pet-store-products
Prompt: In ~/Projects/animals: /clinic/:id pages where category='pet_store' should show a generic services/inventory blurb. Add a `products_carried` text[] column to businesses (migration needed). Default com
---
agents/animal-yolo/state.json | 4 ++--
migrations/014_business_products_carried.sql | 27 +++++++++++++++++++++++++++
src/server/render.js | 20 ++++++++++++++++++++
3 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/agents/animal-yolo/state.json b/agents/animal-yolo/state.json
index a2e732c..cab1b8f 100644
--- a/agents/animal-yolo/state.json
+++ b/agents/animal-yolo/state.json
@@ -1,5 +1,5 @@
{
- "cursor": 5,
- "runs": 5,
+ "cursor": 6,
+ "runs": 6,
"started_at": "2026-05-08T07:01:22.386Z"
}
\ No newline at end of file
diff --git a/migrations/014_business_products_carried.sql b/migrations/014_business_products_carried.sql
new file mode 100644
index 0000000..5d791f4
--- /dev/null
+++ b/migrations/014_business_products_carried.sql
@@ -0,0 +1,27 @@
+-- Project: Animals — pet_store inventory hint.
+--
+-- Adds a `products_carried text[]` column to businesses so /clinic/:id pages
+-- for pet_store rows can show a chips list of brands/items the store stocks.
+-- We don't actually scrape inventory from each store — it's a generic seed
+-- list of the obvious common items so the page isn't empty for stores we
+-- haven't enriched yet. Stores with real, enriched inventory will get their
+-- list overwritten by the enrichment job; the seed is just a default.
+
+BEGIN;
+
+ALTER TABLE businesses
+ ADD COLUMN IF NOT EXISTS products_carried TEXT[];
+
+-- Seed common inventory for pet_store rows that don't already have one.
+-- Idempotent — only fills NULLs, won't clobber enriched data.
+UPDATE businesses
+ SET products_carried = ARRAY[
+ 'Chewy',
+ 'Blue Buffalo',
+ 'Kong',
+ 'Petco house brand'
+ ]
+ WHERE category = 'pet_store'
+ AND products_carried IS NULL;
+
+COMMIT;
diff --git a/src/server/render.js b/src/server/render.js
index 048bc22..c2b2924 100644
--- a/src/server/render.js
+++ b/src/server/render.js
@@ -668,6 +668,25 @@ export function renderCategory({ category, dbCategory, businesses, ad }) {
}
export function renderBusiness({ biz, audit, ad, animals = [] }) {
+ const products = Array.isArray(biz.products_carried) ? biz.products_carried.filter(Boolean) : [];
+ const petStoreBlock = biz.category === 'pet_store' ? `
+ <section class="petstore-services">
+ <h2>Services & inventory</h2>
+ <p>Neighborhood pet store carrying food, treats, toys, and basic supplies for dogs, cats, and small pets. Most independent pet stores stock a mix of national brands and house labels — call ahead to confirm a specific item is in stock${biz.phone ? ` (<a href="tel:${esc(biz.phone)}">${esc(biz.phone)}</a>)` : ''}.</p>
+ ${products.length ? `
+ <h3>Products carried</h3>
+ <ul class="chips">
+ ${products.map(p => `<li class="chip">${esc(p)}</li>`).join('')}
+ </ul>
+ ` : ''}
+ </section>
+ <style>
+ .petstore-services{margin:24px 0}
+ .petstore-services h2{font-weight:400;margin-bottom:8px}
+ .petstore-services h3{font-weight:500;font-size:14px;margin:16px 0 8px;color:#5a6f63;text-transform:uppercase;letter-spacing:.06em}
+ .petstore-services .chips{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:8px}
+ .petstore-services .chip{background:#eef4ea;border:1px solid #c8d4be;color:#0f4d3a;padding:4px 12px;border-radius:999px;font-size:13px}
+ </style>` : '';
const animalsBlock = animals.length ? `
<section class="adoptable">
<h2>Adoptable animals <span class="muted small">(${animals.length})</span></h2>
@@ -742,6 +761,7 @@ export function renderBusiness({ biz, audit, ad, animals = [] }) {
${adSlot(ad, 'sidebar', `/clinic/${biz.id}`)}
</div>
</div>
+ ${petStoreBlock}
${animalsBlock}
${leadForm()}
</main>` + footer() + '</body></html>';
← d1144d1 yolo: 3D dog park: use dog's actual photo as billboard textu
·
back to Animals
·
yolo: Business owners can claim their listing 2fa8980 →