iOS-first app infrastructure

Crash reporting, beta distribution, analytics, and deep links. One small SDK.

Pharen tells you how your iOS app is really doing — crashes symbolicated end-to-end, builds on testers’ phones in one command, sessions and events with consent stamped on every one, and deep links that route your app without leaking a query string. Installed with one line of code and two Info.plist values.

iOS first, by design. Early access — keys are issued when we onboard you.

The whole installMyApp.swift
// Package.swift
.package(
  url: "https://github.com/pharen-ai/sdk-ios.git",
  from: "0.1.0")

// Info.plist — your key + the purposes you grant
PharenIngestKey        YOUR-INGEST-KEY
PharenConsentGranted   [telemetry]

// One line of code
import PharenSDK

Pharen.start()
Crash handlers installed · session started · delivering in batches, off the main thread
What ships today

Four things, done end-to-end.

No grab-bag of half-features. Each capability runs the whole distance — capture to console — and they share one SDK, one event envelope, one consent model.

Crash reporting

Readable crashes, counted once.

Fatal crashes are written to disk at crash time and delivered on the next launch — duplicate-safe, so a retry can never double-count. Symbolicated end-to-end on device builds, grouped into issues. Upload dSYMs late and existing issues re-group with real function names.

Pharen.shared?.crashes.recordError(
  "Checkout failed: gateway timeout",
  breadcrumbs: ["tapped_pay", "network_slow"]
)
Distribution

A build on a tester’s phone, one command.

Upload an .ipa and get back an over-the-air install link served from edge storage — tap it in Safari, the app installs. The same step registers the release and uploads every dSYM, so crashes from that build are readable from the moment it’s installed. Or use the fastlane plugin (MIT).

$ bash release/release-lane.sh
→ archive · upload-build · upload-symbols
itms-services://…/manifest.plist
Sessions & analytics

See the whole customer experience.

Sessions start and end themselves — the standard 30-minute rule, no code. Add track() and screen() for your own events. Everything shares one strict envelope, so crashes, screens, and custom events sit in the same timeline, roll up into sessions, and filter the same way.

Pharen.shared?.track("checkout_completed",
  properties: ["order_value": 49.99])
Pharen.shared?.screen("Cart")
Deep links

Links that route — without leaking.

Accept universal links on your domains and pharen.link, route them through one hook, and create campaign-tagged short links to share. Routing always happens — consent gates the telemetry, not your navigation. And the open event carries the route path only; query strings, which can hide tokens and PII, never leave the device.

Pharen.shared?.deepLinks.onLink = { link in
  router.open(link.targetPath, link.params)
}
Privacy architecture

Consent is stamped on every event.

Not a setting bolted on — enforced at the point of collection. Purposes are opt-in; an ungranted event is dropped at the boundary, before it’s stored or sent. Personal traits route to a restricted attribute store and never travel on the event stream or appear in logs. Your tenant and environment are stamped server-side — the client can’t spoof them.

This architecture is built to make GDPR- and CCPA-style privacy obligations tractable. Whether your use complies is a legal determination that stays with you — Pharen gives you the mechanism, honestly.

How the consent model works →
  • telemetryCrashes, handled errors, performance
  • behavioralSessions, screens, your track() events
  • identityAssociating activity with a known user
  • contentUser-submitted content, like feedback
  • healthSpecial-category data — explicit, runtime-only
Dogfooded first

We run it in our own shipping apps before you do.

Pharen is built by Lucubra and runs in production in Lucubra Studio’s iOS apps. Every capability on this page shipped because our own releases needed it — the crash pipeline caught our crashes, the install links delivered our betas. What annoys us gets fixed before it reaches you.

Your data stays portable: versioned contracts and an export-ready event log. If Pharen ever isn’t right for you, your history leaves with you.

Issues · Sample AppFIXTURE DATA
production · release 9.9.9 (999)
  • SIGSEGV · SampleStore.load(fixture:)first seen 9.9.8 · symbolicated
    14 eventsOPEN
  • NSInvalidArgumentException · DemoCart.total()regressed in 9.9.9 · was resolved in 9.9.7
    6 eventsREGRESSED
  • Handled · “Checkout failed: gateway timeout”breadcrumbs: tapped_pay → network_slow
    3 eventsTRIAGE
  • SIGABRT · FixtureKit.demoCrash()re-grouped after late dSYM upload
    2 eventsRESOLVED
PLAIN FACTS

What Pharen doesn’t do yet: Android and web SDKs, self-serve signup, and billing. iOS-first is deliberate — one platform, done properly, in production. The console is operated for you during early access; you get onboarded, not upsold.

If that scope fits, we’d like to hear from you: hello@pharen.ai

Ship your next build with a fixed point to steer by.

Early access is a conversation, not a form. Tell us what you’re building and we’ll set up your keys, your first release, and your console.