[{"data":1,"prerenderedAt":1745},["ShallowReactive",2],{"guide:/guides/claude-code-slack-discord-notifications":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"tag":10,"date":11,"body":12,"_type":1740,"_id":1741,"_source":494,"_file":1742,"_stem":1743,"_extension":1744},"/guides/claude-code-slack-discord-notifications","guides",false,"","Send Claude Code alerts to Slack or Discord","Wire a Claude Code hook to a Slack or Discord webhook so a run finishing, or needing you, pings a channel. Copy-paste curl examples included.","Notifications","2026-08-15",{"type":13,"children":14,"toc":1729},"root",[15,40,54,61,134,139,144,157,377,406,458,479,484,497,676,696,702,715,994,1007,1217,1223,1228,1290,1334,1340,1345,1586,1623,1629,1663,1669,1697,1703,1723],{"type":16,"tag":17,"props":18,"children":19},"element","p",{},[20,23,29,31,38],{"type":21,"value":22},"text","If you live in Slack or Discord, that is where you want Claude Code to reach you, especially when it finishes a long run while you are in a meeting, or away from the machine entirely. Both take an incoming ",{"type":16,"tag":24,"props":25,"children":26},"strong",{},[27],{"type":21,"value":28},"webhook",{"type":21,"value":30},", and a Claude Code hook is just a shell command, so ",{"type":16,"tag":32,"props":33,"children":35},"code",{"className":34},[],[36],{"type":21,"value":37},"curl",{"type":21,"value":39}," is all you need.",{"type":16,"tag":17,"props":41,"children":42},{},[43,45,52],{"type":21,"value":44},"New to hooks? Start with the ",{"type":16,"tag":46,"props":47,"children":49},"a",{"href":48},"/guides/claude-code-hooks",[50],{"type":21,"value":51},"complete guide to Claude Code hooks",{"type":21,"value":53},". Otherwise, here is the wiring.",{"type":16,"tag":55,"props":56,"children":58},"h2",{"id":57},"get-a-webhook-url",[59],{"type":21,"value":60},"Get a webhook URL",{"type":16,"tag":62,"props":63,"children":64},"ul",{},[65,92],{"type":16,"tag":66,"props":67,"children":68},"li",{},[69,74,76,82,84,90],{"type":16,"tag":24,"props":70,"children":71},{},[72],{"type":21,"value":73},"Slack",{"type":21,"value":75},": create an ",{"type":16,"tag":77,"props":78,"children":79},"em",{},[80],{"type":21,"value":81},"Incoming Webhook",{"type":21,"value":83}," for the channel you want (Slack app settings → Incoming Webhooks). You get a URL like ",{"type":16,"tag":32,"props":85,"children":87},{"className":86},[],[88],{"type":21,"value":89},"https://hooks.slack.com/services/...",{"type":21,"value":91},".",{"type":16,"tag":66,"props":93,"children":94},{},[95,100,102,107,109,114,115,120,121,126,128,133],{"type":16,"tag":24,"props":96,"children":97},{},[98],{"type":21,"value":99},"Discord",{"type":21,"value":101},": channel → ",{"type":16,"tag":77,"props":103,"children":104},{},[105],{"type":21,"value":106},"Edit Channel",{"type":21,"value":108}," → ",{"type":16,"tag":77,"props":110,"children":111},{},[112],{"type":21,"value":113},"Integrations",{"type":21,"value":108},{"type":16,"tag":77,"props":116,"children":117},{},[118],{"type":21,"value":119},"Webhooks",{"type":21,"value":108},{"type":16,"tag":77,"props":122,"children":123},{},[124],{"type":21,"value":125},"New Webhook",{"type":21,"value":127},", then ",{"type":16,"tag":77,"props":129,"children":130},{},[131],{"type":21,"value":132},"Copy Webhook URL",{"type":21,"value":91},{"type":16,"tag":17,"props":135,"children":136},{},[137],{"type":21,"value":138},"Both URLs are credentials: anyone holding one can post to your channel. Treat them accordingly (see below).",{"type":16,"tag":55,"props":140,"children":142},{"id":141},"slack",[143],{"type":21,"value":73},{"type":16,"tag":17,"props":145,"children":146},{},[147,149,155],{"type":21,"value":148},"Post a message when a run finishes, using the ",{"type":16,"tag":32,"props":150,"children":152},{"className":151},[],[153],{"type":21,"value":154},"Stop",{"type":21,"value":156}," hook:",{"type":16,"tag":158,"props":159,"children":163},"pre",{"className":160,"code":161,"language":162,"meta":7,"style":7},"language-json shiki shiki-themes github-light github-dark","{\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"curl -s -X POST -H 'Content-type: application/json' -d '{\\\"text\\\":\\\"✅ Claude Code finished a run\\\"}' \\\"$SLACK_WEBHOOK_URL\\\"\" }\n        ]\n      }\n    ]\n  }\n}\n","json",[164],{"type":16,"tag":32,"props":165,"children":166},{"__ignoreMap":7},[167,179,194,208,217,230,332,341,350,359,368],{"type":16,"tag":168,"props":169,"children":172},"span",{"class":170,"line":171},"line",1,[173],{"type":16,"tag":168,"props":174,"children":176},{"style":175},"--shiki-default:#24292E;--shiki-dark:#E1E4E8",[177],{"type":21,"value":178},"{\n",{"type":16,"tag":168,"props":180,"children":182},{"class":170,"line":181},2,[183,189],{"type":16,"tag":168,"props":184,"children":186},{"style":185},"--shiki-default:#005CC5;--shiki-dark:#79B8FF",[187],{"type":21,"value":188},"  \"hooks\"",{"type":16,"tag":168,"props":190,"children":191},{"style":175},[192],{"type":21,"value":193},": {\n",{"type":16,"tag":168,"props":195,"children":197},{"class":170,"line":196},3,[198,203],{"type":16,"tag":168,"props":199,"children":200},{"style":185},[201],{"type":21,"value":202},"    \"Stop\"",{"type":16,"tag":168,"props":204,"children":205},{"style":175},[206],{"type":21,"value":207},": [\n",{"type":16,"tag":168,"props":209,"children":211},{"class":170,"line":210},4,[212],{"type":16,"tag":168,"props":213,"children":214},{"style":175},[215],{"type":21,"value":216},"      {\n",{"type":16,"tag":168,"props":218,"children":220},{"class":170,"line":219},5,[221,226],{"type":16,"tag":168,"props":222,"children":223},{"style":185},[224],{"type":21,"value":225},"        \"hooks\"",{"type":16,"tag":168,"props":227,"children":228},{"style":175},[229],{"type":21,"value":207},{"type":16,"tag":168,"props":231,"children":233},{"class":170,"line":232},6,[234,239,244,249,255,260,264,268,273,278,282,286,291,295,300,304,309,313,318,322,327],{"type":16,"tag":168,"props":235,"children":236},{"style":175},[237],{"type":21,"value":238},"          { ",{"type":16,"tag":168,"props":240,"children":241},{"style":185},[242],{"type":21,"value":243},"\"type\"",{"type":16,"tag":168,"props":245,"children":246},{"style":175},[247],{"type":21,"value":248},": ",{"type":16,"tag":168,"props":250,"children":252},{"style":251},"--shiki-default:#032F62;--shiki-dark:#9ECBFF",[253],{"type":21,"value":254},"\"command\"",{"type":16,"tag":168,"props":256,"children":257},{"style":175},[258],{"type":21,"value":259},", ",{"type":16,"tag":168,"props":261,"children":262},{"style":185},[263],{"type":21,"value":254},{"type":16,"tag":168,"props":265,"children":266},{"style":175},[267],{"type":21,"value":248},{"type":16,"tag":168,"props":269,"children":270},{"style":251},[271],{"type":21,"value":272},"\"curl -s -X POST -H 'Content-type: application/json' -d '{",{"type":16,"tag":168,"props":274,"children":275},{"style":185},[276],{"type":21,"value":277},"\\\"",{"type":16,"tag":168,"props":279,"children":280},{"style":251},[281],{"type":21,"value":21},{"type":16,"tag":168,"props":283,"children":284},{"style":185},[285],{"type":21,"value":277},{"type":16,"tag":168,"props":287,"children":288},{"style":251},[289],{"type":21,"value":290},":",{"type":16,"tag":168,"props":292,"children":293},{"style":185},[294],{"type":21,"value":277},{"type":16,"tag":168,"props":296,"children":297},{"style":251},[298],{"type":21,"value":299},"✅ Claude Code finished a run",{"type":16,"tag":168,"props":301,"children":302},{"style":185},[303],{"type":21,"value":277},{"type":16,"tag":168,"props":305,"children":306},{"style":251},[307],{"type":21,"value":308},"}' ",{"type":16,"tag":168,"props":310,"children":311},{"style":185},[312],{"type":21,"value":277},{"type":16,"tag":168,"props":314,"children":315},{"style":251},[316],{"type":21,"value":317},"$SLACK_WEBHOOK_URL",{"type":16,"tag":168,"props":319,"children":320},{"style":185},[321],{"type":21,"value":277},{"type":16,"tag":168,"props":323,"children":324},{"style":251},[325],{"type":21,"value":326},"\"",{"type":16,"tag":168,"props":328,"children":329},{"style":175},[330],{"type":21,"value":331}," }\n",{"type":16,"tag":168,"props":333,"children":335},{"class":170,"line":334},7,[336],{"type":16,"tag":168,"props":337,"children":338},{"style":175},[339],{"type":21,"value":340},"        ]\n",{"type":16,"tag":168,"props":342,"children":344},{"class":170,"line":343},8,[345],{"type":16,"tag":168,"props":346,"children":347},{"style":175},[348],{"type":21,"value":349},"      }\n",{"type":16,"tag":168,"props":351,"children":353},{"class":170,"line":352},9,[354],{"type":16,"tag":168,"props":355,"children":356},{"style":175},[357],{"type":21,"value":358},"    ]\n",{"type":16,"tag":168,"props":360,"children":362},{"class":170,"line":361},10,[363],{"type":16,"tag":168,"props":364,"children":365},{"style":175},[366],{"type":21,"value":367},"  }\n",{"type":16,"tag":168,"props":369,"children":371},{"class":170,"line":370},11,[372],{"type":16,"tag":168,"props":373,"children":374},{"style":175},[375],{"type":21,"value":376},"}\n",{"type":16,"tag":17,"props":378,"children":379},{},[380,382,388,390,396,398,404],{"type":21,"value":381},"Keep the URL out of the file: export ",{"type":16,"tag":32,"props":383,"children":385},{"className":384},[],[386],{"type":21,"value":387},"SLACK_WEBHOOK_URL",{"type":21,"value":389}," in your shell profile and reference it, so you are not committing a secret to ",{"type":16,"tag":32,"props":391,"children":393},{"className":392},[],[394],{"type":21,"value":395},".claude/settings.json",{"type":21,"value":397},". Hooks do not load your interactive profile, so if the variable comes up empty, set it through the ",{"type":16,"tag":32,"props":399,"children":401},{"className":400},[],[402],{"type":21,"value":403},"env",{"type":21,"value":405}," key of your settings instead:",{"type":16,"tag":158,"props":407,"children":409},{"className":160,"code":408,"language":162,"meta":7,"style":7},"{\n  \"env\": { \"SLACK_WEBHOOK_URL\": \"https://hooks.slack.com/services/...\" }\n}\n",[410],{"type":16,"tag":32,"props":411,"children":412},{"__ignoreMap":7},[413,420,451],{"type":16,"tag":168,"props":414,"children":415},{"class":170,"line":171},[416],{"type":16,"tag":168,"props":417,"children":418},{"style":175},[419],{"type":21,"value":178},{"type":16,"tag":168,"props":421,"children":422},{"class":170,"line":181},[423,428,433,438,442,447],{"type":16,"tag":168,"props":424,"children":425},{"style":185},[426],{"type":21,"value":427},"  \"env\"",{"type":16,"tag":168,"props":429,"children":430},{"style":175},[431],{"type":21,"value":432},": { ",{"type":16,"tag":168,"props":434,"children":435},{"style":185},[436],{"type":21,"value":437},"\"SLACK_WEBHOOK_URL\"",{"type":16,"tag":168,"props":439,"children":440},{"style":175},[441],{"type":21,"value":248},{"type":16,"tag":168,"props":443,"children":444},{"style":251},[445],{"type":21,"value":446},"\"https://hooks.slack.com/services/...\"",{"type":16,"tag":168,"props":448,"children":449},{"style":175},[450],{"type":21,"value":331},{"type":16,"tag":168,"props":452,"children":453},{"class":170,"line":196},[454],{"type":16,"tag":168,"props":455,"children":456},{"style":175},[457],{"type":21,"value":376},{"type":16,"tag":17,"props":459,"children":460},{},[461,463,469,471,477],{"type":21,"value":462},"Put that in ",{"type":16,"tag":32,"props":464,"children":466},{"className":465},[],[467],{"type":21,"value":468},"~/.claude/settings.json",{"type":21,"value":470}," or ",{"type":16,"tag":32,"props":472,"children":474},{"className":473},[],[475],{"type":21,"value":476},".claude/settings.local.json",{"type":21,"value":478},", never in the project file you commit.",{"type":16,"tag":55,"props":480,"children":482},{"id":481},"discord",[483],{"type":21,"value":99},{"type":16,"tag":17,"props":485,"children":486},{},[487,489,495],{"type":21,"value":488},"Discord webhooks take a ",{"type":16,"tag":32,"props":490,"children":492},{"className":491},[],[493],{"type":21,"value":494},"content",{"type":21,"value":496}," field:",{"type":16,"tag":158,"props":498,"children":500},{"className":160,"code":499,"language":162,"meta":7,"style":7},"{\n  \"hooks\": {\n    \"Notification\": [\n      {\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"curl -s -X POST -H 'Content-type: application/json' -d '{\\\"content\\\":\\\"🙋 Claude Code needs your input\\\"}' \\\"$DISCORD_WEBHOOK_URL\\\"\" }\n        ]\n      }\n    ]\n  }\n}\n",[501],{"type":16,"tag":32,"props":502,"children":503},{"__ignoreMap":7},[504,511,522,534,541,552,641,648,655,662,669],{"type":16,"tag":168,"props":505,"children":506},{"class":170,"line":171},[507],{"type":16,"tag":168,"props":508,"children":509},{"style":175},[510],{"type":21,"value":178},{"type":16,"tag":168,"props":512,"children":513},{"class":170,"line":181},[514,518],{"type":16,"tag":168,"props":515,"children":516},{"style":185},[517],{"type":21,"value":188},{"type":16,"tag":168,"props":519,"children":520},{"style":175},[521],{"type":21,"value":193},{"type":16,"tag":168,"props":523,"children":524},{"class":170,"line":196},[525,530],{"type":16,"tag":168,"props":526,"children":527},{"style":185},[528],{"type":21,"value":529},"    \"Notification\"",{"type":16,"tag":168,"props":531,"children":532},{"style":175},[533],{"type":21,"value":207},{"type":16,"tag":168,"props":535,"children":536},{"class":170,"line":210},[537],{"type":16,"tag":168,"props":538,"children":539},{"style":175},[540],{"type":21,"value":216},{"type":16,"tag":168,"props":542,"children":543},{"class":170,"line":219},[544,548],{"type":16,"tag":168,"props":545,"children":546},{"style":185},[547],{"type":21,"value":225},{"type":16,"tag":168,"props":549,"children":550},{"style":175},[551],{"type":21,"value":207},{"type":16,"tag":168,"props":553,"children":554},{"class":170,"line":232},[555,559,563,567,571,575,579,583,587,591,595,599,603,607,612,616,620,624,629,633,637],{"type":16,"tag":168,"props":556,"children":557},{"style":175},[558],{"type":21,"value":238},{"type":16,"tag":168,"props":560,"children":561},{"style":185},[562],{"type":21,"value":243},{"type":16,"tag":168,"props":564,"children":565},{"style":175},[566],{"type":21,"value":248},{"type":16,"tag":168,"props":568,"children":569},{"style":251},[570],{"type":21,"value":254},{"type":16,"tag":168,"props":572,"children":573},{"style":175},[574],{"type":21,"value":259},{"type":16,"tag":168,"props":576,"children":577},{"style":185},[578],{"type":21,"value":254},{"type":16,"tag":168,"props":580,"children":581},{"style":175},[582],{"type":21,"value":248},{"type":16,"tag":168,"props":584,"children":585},{"style":251},[586],{"type":21,"value":272},{"type":16,"tag":168,"props":588,"children":589},{"style":185},[590],{"type":21,"value":277},{"type":16,"tag":168,"props":592,"children":593},{"style":251},[594],{"type":21,"value":494},{"type":16,"tag":168,"props":596,"children":597},{"style":185},[598],{"type":21,"value":277},{"type":16,"tag":168,"props":600,"children":601},{"style":251},[602],{"type":21,"value":290},{"type":16,"tag":168,"props":604,"children":605},{"style":185},[606],{"type":21,"value":277},{"type":16,"tag":168,"props":608,"children":609},{"style":251},[610],{"type":21,"value":611},"🙋 Claude Code needs your input",{"type":16,"tag":168,"props":613,"children":614},{"style":185},[615],{"type":21,"value":277},{"type":16,"tag":168,"props":617,"children":618},{"style":251},[619],{"type":21,"value":308},{"type":16,"tag":168,"props":621,"children":622},{"style":185},[623],{"type":21,"value":277},{"type":16,"tag":168,"props":625,"children":626},{"style":251},[627],{"type":21,"value":628},"$DISCORD_WEBHOOK_URL",{"type":16,"tag":168,"props":630,"children":631},{"style":185},[632],{"type":21,"value":277},{"type":16,"tag":168,"props":634,"children":635},{"style":251},[636],{"type":21,"value":326},{"type":16,"tag":168,"props":638,"children":639},{"style":175},[640],{"type":21,"value":331},{"type":16,"tag":168,"props":642,"children":643},{"class":170,"line":334},[644],{"type":16,"tag":168,"props":645,"children":646},{"style":175},[647],{"type":21,"value":340},{"type":16,"tag":168,"props":649,"children":650},{"class":170,"line":343},[651],{"type":16,"tag":168,"props":652,"children":653},{"style":175},[654],{"type":21,"value":349},{"type":16,"tag":168,"props":656,"children":657},{"class":170,"line":352},[658],{"type":16,"tag":168,"props":659,"children":660},{"style":175},[661],{"type":21,"value":358},{"type":16,"tag":168,"props":663,"children":664},{"class":170,"line":361},[665],{"type":16,"tag":168,"props":666,"children":667},{"style":175},[668],{"type":21,"value":367},{"type":16,"tag":168,"props":670,"children":671},{"class":170,"line":370},[672],{"type":16,"tag":168,"props":673,"children":674},{"style":175},[675],{"type":21,"value":376},{"type":16,"tag":17,"props":677,"children":678},{},[679,681,687,689,694],{"type":21,"value":680},"Wire ",{"type":16,"tag":32,"props":682,"children":684},{"className":683},[],[685],{"type":21,"value":686},"Notification",{"type":21,"value":688}," for \"needs you\" and ",{"type":16,"tag":32,"props":690,"children":692},{"className":691},[],[693],{"type":21,"value":154},{"type":21,"value":695}," for \"done\", and you get both moments in your channel.",{"type":16,"tag":55,"props":697,"children":699},{"id":698},"say-which-project-it-was",[700],{"type":21,"value":701},"Say which project it was",{"type":16,"tag":17,"props":703,"children":704},{},[705,707,713],{"type":21,"value":706},"A channel full of identical \"finished\" lines is barely better than no channel at all. The hook payload arriving on ",{"type":16,"tag":32,"props":708,"children":710},{"className":709},[],[711],{"type":21,"value":712},"stdin",{"type":21,"value":714}," carries the session's working directory and id, so a short script can label the message:",{"type":16,"tag":158,"props":716,"children":720},{"className":717,"code":718,"language":719,"meta":7,"style":7},"language-bash shiki shiki-themes github-light github-dark","#!/usr/bin/env bash\n# .claude/hooks/slack.sh   usage: slack.sh \"finished\"\npayload=$(cat)\nproject=$(basename \"$(echo \"$payload\" | jq -r '.cwd')\")\ntext=\"Claude Code: *${project}* $1\"\n\ncurl -s -X POST -H 'Content-type: application/json' \\\n  -d \"$(jq -n --arg t \"$text\" '{text: $t}')\" \\\n  \"$SLACK_WEBHOOK_URL\" > /dev/null\n","bash",[721],{"type":16,"tag":32,"props":722,"children":723},{"__ignoreMap":7},[724,733,741,771,841,876,885,922,968],{"type":16,"tag":168,"props":725,"children":726},{"class":170,"line":171},[727],{"type":16,"tag":168,"props":728,"children":730},{"style":729},"--shiki-default:#6A737D;--shiki-dark:#6A737D",[731],{"type":21,"value":732},"#!/usr/bin/env bash\n",{"type":16,"tag":168,"props":734,"children":735},{"class":170,"line":181},[736],{"type":16,"tag":168,"props":737,"children":738},{"style":729},[739],{"type":21,"value":740},"# .claude/hooks/slack.sh   usage: slack.sh \"finished\"\n",{"type":16,"tag":168,"props":742,"children":743},{"class":170,"line":196},[744,749,755,760,766],{"type":16,"tag":168,"props":745,"children":746},{"style":175},[747],{"type":21,"value":748},"payload",{"type":16,"tag":168,"props":750,"children":752},{"style":751},"--shiki-default:#D73A49;--shiki-dark:#F97583",[753],{"type":21,"value":754},"=",{"type":16,"tag":168,"props":756,"children":757},{"style":175},[758],{"type":21,"value":759},"$(",{"type":16,"tag":168,"props":761,"children":763},{"style":762},"--shiki-default:#6F42C1;--shiki-dark:#B392F0",[764],{"type":21,"value":765},"cat",{"type":16,"tag":168,"props":767,"children":768},{"style":175},[769],{"type":21,"value":770},")\n",{"type":16,"tag":168,"props":772,"children":773},{"class":170,"line":210},[774,779,783,787,792,797,802,807,812,817,822,827,832,837],{"type":16,"tag":168,"props":775,"children":776},{"style":175},[777],{"type":21,"value":778},"project",{"type":16,"tag":168,"props":780,"children":781},{"style":751},[782],{"type":21,"value":754},{"type":16,"tag":168,"props":784,"children":785},{"style":175},[786],{"type":21,"value":759},{"type":16,"tag":168,"props":788,"children":789},{"style":762},[790],{"type":21,"value":791},"basename",{"type":16,"tag":168,"props":793,"children":794},{"style":251},[795],{"type":21,"value":796}," \"$(",{"type":16,"tag":168,"props":798,"children":799},{"style":185},[800],{"type":21,"value":801},"echo",{"type":16,"tag":168,"props":803,"children":804},{"style":251},[805],{"type":21,"value":806}," \"",{"type":16,"tag":168,"props":808,"children":809},{"style":175},[810],{"type":21,"value":811},"$payload",{"type":16,"tag":168,"props":813,"children":814},{"style":251},[815],{"type":21,"value":816},"\" ",{"type":16,"tag":168,"props":818,"children":819},{"style":751},[820],{"type":21,"value":821},"|",{"type":16,"tag":168,"props":823,"children":824},{"style":762},[825],{"type":21,"value":826}," jq",{"type":16,"tag":168,"props":828,"children":829},{"style":185},[830],{"type":21,"value":831}," -r",{"type":16,"tag":168,"props":833,"children":834},{"style":251},[835],{"type":21,"value":836}," '.cwd')\"",{"type":16,"tag":168,"props":838,"children":839},{"style":175},[840],{"type":21,"value":770},{"type":16,"tag":168,"props":842,"children":843},{"class":170,"line":219},[844,848,852,857,861,866,871],{"type":16,"tag":168,"props":845,"children":846},{"style":175},[847],{"type":21,"value":21},{"type":16,"tag":168,"props":849,"children":850},{"style":751},[851],{"type":21,"value":754},{"type":16,"tag":168,"props":853,"children":854},{"style":251},[855],{"type":21,"value":856},"\"Claude Code: *${",{"type":16,"tag":168,"props":858,"children":859},{"style":175},[860],{"type":21,"value":778},{"type":16,"tag":168,"props":862,"children":863},{"style":251},[864],{"type":21,"value":865},"}* ",{"type":16,"tag":168,"props":867,"children":868},{"style":185},[869],{"type":21,"value":870},"$1",{"type":16,"tag":168,"props":872,"children":873},{"style":251},[874],{"type":21,"value":875},"\"\n",{"type":16,"tag":168,"props":877,"children":878},{"class":170,"line":232},[879],{"type":16,"tag":168,"props":880,"children":882},{"emptyLinePlaceholder":881},true,[883],{"type":21,"value":884},"\n",{"type":16,"tag":168,"props":886,"children":887},{"class":170,"line":334},[888,892,897,902,907,912,917],{"type":16,"tag":168,"props":889,"children":890},{"style":762},[891],{"type":21,"value":37},{"type":16,"tag":168,"props":893,"children":894},{"style":185},[895],{"type":21,"value":896}," -s",{"type":16,"tag":168,"props":898,"children":899},{"style":185},[900],{"type":21,"value":901}," -X",{"type":16,"tag":168,"props":903,"children":904},{"style":251},[905],{"type":21,"value":906}," POST",{"type":16,"tag":168,"props":908,"children":909},{"style":185},[910],{"type":21,"value":911}," -H",{"type":16,"tag":168,"props":913,"children":914},{"style":251},[915],{"type":21,"value":916}," 'Content-type: application/json'",{"type":16,"tag":168,"props":918,"children":919},{"style":185},[920],{"type":21,"value":921}," \\\n",{"type":16,"tag":168,"props":923,"children":924},{"class":170,"line":343},[925,930,934,939,944,949,954,959,964],{"type":16,"tag":168,"props":926,"children":927},{"style":185},[928],{"type":21,"value":929},"  -d",{"type":16,"tag":168,"props":931,"children":932},{"style":251},[933],{"type":21,"value":796},{"type":16,"tag":168,"props":935,"children":936},{"style":762},[937],{"type":21,"value":938},"jq",{"type":16,"tag":168,"props":940,"children":941},{"style":185},[942],{"type":21,"value":943}," -n",{"type":16,"tag":168,"props":945,"children":946},{"style":185},[947],{"type":21,"value":948}," --arg",{"type":16,"tag":168,"props":950,"children":951},{"style":251},[952],{"type":21,"value":953}," t \"",{"type":16,"tag":168,"props":955,"children":956},{"style":175},[957],{"type":21,"value":958},"$text",{"type":16,"tag":168,"props":960,"children":961},{"style":251},[962],{"type":21,"value":963},"\" '{text: $t}')\"",{"type":16,"tag":168,"props":965,"children":966},{"style":185},[967],{"type":21,"value":921},{"type":16,"tag":168,"props":969,"children":970},{"class":170,"line":352},[971,976,980,984,989],{"type":16,"tag":168,"props":972,"children":973},{"style":251},[974],{"type":21,"value":975},"  \"",{"type":16,"tag":168,"props":977,"children":978},{"style":175},[979],{"type":21,"value":317},{"type":16,"tag":168,"props":981,"children":982},{"style":251},[983],{"type":21,"value":326},{"type":16,"tag":168,"props":985,"children":986},{"style":751},[987],{"type":21,"value":988}," >",{"type":16,"tag":168,"props":990,"children":991},{"style":251},[992],{"type":21,"value":993}," /dev/null\n",{"type":16,"tag":17,"props":995,"children":996},{},[997,999,1005],{"type":21,"value":998},"Building the JSON with ",{"type":16,"tag":32,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":21,"value":1004},"jq -n",{"type":21,"value":1006}," rather than string concatenation matters: a project name with a quote or a backslash would otherwise produce invalid JSON and a silent failure.",{"type":16,"tag":158,"props":1008,"children":1010},{"className":160,"code":1009,"language":162,"meta":7,"style":7},"{\n  \"hooks\": {\n    \"Stop\": [\n      { \"hooks\": [{ \"type\": \"command\", \"command\": \"$CLAUDE_PROJECT_DIR/.claude/hooks/slack.sh finished\", \"timeout\": 10 }] }\n    ],\n    \"Notification\": [\n      { \"hooks\": [{ \"type\": \"command\", \"command\": \"$CLAUDE_PROJECT_DIR/.claude/hooks/slack.sh 'needs you'\", \"timeout\": 10 }] }\n    ]\n  }\n}\n",[1011],{"type":16,"tag":32,"props":1012,"children":1013},{"__ignoreMap":7},[1014,1021,1032,1043,1113,1121,1132,1196,1203,1210],{"type":16,"tag":168,"props":1015,"children":1016},{"class":170,"line":171},[1017],{"type":16,"tag":168,"props":1018,"children":1019},{"style":175},[1020],{"type":21,"value":178},{"type":16,"tag":168,"props":1022,"children":1023},{"class":170,"line":181},[1024,1028],{"type":16,"tag":168,"props":1025,"children":1026},{"style":185},[1027],{"type":21,"value":188},{"type":16,"tag":168,"props":1029,"children":1030},{"style":175},[1031],{"type":21,"value":193},{"type":16,"tag":168,"props":1033,"children":1034},{"class":170,"line":196},[1035,1039],{"type":16,"tag":168,"props":1036,"children":1037},{"style":185},[1038],{"type":21,"value":202},{"type":16,"tag":168,"props":1040,"children":1041},{"style":175},[1042],{"type":21,"value":207},{"type":16,"tag":168,"props":1044,"children":1045},{"class":170,"line":210},[1046,1051,1056,1061,1065,1069,1073,1077,1081,1085,1090,1094,1099,1103,1108],{"type":16,"tag":168,"props":1047,"children":1048},{"style":175},[1049],{"type":21,"value":1050},"      { ",{"type":16,"tag":168,"props":1052,"children":1053},{"style":185},[1054],{"type":21,"value":1055},"\"hooks\"",{"type":16,"tag":168,"props":1057,"children":1058},{"style":175},[1059],{"type":21,"value":1060},": [{ ",{"type":16,"tag":168,"props":1062,"children":1063},{"style":185},[1064],{"type":21,"value":243},{"type":16,"tag":168,"props":1066,"children":1067},{"style":175},[1068],{"type":21,"value":248},{"type":16,"tag":168,"props":1070,"children":1071},{"style":251},[1072],{"type":21,"value":254},{"type":16,"tag":168,"props":1074,"children":1075},{"style":175},[1076],{"type":21,"value":259},{"type":16,"tag":168,"props":1078,"children":1079},{"style":185},[1080],{"type":21,"value":254},{"type":16,"tag":168,"props":1082,"children":1083},{"style":175},[1084],{"type":21,"value":248},{"type":16,"tag":168,"props":1086,"children":1087},{"style":251},[1088],{"type":21,"value":1089},"\"$CLAUDE_PROJECT_DIR/.claude/hooks/slack.sh finished\"",{"type":16,"tag":168,"props":1091,"children":1092},{"style":175},[1093],{"type":21,"value":259},{"type":16,"tag":168,"props":1095,"children":1096},{"style":185},[1097],{"type":21,"value":1098},"\"timeout\"",{"type":16,"tag":168,"props":1100,"children":1101},{"style":175},[1102],{"type":21,"value":248},{"type":16,"tag":168,"props":1104,"children":1105},{"style":185},[1106],{"type":21,"value":1107},"10",{"type":16,"tag":168,"props":1109,"children":1110},{"style":175},[1111],{"type":21,"value":1112}," }] }\n",{"type":16,"tag":168,"props":1114,"children":1115},{"class":170,"line":219},[1116],{"type":16,"tag":168,"props":1117,"children":1118},{"style":175},[1119],{"type":21,"value":1120},"    ],\n",{"type":16,"tag":168,"props":1122,"children":1123},{"class":170,"line":232},[1124,1128],{"type":16,"tag":168,"props":1125,"children":1126},{"style":185},[1127],{"type":21,"value":529},{"type":16,"tag":168,"props":1129,"children":1130},{"style":175},[1131],{"type":21,"value":207},{"type":16,"tag":168,"props":1133,"children":1134},{"class":170,"line":334},[1135,1139,1143,1147,1151,1155,1159,1163,1167,1171,1176,1180,1184,1188,1192],{"type":16,"tag":168,"props":1136,"children":1137},{"style":175},[1138],{"type":21,"value":1050},{"type":16,"tag":168,"props":1140,"children":1141},{"style":185},[1142],{"type":21,"value":1055},{"type":16,"tag":168,"props":1144,"children":1145},{"style":175},[1146],{"type":21,"value":1060},{"type":16,"tag":168,"props":1148,"children":1149},{"style":185},[1150],{"type":21,"value":243},{"type":16,"tag":168,"props":1152,"children":1153},{"style":175},[1154],{"type":21,"value":248},{"type":16,"tag":168,"props":1156,"children":1157},{"style":251},[1158],{"type":21,"value":254},{"type":16,"tag":168,"props":1160,"children":1161},{"style":175},[1162],{"type":21,"value":259},{"type":16,"tag":168,"props":1164,"children":1165},{"style":185},[1166],{"type":21,"value":254},{"type":16,"tag":168,"props":1168,"children":1169},{"style":175},[1170],{"type":21,"value":248},{"type":16,"tag":168,"props":1172,"children":1173},{"style":251},[1174],{"type":21,"value":1175},"\"$CLAUDE_PROJECT_DIR/.claude/hooks/slack.sh 'needs you'\"",{"type":16,"tag":168,"props":1177,"children":1178},{"style":175},[1179],{"type":21,"value":259},{"type":16,"tag":168,"props":1181,"children":1182},{"style":185},[1183],{"type":21,"value":1098},{"type":16,"tag":168,"props":1185,"children":1186},{"style":175},[1187],{"type":21,"value":248},{"type":16,"tag":168,"props":1189,"children":1190},{"style":185},[1191],{"type":21,"value":1107},{"type":16,"tag":168,"props":1193,"children":1194},{"style":175},[1195],{"type":21,"value":1112},{"type":16,"tag":168,"props":1197,"children":1198},{"class":170,"line":343},[1199],{"type":16,"tag":168,"props":1200,"children":1201},{"style":175},[1202],{"type":21,"value":358},{"type":16,"tag":168,"props":1204,"children":1205},{"class":170,"line":352},[1206],{"type":16,"tag":168,"props":1207,"children":1208},{"style":175},[1209],{"type":21,"value":367},{"type":16,"tag":168,"props":1211,"children":1212},{"class":170,"line":361},[1213],{"type":16,"tag":168,"props":1214,"children":1215},{"style":175},[1216],{"type":21,"value":376},{"type":16,"tag":55,"props":1218,"children":1220},{"id":1219},"test-the-webhook-before-wiring-it",[1221],{"type":21,"value":1222},"Test the webhook before wiring it",{"type":16,"tag":17,"props":1224,"children":1225},{},[1226],{"type":21,"value":1227},"A hook that fails prints nothing you will notice, so prove the URL works from a plain shell first:",{"type":16,"tag":158,"props":1229,"children":1231},{"className":717,"code":1230,"language":719,"meta":7,"style":7},"curl -s -X POST -H 'Content-type: application/json' \\\n  -d '{\"text\":\"hello from my machine\"}' \"$SLACK_WEBHOOK_URL\"\n",[1232],{"type":16,"tag":32,"props":1233,"children":1234},{"__ignoreMap":7},[1235,1266],{"type":16,"tag":168,"props":1236,"children":1237},{"class":170,"line":171},[1238,1242,1246,1250,1254,1258,1262],{"type":16,"tag":168,"props":1239,"children":1240},{"style":762},[1241],{"type":21,"value":37},{"type":16,"tag":168,"props":1243,"children":1244},{"style":185},[1245],{"type":21,"value":896},{"type":16,"tag":168,"props":1247,"children":1248},{"style":185},[1249],{"type":21,"value":901},{"type":16,"tag":168,"props":1251,"children":1252},{"style":251},[1253],{"type":21,"value":906},{"type":16,"tag":168,"props":1255,"children":1256},{"style":185},[1257],{"type":21,"value":911},{"type":16,"tag":168,"props":1259,"children":1260},{"style":251},[1261],{"type":21,"value":916},{"type":16,"tag":168,"props":1263,"children":1264},{"style":185},[1265],{"type":21,"value":921},{"type":16,"tag":168,"props":1267,"children":1268},{"class":170,"line":181},[1269,1273,1278,1282,1286],{"type":16,"tag":168,"props":1270,"children":1271},{"style":185},[1272],{"type":21,"value":929},{"type":16,"tag":168,"props":1274,"children":1275},{"style":251},[1276],{"type":21,"value":1277}," '{\"text\":\"hello from my machine\"}'",{"type":16,"tag":168,"props":1279,"children":1280},{"style":251},[1281],{"type":21,"value":806},{"type":16,"tag":168,"props":1283,"children":1284},{"style":175},[1285],{"type":21,"value":317},{"type":16,"tag":168,"props":1287,"children":1288},{"style":251},[1289],{"type":21,"value":875},{"type":16,"tag":17,"props":1291,"children":1292},{},[1293,1295,1301,1303,1309,1311,1317,1318,1324,1326,1332],{"type":21,"value":1294},"Slack answers ",{"type":16,"tag":32,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":21,"value":1300},"ok",{"type":21,"value":1302}," and Discord answers with an empty ",{"type":16,"tag":32,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":21,"value":1308},"204",{"type":21,"value":1310},". Anything else (",{"type":16,"tag":32,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":21,"value":1316},"invalid_payload",{"type":21,"value":259},{"type":16,"tag":32,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":21,"value":1323},"no_service",{"type":21,"value":1325},") is a problem with the URL or the JSON, not with Claude Code. Once that works, add the hook and run ",{"type":16,"tag":32,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":21,"value":1331},"claude --debug",{"type":21,"value":1333}," to watch it fire.",{"type":16,"tag":55,"props":1335,"children":1337},{"id":1336},"richer-slack-messages",[1338],{"type":21,"value":1339},"Richer Slack messages",{"type":16,"tag":17,"props":1341,"children":1342},{},[1343],{"type":21,"value":1344},"Plain text is fine, but Slack's Block Kit lets you make the project name scannable, which matters once several repositories post to the same channel:",{"type":16,"tag":158,"props":1346,"children":1348},{"className":717,"code":1347,"language":719,"meta":7,"style":7},"#!/usr/bin/env bash\npayload=$(cat)\nproject=$(basename \"$(echo \"$payload\" | jq -r '.cwd')\")\n\njq -n --arg p \"$project\" '{\n  blocks: [\n    { type: \"section\", text: { type: \"mrkdwn\", text: (\"*\" + $p + \"* finished a run\") } },\n    { type: \"context\", elements: [ { type: \"mrkdwn\", text: \"Claude Code\" } ] }\n  ]\n}' | curl -s -X POST -H 'Content-type: application/json' -d @- \"$SLACK_WEBHOOK_URL\" > /dev/null\n",[1349],{"type":16,"tag":32,"props":1350,"children":1351},{"__ignoreMap":7},[1352,1359,1382,1441,1448,1486,1494,1502,1510,1518],{"type":16,"tag":168,"props":1353,"children":1354},{"class":170,"line":171},[1355],{"type":16,"tag":168,"props":1356,"children":1357},{"style":729},[1358],{"type":21,"value":732},{"type":16,"tag":168,"props":1360,"children":1361},{"class":170,"line":181},[1362,1366,1370,1374,1378],{"type":16,"tag":168,"props":1363,"children":1364},{"style":175},[1365],{"type":21,"value":748},{"type":16,"tag":168,"props":1367,"children":1368},{"style":751},[1369],{"type":21,"value":754},{"type":16,"tag":168,"props":1371,"children":1372},{"style":175},[1373],{"type":21,"value":759},{"type":16,"tag":168,"props":1375,"children":1376},{"style":762},[1377],{"type":21,"value":765},{"type":16,"tag":168,"props":1379,"children":1380},{"style":175},[1381],{"type":21,"value":770},{"type":16,"tag":168,"props":1383,"children":1384},{"class":170,"line":196},[1385,1389,1393,1397,1401,1405,1409,1413,1417,1421,1425,1429,1433,1437],{"type":16,"tag":168,"props":1386,"children":1387},{"style":175},[1388],{"type":21,"value":778},{"type":16,"tag":168,"props":1390,"children":1391},{"style":751},[1392],{"type":21,"value":754},{"type":16,"tag":168,"props":1394,"children":1395},{"style":175},[1396],{"type":21,"value":759},{"type":16,"tag":168,"props":1398,"children":1399},{"style":762},[1400],{"type":21,"value":791},{"type":16,"tag":168,"props":1402,"children":1403},{"style":251},[1404],{"type":21,"value":796},{"type":16,"tag":168,"props":1406,"children":1407},{"style":185},[1408],{"type":21,"value":801},{"type":16,"tag":168,"props":1410,"children":1411},{"style":251},[1412],{"type":21,"value":806},{"type":16,"tag":168,"props":1414,"children":1415},{"style":175},[1416],{"type":21,"value":811},{"type":16,"tag":168,"props":1418,"children":1419},{"style":251},[1420],{"type":21,"value":816},{"type":16,"tag":168,"props":1422,"children":1423},{"style":751},[1424],{"type":21,"value":821},{"type":16,"tag":168,"props":1426,"children":1427},{"style":762},[1428],{"type":21,"value":826},{"type":16,"tag":168,"props":1430,"children":1431},{"style":185},[1432],{"type":21,"value":831},{"type":16,"tag":168,"props":1434,"children":1435},{"style":251},[1436],{"type":21,"value":836},{"type":16,"tag":168,"props":1438,"children":1439},{"style":175},[1440],{"type":21,"value":770},{"type":16,"tag":168,"props":1442,"children":1443},{"class":170,"line":210},[1444],{"type":16,"tag":168,"props":1445,"children":1446},{"emptyLinePlaceholder":881},[1447],{"type":21,"value":884},{"type":16,"tag":168,"props":1449,"children":1450},{"class":170,"line":219},[1451,1455,1459,1463,1468,1472,1477,1481],{"type":16,"tag":168,"props":1452,"children":1453},{"style":762},[1454],{"type":21,"value":938},{"type":16,"tag":168,"props":1456,"children":1457},{"style":185},[1458],{"type":21,"value":943},{"type":16,"tag":168,"props":1460,"children":1461},{"style":185},[1462],{"type":21,"value":948},{"type":16,"tag":168,"props":1464,"children":1465},{"style":251},[1466],{"type":21,"value":1467}," p",{"type":16,"tag":168,"props":1469,"children":1470},{"style":251},[1471],{"type":21,"value":806},{"type":16,"tag":168,"props":1473,"children":1474},{"style":175},[1475],{"type":21,"value":1476},"$project",{"type":16,"tag":168,"props":1478,"children":1479},{"style":251},[1480],{"type":21,"value":326},{"type":16,"tag":168,"props":1482,"children":1483},{"style":251},[1484],{"type":21,"value":1485}," '{\n",{"type":16,"tag":168,"props":1487,"children":1488},{"class":170,"line":232},[1489],{"type":16,"tag":168,"props":1490,"children":1491},{"style":251},[1492],{"type":21,"value":1493},"  blocks: [\n",{"type":16,"tag":168,"props":1495,"children":1496},{"class":170,"line":334},[1497],{"type":16,"tag":168,"props":1498,"children":1499},{"style":251},[1500],{"type":21,"value":1501},"    { type: \"section\", text: { type: \"mrkdwn\", text: (\"*\" + $p + \"* finished a run\") } },\n",{"type":16,"tag":168,"props":1503,"children":1504},{"class":170,"line":343},[1505],{"type":16,"tag":168,"props":1506,"children":1507},{"style":251},[1508],{"type":21,"value":1509},"    { type: \"context\", elements: [ { type: \"mrkdwn\", text: \"Claude Code\" } ] }\n",{"type":16,"tag":168,"props":1511,"children":1512},{"class":170,"line":352},[1513],{"type":16,"tag":168,"props":1514,"children":1515},{"style":251},[1516],{"type":21,"value":1517},"  ]\n",{"type":16,"tag":168,"props":1519,"children":1520},{"class":170,"line":361},[1521,1526,1531,1536,1540,1544,1548,1552,1556,1561,1566,1570,1574,1578,1582],{"type":16,"tag":168,"props":1522,"children":1523},{"style":251},[1524],{"type":21,"value":1525},"}'",{"type":16,"tag":168,"props":1527,"children":1528},{"style":751},[1529],{"type":21,"value":1530}," |",{"type":16,"tag":168,"props":1532,"children":1533},{"style":762},[1534],{"type":21,"value":1535}," curl",{"type":16,"tag":168,"props":1537,"children":1538},{"style":185},[1539],{"type":21,"value":896},{"type":16,"tag":168,"props":1541,"children":1542},{"style":185},[1543],{"type":21,"value":901},{"type":16,"tag":168,"props":1545,"children":1546},{"style":251},[1547],{"type":21,"value":906},{"type":16,"tag":168,"props":1549,"children":1550},{"style":185},[1551],{"type":21,"value":911},{"type":16,"tag":168,"props":1553,"children":1554},{"style":251},[1555],{"type":21,"value":916},{"type":16,"tag":168,"props":1557,"children":1558},{"style":185},[1559],{"type":21,"value":1560}," -d",{"type":16,"tag":168,"props":1562,"children":1563},{"style":251},[1564],{"type":21,"value":1565}," @-",{"type":16,"tag":168,"props":1567,"children":1568},{"style":251},[1569],{"type":21,"value":806},{"type":16,"tag":168,"props":1571,"children":1572},{"style":175},[1573],{"type":21,"value":317},{"type":16,"tag":168,"props":1575,"children":1576},{"style":251},[1577],{"type":21,"value":326},{"type":16,"tag":168,"props":1579,"children":1580},{"style":751},[1581],{"type":21,"value":988},{"type":16,"tag":168,"props":1583,"children":1584},{"style":251},[1585],{"type":21,"value":993},{"type":16,"tag":17,"props":1587,"children":1588},{},[1589,1591,1597,1599,1605,1607,1613,1615,1621],{"type":21,"value":1590},"Discord has its own version of this with ",{"type":16,"tag":32,"props":1592,"children":1594},{"className":1593},[],[1595],{"type":21,"value":1596},"embeds",{"type":21,"value":1598},", taking a ",{"type":16,"tag":32,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":21,"value":1604},"title",{"type":21,"value":1606},", a ",{"type":16,"tag":32,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":21,"value":1612},"description",{"type":21,"value":1614}," and a ",{"type":16,"tag":32,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":21,"value":1620},"color",{"type":21,"value":1622},", posted to the same webhook URL. Either way, resist the urge to build a dashboard in chat: the message exists to make you look, not to replace the terminal.",{"type":16,"tag":55,"props":1624,"children":1626},{"id":1625},"keep-the-channel-quiet-enough-to-matter",[1627],{"type":21,"value":1628},"Keep the channel quiet enough to matter",{"type":16,"tag":17,"props":1630,"children":1631},{},[1632,1634,1639,1641,1646,1648,1654,1656,1661],{"type":21,"value":1633},"Every short turn firing a webhook makes the channel unreadable within a day, and Slack and Discord both throttle webhooks that post too often. Two habits keep it useful: post ",{"type":16,"tag":32,"props":1635,"children":1637},{"className":1636},[],[1638],{"type":21,"value":686},{"type":21,"value":1640}," events always (something is blocking you), and gate ",{"type":16,"tag":32,"props":1642,"children":1644},{"className":1643},[],[1645],{"type":21,"value":154},{"type":21,"value":1647}," on the run having taken more than a minute, by stamping the start time in a ",{"type":16,"tag":32,"props":1649,"children":1651},{"className":1650},[],[1652],{"type":21,"value":1653},"UserPromptSubmit",{"type":21,"value":1655}," hook and comparing it in the ",{"type":16,"tag":32,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":21,"value":154},{"type":21,"value":1662}," one. A dedicated, muted channel that you check on purpose beats a busy one you learn to ignore.",{"type":16,"tag":55,"props":1664,"children":1666},{"id":1665},"keep-the-payload-dumb",[1667],{"type":21,"value":1668},"Keep the payload dumb",{"type":16,"tag":17,"props":1670,"children":1671},{},[1672,1674,1680,1682,1688,1690,1695],{"type":21,"value":1673},"Do not send the prompt, the diff, or anything Claude typed to a chat channel: it is easy to leak more than you mean to, and the hook payload happily hands you ",{"type":16,"tag":32,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":21,"value":1679},"prompt",{"type":21,"value":1681}," and ",{"type":16,"tag":32,"props":1683,"children":1685},{"className":1684},[],[1686],{"type":21,"value":1687},"transcript_path",{"type":21,"value":1689}," if you ask for them. A short, fixed message (\"finished\", \"needs you\") plus a project name is enough to make you look, which is the whole point. Remember also that a project-level hook runs on your teammates' machines too, so a webhook committed in ",{"type":16,"tag":32,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":21,"value":395},{"type":21,"value":1696}," means everyone posts to your channel.",{"type":16,"tag":55,"props":1698,"children":1700},{"id":1699},"for-your-own-screen-not-just-the-channel",[1701],{"type":21,"value":1702},"For your own screen, not just the channel",{"type":16,"tag":17,"props":1704,"children":1705},{},[1706,1708,1713,1715,1721],{"type":21,"value":1707},"A channel ping is great when you are away. When you are ",{"type":16,"tag":77,"props":1709,"children":1710},{},[1711],{"type":21,"value":1712},"at",{"type":21,"value":1714}," your machine running several sessions, you want something faster than switching to Slack and working out which project pinged. ",{"type":16,"tag":46,"props":1716,"children":1718},{"href":1717},"/",[1719],{"type":21,"value":1720},"Blooby",{"type":21,"value":1722}," reads the same Claude Code events and shows a live mascot per session right on your desktop (done, needs-you, working), so you never leave your editor to find out. Use both: a webhook for when you are out, and Blooby for when you are in.",{"type":16,"tag":1724,"props":1725,"children":1726},"style",{},[1727],{"type":21,"value":1728},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":181,"depth":181,"links":1730},[1731,1732,1733,1734,1735,1736,1737,1738,1739],{"id":57,"depth":181,"text":60},{"id":141,"depth":181,"text":73},{"id":481,"depth":181,"text":99},{"id":698,"depth":181,"text":701},{"id":1219,"depth":181,"text":1222},{"id":1336,"depth":181,"text":1339},{"id":1625,"depth":181,"text":1628},{"id":1665,"depth":181,"text":1668},{"id":1699,"depth":181,"text":1702},"markdown","content:guides:claude-code-slack-discord-notifications.md","guides/claude-code-slack-discord-notifications.md","guides/claude-code-slack-discord-notifications","md",1]