OxiLytics BetaGitHub

Public beta v1.0.14 · MIT · self-hosted

Your App Store and Google Play numbers. On your own server.

OxiLytics pulls downloads, crashes, ratings and reviews from App Store Connect and Google Play into one dashboard that you host. No SDK in your apps, no vendor cloud, no telemetry. Just the official store APIs and a SQLite file you own.

  • iOS · iPadOS · macOS
  • Android
  • Docker amd64 + arm64
  • ~30 MB RAM
OxiLytics dashboard: downloads, crashes, rating and reviews for all products, a downloads chart per product, top performers and top countries

// Privacy first

Analytics that never touch your users

Most analytics tools are an SDK inside your app that reports every user to someone else's cloud. OxiLytics works the other way round: it signs in to Apple and Google as you and reads the aggregated statistics they already publish to you in their consoles.

OxiLytics cloud does not exist. Neither does a licence server, an account or an "anonymous statistics" switch.

No SDK. Ever.

Nothing is compiled into your apps. No tracking pixel, no device IDs, no IDFA prompt, no new line in your privacy label.

On-premises

One Go binary and one SQLite file in a Docker image. Runs on a small VPS, a NAS, a Raspberry Pi or a laptop.

Egress: stores only

Outbound traffic goes to apple.com and googleapis.com (plus Apple's public lookup for icons). Check it with tcpdump.

No telemetry

No phone-home, no usage statistics, no licence check. Your numbers stay in your jurisdiction, under your backups.

Typical analytics SaaS compared with OxiLytics
Typical SaaS analyticsOxiLytics
Data sourceAn SDK inside your appOfficial store reporting APIs
Who sees your numbersThe vendor and its sub-processorsOnly you
Where data livesVendor cloud, foreign jurisdictionYour server, your disk
User-level trackingEvents, device IDs, sessionsNone exists
GDPR paperworkProcessing agreements, transfersNothing leaves your machine
CostPer event or per userFree, MIT
Lock-inExport if they let youPlain SQLite you already own

// Features

Everything the stores tell you, in one place

A dashboard for the whole portfolio

Downloads, crashes, average rating and new reviews for any date range, with the per-platform split under every number. Downloads per product by day, week or month, top performers, platform share, crash trend and top countries.

OxiLytics dashboard: downloads, crashes, rating and reviews for all products, a downloads chart per product, top performers and top countries
Portfolio dashboard: every product, both stores, one date range.

Products, not bundle IDs

You think in "Neon Sudoku", not in io.example.sudoku on one store and 6744125178 on the other. OxiLytics links store listings into products, so the iOS, macOS and Android builds of one app roll up into one row with one number. The platform breakdown is one click away.

  • Automatic linking suggestions for unmatched listings
  • Ignore stale or foreign listings: they leave every total
  • Ratings per platform, crash rate per 1,000 downloads
Neon Sudoku product page in OxiLytics with iOS and Android downloads stacked in one chart, platform share and rating per platform
A product page: iOS and Android builds of one app rolled into one number.

Setup that tells you what is wrong

Until a store is connected, OxiLytics starts in setup mode and walks you through creating the App Store Connect key or the Google Play service account. Test connection checks each step separately and names the one that failed, instead of a generic "invalid credentials".

OxiLytics App Store Connect setup page with step-by-step instructions, the required environment variables and a Test connection button
Guided setup with a Test connection button that names the exact failed check.

Syncs you can see

Full sync walks the whole history both stores expose; delta sync fetches only what changed, daily on a schedule or on demand. Every run is logged with per-app progress, row counts and errors, so a failure is visible instead of silent.

  • Reviews from both stores in one inbox, full-text search, CSV export
  • Admin and viewer roles, TOTP two-factor sign-in
  • Automatic database backups, light and dark theme
OxiLytics sync page: last run per store, the daily schedule and a history table with duration, apps and row counts
Every sync logged with per-app progress, row counts and errors.

// Honest numbers

Apple and Google do not report the same things

A single "portfolio total" can quietly mean one platform. OxiLytics shows the split under every number and keeps one-store metrics off the portfolio view, so you never compare a number with a store that never reported it.

What each store publishes
Metric App Store Google Play
DownloadsYesYes
RedownloadsYesNo
UpdatesYesNot in Play reports
UninstallsWeekly, above a volume thresholdDaily
Active devicesNoYes
CrashesYesYes, plus ANRs
RatingsStore-wide averageDaily
Written reviewsYesYes
Per countryYesYes

Platforms: iOS and iPadOS, macOS (one App Store Connect key covers both, tracked as separate platforms) and Android. Microsoft Store is planned.

// Screenshots

Real data, real screens

Taken from OxiLytics running on OxiSoft's own App Store and Google Play portfolio. Click to enlarge.

// Quick start

Running in five minutes

Download the compose file and the example .env, set a session key and start it. The app opens in setup mode and guides you through connecting a store.

  • Distroless image, runs as a non-root user
  • Binds to 127.0.0.1: put your reverse proxy in front
  • Back up one file: oxilytics.db
shell
# get the compose file and the example config
mkdir oxilytics && cd oxilytics
curl -fsSLO https://raw.githubusercontent.com/oxisoft/oxilytics/main/deploy/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/oxisoft/oxilytics/main/deploy/.env.example -o .env

# paste the output as OXI_SESSION_KEY in .env
openssl rand -hex 32

mkdir -p data secrets
sudo chown -R 65532:65532 data
docker compose up -d

# open http://127.0.0.1:8080 and sign in

// API and MCP

Ask your analytics in plain language

Create a read-only API token in your profile and use it from scripts, a spreadsheet or Grafana. Or connect the OxiLytics MCP server to an AI assistant such as Claude and ask "how did downloads go last month, and what are people complaining about?"

  • Tokens are read-only unless you grant "start a sync" at creation
  • The MCP server runs on your machine and has no write tools at all
  • Tools: overview, products, apps, metrics, time series, countries, reviews, sync runs
OxiLytics API tokens panel: read-only tokens with an opt-in capability to start a sync
Read-only API tokens for scripts and the MCP server.
claude_desktop_config.json
{
  "mcpServers": {
    "oxilytics": {
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/oxisoft/oxilytics-mcp",
        "oxilytics-mcp"
      ],
      "env": {
        "OXILYTICS_SERVER_URL": "https://stats.example.com",
        "OXILYTICS_ENV_FILE": "/home/you/.config/oxilytics/mcp.env"
      }
    }
  }
}

// mcp.env (chmod 600): OXILYTICS_TOKEN=...

// Beta status

In daily use, still growing

OxiLytics has measured OxiSoft's own iOS, macOS and Android apps every day since September 2026, and its App Store numbers were checked against Apple's Sales and Trends. It is labelled beta because the feature set is still moving and you may hit rough edges. Issues and pull requests are welcome.

  • App Store Connect: iOS, iPadOS, macOS
  • Google Play
  • Read-only API and MCP server
  • Microsoft Store (planned)
Report an issue

// FAQ

Questions

Is OxiLytics really free?

Yes. It is MIT licensed with no paid tier, no open-core split and no feature held back. OxiSoft built it to measure its own apps and published the code for everyone.

What does beta mean here?

OxiLytics already runs OxiSoft's own portfolio every day, with numbers checked against Apple's Sales and Trends. Beta means the feature set is still growing (Microsoft Store is planned) and you may meet rough edges. Please report them on GitHub.

Does it put an SDK or tracker in my app?

No. Nothing is added to your app. OxiLytics only reads the store reporting APIs with credentials you create. Your users are never contacted, identified or counted by it.

Is my data sent anywhere?

No. Data goes from Apple and Google straight into a SQLite file on your server. There is no OxiLytics cloud, no licence check and no telemetry. Outbound traffic goes only to the store APIs (plus Apple's public lookup for app icons).

Can I see individual users, sessions or funnels?

No, by design and by data source. Apple and Google publish aggregates per day, country and platform. If you need per-user product analytics you need an in-app SDK, and OxiLytics is the wrong tool.

Why do my Apple and Google numbers not line up?

The stores report different things. Google Play has no updates column, Apple publishes deletions only weekly and above a volume threshold, and active devices and ANRs exist only on Android. OxiLytics shows the per-platform split under every number instead of adding up metrics that only one store reports.

Does it work with only one store?

Yes. Connect App Store Connect only, Google Play only, or both. Platforms without a store are hidden.

Does it support macOS apps?

Yes. One App Store Connect key covers iOS and macOS, and macOS is tracked as its own platform.

What does it need to run?

Anything that runs Docker: a small VPS, a NAS, a Raspberry Pi or a laptop. About 30 MB of RAM when idle and a few hundred MB of disk for years of history. Images are published for amd64 and arm64.

Can I ask my analytics questions from an AI assistant?

Yes. The OxiLytics MCP server connects your instance to an assistant such as Claude. It runs on your machine, uses a read-only API token and has no write or sync tools.

Own your store analytics

Free, open source and private by construction.