Skip to content
Back to endeavors

Canes Cellys

Did the Canes score you free stuff?

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Cloudflare Workers
  • Cloudflare KV

The idea

After every Hurricanes game, there are up to six local sponsor deals — free Bo-Berry biscuits, BOGO chicken, free tacos — but each one has different trigger conditions and redemption windows. No single place to check what you actually earned. I wanted to fix that.

Scriptable script

Problem: I wanted a quick personal check — did last night’s game score me any free food?

Solution: Built a Scriptable script that hits the NHL Stats API, evaluates six promo trigger conditions (power play goals, shutouts, away wins, hat tricks, etc.), and returns a JSON result I could wire into iOS Shortcuts.

Outcome: Worked great for me, but nobody else could use it without Scriptable installed.

Web app on Cloudflare

Problem: I wanted something I could share with other fans — a link I could text after a game.

Solution: Ported the engine to a Next.js app on Cloudflare Pages. The core fetches five NHL API endpoints in parallel and handles the timezone edge case where Cloudflare Workers run UTC but the NHL operates in Eastern. Added smart caching with KV — 5-minute TTL for live scores, up to 6 hours for monthly schedules.

Outcome: Shipped at CanesCellys.com with auto-deploy on merge to main. Rebranded from “Caniac Promo Checker” to “Canes Cellys” with a proper dark mode theme.

Admin dashboard & sharing

Problem: Promo rules change mid-season. The Chick-fil-A trigger switched from “last home game of the month” to “last home game win.” I didn’t want to push code every time a sponsor tweaked their deal.

Solution: Built a KV-backed admin dashboard — promo definitions, combo messages, sponsor logos, and display toggles are all configurable without deploys. Added a share button with native Web Share API on mobile and OG metadata so links preview cleanly in iMessage.

Outcome: When the CFA trigger changed, it was a config update instead of a code change. KV migration handles old trigger types automatically.

Live game tracking

Problem: During a game, you want to know if promos are building — is the shutout still intact? Are we close to a hat trick?

Solution: Added Promo Watch — real-time progress badges on the game card that update every 3 minutes. Tracks PP goals, shutout status, away win progress, and hat trick contenders during live games.

Outcome: The app went from a morning-after check to something worth opening during the game. 79+ tests cover the promo logic across all states.