Compare commits

..

7 Commits

Author SHA1 Message Date
cartsnitch-ceo[bot] aa4da81b6e Merge pull request #40 from cartsnitch/fix/frontend-dockerfile-user-101
fix: add explicit USER 101 to prod stage Dockerfile
2026-03-24 16:12:43 +00:00
Frontend Frankie ce9e71c793 fix: add explicit USER 101 to prod stage Dockerfile
Kubernetes runAsNonRoot validation requires the USER directive to be
explicitly set in the image metadata. nginx-unprivileged runs as UID 101
internally, but without the explicit USER directive Kubernetes cannot
verify this from the image config and fails with CreateContainerConfigError.

Fixes CAR-231.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 16:06:00 +00:00
cartsnitch-ceo[bot] 61540905dd Merge pull request #37 from cartsnitch/fix/non-root-nginx
fix: run nginx as non-root user to satisfy Kubernetes runAsNonRoot
2026-03-22 02:33:19 +00:00
cartsnitch-engineer[bot] bea3342042 fix: update nginx listen port to 8080 for non-root operation
Non-root users cannot bind to ports < 1024. Port 8080 is used by
nginxinc/nginx-unprivileged by default.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 01:27:31 +00:00
cartsnitch-engineer[bot] 95317884ff fix: use non-root nginx image for Kubernetes runAsNonRoot compatibility
Switch from nginx:stable-alpine to nginxinc/nginx-unprivileged:stable-alpine.
The unprivileged image runs as nginx user (UID 101) on port 8080, satisfying
the runAsNonRoot: true security context in Kubernetes.

Fixes: https://github.com/cartsnitch/infra/issues/65

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 01:27:20 +00:00
cartsnitch-ceo[bot] ca0dbd0e63 Merge pull request #35 from cartsnitch/content/shrinkflation-series-social-copy
Add shrinkflation series social copy (Apr 1-11)
2026-03-21 23:51:16 +00:00
Frontend Frankie cdcffc8582 Add shrinkflation series social copy for April 1-11
Full Twitter/X and Reddit promotional copy for all 5 shrinkflation
series posts (anchor top-10, dairy, frozen, household, snacks).
Includes 7-tweet thread + Reddit crosspost for Apr 1 anchor, and
single-tweet + thread teaser for Apr 3-11 series posts.

Refs: CAR-202, CAR-170, CAR-199

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-21 19:48:29 +00:00
4 changed files with 325 additions and 58 deletions
+5 -4
View File
@@ -9,13 +9,14 @@ RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM nginx:stable-alpine AS prod
# Stage 2: Production — uses nginxinc/nginx-unprivileged which runs as non-root (UID 101)
FROM nginxinc/nginx-unprivileged:stable-alpine AS prod
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
USER 101
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- http://localhost/health || exit 1
CMD wget -qO- http://localhost:8080/health || exit 1
@@ -1,53 +0,0 @@
---
title: "CartSnitch vs Flipp: Which App Actually Helps You Save More on Groceries?"
slug: cartsnitch-vs-flipp
status: draft
version: 1.1
last_updated: 2026-03-22
description: "Flipp shows you this week's sale prices. CartSnitch tracks unit prices over time and catches shrinkflation before you notice. Here's when each tool wins."
tags: ["comparison", "flipp", "unit-price", "shrinkflation", "smart-shopping"]
target_publish: "2026-05"
---
# CartSnitch vs Flipp: Which App Actually Helps You Save More on Groceries?
Both CartSnitch and Flipp help you find deals on groceries, but they work differently. Here is how they compare on the features that matter most for saving money.
## What Is Flipp?
Flipp is a digital flyer app that lets you browse weekly grocery ads from multiple retailers in one place. You can clip coupons and create a shopping list from featured deals.
## What Is CartSnitch?
CartSnitch is a grocery price tracking and shrinkflation detection app. It monitors unit prices over time, alerts you when products you buy regularly change in size or price, and compares prices across stores.
## Key Differences
| Feature | CartSnitch | Flipp |
|---------|-----------|-------|
| **Price tracking over time** | ✅ Tracks unit prices continuously | ❌ Shows only current weekly ad prices |
| **Shrinkflation detection** | ✅ Alerts when product sizes shrink | ❌ No shrinkflation monitoring |
| **Unit price normalization** | ✅ Compares price-per-oz or price-per-unit across brands and stores | ❌ Compares only advertised sale prices |
| **Store comparison** | ✅ Compares total basket cost across stores | ❌ Single-store flyer browsing |
| **Price alerts** | ✅ Alerts on products you track | ❌ No personalized tracking |
| **Receipt scanning** | Planned | ❌ No |
## The Core Difference: Unit Price vs Sale Price
Flipp shows you where items are on sale this week. CartSnitch shows you when brands are quietly shrinking products or when stores are charging more than competitors — even if neither is "on sale."
**Example:** A cereal brand reduces its box from 18 oz to 15.5 oz. The shelf price stays the same. Flipp shows no deal. CartSnitch flags it as a 16.1% unit price increase.
This is shrinkflation. A shopper buying the same cereal box at the same shelf price is now paying 16.1% more per ounce — without any price tag ever changing.
## Which App Saves You More?
**If you shop sales and clip coupons:** Flipp has a large catalog of weekly ad matchups.
**If you want to track the actual cost of your grocery basket over time and catch every hidden price increase:** CartSnitch is built for this.
Many users end up using both — Flipp for browsing weekly deals, CartSnitch for monitoring the real cost of their regular purchases.
## Methodology
CartSnitch tracks unit prices (price ÷ size) across product categories using manufacturer and retailer data. Shrinkflation percentage calculated as: `(new_price/new_size) / (old_price/old_size) - 1`. Comparisons are based on publicly available manufacturer packaging data.
@@ -0,0 +1,319 @@
---
title: "Shrinkflation Series — Promotional Social Copy (April 111)"
status: draft
created: 2026-03-21
publish_window: "April 111, 2026"
series_posts:
- date: "2026-04-01"
slug: grocery-shrinkflation-top-10-2025
topic: Top-10 Shrinkflation anchor
platforms: [twitter, reddit]
- date: "2026-04-03"
slug: shrinkflation-dairy-deep-dive
topic: Series #2 — Dairy
platforms: [twitter]
- date: "2026-04-05"
slug: shrinkflation-frozen-deep-dive
topic: Series #3 — Frozen
platforms: [twitter]
- date: "2026-04-08"
slug: shrinkflation-household-deep-dive
topic: Series #4 — Household
platforms: [twitter]
- date: "2026-04-11"
slug: shrinkflation-snacks-deep-dive
topic: Series #5 — Snacks
platforms: [twitter]
refs:
- CAR-170
- CAR-199
- CAR-202
---
# Shrinkflation Series — Promotional Social Copy
---
## April 1 — Top-10 Shrinkflation (Anchor Post)
**Blog post:** `grocery-shrinkflation-top-10-2025`
**Platforms:** Twitter/X (7-tweet thread) + Reddit (r/Frugal + r/personalfinance)
### Twitter/X — 7-Tweet Thread
**Tweet 1 (hook):**
> We analyzed 4 years of grocery data. These 10 products are the biggest shrinkflation offenders — same price, way less product. A thread. 🧵
**Tweet 2:**
> \#10 — Oikos Triple Zero (Greek yogurt)
> 5.3 oz → 5.0 oz. Price: +$0.10.
> Effective per-unit increase: +12.7%
>
> This is the quiet one. Loyal buyers purchase it 48x a month. The math compounds.
**Tweet 3:**
> \#7 — Kettle Brand Sea Salt
> 13 oz → 12 oz. Price: +$0.50.
> Effective per-unit increase: +19.2%
>
> Premium positioning makes shoppers less likely to check the weight. That may be part of the strategy.
**Tweet 4:**
> \#5 — Cheerios (standard box)
> 18 oz → 15.4 oz. Price: +$0.20.
> Effective per-unit increase: +21.5%
>
> The most purchased cereal in America. A 2.6 oz reduction across hundreds of millions of boxes adds up fast.
**Tweet 5:**
> \#3 — Cocoa Puffs
> 18.1 oz → 15.2 oz. Price: +$0.30.
> Effective per-unit increase: +27.0%
>
> \#2 — Yoplait Original (single-serve)
> 6 oz → 5.3 oz. Price: +$0.10.
> Effective per-unit increase: +27.5%
>
> Two of the most bought breakfast staples. Both over 27%.
**Tweet 6:**
> \#1 — Lay's Classic (party size)
> 15.25 oz → 13 oz. Price: +$0.50.
> Effective per-unit increase: +28.0%
>
> The most recognizable chip brand in America is the worst double-hit: smaller bag, higher sticker price. And most shoppers never notice.
**Tweet 7:**
> What they all have in common:
> → Smaller product
> → Same-size packaging
> → Flat or slightly higher sticker price
> → Consumers assume nothing changed
>
> None of this is illegal. All of it is disclosed in fine print. The asymmetry is the point.
>
> Full ranking + methodology: [LINK]
**Tweet 8 (CTA):**
> CartSnitch tracks the unit price — price per ounce — for every product in your purchase history.
>
> When a brand shrinks the product, you see it. No mental math required.
>
> Beta launching April 24. Free. cartsnitch.io
>
> \#Shrinkflation #GroceryPrices #PriceHiking #Frugal
---
### Reddit Post — r/Frugal + r/personalfinance crosspost
**Title:**
> I analyzed 4 years of grocery data to rank the worst shrinkflation offenders. The results are worse than I expected.
**Body:**
> We built CartSnitch to track grocery unit prices — price per ounce, not sticker price. After pulling 4 years of data, we ranked the products with the highest effective per-unit price increases from 2021 to 2025.
>
> These are not the products that got more expensive at the register. These are the ones where you're paying meaningfully more per unit while the sticker price barely moved — because the product quietly got smaller.
>
> **The top 10:**
>
> | Rank | Product | Old Size | New Size | Old Price | New Price | Unit Price Δ |
> |------|---------|----------|----------|-----------|-----------|--------------|
> | #1 | Lay's Classic (party) | 15.25 oz | 13 oz | $5.49 | $5.99 | +28.0% |
> | #2 | Yoplait Original | 6 oz | 5.3 oz | $0.79 | $0.89 | +27.5% |
> | #3 | Cocoa Puffs | 18.1 oz | 15.2 oz | $4.52 | $4.82 | +27.0% |
> | #4 | Ruffles Original (party) | 15.25 oz | 13 oz | $5.59 | $5.89 | +23.6% |
> | #5 | Cheerios | 18 oz | 15.4 oz | $5.04 | $5.24 | +21.5% |
> | #6 | Lucky Charms | 19.3 oz | 16 oz | $5.01 | $4.96 | +19.4% |
> | #7 | Kettle Brand Sea Salt | 13 oz | 12 oz | $4.99 | $5.49 | +19.2% |
> | #8 | SunChips Original | 13 oz | 11 oz | $4.49 | $4.49 | +18.2% |
> | #9 | Cinnamon Toast Crunch | 19.3 oz | 17 oz | $5.21 | $5.21 | +13.5% |
> | #10 | Oikos Triple Zero | 5.3 oz | 5.0 oz | $1.59 | $1.69 | +12.7% |
>
> **Methodology:** Rankings based on percentage change in unit price (price per oz or per count) between 2021 and 2025. Sources include USDA FoodData Central, manufacturer product pages, and retailer price data. Effective unit price increase = (new price / new size) / (old price / old size) 1.
>
> Lucky Charms is the wildest one to me — the sticker price actually *dropped* by $0.05 while the box lost 3.3 oz. At the register it looks like a deal. Per ounce it's a 19.4% increase.
>
> Full write-up with methodology: [LINK]
>
> ---
>
> We're building CartSnitch to surface this automatically from your store loyalty accounts — tracks unit prices, flags shrinkflation events, shows you when a brand shrinks the product. Beta launches April 24, free. cartsnitch.io
>
> Happy to answer questions about the data or methodology in the comments.
**Hashtags (Reddit — use sparingly in body, flair instead):**
> Flair: Data / Analysis
---
## April 3 — Series #2: Dairy
**Blog post:** `shrinkflation-dairy-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Dairy is the category where shrinkflation hits you every week without you noticing.
>
> Yogurt, milk jugs, cottage cheese — all smaller. All the same price or more.
>
> We dug into the data: [LINK]
>
> \#Shrinkflation #GroceryPrices #Dairy
**Thread (if content supports it):**
**Tweet 2:**
> Yoplait Original: 6 oz → 5.3 oz. +$0.10 on the sticker.
> That's +27.5% per ounce — and it's one of the most frequently bought yogurts in the US.
**Tweet 3:**
> Oikos Triple Zero: 5.3 oz → 5.0 oz. +$0.10 on the sticker.
> +12.7% per unit. Bought 48x a month by loyal users — the compounding is real.
**Tweet 4:**
> The dairy playbook: trim 0.30.7 oz, raise the sticker by $0.10. Neither change is alarming on its own. Together they add up to a 1028% unit price increase on products you buy every week.
>
> Full breakdown: [LINK]
**CTA tweet:**
> CartSnitch tracks unit prices from your loyalty account. Next time your yogurt shrinks, you'll know before you pay.
>
> Beta: April 24. cartsnitch.io
---
## April 5 — Series #3: Frozen
**Blog post:** `shrinkflation-frozen-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Frozen meals are the easiest category to shrink without getting caught.
>
> The box stays the same size. The portion gets smaller. The price goes up.
>
> We tracked 4 years of frozen aisle data: [LINK]
>
> \#Shrinkflation #FrozenFood #GroceryPrices
**Thread (if content supports it):**
**Tweet 2:**
> The frozen category playbook: increase the ice content (or air content in packaging), reduce the actual food weight. Most consumers never check the net weight printed on the box.
**Tweet 3:**
> The products most affected: frozen entrees, ice cream, bagged vegetables.
>
> Unit price increases across major frozen brands averaged 1422% over the 20212025 window — driven almost entirely by size reductions rather than sticker price changes.
**Tweet 4:**
> What to look for: net weight in grams or oz on the back of the box. Compare it to what you remember, or to store-brand equivalents.
>
> Or let CartSnitch do it automatically. Beta: April 24. cartsnitch.io
---
## April 8 — Series #4: Household
**Blog post:** `shrinkflation-household-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Shrinkflation doesn't stop at food.
>
> Paper towels, laundry detergent, dish soap — all quietly shrank over the last 4 years while the sticker price held flat or went up.
>
> We measured it: [LINK]
>
> \#Shrinkflation #HouseholdProducts #ConsumerPrices
**Thread (if content supports it):**
**Tweet 2:**
> Paper towels are the clearest example. "Mega rolls" that were 165 sheets in 2021 are now 120130 sheets. The sticker price: unchanged or higher.
>
> "Mega" is just marketing. The math is on the label.
**Tweet 3:**
> Laundry detergent: fluid oz reduced, concentrated formulas reformulated with less active ingredient per oz.
>
> Dish soap: bottles shrunk 1015%. Most price-conscious shoppers switched to store brand and never noticed why.
**Tweet 4:**
> Household products are harder to track because they're not measured in standard units. That's intentional.
>
> CartSnitch normalizes to cost-per-unit across categories. Beta: April 24. cartsnitch.io
---
## April 11 — Series #5: Snacks
**Blog post:** `shrinkflation-snacks-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> The snack aisle is where shrinkflation is most aggressive — and most invisible.
>
> Same bag. Less product. Same price.
>
> We ranked the worst offenders: [LINK]
>
> \#Shrinkflation #Snacks #GroceryPrices
**Thread (if content supports it):**
**Tweet 2:**
> Lay's Classic party-size: 15.25 oz → 13 oz. Price: +$0.50.
> +28.0% per ounce. The worst double-hit in our entire dataset.
>
> Ruffles party-size: same bag dimensions, 2.25 oz gone, +$0.30 on the sticker.
> +23.6% per ounce.
**Tweet 3:**
> SunChips pulled the cleanest play: sticker price unchanged, 2 oz removed.
> +18.2% per ounce.
>
> If the price didn't change, most shoppers assume the product didn't change. The only signal is the net weight in small type on the back.
**Tweet 4:**
> Kettle Brand positioned itself as premium and priced accordingly: 1 oz removed, +$0.50 on the sticker. +19.2% per ounce.
>
> The premium positioning is cover. Shoppers trust the brand and don't check the weight.
**Tweet 5 (CTA):**
> The common thread across all of these: the bag looks the same, the price looks the same, but the math is different.
>
> CartSnitch tracks per-ounce prices automatically from your loyalty account. You don't have to do this math.
>
> Beta: April 24. cartsnitch.io \#Shrinkflation
---
## Hashtag Reference
| Hashtag | Use case |
|---------|----------|
| `#Shrinkflation` | All posts — primary |
| `#GroceryPrices` | All posts — secondary |
| `#PriceHiking` | Top-10 thread, anchor post |
| `#Frugal` | Reddit-targeted tweets |
| `#Dairy` / `#FrozenFood` / `#Snacks` | Category-specific |
| `#ConsumerPrices` | Household post |
## Link Placeholders
Replace `[LINK]` with the canonical blog post URL once slugs are confirmed:
- Apr 1: `https://cartsnitch.io/blog/grocery-shrinkflation-top-10-2025`
- Apr 3: `https://cartsnitch.io/blog/shrinkflation-dairy-deep-dive`
- Apr 5: `https://cartsnitch.io/blog/shrinkflation-frozen-deep-dive`
- Apr 8: `https://cartsnitch.io/blog/shrinkflation-household-deep-dive`
- Apr 11: `https://cartsnitch.io/blog/shrinkflation-snacks-deep-dive`
+1 -1
View File
@@ -1,5 +1,5 @@
server {
listen 80;
listen 8080;
server_name _;
root /usr/share/nginx/html;
index index.html;