{
 "vendor": "Claude",
 "maker": "Anthropic",
 "generated": "2026-10-05T15:04+00:00",
 "newest_comment": "2026-10-05T11:44+00:00",
 "window_days": 60,
 "people": 4326,
 "source": "https://machinemorning.com/giveaway/claude.html",
 "habits": [
  {
   "key": "emdash",
   "name": "The em dash hinge",
   "applies_to": "writing",
   "instruction": "Use at most one em dash in a reply, and only for a true aside. Where a dash would hang a reason or a punchline on a sentence, end the sentence with a period or use a comma instead, and do not swap in \"--\" or the other substitutes.",
   "substitutes": [
    "--",
    ":",
    ";",
    "→"
   ],
   "checks": [
    {
     "target": "text",
     "regex": "(?:[^\\n]*?\\s[—–]\\s){2,}",
     "flags": "",
     "what": "two spaced dashes per paragraph"
    },
    {
     "target": "text",
     "regex": "\\s--\\s",
     "flags": "",
     "what": "double hyphen used as dash"
    },
    {
     "target": "text",
     "regex": "(?m)^\\W*\\w+(?:\\s\\w+)?\\s?[—–]\\s",
     "flags": "",
     "what": "short opener then dash"
    }
   ],
   "not_a_ban_on": "An occasional em dash around a real aside is fine.",
   "people_60d": 439,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#emdash"
  },
  {
   "key": "claudish",
   "name": "Load-bearing, seams, blast radius",
   "applies_to": "writing",
   "instruction": "Say what you mean in plain words every time. Replace \"load-bearing\" with \"essential\" and replace \"seam\" or \"blast radius\" with the actual boundary or risk. Define any new label before you use it.",
   "substitutes": [
    "load bearing",
    "loadbearing"
   ],
   "checks": [
    {
     "target": "text",
     "regex": "\\bload[\\s-]?bearing\\b",
     "flags": "i",
     "what": "\"load-bearing\" metaphor"
    },
    {
     "target": "text",
     "regex": "\\b(?:seams?|blast radius|foot-?guns?|smoking gun|earns? (?:its|their) keep|the spine of)\\b",
     "flags": "i",
     "what": "engineering house words"
    }
   ],
   "not_a_ban_on": "Technical terms are fine in technical text when they are the right word.",
   "people_60d": 205,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#claudish"
  },
  {
   "key": "rhythm",
   "name": "Metronome paragraphs",
   "applies_to": "writing",
   "instruction": "Vary paragraph length on purpose, so some paragraphs run long and some stop after one sentence. End each paragraph on its last real point instead of a neat summary line, and avoid runs of short fragments used for emphasis.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Short sentences and parallel structure are fine where the content calls for them.",
   "people_60d": 97,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#rhythm"
  },
  {
   "key": "format",
   "name": "Document furniture in prose",
   "applies_to": "writing",
   "instruction": "Answer short questions in plain paragraphs. Use headers and bullets only for long documents that readers will scan, and do not open each bullet with a bold label or put emoji on headings.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "(?m)^\\s*(?:[-*•]|\\d+\\.)\\s+\\*\\*[^*\\n]+\\*\\*\\s*(?:[—–:]|-\\s)",
     "flags": "",
     "what": "bold label opening each bullet"
    },
    {
     "target": "text",
     "regex": "\\*\\*[^*]{30,}?[.!?]\\*\\*",
     "flags": "",
     "what": "whole sentence in bold"
    },
    {
     "target": "text",
     "regex": "(?m)^#{1,6}\\s[^\\n]*[\\U0001F300-\\U0001FAFF\\u2600-\\u27BF]",
     "flags": "",
     "what": "emoji on a heading"
    }
   ],
   "not_a_ban_on": "Headings and lists in long reference documents stay useful.",
   "people_60d": 65,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#format"
  },
  {
   "key": "opener",
   "name": "Candour labels and signposts",
   "applies_to": "writing",
   "instruction": "State the point without announcing it. Leave out \"honestly\", \"genuinely\", \"here's the thing\" and \"worth flagging\", and add a caveat only when it changes what the reader should do.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:honest(?:ly)?|genuine(?:ly)?)\\b",
     "flags": "i",
     "what": "candour words",
     "min": 2
    },
    {
     "target": "text",
     "regex": "\\b(?:here['’]?s the (?:thing|part)|the part (?:that|i)|worth (?:noting|flagging|sitting with|adding)|one thing i['’]?(?:d|ll) flag)\\b",
     "flags": "i",
     "what": "signpost phrases",
     "min": 2
    }
   ],
   "not_a_ban_on": "Saying \"honestly\" once to admit a real mistake is fine.",
   "people_60d": 63,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#opener"
  },
  {
   "key": "verbose",
   "name": "Padded and long",
   "applies_to": "writing",
   "instruction": "Put the answer in the first sentence and stop when the question is answered. Say each point once without a preamble or a recap. Add caveats only when they change the answer.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Detail the user asked for, or that a reader would miss, stays in.",
   "people_60d": 59,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/claude.html#verbose"
  },
  {
   "key": "vocab",
   "name": "Buzzword-heavy corporate register",
   "applies_to": "writing",
   "instruction": "Write in the register the user asked for and use everyday words. Repeat the project's agreed terms instead of rotating synonyms, and leave out stock words such as \"delve\", \"leverage\", \"seamless\" and \"in today's landscape\".",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:delve[sd]?|delving|leverag(?:e|es|ed|ing)|seamless(?:ly)?|robust|crucial|pivotal|tapestry|foster(?:s|ing)?|underscores?)\\b",
     "flags": "i",
     "what": "stock AI buzzwords"
    },
    {
     "target": "text",
     "regex": "\\b(?:in today['’]s|furthermore|moreover|let['’]s dive in|it['’]s worth noting)\\b",
     "flags": "i",
     "what": "stock transitions"
    }
   ],
   "not_a_ban_on": "Technical terms the reader needs, and a formal tone when the user asks for one, stay allowed.",
   "people_60d": 36,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#vocab"
  },
  {
   "key": "notx",
   "name": "The \"not X, but Y\" reframe",
   "applies_to": "writing",
   "instruction": "Say what something is directly. Use a \"not X, it's Y\" contrast only when the reader really holds view X, and at most once in a piece.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:it|this|that)(?:['’]s| is)(?: not|n['’]t)\\b[^.!?\\n]{1,80}?(?:[.;,]|\\s[—–])\\s*(?:it|this|that)(?:['’]s| is)\\b",
     "flags": "i",
     "what": "\"not X, it's Y\" contrast",
     "min": 2
    },
    {
     "target": "text",
     "regex": "\\bnot just\\b[^.!?\\n]{1,60}?(?:[.;,]|\\s[—–])\\s*(?:it|this|that|they)(?:['’]s|['’]re| is| are)\\b",
     "flags": "i",
     "what": "\"not just X\" escalation",
     "min": 2
    },
    {
     "target": "text",
     "regex": "(?:^|[.!?]\\s+)Not\\b[^.!?\\n]{1,60}[.,]\\s+(?:not|Not|Just)\\b",
     "flags": "",
     "what": "run of negations",
     "min": 2
    }
   ],
   "not_a_ban_on": "A contrast that answers a view the reader really holds is fine.",
   "people_60d": 31,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#notx"
  },
  {
   "key": "closer",
   "name": "The tidy bow at the end",
   "applies_to": "writing",
   "instruction": "End a paragraph or a reply on its last piece of content. Do not add a summary line, an aphorism, an unasked note or a question back to the reader.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:I hope this helps|let me know if|curious (?:what|how) (?:you|everyone)|would you like me to|do you agree\\?)",
     "flags": "i",
     "what": "stock closing lines"
    },
    {
     "target": "text",
     "regex": "(?:^|\\n|[.!?]\\s+)\\**\\w+\\?\\**\\s*\\Z",
     "flags": "",
     "what": "one word question at end"
    }
   ],
   "not_a_ban_on": "A closing line the user asked for, such as a polite sign off, is fine.",
   "people_60d": 31,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#closer"
  },
  {
   "key": "punct",
   "name": "Colon-led payoffs",
   "applies_to": "writing",
   "instruction": "Write the point as a plain sentence instead of a short setup followed by a colon and the payoff. Keep colons for real lists and definitions, and when you drop em dashes, use periods instead of semicolons or arrows.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "(?:^|[.!?]\\s+)(?:\\*\\*)?[A-Z][^.!?:\\n]{2,80}:(?:\\*\\*)?\\s+[A-Za-z]",
     "flags": "",
     "what": "short setup then colon",
     "min": 2
    },
    {
     "target": "text",
     "regex": "\\w;\\s+\\w",
     "flags": "",
     "what": "semicolon joining clauses",
     "min": 2
    },
    {
     "target": "text",
     "regex": "→",
     "flags": "",
     "what": "unicode arrow",
     "min": 2
    }
   ],
   "not_a_ban_on": "Colons that introduce a list or a definition stay allowed.",
   "people_60d": 29,
   "last_seen": "2026-09-26",
   "card_url": "https://machinemorning.com/giveaway/claude.html#punct"
  },
  {
   "key": "empty",
   "name": "Polished but says nothing",
   "applies_to": "writing",
   "instruction": "Give each paragraph a new fact, number, name or example, and cut sentences that restate the request or the previous point. Replace vague lines such as \"something shifted\" with what actually changed.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:something (?:shifted|changed|else entirely)|let that sink in)\\b",
     "flags": "i",
     "what": "vague grand framing"
    }
   ],
   "not_a_ban_on": "Atmospheric lines in fiction are fine when used sparingly.",
   "people_60d": 25,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#empty"
  },
  {
   "key": "three",
   "name": "Rule of three",
   "applies_to": "writing",
   "instruction": "Use the number of items the content really has. When a list comes out as three, check whether the true count is two or four. Avoid runs of three short parallel beats for emphasis.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(\\w+(?: \\w+)?)\\b[^,.!?\\n]{0,25}[.,]\\s+\\1\\b[^,.!?\\n]{0,25}[.,]\\s+(?:and\\s+|or\\s+)?\\1\\b",
     "flags": "i",
     "what": "three parallel beats",
     "min": 2
    }
   ],
   "not_a_ban_on": "A list of three is fine when the content has exactly three items.",
   "people_60d": 14,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/claude.html#three"
  },
  {
   "key": "hedge",
   "name": "Soft-framed hedging",
   "applies_to": "writing",
   "instruction": "State the claim first and qualify it once, only where the evidence is weak. When you disagree, say so plainly. End a comparison by taking a position.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:gently push back|push back (?:gently|slightly)|worth being precise|hold (?:that|this|it) lightly|both fair|it['’]s worth noting)\\b",
     "flags": "i",
     "what": "stock softening phrases"
    }
   ],
   "not_a_ban_on": "A hedge where the uncertainty is real and matters to the reader stays.",
   "people_60d": 11,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#hedge"
  },
  {
   "key": "flawless",
   "name": "Too-clean prose, faked mess",
   "applies_to": "writing",
   "instruction": "When asked to sound more human, rework the sentence structure itself. Do not lowercase sentence starts or plant typos on top of correct punctuation, since readers spot that as a disguise.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Correct grammar and spelling remain the default.",
   "people_60d": 2,
   "last_seen": "2026-08-17",
   "card_url": "https://machinemorning.com/giveaway/claude.html#flawless"
  },
  {
   "key": "purple",
   "name": "The AI purple",
   "applies_to": "web_ui",
   "instruction": "Choose the accent colour from the brand or the subject instead of defaulting to violet or indigo. Skip blue to purple gradients on hero text and buttons, and skip soft glows behind cards.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "\\b(?:bg|text|from|via|to|border|ring|shadow)-(?:purple|violet|indigo|fuchsia)-\\d{2,3}\\b",
     "flags": "",
     "what": "Tailwind purple classes"
    },
    {
     "target": "css",
     "regex": "#(?:7c3aed|8b5cf6|a855f7|6366f1|4f46e5|9333ea|a78bfa|818cf8|6d28d9|c084fc)\\b|\\b(?:purple|violet|indigo|blueviolet)\\b",
     "flags": "i",
     "what": "violet or indigo colour"
    },
    {
     "target": "css",
     "regex": "background-clip:\\s*text",
     "flags": "",
     "what": "gradient filled heading text"
    }
   ],
   "not_a_ban_on": "Purple is fine when the brand already uses it.",
   "people_60d": 64,
   "last_seen": "2026-10-03",
   "card_url": "https://machinemorning.com/giveaway/claude.html#purple"
  },
  {
   "key": "fonts",
   "name": "Serif headline, one italic word",
   "applies_to": "web_ui",
   "instruction": "Pick one or two type families that suit the brand and use them consistently. Avoid the stock recipe of a serif headline with one italic accent word, a tiny tracked caps label above it and monospace outside code.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "<h[12]\\b[^>]*>(?:(?!</h[12]>).)*<(?:em|i)\\b",
     "flags": "i",
     "what": "italic word in headline"
    },
    {
     "target": "css",
     "regex": "font-family:\\s*['\\\"]?(?:Playfair Display|Fraunces|Instrument Serif)",
     "flags": "i",
     "what": "stock display serif"
    }
   ],
   "not_a_ban_on": "Any of these fonts on its own, chosen on purpose, is fine.",
   "people_60d": 58,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#fonts"
  },
  {
   "key": "cards",
   "name": "Cards, with an accent stripe",
   "applies_to": "web_ui",
   "instruction": "Group content with spacing and headings instead of boxing every item, and give the most important item more size than the rest. Leave out the coloured accent stripe on one edge of cards.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "border-left:\\s*[2-6]px\\s+solid",
     "flags": "i",
     "what": "accent stripe on card edge"
    },
    {
     "target": "html",
     "regex": "\\bborder-l-(?:2|4|\\[[3-6]px\\])\\b",
     "flags": "",
     "what": "Tailwind left edge stripe"
    }
   ],
   "not_a_ban_on": "Cards stay allowed for items that are separate objects, like products.",
   "people_60d": 34,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#cards"
  },
  {
   "key": "pills",
   "name": "Pill above the headline",
   "applies_to": "web_ui",
   "instruction": "Use a pill only for a real tag or status, and drop the badge above the headline. Vary the corner radius by element instead of giving every container the same large rounding.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "<(?:span|div|a|p)\\b[^>]*\\brounded-full\\b[^>]*>(?:(?!</?h1).){1,200}?</(?:span|div|a|p)>\\s*(?:</div>\\s*)?<h1\\b",
     "flags": "i",
     "what": "pill right above the h1"
    },
    {
     "target": "css",
     "regex": "border-radius:\\s*(?:9999px|999px|100px)",
     "flags": "i",
     "what": "full pill radius"
    }
   ],
   "not_a_ban_on": "Rounded corners and real filter chips stay allowed.",
   "people_60d": 24,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/claude.html#pills"
  },
  {
   "key": "kit",
   "name": "Stock component kit",
   "applies_to": "web_ui",
   "instruction": "Restyle the component kit for the brief by changing radius, palette, spacing and icon set, and use the project's design tokens when it has them. Use icons only where they help someone find something, and never emoji in their place.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "\\blucide-(?:sparkles|zap|brain)\\b|<(?:Sparkles|Zap|Brain)\\b",
     "flags": "",
     "what": "stock Lucide sparkle icons"
    }
   ],
   "not_a_ban_on": "Using shadcn or Lucide is fine once the result is styled for the project.",
   "people_60d": 20,
   "last_seen": "2026-09-29",
   "card_url": "https://machinemorning.com/giveaway/claude.html#kit"
  },
  {
   "key": "hero",
   "name": "The same hero, every time",
   "applies_to": "web_ui",
   "instruction": "Build the opening section around what this product or client needs, such as a product photo or a live demo, instead of the stock pill, headline, two buttons and three cards. Change the section order from one brief to the next.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "A clear headline and a main button, which most pages need, stay.",
   "people_60d": 20,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#hero"
  },
  {
   "key": "eyebrow",
   "name": "Eyebrow over every heading",
   "applies_to": "web_ui",
   "instruction": "Let headings stand alone. Add a small label above a heading only when it carries real information, and number sections 01, 02 and so on only when order matters.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "text-transform:\\s*uppercase[^}]*letter-spacing|letter-spacing:[^}]*text-transform:\\s*uppercase",
     "flags": "i",
     "what": "tracked caps label"
    },
    {
     "target": "html",
     "regex": "class=\\\"(?=[^\\\"]*\\buppercase\\b)(?=[^\\\"]*\\btracking-)[^\\\"]*\\\"",
     "flags": "",
     "what": "tracked caps classes"
    },
    {
     "target": "html",
     "regex": ">\\s*0[1-9]\\s*(?:[/·.—–-]\\s*)?<",
     "flags": "",
     "what": "01 02 section numbers"
    }
   ],
   "not_a_ban_on": "An occasional kicker that adds information, as in editorial design, is fine.",
   "people_60d": 19,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#eyebrow"
  },
  {
   "key": "cream",
   "name": "Cream and terracotta page",
   "applies_to": "web_ui",
   "instruction": "Take the background and accent colours from the brand or the subject. Without a brief, avoid the warm cream page with rust orange accents and a large serif headline, which reads as Anthropic's own palette.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "#(?:c15f3c|d97757|cc785c|da7756)\\b",
     "flags": "i",
     "what": "Claude orange hex"
    },
    {
     "target": "css",
     "regex": "background(?:-color)?:\\s*#(?:faf9f5|(?:f[5-9a-f]|e[8-9a-f])(?:f[0-9a-f]|e[5-9a-f])(?:e[0-9a-f]|d[5-9a-f]))\\b",
     "flags": "i",
     "what": "cream page background"
    }
   ],
   "not_a_ban_on": "Warm palettes chosen to fit the brand are fine.",
   "people_60d": 15,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#cream"
  },
  {
   "key": "glass",
   "name": "Hairline borders, edge stripe",
   "applies_to": "web_ui",
   "instruction": "Separate areas with spacing or a background change instead of a faint 1px border on every container, and drop the coloured stripe on one edge of status cards. Use blur and glass panels only where content really sits over an image.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "border-left:\\s*[3-6]px\\s+solid",
     "flags": "i",
     "what": "one sided accent border"
    },
    {
     "target": "css",
     "regex": "backdrop-filter:\\s*blur",
     "flags": "i",
     "what": "frosted glass blur"
    },
    {
     "target": "css",
     "regex": "border:\\s*1px\\s+solid\\s+rgba\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*0?\\.[0-2]\\d*\\s*\\)",
     "flags": "i",
     "what": "faint translucent 1px border"
    }
   ],
   "not_a_ban_on": "Borders that separate items a reader must tell apart stay allowed.",
   "people_60d": 14,
   "last_seen": "2026-09-29",
   "card_url": "https://machinemorning.com/giveaway/claude.html#glass"
  },
  {
   "key": "dark",
   "name": "Dark by default, grey on grey",
   "applies_to": "web_ui",
   "instruction": "Use a light theme unless the brief or the subject calls for dark. Give labels and helper text strong contrast against their background and a size people can read.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "font-size:\\s*(?:[5-9](?:\\.\\d+)?|10)px",
     "flags": "i",
     "what": "tiny text size"
    }
   ],
   "not_a_ban_on": "Dark themes are fine when the subject or the user calls for one.",
   "people_60d": 11,
   "last_seen": "2026-10-01",
   "card_url": "https://machinemorning.com/giveaway/claude.html#dark"
  },
  {
   "key": "gimmick",
   "name": "Dot-pill chips everywhere",
   "applies_to": "web_ui",
   "instruction": "Drop the decorative pill with a pulsing dot above the headline, and keep status chips on cards only when they show live data. Do not add fake terminal windows as decoration.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "\\banimate-(?:pulse|ping)\\b",
     "flags": "",
     "what": "pulsing dot class"
    },
    {
     "target": "css",
     "regex": "@keyframes\\s+(?:pulse|ping|blink)",
     "flags": "i",
     "what": "pulsing dot animation"
    }
   ],
   "not_a_ban_on": "Status indicators that show real live state are fine.",
   "people_60d": 8,
   "last_seen": "2026-09-29",
   "card_url": "https://machinemorning.com/giveaway/claude.html#gimmick"
  },
  {
   "key": "emoji",
   "name": "Emoji as icons",
   "applies_to": "web_ui",
   "instruction": "Use an SVG icon set such as Lucide, or no icon at all, wherever the interface needs one. Keep emoji out of feature cards, navigation, buttons and headings.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": ">[^<]*[\\U0001F300-\\U0001FAFF\\u2728\\u26A1\\u2705][^<]*<",
     "flags": "",
     "what": "emoji in page markup"
    }
   ],
   "not_a_ban_on": "Emoji the user explicitly asked for are fine.",
   "people_60d": 6,
   "last_seen": "2026-09-15",
   "card_url": "https://machinemorning.com/giveaway/claude.html#emoji"
  },
  {
   "key": "motion",
   "name": "Everything fades, slides, floats",
   "applies_to": "web_ui",
   "instruction": "Animate only where motion helps the user. Leave sections static as they scroll into view, drop the lift on hover, and skip moving decorative backgrounds and marquees.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "opacity:\\s*0\\b[^}]{0,120}translateY\\(\\s*\\d+px|translateY\\(\\s*\\d+px\\s*\\)[^}]{0,120}opacity:\\s*0\\b",
     "flags": "i",
     "what": "fade and slide in"
    },
    {
     "target": "css",
     "regex": ":hover[^{]*\\{[^}]*translateY\\(\\s*-\\d",
     "flags": "i",
     "what": "lift on hover"
    },
    {
     "target": "html",
     "regex": "\\bmarquee\\b",
     "flags": "i",
     "what": "marquee strip"
    }
   ],
   "not_a_ban_on": "Motion that shows a change of state or responds to input stays.",
   "people_60d": 5,
   "last_seen": "2026-09-28",
   "card_url": "https://machinemorning.com/giveaway/claude.html#motion"
  },
  {
   "key": "even",
   "name": "One spacing rhythm everywhere",
   "applies_to": "web_ui",
   "instruction": "Set spacing by importance. Group related items tightly, leave more space before major sections, and let the key section take more room than the rest.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "A consistent spacing scale is fine when it creates contrast between groups.",
   "people_60d": 3,
   "last_seen": "2026-10-01",
   "card_url": "https://machinemorning.com/giveaway/claude.html#even"
  },
  {
   "key": "icons",
   "name": "The same-every-time Claude deck",
   "applies_to": "slides",
   "instruction": "Lay out each slide around its content so the main point gets the most space. Avoid equal boxes or three columns on every slide. Take the palette and fonts from the client's template or brand.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "A grid of equal boxes is fine when the items really are equal.",
   "people_60d": 18,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/claude.html#icons"
  },
  {
   "key": "wording",
   "name": "Over-written slide headings",
   "applies_to": "slides",
   "instruction": "Title each slide with a plain label or a short claim, and drop the small label above the title and the tagline below it unless they add information. Write body text in a neutral voice and give the main point more weight than the rest.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "A subtitle that adds a fact the title lacks stays.",
   "people_60d": 5,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#wording"
  },
  {
   "key": "colour",
   "name": "Claude's default deck palette",
   "applies_to": "slides",
   "instruction": "Use the client's brand colours or slide master. Without one, pick a palette for the subject instead of the beige ground with rust and blue accents, and keep body text dark and large enough to read from the back of the room.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "background(?:-color)?:\\s*#(?:faf9f5|(?:f[5-9a-f]|e[8-9a-f])(?:f[0-9a-f]|e[5-9a-f])(?:e[0-9a-f]|d[5-9a-f]))\\b",
     "flags": "i",
     "what": "cream slide background"
    }
   ],
   "not_a_ban_on": "Warm palettes that match the client's brand are fine.",
   "people_60d": 5,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#colour"
  },
  {
   "key": "comments",
   "name": "Diary comments in code",
   "applies_to": "code",
   "instruction": "Write a comment only when the code cannot show why on its own, and keep it to a line or two about the code as it is now. Keep the change history and anything from the chat out of comments.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "(?m)(?:^[ \\t ]*(?://|#|\\*|/\\*)[^\\n]*\\n){6,}",
     "flags": "",
     "what": "comment block of six lines"
    },
    {
     "target": "code",
     "regex": "(?://|#)[^\\n]*\\b(?:as (?:you )?(?:asked|requested|discussed)|per your|used to|no longer|previously|earlier version|PR #\\d+|issue #\\d+)",
     "flags": "i",
     "what": "history or chat in comment"
    }
   ],
   "not_a_ban_on": "A short comment that explains a non obvious reason stays.",
   "people_60d": 178,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/claude.html#comments"
  },
  {
   "key": "attrib",
   "name": "Claude signs the commit",
   "applies_to": "code",
   "instruction": "Follow the user's attribution choice. When they want none, leave out any line that credits Claude or links the session, and point them to the attribution setting or a commit hook, because CLAUDE.md rules are unreliable for this.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "Co-Authored-By:\\s*Claude",
     "flags": "i",
     "what": "Claude co-author trailer"
    },
    {
     "target": "text",
     "regex": "Generated with \\[?Claude Code",
     "flags": "i",
     "what": "Claude Code footer"
    },
    {
     "target": "text",
     "regex": "Claude-Session:|claude\\.ai/code/session",
     "flags": "i",
     "what": "session link trailer"
    }
   ],
   "not_a_ban_on": "Keeping the trailer is fine when the user wants the disclosure.",
   "people_60d": 34,
   "last_seen": "2026-10-03",
   "card_url": "https://machinemorning.com/giveaway/claude.html#attrib"
  },
  {
   "key": "commit",
   "name": "Essay-length commits and PRs",
   "applies_to": "code",
   "instruction": "Write a one line commit subject under 72 characters, and add a short body only when the reason is not obvious from the diff. Keep PR descriptions to what changed and why, in plain words.",
   "substitutes": [],
   "checks": [
    {
     "target": "commit",
     "regex": "\\A[^\\n]{73,}",
     "flags": "",
     "what": "subject over 72 characters"
    },
    {
     "target": "commit",
     "regex": "\\A(?:[^\\n]*\\n){10,}",
     "flags": "",
     "what": "commit message over ten lines"
    }
   ],
   "not_a_ban_on": "A longer body is fine when the change really needs explaining.",
   "people_60d": 27,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/claude.html#commit"
  },
  {
   "key": "dup",
   "name": "Rewrites what already exists",
   "applies_to": "code",
   "instruction": "Before writing a new helper, component, type or constant, search the repo for an existing one and reuse or extend it. Delete the old version when you replace code, and split files that pass the size limit the project sets.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "New code is fine when nothing suitable exists yet.",
   "people_60d": 26,
   "last_seen": "2026-09-24",
   "card_url": "https://machinemorning.com/giveaway/claude.html#dup"
  },
  {
   "key": "ascii",
   "name": "Non-ASCII punctuation in code",
   "applies_to": "code",
   "instruction": "Use plain ASCII in code, comments, strings, commit messages and project docs. Write hyphens for dashes and straight quotes for curly ones. For arrows write \"->\".",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "[—–‘’“”→]",
     "flags": "",
     "what": "non ASCII typography"
    },
    {
     "target": "code",
     "regex": "[ ​]",
     "flags": "",
     "what": "invisible non ASCII space"
    }
   ],
   "not_a_ban_on": "Dashes in chat prose are a separate habit.",
   "people_60d": 16,
   "last_seen": "2026-09-24",
   "card_url": "https://machinemorning.com/giveaway/claude.html#ascii"
  },
  {
   "key": "naming",
   "name": "Names from the chat, not the code",
   "applies_to": "code",
   "instruction": "Name things after what the code does, following the repo's existing conventions, with words that tell similar items apart. Keep corrections and passing metaphors from the chat out of names and commit messages.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "\\b\\w+_without_\\w+\\b|\\b[a-z]\\w*Without[A-Z]\\w*\\b",
     "flags": "",
     "what": "chat correction in a name"
    },
    {
     "target": "text",
     "regex": "\\((?:without|no longer|instead of) [^)]+\\)",
     "flags": "i",
     "what": "chat correction in commit"
    }
   ],
   "not_a_ban_on": "Long descriptive names are fine, and some users prefer them for agents.",
   "people_60d": 15,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/claude.html#naming"
  },
  {
   "key": "defensive",
   "name": "Errors swallowed by fallbacks",
   "applies_to": "code",
   "instruction": "Let the code fail loudly. Catch only the specific exceptions you can handle at that point, and when a required value is missing, raise an error instead of inventing a default.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "\\bexcept(?:\\s+(?:Exception|BaseException)(?:\\s+as\\s+\\w+)?)?\\s*:",
     "flags": "",
     "what": "catch all exception handler"
    },
    {
     "target": "code",
     "regex": "\\bcatch\\s*(?:\\([^)]*\\))?\\s*\\{\\s*\\}",
     "flags": "",
     "what": "empty catch block"
    },
    {
     "target": "code",
     "regex": "process\\.env\\.\\w+\\s*(?:\\|\\||\\?\\?)\\s*['\\\"`]|(?://|#)\\s*fallback\\b",
     "flags": "i",
     "what": "fallback default value"
    }
   ],
   "not_a_ban_on": "Error handling for failures the code can really recover from stays.",
   "people_60d": 9,
   "last_seen": "2026-09-10",
   "card_url": "https://machinemorning.com/giveaway/claude.html#defensive"
  },
  {
   "key": "css",
   "name": "Copy-paste Tailwind and hardcoded styles",
   "applies_to": "code",
   "instruction": "Move repeated class strings into a component or a shared class, and use the project's design tokens instead of raw palette colours or hard coded hex values. Keep styles in the stylesheet instead of inline.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "class=\\\"([^\\\"]{60,})\\\"[\\s\\S]*class=\\\"\\1\\\"",
     "flags": "",
     "what": "same long class string twice"
    },
    {
     "target": "html",
     "regex": "\\b(?:bg|text|border)-(?:gray|slate|zinc|neutral|stone|blue)-\\d{2,3}\\b",
     "flags": "",
     "what": "raw Tailwind palette class"
    },
    {
     "target": "html",
     "regex": "\\bstyle=\\\"[^\\\"]*(?:color|background|margin|padding)\\s*:",
     "flags": "",
     "what": "inline style"
    }
   ],
   "not_a_ban_on": "Tailwind itself is fine when the project uses it.",
   "people_60d": 4,
   "last_seen": "2026-09-24",
   "card_url": "https://machinemorning.com/giveaway/claude.html#css"
  }
 ],
 "changes": [
  {
   "date": "2026-10-04",
   "added": [],
   "removed": [],
   "first": true
  },
  {
   "date": "2026-10-05",
   "added": [
    "AI-style copy on the page (em dash, metaphors, explanatory text)"
   ],
   "removed": [],
   "first": false
  },
  {
   "date": "2026-10-05",
   "added": [],
   "removed": [
    "bugs"
   ],
   "first": false
  }
 ]
}