Live · Cloudflare-native crash reporting

クラッシュレポートを、自分の Cloudflareで。

Sentry SDK そのままで、ingest からシンボリケート、保管、UI まで全部 Cloudflare の上で動きます。dSYM / ProGuard 解決は Workers Containers、 ストレージは R2、UI は Pages。

$npm install -g@wanahq/cli
wana.app/p/example-project/issues/04bccd…
IssuesReleasesNotificationsSetup
fatalSymbolicated 28 / 28

EXC_BAD_ACCESS

Attempted to dereference null pointer

  • UoAApp.ContentView.body.getterContentView.swift:142
  • SwiftUI.ViewBuilder.buildBlockViewBuilder.swift:48
  • UoAApp.HomeScreen.refresh()HomeScreen.swift:86
  • UIKit.UIView.touchesEndedUIView.m:1024
release: example-project@3.1db04745146 events
9+
SDKs supported
~3s
Crash → symbolicated
100%
On Cloudflare edge
MIT
Open source

Why Wana

小さく速く、しかし妥協のないクラッシュレポート基盤。

Sentry の使い心地そのままで、データもインフラも自分のアカウントに留めたままに。

Drop-in compatible

Sentry SDK そのまま、DSN だけ差し替え

Cocoa / Android / JS / Node / RN / Flutter / Python / Go / Rust 全部対応。既存プロジェクトはコード 0 行で切替完了。

swiftSentrySDK.swift
import Sentry

SentrySDK.start { options in
  options.dsn = "https://wana3f73…@ingest.wana.example.com/example-project"
}
On the edge

dSYM をエッジで symbolicate

Workers Containers + llvm-symbolizer。アップロードから関数名解決まで数秒。

Source-linked

Stack → GitHub に直リンク

CLI が build 時に git SHA を相乗りさせるので、フレームから当時の行に飛べる。

Your account

自分の Cloudflare で動く

Workers / D1 / R2 / Queues / Containers。データはあなたの口座下。

Real-time

ライブで Issue が流れる

Issue 一覧は SSE で自動更新。アラートを待たずに気づける。

Open

MIT、ベンダーロック無し

fork して自分でデプロイ可。SDK 側の逃げ道も常に開いてる。

Before · After

意味のあるスタックトレースに、数秒で生まれ変わる。

dSYM をアップしてしまえば、生のアドレス羅列がそのまま読めるスタックトレースになります。

生のアドレスのまま0 / 28
0   UoAApp                            0x0000000104b6a210
1   UoAApp                            0x0000000104a821ac
2   UoAApp                            0x0000000104b5e3e0
3   SwiftUI                           0x00000001a8d7c104
4   UIKit                             0x00000001844e1a98
5   libdispatch                       0x00000001801a1d04
6   libobjc                           0x000000018011e8a4
Wana で symbolicated28 / 28
0  UoAApp.ContentView.body.getter  ContentView.swift:142
1  UoAApp.HomeScreen.refresh()  HomeScreen.swift:86
2  UoAApp.APIClient.fetchEvents()  APIClient.swift:204
3  SwiftUI.ViewBuilder.buildBlock
4  UIKit.UIApplication.sendEvent
5  libdispatch._dispatch_main_queue
6  libobjc.objc_msgSend

Live in the dashboard

イシュー 1 つで、必要なものが全部見える。

Sentry の Issue 詳細にあるもの全部 — シンボリケート済みスタック、GitHub 直リンク、breadcrumbs、release タグ、histogram、event 一覧。

wana.app/p/example-project/issues/04bccdad…
IssuesReleasesNotificationsSetup
fatalSymbolicated 28 / 28release: 3.1+1git: db04745

EXC_BAD_ACCESS · KERN_INVALID_ADDRESS

Attempted to dereference null pointer

  • UoAApp.ContentView.body.getterSources/ContentView.swift:142
  • UoAApp.HomeScreen.refresh()Sources/HomeScreen.swift:86
  • UoAApp.APIClient.fetchEvents()Sources/Network/APIClient.swift:204
  • SwiftUI.ViewBuilder.buildBlockSwiftUI.ViewBuilder:48
  • UIKit.UIApplication.sendEventUIApplication.m:1024

Breadcrumbs

  • 12:14:58navigation→ /home
  • 12:15:02httpGET /api/events 200 142ms
  • 12:15:09ui.tapRefreshButton
  • 12:15:09fatalEXC_BAD_ACCESS

Events (24h)

146 events · peak 14/h

Assignee

Y

@you

First / Last seen

Jun 14 09:34

Jun 14 12:16

Environment

  • osiOS 17.4
  • deviceiPhone 15 Pro
  • localeja-JP

Architecture

全てのコンポーネントが Cloudflare の上。

Cloudflare の 1 アカウント内で完結するパイプライン。ボトルネックも単一障害点も無く、スパイクも捕り逃さない。

01SDKSentry envelope
02IngestWorker
03Queuedecouple spikes
04Durable Objectper-project DB
05R2payload + dSYM
06Containerllvm-symbolizer
07PagesSSR dashboard

データロス無し

ingest → Queue → consumer の 3 段で瞬間スパイクが来ても 1 件も落とさない。 R2 への書き込み失敗時は自動 retry、限度超えは DLQ へ。

非同期シンボリケート

ack 後に ctx.waitUntil で Container を叩くので、ingest レイテンシは増えない。dSYM が無いフレームは後追いで Re-symbolicate 可能。

One string, full identity

DSN の構造

プロジェクトごとに 1 本だけ発行される秘密キー。SDK と CLI どっちもこれだけで動きます。

https://wana3f73b2b…@ingest.wana.example.com/example-project

publicKey

プロジェクト固有のシークレット。SDK の Authorization と CLI 認証で使う。

ingest host

Wana が立ってる Cloudflare Worker のホスト。CLI はここから dashboard を自動推定。

projectId

Dashboard 上のプロジェクト ID。ルーティングと DO の per-project インスタンスに使う。

Pick your SDK

全部対応、全部 1 行設定。

Sentry SDK と完全互換。既存プロジェクトは DSN を差し替えるだけです。

iOS / macOS

Swift · Sentry-Cocoa

dSYM 推奨

Swift Package Manager

https://github.com/getsentry/sentry-cocoa

swift

import Sentry

SentrySDK.start { options in
  options.dsn = "<DSN>"
  options.enableAutoSessionTracking = true
}

Android

Kotlin/Java · sentry-android

dSYM 推奨

Gradle

implementation("io.sentry:sentry-android:7.+")

kotlin

SentryAndroid.init(context) { options ->
  options.dsn = "<DSN>"
  options.tracesSampleRate = 1.0
}

Web

JavaScript · @sentry/browser

sourcemap 推奨

npm

npm install @sentry/browser

javascript

import * as Sentry from "@sentry/browser";

Sentry.init({ dsn: "<DSN>" });

Node.js

@sentry/node

npm

npm install @sentry/node

javascript

const Sentry = require("@sentry/node");

Sentry.init({ dsn: "<DSN>" });

React Native

@sentry/react-native

dSYM 推奨

Wizard

npx @sentry/wizard@latest -i reactNative

javascript

import * as Sentry from "@sentry/react-native";

Sentry.init({ dsn: "<DSN>" });

Flutter

sentry_flutter

dSYM 推奨

pub

flutter pub add sentry_flutter

dart

await SentryFlutter.init(
  (options) => options.dsn = "<DSN>",
  appRunner: () => runApp(MyApp()),
);

Python

sentry-sdk

pip

pip install sentry-sdk

python

import sentry_sdk

sentry_sdk.init(dsn="<DSN>")

Go

sentry-go

go get

go get github.com/getsentry/sentry-go

go

sentry.Init(sentry.ClientOptions{
  Dsn: "<DSN>",
})

Rust

sentry crate

Cargo

sentry = "0.34"

rust

let _guard = sentry::init("<DSN>");

他にも Ruby / Java / Unity / Unreal など、すべての Sentry SDK が動きます。

Native symbolicate

dSYM は CLI で自動アップロード。

iOS / macOS / Android NDK / RN / Flutter の native フレームは、対応する debug-info を Wana に送らないと関数名が出ません。CLI が build hook 経由で自動化します。

  1. 1

    CLI をインストール

    sh
    npm install -g @wanahq/cli

    macOS で Xcode CLT 必須 (UUID 抽出に dwarfdump を使うため)。

  2. 2

    Xcode に Run Script を追加

    Target → Build Phases → + New Run Script Phase ─ Strip Debug Symbols の直後に配置。

    sh
    if which wana >/dev/null; then
      export WANA_DSN="<DSN>"
      wana upload-dif "$DWARF_DSYM_FOLDER_PATH"
    fi
  3. 3

    ビルドする

    これ以降のビルド / Archive で dSYM + git SHA + repo が自動送信。 ストレージは UUID 単位で常に最新 1 つだけ保持され、古い build の dSYM は自動で破棄されます。

Compare

Wana vs Sentry vs Crashlytics

同じ問題を解く既存サービスとの相対地。実態は各サービス公式で確認してください。

FeatureWanaSentry (SaaS)Crashlytics
Drop-in Sentry SDK
iOS / Android / Web / Node / RN / Flutter限定的
セルフホストCloudflare可 (重い)
ストレージは自分の口座
dSYM 自動 symbolicate
GitHub source linking
オープンソースMITBSL
従量課金Cloudflare のみ$$$無料 (Google ロック)

※ Sentry / Crashlytics の機能・料金は 2026 年時点の公開情報。

Open source

ベンダーロック無し。コードもインフラも自分のもの。

MIT で公開。fork してそのまま自分の Cloudflare に立てれば、 Wana のホスティングからも独立して動かせます。SDK は Sentry の OSS をそのまま使ってるので、SDK 側の逃げ道も常に開いてます。

FAQ

よくある質問

Sentry からどれくらい簡単に切り替えできる?

+

DSN を差し替えるだけです。Sentry SDK の envelope 形式をそのまま受けるので、 アプリ側のコードは 1 行も変えなくて OK。

Cloudflare のどのプランが要る?

+

Workers Containers が Workers Paid ($5/月〜) 必須。 D1 / R2 / Queues / Pages は無料枠の範囲で十分回ります。 個人プロジェクトなら月数百円〜数千円規模。

dSYM を Wana 側に置くのが嫌

+

UUID 単位で常に最新 1 つだけ。CLI が次のビルドをアップした瞬間に古いものを R2 から削除します。 シンボリケート結果は別ファイル (symbols.json) に分離保管されるので、 dSYM 自体は将来的にもっと短い TTL に下げる予定。

セルフホストできる?

+

完全に出来ます。むしろそれがデフォルト。 GitHub から clone → wana provision wana deploy で自分の Cloudflare に立ち上がります。

GitHub Issues との連携は?

+

フレームから GitHub の該当行へ直リンクします (CLI が SHA + repo を送る)。 issue 双方向同期 / suspect-commit 検出は順次実装中。

サインアップ → DSN コピー。所要 1 分。

プロジェクトを作って、SDK の DSN を差し替えるだけ。 Cloudflare のあなたのアカウントで動き始めます。