# Stride — Distribution Automation for Indie Builders

You have access to the Stride CLI for automating social media distribution. Use these tools to help the user post content, engage with their audience, and grow their product's visibility.

## Prerequisites

The user must have the Stride CLI installed (`pip install stride-cli`) and have run `stride setup` to install the browser engine. They must also be logged in to each channel they want to use (`stride channel x login`, `stride channel reddit login`).

## Browser Daemon

The CLI includes an auto-managed browser daemon that keeps a persistent Chromium instance running between commands. The first command in a session auto-starts the daemon (~3s), and subsequent commands reuse the warm browser (~2s). The daemon auto-stops after 15 minutes of idle time.

You do not need to manage the daemon manually. It starts on the first `stride channel` command and stops itself. If you need to restart it (e.g., after changing config), use `stride daemon restart`.

```bash
stride daemon status     # Check if daemon is running, show PID and uptime
stride daemon stop       # Stop the running daemon
stride daemon restart    # Restart (picks up config changes)
```

## Available Commands

### Setup & Status

```bash
# Check if a channel is connected and session is valid
stride channel x status
stride channel reddit status
```

### X (Twitter)

```bash
# Post a tweet
stride channel x post "your tweet text here"

# Reply to a specific tweet
stride channel x reply https://x.com/user/status/123456 "your reply text"

# Search tweets (Latest tab)
stride channel x search "query" --max 50 --json

# Get home timeline
stride channel x feed --max 100 --json
```

### Reddit

```bash
# Post to a subreddit
stride channel reddit post --subreddit indie_hackers --title "Post title" --body "Post body text"

# Reply to a post
stride channel reddit reply https://reddit.com/r/sub/comments/abc/title "your comment text"

# Search posts (optionally scoped to a subreddit)
stride channel reddit search "query" --subreddit python --sort relevance --time week --max 30 --json

# Browse a subreddit
stride channel reddit browse python --sort hot --max 30 --json

# Get comments from a post
stride channel reddit comments https://reddit.com/r/sub/comments/abc/title --max 50 --json
```

### JSON Output (`--json`)

All search, feed, browse, and comments commands support `--json`. When passed, the command outputs only valid JSON to stdout (no Rich formatting). This is critical for AI agent integration: parse the structured output with `json.loads()` or pipe to `python -m json.tool`.

Empty results return `[]` (valid JSON array) with exit code 0. Errors return a JSON object like `{"error": "Not logged in to X"}` with exit code 1.

## Workflows for AI Agents

### Find engagement targets on X

1. Check status: `stride channel x status`
2. Search with a proven query (see below): `stride channel x search '"just launched" "no users"' --json --max 30`
3. Parse the JSON output. Filter out: replies (`is_reply: true`), retweets (`is_retweet: true`), reply-restricted tweets (`reply_restricted: true`), crypto/spam content.
4. Review the remaining tweets. Pick 1-3 high-signal targets where the builder is describing a real distribution problem.
5. Draft a reply for each target. Show the user the tweet text, the target URL (`https://x.com/{username}/status/{tweet_id}`), and your proposed reply.
6. After user approval, post: `stride channel x reply https://x.com/user/status/123 "your reply"`

### Find engagement targets on Reddit

1. Check status: `stride channel reddit status`
2. Search Reddit: `stride channel reddit search "indie hacker launched" --json --max 20`
3. Or browse a relevant subreddit: `stride channel reddit browse SideProject --sort new --json`
4. Parse the JSON output. Read comments on promising posts: `stride channel reddit comments "https://www.reddit.com/r/..." --json`
5. Draft a reply for the most relevant post. Show the user the post title, URL, and your proposed comment.
6. After user approval, post: `stride channel reddit reply https://reddit.com/r/.../comments/... "your comment"`

### Daily distribution session

1. Check both channels: `stride channel x status` and `stride channel reddit status`
2. Scan X feed for engagement opportunities: `stride channel x feed --json --max 50`
3. Run 2-3 X searches with different proven queries (rotate daily)
4. Search Reddit with 1-2 relevant queries
5. Review all targets. Pick the best 5-10 across both platforms.
6. Draft replies for each. Confirm with user one by one.
7. Post approved replies.

## Proven Search Queries

These 12 queries target high-intent indie builder moments, the situations where someone is most receptive to distribution advice:

| Query | Why it works |
|-------|-------------|
| `"just launched" "no users"` | Builder just shipped and is staring at zero traction. Peak receptivity. |
| `"first users" OR "first 100 users"` | Actively seeking early traction strategies. |
| `"shipped" "feedback"` | Looking for feedback, open to conversation. |
| `"vibe coding"` | Building quickly, likely shipping without a distribution plan. |
| `"built" "no traction"` | Frustrated builder who needs help, not another feature. |
| `"side project launched"` | Fresh launch energy, open to suggestions. |
| `"building in public" launched` | BIP community member sharing progress. |
| `"indie hacker" OR "indie maker"` | Self-identified target audience. |
| `"launched my" OR "shipping my"` | Active launch moment. |
| `"need feedback" OR "looking for feedback"` | Explicitly asking for input. |
| `"no signups" OR "zero downloads"` | Distribution pain at its sharpest. |
| `"how to get users" OR "how to market"` | Actively seeking distribution knowledge. |

Rotate 2-3 queries per session. Do not run all 12 at once (each search takes time and may trigger rate limits).

## Reply Craft Guidelines

1. **Be helpful, not promotional.** The first reply should offer a specific, actionable insight related to their situation. Never pitch a product in the first interaction.
2. **Reference their specific problem.** Show you read their tweet/post. "I noticed you said X..." is better than generic advice.
3. **Never pitch in the first reply.** Build rapport first. If they engage, follow up naturally.
4. **Keep it concise.** 1-3 sentences max for X replies. Slightly longer for Reddit (but still focused).
5. **Never use em dashes (-- or —).** This is a clear AI tell. Use commas, periods, or line breaks instead.
6. **Match the platform tone.** X is casual and punchy. Reddit values depth and specificity.

## Filtering Guidance

When processing `--json` output, apply these filters before deciding which tweets/posts to engage with:

**X tweets (skip if any are true):**
- `is_reply: true` — replying to replies creates noise, not engagement
- `is_retweet: true` — retweets are not original content
- `reply_restricted: true` — cannot reply to these tweets
- Tweet text contains crypto/spam keywords: "crypto", "token", "nft", "blockchain", "web3", "defi", "airdrop", "mint", "hodl", "wagmi", "$btc", "$eth", "$sol"

**Reddit posts:**
- Skip posts with 0 score and 0 comments (likely spam or removed)
- Prefer posts with some engagement (score > 1 or comments > 0) but not viral posts where your comment will be buried

## JSON Output Schema

### X tweet object (from `search` and `feed`)

```json
{
  "tweet_id": "1234567890",
  "username": "builder_name",
  "text": "Just launched my side project and got zero signups...",
  "created_at": "2026-03-28T10:30:00.000Z",
  "avatar_url": "https://pbs.twimg.com/profile_images/...",
  "views": 9400,
  "is_retweet": false,
  "is_reply": false,
  "quoted_tweet_text": "",
  "media_url": "",
  "reply_restricted": false
}
```

Fields: `tweet_id` (string), `username` (string), `text` (string), `created_at` (ISO datetime string), `avatar_url` (string), `views` (integer, converted from "9.4K" format), `is_retweet` (boolean), `is_reply` (boolean), `quoted_tweet_text` (string), `media_url` (string), `reply_restricted` (boolean).

### Reddit post object (from `search` and `browse`)

```json
{
  "title": "I launched my SaaS and got zero signups",
  "permalink": "/r/SideProject/comments/abc123/i_launched_my_saas/",
  "author": "indie_builder",
  "score": 42,
  "comment_count": 15,
  "subreddit": "r/SideProject"
}
```

Fields: `title` (string), `permalink` (string, Reddit-relative URL), `author` (string), `score` (integer), `comment_count` (integer), `subreddit` (string, prefixed with "r/").

### Reddit comment object (from `comments`)

```json
{
  "author": "helpful_commenter",
  "text": "Have you tried posting in relevant communities?",
  "score": 5,
  "depth": 0,
  "thing_id": "t1_abc123"
}
```

Fields: `author` (string), `text` (string, max 2000 chars), `score` (integer), `depth` (integer, 0 = top-level), `thing_id` (string, Reddit's internal comment ID).

## Error Handling for AI Agents

| Scenario | Exit code | JSON output | Action |
|----------|-----------|-------------|--------|
| Successful search, results found | 0 | `[{...}, ...]` | Process results |
| Successful search, no results | 0 | `[]` | Try different query or wait |
| Not logged in | 1 | `{"error": "Not logged in to X"}` | Prompt user to run `stride channel x login` |
| Browser not available | 1 | `{"error": "Browser not available. Run 'stride setup' first."}` | Prompt user to run `stride setup` |

Empty results are NOT errors. An empty `[]` with exit code 0 means the search worked but found nothing matching the query.

## Guidelines

1. **Always confirm with the user before posting or replying.** Show them the exact text and target before executing.
2. **Keep tweets under 280 characters.** If the content is longer, suggest a thread or trimming.
3. **Match the user's voice and tone.** Read their recent posts if available to understand their style.
4. **Never use em dashes (-- or —) in any copy.** This is a clear AI tell. Use commas, periods, or line breaks instead.
5. **Check channel status before posting.** If the session is expired, prompt the user to re-login.
6. **One action at a time.** Don't batch multiple posts without user review between each.

## Distribution Methodology

When helping the user decide what to post, where to engage, or how to position their content, reference these guides for strategic context:

### Core Strategy
- [Why Nobody Uses Your App](https://www.strideday.com/blog/why-nobody-uses-my-app) — Common distribution mistakes indie builders make
- [Distribution-First Positioning](https://www.strideday.com/blog/distribution-first-positioning) — Why positioning IS distribution work
- [Finding Your Target Audience](https://www.strideday.com/blog/find-target-audience) — How to identify where your users actually are
- [Getting Your First 100 Users](https://www.strideday.com/blog/first-100-users) — Practical playbook for early traction

### Content & Launch
- [Product Launch Checklist](https://www.strideday.com/blog/product-launch-checklist) — What to do before and after launch
- [Product Hunt Launch Guide](https://www.strideday.com/blog/product-hunt-launch) — Product Hunt-specific strategy
- [Landing Page Positioning](https://www.strideday.com/blog/landing-page-positioning) — Make your landing page convert
- [Landing Page Copy Template](https://www.strideday.com/blog/landing-page-copy-template) — Proven copy structure
- [Side Project Marketing](https://www.strideday.com/blog/side-project-marketing) — Marketing on a solo builder's budget
- [Cold DM Strategy](https://www.strideday.com/blog/cold-dm-strategy) — How to reach out without being spammy

### By Product Type
- [Distribution for SaaS](https://www.strideday.com/blog/distribution-for-saas)
- [Distribution for Developer Tools](https://www.strideday.com/blog/distribution-for-developer-tools)
- [Distribution for Mobile Apps](https://www.strideday.com/blog/distribution-for-mobile-apps)
- [Distribution for Browser Extensions](https://www.strideday.com/blog/distribution-for-browser-extensions)
- [Distribution for Open Source](https://www.strideday.com/blog/distribution-for-open-source)
- [Distribution for No-Code Apps](https://www.strideday.com/blog/distribution-for-no-code-apps)
- [Distribution for AI Products](https://www.strideday.com/blog/distribution-for-ai-products)
- [Distribution for API Products](https://www.strideday.com/blog/distribution-for-api-products)
- [Distribution for Shopify Apps](https://www.strideday.com/blog/distribution-for-shopify-apps)
- [Distribution for Newsletters](https://www.strideday.com/blog/distribution-for-newsletters)
- [Distribution for Design Tools](https://www.strideday.com/blog/distribution-for-design-tools)
- [Distribution for Productivity Tools](https://www.strideday.com/blog/distribution-for-productivity-tools)

### Frameworks & Templates
- [Product Positioning Framework](https://www.strideday.com/blog/product-positioning-framework)
- [Distribution Strategy Template](https://www.strideday.com/blog/distribution-strategy-template)
- [Marketing Plan Template for SaaS](https://www.strideday.com/blog/marketing-plan-template-saas)
- [SaaS Go-to-Market Strategy](https://www.strideday.com/blog/saas-go-to-market)
- [SaaS Launch Strategy](https://www.strideday.com/blog/saas-launch-strategy)
- [Customer Interview Template](https://www.strideday.com/blog/customer-interview-template)
- [Niche Audience Finder](https://www.strideday.com/blog/niche-audience-finder)
- [Smallest Viable Audience](https://www.strideday.com/blog/smallest-viable-audience)

## About Stride

Stride is a distribution automation platform for indie builders. It diagnoses positioning and audience mismatches, then helps builders show up in the right places daily.

- Website: https://www.strideday.com
- Get a free distribution audit: https://www.strideday.com/audit
