Documentation

Getting started

This guide takes you from nothing to a real bug report landing in Linear. You'll create an account, get a project ingest key, add the RageShake Swift Package, point the project at a destination, and shake your phone to file the first issue. It takes a few minutes.

What you'll need

  • An iOS app you can build and run (iOS 15 or newer), and Xcode.
  • A destination for reports: either a Linear API key plus the team ID issues should land in, or any HTTPS webhook URL you control.
  • A rageshake.dev account — created when you sign in in the next step.
01

Create your account

Open rageshake.dev/login and sign in with Clerk — use your email or a social login. Your rageshake.dev account is keyed to that identity and is created automatically on first sign-in.

02

Create a project and get an ingest key

A project holds your ingest key, destinations, and reports. There are three ways to create one — pick whichever fits how you work. Each produces an rs_ing_… ingest key, which is shown once and embedded in your app. Ingest keys can only submit reports, so they are safe to ship inside the binary.

Dashboard

In the dashboard, click New project, give it a name, and set the platform to ios. Open the project and copy the ingest key from the API keyssection — it's revealed only at creation, so store it now.

CLI (rageshake bootstrap)

The CLI's bootstrap command creates the project, mints the ingest key, and optionally wires up a destination in a single call, then prints the ready-to-paste Swift snippet. It needs a rs_mgmt_…management key, which you create in the dashboard under a project's API keys.

bash
# 1. Install the CLI (Go 1.22+)
go install github.com/patrickshuff/rageshake-cli/cmd/rageshake@latest

# 2. Authenticate with a management key (Dashboard -> project -> API keys)
export RAGESHAKE_API_KEY=rs_mgmt_YOUR_KEY

# 3. Create project + ingest key + Linear destination in one shot
rageshake bootstrap --name "My App" --platform ios \
  --type linear --linear-api-key lin_api_YOUR_KEY --team-id YOUR_TEAM_ID

Run it without flags to be prompted interactively. Full command reference is in the CLI README.

MCP (for AI agents)

Point an AI agent at the hosted MCP server with a management key and ask it to set the project up. Add the server:

bash
claude mcp add rageshake \
  --transport http https://rageshake.dev/api/mcp \
  --header "Authorization: Bearer rs_mgmt_YOUR_KEY"

Then the agent calls one tool:

json
bootstrap_project({
  "name": "My App",
  "platform": "ios",
  "destination": {
    "type": "linear",
    "linear": { "apiKey": "lin_api_YOUR_KEY", "teamId": "YOUR_TEAM_ID" }
  }
})

The response includes the ingest key (once) and a RageShake.configure(apiKey:) snippet. See the MCP server docs for every tool.

Prefer a guided flow? Install the rageshake agent skill (save to .claude/skills/rageshake/SKILL.md) and it walks your agent through provisioning the project, pulling the ingest key, adding the Swift package, and wiring the SDK.

03

Add the SDK with Swift Package Manager

In Xcode, choose File → Add Package Dependencies… and enter https://github.com/rageshake/rageshake-ios, or add it to your Package.swift directly. RageShake is iOS 15+ and has zero third-party dependencies.

swift
dependencies: [
  .package(url: "https://github.com/rageshake/rageshake-ios", from: "1.0.0"),
],
targets: [
  .target(
    name: "MyApp",
    dependencies: [
      .product(name: "RageShake", package: "rageshake-ios"),
    ]
  ),
]
04

Configure at launch

Call RageShake.configure(apiKey:) once, as early as possible — a SwiftUI Appinitializer or your app delegate's didFinishLaunchingWithOptions. That one call starts shake detection, screenshot capture, and the feedback sheet. Paste the ingest key from step 2.

swift
import SwiftUI
import RageShake

@main
struct MyApp: App {
  init() {
    RageShake.configure(apiKey: "rs_ing_YOUR_KEY")
  }

  var body: some Scene {
    WindowGroup { ContentView() }
  }
}

That's the whole integration. The endpoint defaults to https://rageshake.dev; pass tintColor: to theme the sheet, or call RageShake.setEnabled(false) to suppress reporting in sensitive flows. Wrap any sensitive SwiftUI view in .rageShakeExcluded() to keep it out of the captured screenshot.

05

Route reports to a destination

A report is only useful if it lands somewhere your team works. If you used bootstrap with a destination in step 2, this is already done — otherwise add one now. A project can have both a Linear destination and a webhook.

Linear

Provide a Linear API key and the target team ID. Every report becomes an issue in that team with the message as the title, the screenshot attached, and device metadata in the body. In the dashboard, add a destination of type linear and paste your API key — it fetches your Linear teams so you pick the target from a list rather than hunting for an ID. Or from the CLI, pass the team ID directly:

bash
rageshake destinations create --project YOUR_PROJECT_ID --type linear \
  --linear-api-key lin_api_YOUR_KEY --team-id YOUR_TEAM_ID

# Fire a synthetic delivery to confirm the credentials work
rageshake destinations test --project YOUR_PROJECT_ID YOUR_DESTINATION_ID

Webhook

Deliver a signed JSON POST to your own endpoint. Each request carries an X-Rageshake-Signature header you should verify — the exact HMAC scheme and a Node verification snippet are documented in the OpenAPI spec under WebhookDeliveryPayload.

bash
rageshake destinations create --project YOUR_PROJECT_ID --type webhook \
  --url https://example.com/hooks/rageshake --secret whsec_YOUR_SECRET

Delivery is validated before saving and you can dry-run it any time with test_destination (MCP) or rageshake destinations test (CLI), which runs a real delivery against a synthetic report and reports success, retryable, or permanent.

06

Shake, and watch it land

Build and run your app. Shake the device — on the iOS Simulator use Device → Shake (⌃⌘Z). The feedback sheet rises with a preview of the screenshot and a text box; type what went wrong and hit submit.

Within moments the report is ingested, fanned out to your destination, and delivered: a new issue appears in your Linear team (or your webhook receives the signed payload). If the device is offline, the SDK queues the report on disk and drains it automatically when connectivity returns — the user's job is done the moment they tap submit.

You can confirm delivery from the dashboard's reports view, or with rageshake reports list --project YOUR_PROJECT_ID, which shows each report with its per-destination delivery status.

Where to go next

  • MCP server — let an agent manage projects, keys, and destinations end to end.
  • REST API (OpenAPI) — the full ingest and management surface, including the webhook signature scheme.
  • Go CLI — full CRUD from your terminal, with table, JSON, and CSV output.
  • iOS SDK — configuration options, the offline queue, and the privacy manifest.