Export

The Export feature allows you to export your brew data as JSON for backup, analysis, or integration with other tools.

Overview

Beanstats provides several export options:

  • Single Brew Export: Export any individual brew as JSON
  • Bulk Export: Export all your brews at once
  • Full Backup: Export all data including beans, methods, equipment, and freeze entries (see Import & Backup)

Single Brew Export

Export any brew from its detail view:

  1. Open a brew’s detail view
  2. Tap the menu in the toolbar
  3. Select Export as JSON
  4. Share or save the JSON file

Single brew export is always available to all users.

Bulk Export

Export all your brew data from Settings:

  1. Navigate to Settings > Data & Storage
  2. Tap Export Data
  3. Choose to include flow data (optional)
  4. Select Export Home Brews or Export Cafe Brews

Export Options

Include Flow Data

When exporting brews that have scale data, you can optionally include the raw weight samples. This increases file size but preserves the full brew profile for analysis.

Pretty Print

JSON is formatted with indentation for human readability.

JSON Format

Home Brew Export

{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-01-07T08:30:00Z",
  "bean": {
    "uuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
    "name": "Ethiopia Yirgacheffe",
    "roaster": "Local Roaster",
    "roastLevel": "Light",
    "tastingNotes": "Blueberry, Jasmine"
  },
  "recipe": {
    "style": "filter",
    "doseGrams": 18.0,
    "waterGrams": 300.0,
    "ratio": "1:17",
    "grindSize": "Medium-fine",
    "waterTempCelsius": 94.0,
    "brewTimeSeconds": 210,
    "bloomTimeSeconds": 45
  },
  "flowData": {
    "peakFlowRate": 4.2,
    "wasAutoCapture": true,
    "weightCurve": [0, 2, 5, 10, 18, 25, 32, 36]
  },
  "evaluation": {
    "rating": 4.5,
    "notes": "Great brew!"
  },
  "method": { "name": "V60" },
  "equipment": [
    { "name": "Comandante C40", "type": "Grinder" }
  ]
}

Cafe Brew Export

{
  "uuid": "abc12345-6789-def0-1234-567890abcdef",
  "timestamp": "2026-01-07T10:00:00Z",
  "cafe": {
    "name": "Local Coffee Shop",
    "url": "https://localcoffee.com",
    "location": "Downtown",
    "coordinates": {
      "latitude": 52.3702,
      "longitude": 4.8952
    }
  },
  "coffeeStyle": "Cappuccino",
  "variety": {
    "name": "Gesha",
    "originCountry": "Panama"
  },
  "evaluation": {
    "rating": 5.0,
    "notes": "Best cap in town"
  }
}

Bulk Export Wrapper

Bulk exports include metadata:

{
  "metadata": {
    "exportedAt": "2026-01-07T15:30:00Z",
    "appVersion": "1.0.0",
    "exportVersion": "1.0"
  },
  "brews": [...]
}

Units

All exported values use consistent units regardless of your display preferences:

Field suffixUnit
*GramsGrams (g)
*CelsiusCelsius (°C)
*SecondsSeconds (s)
*BarsBar pressure

This ensures data consistency for external tools and integrations.

Recipe Fields by Style

FieldFilterEspresso
doseGrams
waterGrams
yieldGrams
ratio
grindSize
waterTempCelsius
brewTimeSeconds
bloomTimeSeconds
pressureBars
preInfusionSeconds

Flow Data Format

When includeFlowData is enabled and the brew has scale and/or pressure data:

{
  "flowData": {
    "peakFlowRate": 4.2,
    "wasAutoCapture": true,
    "detectedPreInfusionEnd": 5.5,
    "weightCurve": [0, 2, 5, 10, 18, 25, 32, 36],
    "peakPressureBars": 9.2,
    "pressureCurve": [0, 50, 200, 200, 500, 850, 900, 910]
  }
}

Weight curve: Weight in grams at each second (index 0 = 0s, index 1 = 1s, etc.). Uses linear interpolation between raw 10Hz samples.

Pressure curve: Pressure in hundredths of a bar at each second. Divide by 100 to get bars (e.g. 900 = 9.00 bar). Only present when pressure sensor data was recorded. Uses linear interpolation between raw samples.

Flow data is included when either scale data or pressure data is available.

File Naming

Exported files follow these naming patterns:

TypePattern
Single brewbrew-{bean-name}-{timestamp}.json
Cafe brewcafe-brew-{cafe-name}-{timestamp}.json
Bulk exporthome-brews-{count}-{timestamp}.json