# iOS, React Native and servers

Web pages are the main install, but native apps and back-end code can report into the same inbox. Their bugs are grouped the same way.

## iOS and macOS (Swift)

1. In **Setup**, choose the **iOS (Swift)** tab and download the **BugTapeCore** package.
2. Unzip it and add it to your Xcode project as a local package.
3. Copy the start-up code from Setup. It asks for the user's consent choice and keeps an offline queue.

BugTapeCore sends handled errors, user reports and breadcrumbs. It is in alpha: it does not capture fatal crashes and has no screen replay. See [Swift](/docs/swift/) for the full API.

## React Native

Setup's **React Native** tab links a small file, `bugtape.ts`, that uses `fetch` and needs no native module. Copy it into your app and start it with your key. It captures global JavaScript errors and unhandled rejections, and you can report handled errors yourself.

## Servers

### Python

Install the Python SDK and start it once, near the top of your app:

```bash
pip install bugtape
```

```python
import bugtape

bugtape.init(service="reports")  # key from BUGTAPE_KEY
```

It reports uncaught exceptions, `ERROR` log records and Streamlit page errors. Frame locals are never read, and messages are redacted by pattern before they are sent. See the [Python docs](/docs/python/).

### Node.js

Install the Node.js SDK and start it once, when your server starts:

```bash
npm install @bugtape/node
```

```js
import * as bugtape from '@bugtape/node';

bugtape.init({ service: 'api' });            // key from BUGTAPE_KEY
app.use(bugtape.expressErrorHandler());      // Express: after your routes
```

It reports uncaught exceptions, unhandled rejections, and Express or Next.js request errors with the route pattern. Request bodies, headers and query strings are never read, and messages are redacted by pattern before they are sent. See the [Node.js docs](/docs/node/).

### Any other back end

Any back end can send a report over HTTP:

```bash
curl -X POST https://app.bugtape.ai/v1/ingest \
  -H 'Content-Type: application/json' \
  -H 'X-BugTape-Key: bt_live_your_key_here' \
  -d '{"title": "TimeoutError: payment provider did not answer", "platform": "server", "severity": "high"}'
```

Add `release`, `environment`, `userId` and a stack in `events` to make the issue more useful. The [ingest schema](/docs/ingest-schema/) lists every field. Server reports have no page replay.

## Next

Learn to work the inbox.
