@jtalk22/slack-mcp 2.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +118 -67
  2. package/docs/CLOUDFLARE-BROWSER-TOOLKIT.md +67 -0
  3. package/docs/DEPLOYMENT-MODES.md +10 -3
  4. package/docs/HN-LAUNCH.md +47 -36
  5. package/docs/INDEX.md +9 -5
  6. package/docs/INSTALL-PROOF.md +5 -5
  7. package/docs/LAUNCH-COPY-v3.0.0.md +101 -0
  8. package/docs/LAUNCH-MATRIX.md +4 -2
  9. package/docs/LAUNCH-OPS.md +25 -24
  10. package/docs/RELEASE-HEALTH.md +44 -48
  11. package/docs/TROUBLESHOOTING.md +27 -0
  12. package/docs/WEB-API.md +13 -4
  13. package/docs/images/demo-channel-messages.png +0 -0
  14. package/docs/images/demo-channels.png +0 -0
  15. package/docs/images/demo-claude-mobile-360x800.png +0 -0
  16. package/docs/images/demo-claude-mobile-390x844.png +0 -0
  17. package/docs/images/demo-claude-mobile-poster.png +0 -0
  18. package/docs/images/demo-main-mobile-360x800.png +0 -0
  19. package/docs/images/demo-main-mobile-390x844.png +0 -0
  20. package/docs/images/demo-main.png +0 -0
  21. package/docs/images/demo-poster.png +0 -0
  22. package/docs/images/demo-sidebar.png +0 -0
  23. package/docs/images/social-preview-v3.png +0 -0
  24. package/docs/images/web-api-mobile-360x800.png +0 -0
  25. package/docs/images/web-api-mobile-390x844.png +0 -0
  26. package/package.json +31 -31
  27. package/public/demo-claude.html +100 -11
  28. package/public/demo-video.html +45 -7
  29. package/public/demo.html +138 -4
  30. package/public/index.html +132 -69
  31. package/public/share.html +127 -0
  32. package/scripts/build-mobile-demo.js +168 -0
  33. package/scripts/build-release-health-delta.js +2 -2
  34. package/scripts/build-social-preview.js +189 -0
  35. package/scripts/capture-screenshots.js +109 -53
  36. package/scripts/check-owner-attribution.sh +53 -2
  37. package/scripts/check-public-language.sh +1 -0
  38. package/scripts/check-version-parity.js +70 -14
  39. package/scripts/cloudflare-browser-tool.js +237 -0
  40. package/scripts/collect-release-health.js +14 -2
  41. package/scripts/impact-push-v3.js +781 -0
  42. package/scripts/record-demo.js +26 -12
  43. package/scripts/release-preflight.js +247 -0
  44. package/scripts/setup-wizard.js +1 -1
  45. package/scripts/update-github-social-preview.js +208 -0
  46. package/scripts/verify-install-flow.js +2 -1
  47. package/scripts/verify-web.js +53 -1
  48. package/server.json +47 -0
  49. package/smithery.yaml +34 -0
  50. package/src/server-http.js +98 -5
  51. package/src/server.js +18 -6
  52. package/src/web-server.js +7 -3
  53. package/docs/LAUNCH-COPY-v2.0.0.md +0 -59
  54. package/docs/images/demo-claude-v1.2.gif +0 -0
  55. package/docs/images/demo-readme.gif +0 -0
  56. package/docs/release-health/2026-02-25.md +0 -33
  57. package/docs/release-health/2026-02-26.md +0 -33
  58. package/docs/release-health/24h-delta.md +0 -21
  59. package/docs/release-health/24h-end.md +0 -33
  60. package/docs/release-health/24h-start.md +0 -33
  61. package/docs/release-health/latest.md +0 -33
  62. package/docs/release-health/launch-log-template.md +0 -21
  63. package/docs/release-health/version-parity.md +0 -21
  64. package/docs/videos/.gitkeep +0 -0
  65. package/docs/videos/demo-claude-v1.2.webm +0 -0
@@ -19,22 +19,27 @@
19
19
  <meta property="og:description" content="Session-based Slack access for Claude with your existing workspace permissions. Search, thread, and messaging workflows.">
20
20
  <meta property="og:type" content="website">
21
21
  <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo-claude.html">
22
- <meta property="og:image" content="https://assets-worker.james-20a.workers.dev/projects/slack-mcp-server/demo-claude.gif">
22
+ <meta property="og:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/social-preview-v3.png">
23
23
 
24
24
  <!-- Twitter Card -->
25
25
  <meta name="twitter:card" content="summary_large_image">
26
26
  <meta name="twitter:title" content="Slack MCP Server - Session-Based Slack Access Demo">
27
27
  <meta name="twitter:description" content="Session-based Slack access for Claude with your existing workspace permissions. Search, thread, and messaging workflows.">
28
- <meta name="twitter:image" content="https://assets-worker.james-20a.workers.dev/projects/slack-mcp-server/demo-claude.gif">
28
+ <meta name="twitter:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/social-preview-v3.png">
29
29
 
30
30
  <!-- Theme -->
31
31
  <meta name="theme-color" content="#1a1a1a">
32
32
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💬</text></svg>">
33
33
  <style>
34
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap');
35
+
34
36
  /* ═══════════════════════════════════════════════════════════════
35
37
  Claude Desktop Color Palette (Dark Mode)
36
38
  ═══════════════════════════════════════════════════════════════ */
37
39
  :root {
40
+ --font-heading: "Space Grotesk", "Avenir Next", "Segoe UI", sans-serif;
41
+ --font-body: "IBM Plex Sans", "Inter", "Segoe UI", sans-serif;
42
+
38
43
  /* Window chrome */
39
44
  --window-bg: #1a1a1a;
40
45
  --window-chrome: #2d2d2d;
@@ -83,7 +88,7 @@
83
88
  }
84
89
 
85
90
  body {
86
- font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
91
+ font-family: var(--font-body);
87
92
  font-size: 15px;
88
93
  line-height: 1.5;
89
94
  -webkit-font-smoothing: antialiased;
@@ -118,6 +123,8 @@
118
123
  align-items: center;
119
124
  justify-content: center;
120
125
  gap: 12px;
126
+ font-family: var(--font-heading);
127
+ letter-spacing: -0.02em;
121
128
  }
122
129
 
123
130
  .page-header p {
@@ -127,11 +134,11 @@
127
134
  .cta-strip {
128
135
  width: 100%;
129
136
  max-width: 960px;
130
- margin-bottom: 16px;
137
+ margin-bottom: 14px;
131
138
  background: rgba(15, 52, 96, 0.72);
132
139
  border: 1px solid rgba(255, 255, 255, 0.15);
133
140
  border-radius: 12px;
134
- padding: 10px 14px;
141
+ padding: 10px 12px;
135
142
  display: flex;
136
143
  justify-content: space-between;
137
144
  align-items: center;
@@ -183,6 +190,7 @@
183
190
  margin-bottom: 24px;
184
191
  flex-wrap: wrap;
185
192
  justify-content: center;
193
+ width: min(100%, 960px);
186
194
  }
187
195
 
188
196
  .scenario-btn {
@@ -257,6 +265,9 @@
257
265
  gap: 12px;
258
266
  margin-bottom: 16px;
259
267
  align-items: center;
268
+ flex-wrap: wrap;
269
+ justify-content: center;
270
+ width: min(100%, 920px);
260
271
  }
261
272
 
262
273
  .speed-control {
@@ -346,6 +357,7 @@
346
357
  box-shadow: var(--shadow-lg);
347
358
  overflow: hidden;
348
359
  border: 1px solid var(--window-border);
360
+ position: relative;
349
361
  }
350
362
 
351
363
  .window-chrome {
@@ -911,6 +923,11 @@
911
923
  display: none !important;
912
924
  }
913
925
 
926
+ body.fullscreen-mode .cta-strip,
927
+ body.fullscreen-mode .scenario-caption {
928
+ display: none !important;
929
+ }
930
+
914
931
  body.fullscreen-mode .claude-window {
915
932
  max-width: 100%;
916
933
  height: 100vh;
@@ -967,31 +984,93 @@
967
984
  /* ═══════════════════════════════════════════════════════════════
968
985
  Responsive
969
986
  ═══════════════════════════════════════════════════════════════ */
987
+ @media (max-width: 900px) {
988
+ body {
989
+ padding: 14px;
990
+ }
991
+
992
+ .page-header {
993
+ margin-bottom: 16px;
994
+ }
995
+
996
+ .page-header h1 {
997
+ font-size: 24px;
998
+ }
999
+
1000
+ .scenario-btn {
1001
+ padding: 10px 14px;
1002
+ }
1003
+
1004
+ .controls-bar {
1005
+ gap: 10px;
1006
+ }
1007
+
1008
+ .claude-window {
1009
+ max-width: 100%;
1010
+ }
1011
+ }
1012
+
970
1013
  @media (max-width: 600px) {
971
1014
  body {
972
1015
  padding: 12px;
973
1016
  }
974
1017
 
1018
+ .cta-strip {
1019
+ padding: 10px;
1020
+ gap: 8px;
1021
+ }
1022
+
1023
+ .cta-strip .links {
1024
+ width: 100%;
1025
+ }
1026
+
1027
+ .cta-strip .note {
1028
+ font-size: 12px;
1029
+ }
1030
+
975
1031
  .page-header h1 {
976
1032
  font-size: 22px;
1033
+ flex-wrap: wrap;
1034
+ gap: 8px;
1035
+ }
1036
+
1037
+ .page-header p {
1038
+ font-size: 14px;
977
1039
  }
978
1040
 
979
1041
  .scenario-bar {
980
1042
  gap: 8px;
1043
+ margin-bottom: 14px;
981
1044
  }
982
1045
 
983
1046
  .scenario-btn {
984
- padding: 10px 14px;
1047
+ padding: 9px 12px;
985
1048
  font-size: 13px;
1049
+ border-radius: 10px;
986
1050
  }
987
1051
 
988
1052
  .scenario-btn .label {
989
1053
  display: none;
990
1054
  }
991
1055
 
1056
+ .controls-bar {
1057
+ gap: 8px;
1058
+ margin-bottom: 12px;
1059
+ }
1060
+
1061
+ .replay-btn,
1062
+ .share-btn {
1063
+ padding: 8px 12px;
1064
+ }
1065
+
1066
+ .speed-control {
1067
+ width: 100%;
1068
+ justify-content: space-between;
1069
+ }
1070
+
992
1071
  .chat-container {
993
- height: 450px;
994
- padding: 16px;
1072
+ height: min(55vh, 450px);
1073
+ padding: 14px;
995
1074
  }
996
1075
 
997
1076
  .tools-dropdown {
@@ -1005,6 +1084,12 @@
1005
1084
  .tools-dropdown:hover {
1006
1085
  transform: translateX(-50%) translateY(0);
1007
1086
  }
1087
+
1088
+ .scenario-caption {
1089
+ top: 56px;
1090
+ font-size: 12px;
1091
+ padding: 7px 14px;
1092
+ }
1008
1093
  }
1009
1094
 
1010
1095
  /* ═══════════════════════════════════════════════════════════════
@@ -1046,7 +1131,7 @@
1046
1131
  /* Scenario Caption Overlay */
1047
1132
  .scenario-caption {
1048
1133
  position: absolute;
1049
- top: 72px;
1134
+ top: 60px;
1050
1135
  left: 50%;
1051
1136
  transform: translateX(-50%);
1052
1137
  background: rgba(0, 0, 0, 0.75);
@@ -1059,6 +1144,10 @@
1059
1144
  transition: opacity 0.3s ease;
1060
1145
  z-index: 50;
1061
1146
  pointer-events: none;
1147
+ max-width: calc(100% - 24px);
1148
+ white-space: nowrap;
1149
+ overflow: hidden;
1150
+ text-overflow: ellipsis;
1062
1151
  }
1063
1152
 
1064
1153
  .scenario-caption.visible {
@@ -1161,7 +1250,7 @@
1161
1250
  <header class="page-header">
1162
1251
  <h1>
1163
1252
  <span>Slack MCP Server</span>
1164
- <span class="badge">🔧 MCP Demo v2.0.0</span>
1253
+ <span class="badge">🔧 MCP Demo v3.0.0</span>
1165
1254
  </h1>
1166
1255
  <p>See how Claude uses MCP tools to access your Slack workspace</p>
1167
1256
  </header>
@@ -1233,7 +1322,7 @@
1233
1322
  <div class="title-logo">💬</div>
1234
1323
  <h1>Slack MCP Server</h1>
1235
1324
  <p class="title-tagline">Full Slack access for Claude Desktop</p>
1236
- <p class="title-version">v2.0.0 • @jtalk22</p>
1325
+ <p class="title-version">v3.0.0 • @jtalk22</p>
1237
1326
  </div>
1238
1327
 
1239
1328
  <!-- Scenario Caption Overlay -->
@@ -9,19 +9,27 @@
9
9
  <meta property="og:title" content="Slack MCP Server - Session-Based Slack Access Demo">
10
10
  <meta property="og:description" content="Session-based Slack access for Claude with your existing workspace permissions. Video walkthrough for Slack workflows.">
11
11
  <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo-video.html">
12
- <meta property="og:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-poster.png">
12
+ <meta property="og:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/demo-poster.png">
13
13
  <meta name="twitter:card" content="summary_large_image">
14
14
  <meta name="twitter:title" content="Slack MCP Server - Session-Based Slack Access Demo">
15
15
  <meta name="twitter:description" content="Session-based Slack access for Claude with your existing workspace permissions. Video walkthrough for Slack workflows.">
16
- <meta name="twitter:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-poster.png">
16
+ <meta name="twitter:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/demo-poster.png">
17
+ <link rel="preconnect" href="https://fonts.googleapis.com">
18
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
19
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap" rel="stylesheet">
17
20
  <style>
21
+ :root {
22
+ --font-heading: "Space Grotesk", "Avenir Next", "Segoe UI", sans-serif;
23
+ --font-body: "IBM Plex Sans", "Inter", "Segoe UI", sans-serif;
24
+ }
25
+
18
26
  * {
19
27
  margin: 0;
20
28
  padding: 0;
21
29
  box-sizing: border-box;
22
30
  }
23
31
  body {
24
- font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
32
+ font-family: var(--font-body);
25
33
  background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
26
34
  min-height: 100vh;
27
35
  display: flex;
@@ -40,6 +48,8 @@
40
48
  font-weight: 600;
41
49
  text-align: center;
42
50
  margin-bottom: 0.5rem;
51
+ font-family: var(--font-heading);
52
+ letter-spacing: -0.02em;
43
53
  }
44
54
  .subtitle {
45
55
  color: #94a3b8;
@@ -137,6 +147,26 @@
137
147
  .back-link a:hover {
138
148
  color: #ffffff;
139
149
  }
150
+
151
+ @media (max-width: 640px) {
152
+ body {
153
+ padding: 1rem 0.75rem;
154
+ }
155
+
156
+ .cta-strip .links {
157
+ width: 100%;
158
+ }
159
+
160
+ .controls {
161
+ gap: 0.75rem;
162
+ }
163
+
164
+ .btn {
165
+ flex: 1;
166
+ min-width: 0;
167
+ padding: 0.72rem 0.95rem;
168
+ }
169
+ }
140
170
  </style>
141
171
  </head>
142
172
  <body>
@@ -156,8 +186,8 @@
156
186
 
157
187
  <div class="video-wrapper">
158
188
  <video id="demo" poster="../docs/images/demo-poster.png" playsinline>
159
- <source src="../docs/videos/demo-claude-v1.2.webm" type="video/webm">
160
- <source src="../docs/images/demo-claude-v1.2.gif" type="image/gif">
189
+ <source src="../docs/videos/demo-claude.webm" type="video/webm">
190
+ <source src="https://jtalk22.github.io/slack-mcp-server/docs/videos/demo-claude.webm" type="video/webm">
161
191
  Your browser does not support the video tag.
162
192
  </video>
163
193
  </div>
@@ -174,10 +204,18 @@
174
204
 
175
205
  <script>
176
206
  const video = document.getElementById('demo');
207
+ const HIGHLIGHT_START_SECONDS = 6;
208
+
209
+ function playFromHighlight() {
210
+ if (video.duration && video.duration > HIGHLIGHT_START_SECONDS + 1) {
211
+ video.currentTime = HIGHLIGHT_START_SECONDS;
212
+ }
213
+ return video.play();
214
+ }
177
215
 
178
216
  // Autoplay with 1 second delay
179
217
  setTimeout(() => {
180
- video.play().catch(() => {
218
+ playFromHighlight().catch(() => {
181
219
  // Autoplay blocked, user will need to click
182
220
  console.log('Autoplay blocked, click to play');
183
221
  });
@@ -198,7 +236,7 @@
198
236
 
199
237
  // Loop the video
200
238
  video.addEventListener('ended', () => {
201
- video.currentTime = 0;
239
+ video.currentTime = HIGHLIGHT_START_SECONDS;
202
240
  video.play();
203
241
  });
204
242
  </script>
package/public/demo.html CHANGED
@@ -10,21 +10,23 @@
10
10
  <meta property="og:url" content="https://jtalk22.github.io/slack-mcp-server/public/demo.html">
11
11
  <meta property="og:title" content="Slack MCP Server - Session-Based Slack Access Demo">
12
12
  <meta property="og:description" content="Session-based Slack access for Claude with your existing workspace permissions. DMs, channels, search, and threads.">
13
- <meta property="og:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-main.png">
13
+ <meta property="og:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/demo-main.png">
14
14
 
15
15
  <!-- Twitter Card -->
16
16
  <meta name="twitter:card" content="summary_large_image">
17
17
  <meta name="twitter:title" content="Slack MCP Server - Session-Based Slack Access Demo">
18
18
  <meta name="twitter:description" content="Session-based Slack access for Claude with your existing workspace permissions. DMs, channels, search, and threads.">
19
- <meta name="twitter:image" content="https://raw.githubusercontent.com/jtalk22/slack-mcp-server/main/docs/images/demo-main.png">
19
+ <meta name="twitter:image" content="https://jtalk22.github.io/slack-mcp-server/docs/images/demo-main.png">
20
20
 
21
21
  <!-- SEO -->
22
22
  <meta name="description" content="Session-based Slack access for Claude with your existing workspace permissions. Interactive demo for DMs, channels, search, and thread workflows.">
23
23
  <link rel="preconnect" href="https://fonts.googleapis.com">
24
24
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
25
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap" rel="stylesheet">
26
26
  <style>
27
27
  :root {
28
+ --font-heading: "Space Grotesk", "Avenir Next", "Segoe UI", sans-serif;
29
+ --font-body: "IBM Plex Sans", "Inter", "Segoe UI", sans-serif;
28
30
  --bg-primary: #0f0f1a;
29
31
  --bg-secondary: #1a1a2e;
30
32
  --bg-tertiary: #16213e;
@@ -45,7 +47,7 @@
45
47
  * { box-sizing: border-box; margin: 0; padding: 0; }
46
48
 
47
49
  body {
48
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
50
+ font-family: var(--font-body);
49
51
  background: var(--bg-primary);
50
52
  color: var(--text-primary);
51
53
  min-height: 100vh;
@@ -150,6 +152,7 @@
150
152
  font-size: 16px;
151
153
  font-weight: 600;
152
154
  color: var(--text-primary);
155
+ font-family: var(--font-heading);
153
156
  }
154
157
  .claude-header .subtitle {
155
158
  font-size: 12px;
@@ -276,6 +279,7 @@
276
279
  letter-spacing: 1px;
277
280
  color: var(--text-muted);
278
281
  margin-bottom: 12px;
282
+ font-family: var(--font-heading);
279
283
  }
280
284
 
281
285
  .try-buttons .scenarios {
@@ -352,6 +356,7 @@
352
356
  .dashboard-title h2 {
353
357
  font-size: 18px;
354
358
  font-weight: 600;
359
+ font-family: var(--font-heading);
355
360
  }
356
361
 
357
362
  .status-badge {
@@ -475,6 +480,7 @@
475
480
  display: flex;
476
481
  align-items: center;
477
482
  gap: 8px;
483
+ font-family: var(--font-heading);
478
484
  }
479
485
 
480
486
  .online-dot {
@@ -490,6 +496,75 @@
490
496
  padding: 20px 24px;
491
497
  }
492
498
 
499
+ .mobile-scenario-rail {
500
+ display: none;
501
+ padding: 14px 16px;
502
+ background: rgba(15, 52, 96, 0.55);
503
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
504
+ }
505
+
506
+ .mobile-rail-head {
507
+ display: flex;
508
+ align-items: center;
509
+ justify-content: space-between;
510
+ gap: 10px;
511
+ margin-bottom: 10px;
512
+ }
513
+
514
+ .mobile-rail-head h4 {
515
+ font-size: 12px;
516
+ letter-spacing: 0.08em;
517
+ text-transform: uppercase;
518
+ color: var(--text-muted);
519
+ font-family: var(--font-heading);
520
+ }
521
+
522
+ .mobile-scenario-buttons {
523
+ display: grid;
524
+ grid-template-columns: repeat(3, minmax(0, 1fr));
525
+ gap: 8px;
526
+ }
527
+
528
+ .mobile-scenario-btn {
529
+ background: rgba(255, 255, 255, 0.06);
530
+ color: var(--text-primary);
531
+ border: 1px solid rgba(255, 255, 255, 0.12);
532
+ border-radius: 10px;
533
+ padding: 10px 8px;
534
+ font-size: 12px;
535
+ font-weight: 600;
536
+ display: flex;
537
+ flex-direction: column;
538
+ align-items: center;
539
+ justify-content: center;
540
+ gap: 3px;
541
+ cursor: pointer;
542
+ transition: var(--transition);
543
+ text-align: center;
544
+ font-family: var(--font-body);
545
+ }
546
+
547
+ .mobile-scenario-btn:hover {
548
+ border-color: var(--accent);
549
+ background: rgba(78, 205, 196, 0.15);
550
+ }
551
+
552
+ .mobile-scenario-btn .icon {
553
+ font-size: 16px;
554
+ line-height: 1;
555
+ }
556
+
557
+ .mobile-cta {
558
+ margin-top: 10px;
559
+ font-size: 12px;
560
+ color: var(--text-secondary);
561
+ }
562
+
563
+ .mobile-reset {
564
+ padding: 4px 10px;
565
+ font-size: 11px;
566
+ }
567
+
493
568
  .message {
494
569
  display: flex;
495
570
  gap: 14px;
@@ -614,16 +689,53 @@
614
689
  @media (max-width: 1000px) {
615
690
  .split-container {
616
691
  grid-template-columns: 1fr;
692
+ height: auto;
693
+ min-height: calc(100vh - 88px);
617
694
  }
618
695
  .claude-panel {
619
696
  display: none;
620
697
  }
698
+ .mobile-scenario-rail {
699
+ display: block;
700
+ }
621
701
  .dashboard-content {
622
702
  grid-template-columns: 1fr;
623
703
  }
624
704
  .sidebar {
625
705
  display: none;
626
706
  }
707
+ .main-header {
708
+ padding: 14px 16px;
709
+ }
710
+ .messages-container {
711
+ padding: 16px;
712
+ }
713
+ }
714
+
715
+ @media (max-width: 640px) {
716
+ .cta-strip {
717
+ gap: 8px;
718
+ padding: 10px 12px;
719
+ }
720
+ .mobile-scenario-buttons {
721
+ grid-template-columns: repeat(2, minmax(0, 1fr));
722
+ }
723
+ .mobile-scenario-btn {
724
+ padding: 10px 6px;
725
+ }
726
+ .dashboard-header {
727
+ padding: 14px 12px;
728
+ }
729
+ .dashboard-title h2 {
730
+ font-size: 16px;
731
+ }
732
+ .status-badge {
733
+ font-size: 11px;
734
+ padding: 3px 10px;
735
+ }
736
+ .messages-container {
737
+ min-height: 48vh;
738
+ }
627
739
  }
628
740
  </style>
629
741
  </head>
@@ -706,6 +818,28 @@
706
818
  </div>
707
819
  </div>
708
820
 
821
+ <div class="mobile-scenario-rail" aria-label="Scenario shortcuts">
822
+ <div class="mobile-rail-head">
823
+ <h4>Try a Scenario</h4>
824
+ <button class="reset-btn mobile-reset" onclick="resetDemo()">Reset Demo</button>
825
+ </div>
826
+ <div class="mobile-scenario-buttons">
827
+ <button class="mobile-scenario-btn" onclick="runScenario('findKey')">
828
+ <span class="icon">🔑</span>
829
+ <span>Find Key</span>
830
+ </button>
831
+ <button class="mobile-scenario-btn" onclick="runScenario('listChannels')">
832
+ <span class="icon">📋</span>
833
+ <span>Channels</span>
834
+ </button>
835
+ <button class="mobile-scenario-btn" onclick="runScenario('whoIsAlex')">
836
+ <span class="icon">👤</span>
837
+ <span>Who is Alex?</span>
838
+ </button>
839
+ </div>
840
+ <p class="mobile-cta">Tap a scenario to drive the live preview with one click.</p>
841
+ </div>
842
+
709
843
  <div class="dashboard-content">
710
844
  <aside class="sidebar">
711
845
  <div class="sidebar-section">