🌐 Translation: Translated from Korean.
TL;DR
- Core Concept: 4-stage message processing pipeline + channel-based FIFO task queue
- Result: Manage multiple projects via Slack channels with guaranteed FIFO order
- Keywords: Plain text, DSL, FIFO, Channel = Project
- Target Audience: Developers working on multiple projects simultaneously
- Time Required: 10 minutes to understand, 5 minutes to practice
1. Why Do You Need to Manage Multiple Projects Simultaneously?
The Core Problem: Claude Code Wait Time
When working with Claude Code, you frequently encounter situations like this:
In #project-blog:
"Write a draft post for me"
→ Claude Code running... (estimated 5 minutes)
→ You just wait idly ⏳
→ This time is wasted!
What If You Could Use That Wait Time?
The key to managing multiple projects simultaneously is utilizing wait time:
1. Start work in #project-blog
"Write a draft post for me" (takes 5 min)
2. While waiting, switch to #project-api
"Debug this API error" (takes 3 min)
3. Return to #project-blog later
→ The draft is ready!
Result: Complete 2 tasks across multiple projects in 5 minutes instead of 8 ✨
Limitations of Existing Solutions:
- Terminal tab switching: Confusing which project you’re in, context loss
- VS Code workspaces: Heavy, not available on mobile
remote-claude’s Solution:
Slack Channel = Project
#project-blog → /Users/idongho/proj/blog
#project-api → /Users/idongho/proj/api
#project-frontend → /Users/idongho/proj/frontend
- Switch projects by changing channels (1 second)
- Each channel’s conversation history = project work log
- More than 2x efficiency by utilizing wait time
2. Deep Dive into the 4-Stage Message Processing Pipeline
2.1 Why 4 Stages?
Message Processing Pipeline Design Goals:
- Flexibility: Support various input methods (Plain text, DSL, Slash Commands)
- Priority: Process important commands first
- Stability: Prevent errors through stage-by-stage validation
The 4-Stage Pipeline:
Incoming message
↓
Stage 1: Check for Slack native commands (passthrough)
↓ (if not)
Stage 2: Bot meta commands (/setup, /state, /cancel)
↓ (if not)
Stage 3: DSL (interactive input responses)
↓ (if not)
Stage 4: Plain text → Execute Claude Code
2.2 Stage 1: Slack Native Commands (Pass-through)
Purpose: Let Slack’s built-in commands pass through untouched
Examples:
/invite @remote-claude → Handled directly by Slack
/archive → Handled directly by Slack
Processing Logic: The message processing pipeline doesn’t intervene
2.3 Stage 2: Bot Meta Commands
Purpose: Commands for managing remote-claude itself
Supported Commands:
/setup <project-name> <path>: Connect a project/state: Check status (channel, task queue)/cancel: Cancel running task/download [file]: Download a file
Key Feature: Immediate execution (not added to task queue)
Example:
/state
→ Immediate response:
Current channel: #project-blog
Project: /Users/idongho/proj/blog
Task queue: 1 waiting
2.4 Stage 3: DSL (Domain-Specific Language)
Purpose: Send arrow key and Enter events to Claude Code
The Problem:
When Claude Code shows selection options, you can’t press arrow keys in Slack:
Claude Code shows:
> Create new file
Update existing file
Delete file
→ Can't use arrow keys to navigate in Slack
→ Can't press Enter to select
→ Work stops!
The Solution: DSL (5 Commands)
Format: `command`
Supported commands:
`r` → Right arrow (→)
`l` → Left arrow (←)
`u` → Up arrow (↑)
`p` → Down arrow (↓)
`e` → Enter
Real-World Usage Example:
Claude Code shows:
> Create new file
Update existing file
Delete file
In Slack:
→ Type `p` (move down)
Claude Code screen changes:
Create new file
> Update existing file
Delete file
In Slack:
→ Type `p` (move down again)
→ Type `e` (select Delete file)
→ Work continues ✅
Advantages:
- Send arrow key events from Slack
- Clearly distinguished by backticks
- Instant delivery (< 1 second)
Limitations:
- Only 5 commands available (r, l, u, p, e)
- Can’t type directly (y/n, number input not supported)
Use Cases:
- When Claude Code shows a selection list
- When selecting items from a menu
- “Press Enter to continue” prompts
- UI that can be navigated with arrow keys
2.5 Stage 4: Plain Text (Claude Code Execution)
Format: Just speak naturally
Examples:
"Find the cause of the test failure"
"Add a new script to package.json"
"API response is slow. Optimize it"
Processing Flow:
- Message processing pipeline forwards to Claude Code
- Added to task queue
- Claude Code understands context and executes
- Requests interactive input via DSL when needed
Advantages:
- Natural: No need to memorize commands
- Intelligent: AI understands intent and chooses the best approach
- Context-aware: Remembers previous conversations
- Complex tasks possible: Debugging, refactoring, analysis
Limitations:
- Slow: Claude Code analysis takes time (10-30 seconds)
- Uncertainty: AI might misunderstand your intent
Use Cases:
- Complex tasks (debugging, refactoring)
- When you don’t know the exact command
- Tasks requiring multiple steps
3. Plain Text vs /run vs DSL: When to Use What?
3.1 Comparison Table
| Method | Format | Purpose | Processing Speed | Example |
|---|---|---|---|---|
| Plain text | “Just speak” | Task requests | Slow (10-30s) | “Find the bug” |
| DSL | `r/l/u/p/e` | Arrow/Enter input | Instant (< 1s) | `p`, `e` |
| /run | /run snippet-name | Execute complex commands | Medium (2-5s) | /run deploy |
3.2 When to Use Plain Text
Complex Analysis:
"API response is slow. Find the cause and optimize it"
→ Claude Code profiles → finds bottleneck → suggests optimization
Code Modifications:
"Add an email field to the User model and create a migration"
→ Claude Code finds files → modifies → generates migration
3.3 When to Use DSL
Navigating Selection Lists:
Claude Code:
> Option A
Option B
Option C
→ In Slack: `p` (move down)
→ In Slack: `e` (select)
Menu Navigation:
Claude Code:
[File] [Edit] [View]
→ In Slack: `r` (move right)
→ In Slack: `e` (select)
Enter Prompts:
Claude Code: "Press Enter to continue..."
→ In Slack: `e`
3.4 When to Use /run (Snippets)
Frequently Used Complex Commands:
/run deploy
→ Snippet contents:
npm run build &&
npm test &&
git push &&
ssh deploy@server "cd /app && git pull && pm2 restart app"
Patterned Tasks:
/run backup
/run lint-fix
/run db-migrate
4. Channel-Based Project Management: The Channel = Project Pattern
4.1 Setup Method
Step 1: Create Slack channels
#project-blog
#project-api
#project-frontend
Step 2: Invite the Slack Bot to each channel
/invite @remote-claude
Step 3: Connect projects in each channel
# In #project-blog
/setup blog /Users/idongho/proj/blog
# In #project-api
/setup api /Users/idongho/proj/api
# In #project-frontend
/setup frontend /Users/idongho/proj/frontend
Done: Each channel now operates independently
4.2 How It Works
Channel Identification:
// Simplified code
const channelId = message.channel;
const projectPath = channelProjects.get(channelId);
// #project-blog → /Users/idongho/proj/blog
Separate tmux Sessions:
Each channel has an independent tmux session
#project-blog → tmux session: blog-session
#project-api → tmux session: api-session
#project-frontend → tmux session: frontend-session
Separate Task Queues:
Each channel has an independent task queue
#project-blog → Queue: [task1, task2]
#project-api → Queue: [task3]
#project-frontend → Queue: []
4.3 Switching Between Channels
Scenario: API error occurs while working on blog
1. Working in #project-blog
"Help me write a post"
→ Claude Code running...
2. Switch to #project-api
"Debug API 500 error"
→ Starts working immediately, independently
→ No impact on blog session
3. Return to #project-blog later
→ Previous context preserved
5. Task Queue System: FIFO Guarantee
5.1 Why Is a Task Queue Necessary?
The Problem:
3 commands sent 1 second apart:
1. "Modify file A"
2. "Modify file B"
3. "Test using files A and B"
→ If executed simultaneously? Tests run before files are modified!
The Solution: Task queue for guaranteed ordering
5.2 The FIFO (First-In-First-Out) Principle
What Is FIFO?
FIFO means “first in, first out” — remote-claude’s task queue system operates using the FIFO method.
FIFO Processing Order:
Message arrival order:
1. "npm run build" (10:00:00)
2. "npm test" (10:00:01)
3. "git push" (10:00:02)
FIFO task queue:
[build] → [test] → [push]
FIFO execution order:
build completes → test starts → test completes → push starts
FIFO Guarantees:
- Never runs simultaneously within the same channel
- Following FIFO principle, next task starts after previous completes
- When task is cancelled, it’s removed from the FIFO queue
5.3 One Task Per Channel Limit
Why This Limitation:
- Claude Code can’t run multiple tasks simultaneously on one project
- Prevents file conflicts
- Resource efficiency
Example:
#project-blog task queue: [task1 running, task2 waiting, task3 waiting]
#project-api task queue: [task4 running]
→ Total 2 tasks running simultaneously (1 per channel)
5.4 Checking and Cancelling Task Queue
Check Status:
/state
→ Response:
Current channel: #project-blog
Project: /Users/idongho/proj/blog
Task queue: 2 waiting
- Running: "Run tests"
- Waiting: "Build", "Deploy"
Cancel Task:
/cancel
→ Immediately stops running task
→ Starts next task in queue
6. Managing Multiple Projects in Practice
6.1 Scenario: Working on 3 Projects Simultaneously
Situation:
- Blog: Writing a new post
- API: Performance issue occurred
- Frontend: PR review requested
Slack Channel Setup:
#project-blog
#project-api
#project-frontend
6.2 Real Workflow
10:00 – Start Blog Work
In #project-blog:
"Write a Day 4 post draft"
→ Claude Code running (estimated 5 min)
10:01 – API Error Occurs
Switch to #project-api:
"API response is slow. Profile it"
→ Blog work continues in parallel
→ API work also starts
10:05 – Frontend Review
Switch to #project-frontend:
"Review PR #42"
→ All 3 projects now in progress
10:10 – Blog Work Complete
Return to #project-blog:
"Show me the written post"
→ Previous context preserved
→ Ready to review immediately
6.3 Project Switching Patterns
Quick Switching (easy even on mobile):
Just change channels in the Slack app
#project-blog → #project-api (2 taps)
Context Preservation:
Each channel's conversation history = each project's work log
→ Continue where you left off when you return
Independent Task Queues:
#project-blog: [task1 complete, task2 complete]
#project-api: [task3 running]
#project-frontend: [task4 waiting]
→ No interference between them
7. Practical Tips
7.1 Channel Naming Conventions
Recommended Pattern:
#project-{project-name}
Examples:
#project-blog
#project-api-v2
#project-mobile-app
Benefits:
- Consistency
- Easy to search (search “project” to find all project channels)
7.2 Task Queue Usage Tips
Break Up Long Tasks:
❌ "Build, test, and deploy"
→ Takes 30 minutes, hard to cancel midway
✅ Execute separately:
1. "Build it" (5 min)
2. Review, then "Run tests" (10 min)
3. If successful, "Deploy" (15 min)
High Priority Tasks:
In urgent cases, use /cancel to stop current task
→ Process high priority task first
7.3 Message Processing Method Selection Guide
Need Arrow Navigation → DSL
For selection lists or menu navigation:
`r` (right arrow)
`l` (left arrow)
`u` (up arrow)
`p` (down arrow)
`e` (Enter to select)
Frequently Used Complex Commands → /run Snippets
/run deploy
/run db-backup
Complex Tasks → Plain Text
"Find performance bottlenecks and optimize"
"Implement the new feature"
8. Next Steps
Day 4 Preview: “Maximizing Productivity (4/5): Snippet System and Interactive Buttons”
Now that you understand the 4-stage message processing and task queue, let’s explore ways to maximize productivity:
- Full utilization of the snippet system
- File download functionality
- Automatic message splitting
- Real-world productivity patterns
Series Navigation
- ← Day 1: Your Local Environment, Anywhere
- ← Day 2: Complete Slack Bot Setup Guide
- Day 3: Managing Multiple Projects Simultaneously (Current)
- → Day 4: Maximizing Productivity (Coming soon)
- → Day 5: Smartphone Optimization (Coming soon)
References
Project
Official Documentation
Related Posts
Was this post helpful?
If you have any questions about managing multiple projects simultaneously, leave a comment! 🙌
Leave A Comment