クラッシュレポートを、自分の Cloudflareで。
Sentry SDK そのままで、ingest からシンボリケート、保管、UI まで全部 Cloudflare の上で動きます。dSYM / ProGuard 解決は Workers Containers、 ストレージは R2、UI は Pages。
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
Why Wana
小さく速く、しかし妥協のない
クラッシュレポート基盤。
Sentry の使い心地そのままで、データもインフラも自分のアカウントに留めたままに。
Sentry SDK そのまま、DSN だけ差し替え
Cocoa / Android / JS / Node / RN / Flutter / Python / Go / Rust 全部対応。既存プロジェクトはコード 0 行で切替完了。
import Sentry SentrySDK.start { options in options.dsn = "https://wana3f73…@ingest.wana.example.com/example-project" }
dSYM をエッジで symbolicate
Workers Containers + llvm-symbolizer。アップロードから関数名解決まで数秒。
Stack → GitHub に直リンク
CLI が build 時に git SHA を相乗りさせるので、フレームから当時の行に飛べる。
自分の Cloudflare で動く
Workers / D1 / R2 / Queues / Containers。データはあなたの口座下。
ライブで Issue が流れる
Issue 一覧は SSE で自動更新。アラートを待たずに気づける。
MIT、ベンダーロック無し
fork して自分でデプロイ可。SDK 側の逃げ道も常に開いてる。
Before · After
意味のあるスタックトレースに、
数秒で生まれ変わる。
dSYM をアップしてしまえば、生のアドレス羅列がそのまま読めるスタックトレースになります。
0 UoAApp 0x0000000104b6a210 1 UoAApp 0x0000000104a821ac 2 UoAApp 0x0000000104b5e3e0 3 SwiftUI 0x00000001a8d7c104 4 UIKit 0x00000001844e1a98 5 libdispatch 0x00000001801a1d04 6 libobjc 0x000000018011e8a4
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 一覧。
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
@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 アカウント内で完結するパイプライン。ボトルネックも単一障害点も無く、スパイクも捕り逃さない。
データロス無し
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
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
Gradle
implementation("io.sentry:sentry-android:7.+")kotlin
SentryAndroid.init(context) { options ->
options.dsn = "<DSN>"
options.tracesSampleRate = 1.0
}Web
JavaScript · @sentry/browser
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
Wizard
npx @sentry/wizard@latest -i reactNative
javascript
import * as Sentry from "@sentry/react-native";
Sentry.init({ dsn: "<DSN>" });Flutter
sentry_flutter
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
CLI をインストール
shnpm install -g @wanahq/cli
macOS で Xcode CLT 必須 (UUID 抽出に
dwarfdumpを使うため)。 - 2
Xcode に Run Script を追加
Target → Build Phases → + New Run Script Phase ─ Strip Debug Symbols の直後に配置。
shif which wana >/dev/null; then export WANA_DSN="<DSN>" wana upload-dif "$DWARF_DSYM_FOLDER_PATH" fi
- 3
ビルドする
これ以降のビルド / Archive で dSYM + git SHA + repo が自動送信。 ストレージは UUID 単位で常に最新 1 つだけ保持され、古い build の dSYM は自動で破棄されます。
Compare
Wana vs Sentry vs Crashlytics
同じ問題を解く既存サービスとの相対地。実態は各サービス公式で確認してください。
| Feature | Wana | Sentry (SaaS) | Crashlytics |
|---|---|---|---|
| Drop-in Sentry SDK | ✓ | ✓ | — |
| iOS / Android / Web / Node / RN / Flutter | ✓ | ✓ | 限定的 |
| セルフホスト | Cloudflare | 可 (重い) | — |
| ストレージは自分の口座 | ✓ | — | — |
| dSYM 自動 symbolicate | ✓ | ✓ | ✓ |
| GitHub source linking | ✓ | ✓ | — |
| オープンソース | MIT | BSL | — |
| 従量課金 | 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 検出は順次実装中。