> ## Documentation Index
> Fetch the complete documentation index at: https://docs.energy.nlead.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Bridge App

> Every screen and element of the app on iPhone, Android and Apple Watch, and what it shows

The Bridge app shows the balancing group's day-ahead pipeline on a phone
and a watch: today's gate, the delivery days and their forecasts, the
schedule against what was measured and what that cost, the events, and
the state of the market communication. It only reads. Nothing in the app
sends a forecast, a schedule or a message. The API behind it and the
device keys are described in [Operator App](https://docs.energy.nlead.ch/setup/mobile.md).

> [!NOTE]
>
> The screenshots show sample data. The app is in English unless German is
> picked under **More → Settings → Language**.

## Setting up a device

![The setup screen with the key field, Check and save, and Scan QR code](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/setup.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=88cba8b4cf82756935510c3a9ec8e1d2)

Set up this device

Every phone and every watch gets **its own device key**. Its name, such as
`mobile-customer1-phone`, is what the settings screen and the operators'
console show.

* **Device key:** paste the key, or fill it from a password manager, then
  tap **Check and save**. The app keeps the key only if the service
  accepts it as a device key. The key is never shown again.
* **Scan QR code:** reads the key with the camera, on the device, straight
  into the same check. Scan it with the app, never with the phone's camera
  app, which would show the key as text.
* **Language** (the translate icon, top right): English or Deutsch, before
  a key is set up.
* **Screen lock:** without a passcode, PIN, pattern or password the app
  stays locked and shows nothing.

A key the service refuses is deleted on the device at once, and every
screen says **Key invalid – set it up again**.

## Finding your way

| Tab | What it shows |
| - | - |
| **Today** | The gate, the day ahead and its badge, every delivery day at a glance, the last 24 hours |
| **Days** | Yesterday to the end of the forecast horizon, each day with its steps and every stored forecast version |
| **Actuals** | Schedule vs. actual: a past day's schedule against the measured actuals, the imbalance, its cost and the calculation |
| **Events** | What happened, newest first |
| **More** | Market partners, Market roles, Control area map, Customer ramp-up, Settings |

* **Pull down** on any screen to fetch it again.
* **Fresh data:** the app fetches every screen's data in the background
  when it opens, and a screen asks again only once what it shows is five
  minutes old. Pull to refresh always asks.
* **Old data:** the service line always says **As of** when the data was
  made. After 30 minutes without new data the badge adds it too, and after
  six hours the badge turns grey.
* **Hidden while recording:** lists and charts are hidden while the screen
  is recorded, mirrored or shared.

## Today

![The Today screen: the dial, milestones, badge, steps, projection, days and last 24 hours](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/today.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=5d9eb724ff9108df43cc86702e3f82e9)

Today

| Element | What it shows |
| - | - |
| **Service line** | **TEST** or **LIVE**, **Service running** or **Service stopped**, **Orchestrator not reporting** when its timer has been silent for 20 minutes, and **As of** the time of the data |
| **Dial** | The Berlin day as a 24-hour clock, midnight at the top. The elapsed part is filled, the time up to the gate warning is lighter, the warning window is amber, the milestones are ticks and now is a ring. The middle shows the time left until the gate closes |
| **Milestones** | 05:00 Forecast expected, 09:00 Trader pickup, 12:00 EPEX auction, then the gate warning and the gate closure as configured. A tick marks each one that has passed |
| **Delivery day and badge** | The day ahead and the badge: one colour and label for how it stands (below) |
| **Steps** | **aggregated** (with the forecast it runs on), **CSV** (when the CSV went to the trader), **submitted** (the schedules to the TSOs) and **Result** (the TSOs' answer) |
| **Follow the gate** | iPhone only: the countdown to the gate on the lock screen as a Live Activity, within eight hours of closure. Opening the app within three hours of closure starts it once a day anyway |
| **Next … h if nothing changes** | The badge from now to its end as one bar: what it will be, and from when, if nothing happens |
| **Days** | Each delivery day with its forecast source, three marks for its steps, the day's energy in MWh, the highest quarter-hour in MW and the customers in supply. The day ahead is highlighted |
| **Last 24 hours** | Errors and warnings per hour, their counts, and the open follow-ups |

### The badge

The service decides the badge; the app shows what it is given, in either
language. The full list of rules is in
[Operator App → The day-ahead badge](https://docs.energy.nlead.ch/setup/mobile.md#the-day-ahead-badge).

| Colour | Means | Examples |
| - | - | - |
| Green | Done | accepted |
| Amber | Look at it | gate closing, backup only, new forecast, imbalance, not published, no data before the gate, service stopped |
| Red | Act now | gate missed, rejected, no data after the gate |
| Neutral | Running as planned | running, forecast expected 05:00 |
| Grey | The data is too old to say | set by the app after six hours |

Every state also has its own symbol, because iOS drops the colour on the
lock screen, in StandBy and on a tinted home screen.

## Days

![Delivery days from T-1 to T+4 with their steps, customers, deviation and forecast versions](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/days.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=8a8345d6605dc92da19dedf910b86790)

Days

One row per delivery day, from yesterday (**T-1**) to the end of the
forecast horizon (**T+4**):

| Element | What it shows |
| - | - |
| **T-1 … T+4 and the date** | The day relative to today |
| **Source** (top right) | The forecast the day runs on: **Customer** (the customer's own), **generated** or **backup**; **no data** without one |
| **Steps** | **aggregated**, **CSV** and **submitted**, each **pending**, **done**, **outdated** (an older forecast) or **rejected** |
| **Customers** | Customers in supply that day |
| **CSV only** | The day runs on the backup: it goes to the trader as CSV and is never submitted as schedules |
| **Backup!** | The backup is what the trader gets, and it has no reference shape for some customers |
| **Backup without reference for N customers** | Shown instead of the deviation, which would compare unlike sets |
| **deviation … · Ø … per quarter-hour** | How far the backup is from the customer's forecast: the day's energy in percent and the mean deviation per quarter-hour. Red above 10 % |
| **Clock change: N quarter-hours** | 92 or 100 instead of 96 on the days the clocks change |
| **Versions** | Every stored forecast of the day: a dot in the source's colour, its energy, the active one in bold. A backup also says where it came from (**from** the day it was copied from, the method, customers without reference) |

**Tap a row:**

* A past day (the ⇄ icon) opens [Schedule vs. actual](#actuals-schedule-vs-actual) for that day.
* A day with a forecast (the chart icon) opens its curves:

![The quarter-hour curves of a day's forecast versions, consumption and production](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/forecast-day.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=f377c6ad5ac69a899b8ab07c3b20b1e1)

A day's forecast versions as curves

**Consumption** or **Production** in MW per quarter-hour, one line per
version, on the service's own quarter-hour labels: on the autumn clock
change the repeated hour reads 02:00 A and 02:00 B.

## Actuals: Schedule vs. actual

A delivery day's schedule as the TSO confirmed it, against the actuals
from the TSO's balancing group sum series (BK-SZR), for Germany or one
control area. The tab opens on yesterday.

![Schedule vs. actual: day picker, control area chips, status chips, the reBAP note and the calculation tables](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/actuals-1.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=a84af15e9a52617ebc134cd46226b33a)

Status and calculation

| Element | What it shows |
| - | - |
| **‹ date ›** | The day before and after. Tap the date for a calendar: up to the latest day with a plan, back 120 days |
| **Map** (top right) | The [Control area map](#control-area-map) for the same day |
| **Germany, Amprion, …** | Germany, or one control area that has something in it |
| **Show categories A, B and C** | Adds the actuals of each BK-SZR category as its own line: A from the DSOs (monthly), B from the TSOs (monthly), C the TSOs' daily values |
| **Status** | **Preliminary: the TSO's daily values**, **Settlement data: monthly values**, **Actual incomplete** or **No actual values yet** |
| **Schedule, Actual** | The day's energy, net of consumption and production |
| **short / long** | Energy the balancing group was short (orange) or long (blue) |
| **compared n/96 ¼ h** | Quarter-hours that have both a schedule and an actual |
| **Imbalance** | What the deviation costs at the reBAP. **estimated** while the reBAP is rebuilt or estimated, before the BIKO's final prices |
| **Note** | Where the reBAP comes from, or why there is none yet |

**Calculation**, for the delivery day and for the month up to it:

| Row | Meaning |
| - | - |
| **Spot bought / sold (EPEX day-ahead)** | The schedule bought and sold in the day-ahead auction, at the spot price |
| **Net procurement** | Bought minus sold |
| **Imbalance energy (short / long)** | Energy short and long, and its cost at the reBAP. Positive is to pay, negative a credit |
| **Total cost** | Net procurement plus imbalance energy |
| **Delivered to customers, at spot** | What the customers took, valued at the spot price |
| **Cost above spot** | Total cost minus the customers' quantity at spot |
| **Mark-up needed for imbalance energy** | The mark-up on the spot price, in ct/kWh, that covers the cost above spot |

The **ct/kWh** column divides each row's euros by its kWh. The note
below the tables says where the customers' quantity and the imbalance
energy come from: actuals, or the schedule where actuals are missing, and
an expected or a final reBAP.

![The schedule and actual chart, the reBAP and cost charts, and the actuals per balancing area](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/actuals-2.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=1bc8d80f2f3db77261ca377550e5d93c)

Charts, quarter-hour values and balancing areas

| Element | What it shows |
| - | - |
| **Schedule and actual** | Per quarter-hour: the schedule (blue), the actual (white), short (orange) and long (blue) between them, and categories A, B and C when switched on. In MW, or kW for small values |
| **reBAP and cost per quarter-hour** | The reBAP in €/MWh, and below it each quarter-hour's cost: to pay (orange) or a credit (blue) |
| **Tap or swipe** | On any chart: one line with the quarter-hour's schedule, actual, deviation, reBAP, cost and spot price |
| **Actuals per balancing area** | Per Bilanzierungsgebiet: its EIC, DSO and category, consumption, production and complete quarter-hours |
| **Data basis** | What the actuals are built from: category, time series type, consumption or production, and how many quarter-hours have a value |

## Events

![The events list with All, Warnings and Errors](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/events.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=786bcc86085e85cbc23728d11ffbbdb1)

Events

What happened, in the service's words, newest first: forecasts received,
backups created, CSVs published, schedules submitted and answered,
messages to market partners, the service's start and stop.

* **All, Warnings, Errors** filter by level. The icon says the level:
  information, warning (amber) or error (red).
* A delivery day comes first in the text, the time below.
* **Load older** at the end pages back.
* If the service's event log was restarted, the app says that older events
  are no longer available.

## More

![The More menu](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/more.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=9e27f050ad9770b48b9aa5b95a2aec1e)

More

### Market partners

The market communication with every network operator, TSO and BIKO, in
counts:

* **All market partners** and each control area, with one chip per state:
  **rejection**, **no contact**, **contacted**, **waiting**,
  **communication OK**, **complete, assignment open**, **assignment
  accepted**, **exempt**.
* **Standing rejections**, newest first: the partner, the reason in fixed
  words (for example *APERAK Z29: sender not registered* or *transmission
  error (AS4)*), its MP-ID, its control areas, the stream (PARTIN,
  assignment or transmission) and when. The partner's own text never
  reaches the app.

### Market roles

The balancing group's roles and contracts, per control area:

* **Header:** the BRP's and the supplier's MP-IDs, the balancing group,
  the customers, how many of the expected time series are active and
  missing, and the contracts active and missing.
* **Legend** for the time series: **active** (filled), **expected**
  (outlined), **missing for customers** (orange), **activated, not
  expected** (red outline).
* **One card per control area:** a ring with the share of expected series
  that is active, the customers, and the balance group contract with its
  TSO. Tap it to open:
  * the **BIKO**, the **ÜNB** (TSO) and every **NB** (DSO) with customers
    or something open;
  * their contracts: **BKV** (balance group contract), **LRV** (supplier
    framework contract), **ZV** (assignment agreement);
  * one chip per time series type (SLS, LGS, EGS, …) in its state.
  * The rest only as a count, "N more network operators, nothing open".

### Control area map

![Germany with its four control areas, the plan, actual and deviation per area](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/map.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=0f0e73d83443fb0aacf36ddf2ce3d34f)

Control area map

The four control areas on a map of Germany, for a day:

* **Plan, Actual, Deviation:** what each control area shows.
* **Whole day** in MWh, or one hour in MW with the slider.
* **Tap** a control area for its label.
* **Arrows:** the schedule from the home balancing group (**Home BG**)
  to the other control areas, their width by volume.
* **Cards** below: Germany with its EPEX buy or sell and its balance, then
  each control area with its plan and actual consumption and production.
  The chart icon opens [Schedule vs. actual](#actuals-schedule-vs-actual)
  for that control area.

The borders follow the federal states and are simplified; the app says
so.

### Customer ramp-up

The customer's confirmed customers, per Bilanzierungsgebiet, against the
market:

* **N customers · As of** the date of the customer's sheet, and the number of
  **urgent areas**.
* **One card per area:** the DSO, its customers, the EIC, the control
  area, the state of the market communication, the first supply start, the
  time series types still missing and a missing assignment authorisation.
* **Urgent** (red outline, **!**, listed first): something is missing and
  the first supply start is at most 14 days away, or has passed.
* If the customer has not sent its sheet yet, or the comparison with the market
  could not run, the screen says so instead of "nothing urgent".

### Settings

![Settings: device, language, service, app version and delete](https://mintcdn.com/nleadgmbh-dff6b954/BSDZiAR_LQsklvf2/images/app/settings.png?fit=max\&auto=format\&n=BSDZiAR_LQsklvf2\&q=85\&s=109b494de4604dc7fcfea440839c15f0)

Settings

| Section | What it holds |
| - | - |
| **Device** | **Set up as** the device's name, and **Replace key** |
| **Watch** | Only with a paired Apple Watch: the connection, whether the watch has a key, **Set up the watch** and **Wipe the watch** |
| **Language** | **English** or **Deutsch**, also for the widgets and the watch |
| **Service** | The host, the service's version and the contract version |
| **App** | The app's version |
| **Delete everything on this device** | Deletes the key, the snapshot and all of the app's data. Then have the key revoked on the server |

## Widgets, Live Activity and Apple Watch

| Surface | What it shows |
| - | - |
| **iPhone widgets** | The badge with its symbol. Below it, as many figure lines as fit: the days ahead, yesterday's plan against its actual, the customers; the medium size adds the deviation, what is open and the events. On the lock screen, in StandBy and Always-On only the state and the countdown |
| **Live Activity** | **Follow the gate**: the countdown to the gate on the lock screen and in the Dynamic Island. The badge changes only while the app runs; it ends with the outcome after the gate |
| **Apple Watch** | One glance: the badge with its symbol, the countdown to the gate, the errors of the last 24 hours and whether the service runs. Complications (circular, rectangular, corner, inline) follow the badge, and hide their labels while the wrist is down. The watch has its own key, `mobile-<handle>-watch`, set up from **Settings → Set up the watch** |
| **Android widget** | On the home screen only: the badge with LIVE or TEST and **As of**, and as many figure lines as its height holds. It has no network and never reads the key |

Widgets and complications change colour on their own as the badge's
timeline says, even offline. They turn grey once the data is too old.

## On the device

* The key is kept in the iPhone's Keychain or Android's Keystore, on this
  device only, never synchronised or backed up.
* Everything else stays in memory and goes with a lock, a refused or
  deleted key, and when the app is closed. Only the snapshot for the
  widgets and the watch is stored: the badge, the steps, counts and daily
  totals, never names or event text.
* Android blocks screenshots and screen recording. iOS cannot, so the app
  covers its window when it leaves the foreground and hides its data
  while the screen is recorded or shared.
* Without a screen lock the app locks, stops asking the service and
  deletes the snapshot.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.