Exposensia mobile

Tap to read.
Export to prove.

Hold your phone against any Tempest or Yotta sensor. The reading is in your hand in under a second — temperature, humidity, irradiance, cumulative exposure, min & max. Save it. Group it. Mark its location. Share it with your team. Print an audit-ready PDF the regulator will accept. No account. No subscription. No cloud.

iOS 14+  ·  Android 9+  ·  works offline  ·  ~12 MB

Shipped · v1.0

1 · Scan a single tag

Open the app. Press Scan. Hold the back of your phone against the sensor. In under a second the reading drops into your history, opens the detail view, and is saved locally on the device — no network call, no upload.

  1. Tap Scan. The phone listens for an NFC payload.
  2. Touch the sensor. Hold it flush against the back of the phone (iPhone: top half; Android: middle).
  3. Reading appears. Temperature, humidity, irradiance, min/max, cumulative exposure, Mean Kinetic Temperature.
  4. Stored locally. The reading is appended to this device's history — no account, no sync.
Works without the sensor handy. Toggle Force mock NFC in Settings to demo the UI with synthetic fixtures (Tempest 100, Tempest 200, Yotta). Useful for training and for QA on simulators that don't have an NFC radio.

Video walkthrough: a 20-second clip of a real-device scan will land here once Android Developer verification (sibling op #6) and Apple Developer Program enrollment clear. The mockup at right is rendered from the actual app source.

Empty scan tab
After first scan
Device detail
Roadmap · v1.2

2 · Create a group of tags

A group is a logical bundle of sensors — a fridge with three Tempest 100s, an array of six Yottas on a solar lot, a cold truck running ten Tempest 200s. Once tags are grouped, every export and every audit report includes the group as a unit: min/max across all members, deviation between members, group-level tamper history.

  1. Tap New Group. Name the group and pick an icon (fridge, lot, vehicle, custom).
  2. Add tags one by one. Scan each sensor — it's appended to the group's member list.
  3. Set a measurement window. Optional start/end timestamps that scope the group's exposure record.
  4. Review the rollup. Group view shows per-member status and across-member aggregates side-by-side.
Why grouping matters. A regulator-ready audit rarely cares about one sensor — it cares about the worst-case across the storage unit. A group makes that one tap to produce rather than one CSV per device that you have to merge in a spreadsheet.

Status: design complete, scoped for the v1.2 release after the first round of customer feedback on v1.0. Tracked in the mobile repo's roadmap.

Groups tab
Group detail · 4 tags
Aggregate rollup
Roadmap · v1.3

3 · Pin a group to a location

Same group concept, with a GPS fix attached. Tap Use my location when you create the group and the app captures your coordinates from the phone's location services. Every downstream reading stamped to that group inherits the pin, which shows up on the audit report's cover page and in any CSV export.

  1. Create a group at the site. The first reading anchors the GPS pin.
  2. Confirm or override. Tap the map to nudge the pin or paste exact coordinates from a survey.
  3. Lock the location. Once locked, future scans into this group inherit the pin without re-prompting.
  4. Search by site. The History tab filters groups by proximity — "show me everything within 100 m of here."
Where this is useful. Solar installers walking a rooftop. Cold-chain operators auditing a warehouse with multiple coolers. Field-research teams sampling a forest plot. The pin is the difference between "we measured this somewhere on the site" and "we measured this at this coordinate at that minute."

Status: queued after groups (v1.2). Needs location-permission UX review and offline tile caching for sites without cell signal.

Location prompt
Pin on map
Group with pin
Roadmap · v1.4

4 · Place tags on a floor plan

When you don't have GPS (indoors, basement, vault) or you want a visual map of where each tag lives, drop a photo or floor plan into the group and tap to place each sensor on it. The placement is saved as a relative coordinate, so future readings into the group render directly on the overlay.

  1. Pick a background. Take a photo, pick from gallery, or import a PDF/PNG floor plan.
  2. Scan a tag, then tap to place. The reading drops a pin where you tap. Drag to refine.
  3. Repeat for each sensor. All members of the group share the same overlay.
  4. Heat-mapped view. Toggle to color each pin by current temp, exposure, or any reading channel.
The use case this nails. An indoor cultivation canopy with 40 sensors. A walk-in cooler with a Tempest 200 on every shelf. A greenhouse with sensors in eight zones. A photo of the room + tapped pins is faster than typing serial numbers into a spreadsheet and clearer than a list of GPS coordinates that all read the same.

Status: design exploration in progress. Open question: PDF floor-plan import on Android needs a render path (looking at react-native-pdf vs. server-side rasterization).

Pick a background
Tap to place pin
Heat-mapped view
Roadmap · v1.5

5 · Hand off readings, phone to phone

Audit-grade work involves teams: the technician scans on site, the QA lead signs off back at the office. Device-to-device sharing beams a tag, a group, or a whole history bundle from one phone straight to another over the local network or a QR code — no cloud in the middle, no email attachment, no cost.

  1. Pick what to share. One reading, one group, or every reading in a date range.
  2. Pick how. AirDrop / Nearby Share for phones in the same room; QR code for over-the-shoulder; encrypted file for email/Slack.
  3. Receiving phone confirms. Cryptographic checksum is shown; the receiver taps Accept.
  4. Merged into history. Readings are deduplicated by tag serial + timestamp — no double-counting.
Why peer-to-peer. Our customer base is deliberately disconnected from cloud workflows — pharmacies that can't expose patient cold-chain data, growers who don't want competitive intel routed through a SaaS, field installers in spotty-cell country. Phone-to-phone keeps the data flow local.

Status: protocol scoped (signed JSON bundle + channel-agnostic transport). Implementation queued after the overlay work.

Sender
Receiver
Export shipped · Import roadmap v1.2

6 · Import & export

The export flow is shipped in v1.0: every tag's history, the full-device history, and a per-reading audit-grade PDF go out through the OS share sheet. Import lands with the groups release (v1.2) so teams can pull a peer's CSV into their own history without resorting to a manual merge.

Export — shipped today

  • Per-tag CSV. One row per reading, every payload field as a column.
  • All-history CSV. One file, every reading the device has captured, sorted by timestamp.
  • Audit PDF. Single-reading or single-tag report with the operator's name, the device serial, full reading detail, and a hash of the payload for tamper detection.
  • OS share sheet. Hand off to email, Slack, Files, AirDrop, a cloud drive of your choice — the file is yours to route.

Import — roadmap v1.2

  • CSV import. Pull in readings exported from another Exposensia app instance and merge them into the local history.
  • Group import. Pull in a group definition + member list from a teammate.
  • De-dup on serial + timestamp. Re-importing the same data is a no-op, never a double-count.
  • Source-of-truth log. Each imported reading is tagged with the originating device's identifier so the audit trail stays intact.

Source. Export is implemented in src/screens/DeviceDetailScreen.tsx and src/screens/HistoryScreen.tsx, with the CSV/PDF generators in src/export/. Import lands in the same surface — same buttons, opposite arrow.

Export menu · shipped
Audit PDF preview
Import flow · v1.2
Shipped · v1.0

7 · Firmware regression testing

After a freshly-flashed sensor comes off the programmer board, the app runs it through a built-in battery of known stimuli — Tempest 100/200 temperature and humidity cases, Yotta irradiance cases — and reports pass/fail per case. The test session is saved locally so QA can compare run-to-run drift across firmware revisions.

  1. Open the Firmware tab. Pick a built-in case or load a custom one.
  2. Scan the sensor. The app reads its current state and compares against the case's expected output.
  3. Pass / fail per case. Each case lights green or red, with the deviation breakdown attached.
  4. Session log. Saved to local history, exportable as a CSV report attached to the firmware version under test.
How it fits. Sibling op #5 ships V2 firmware; this is the test harness that gates V2 promotion. Mobile-side regression beats waiting for the next field deployment to discover a regression.
Pick a case
Running case 3 of 7
Results · 7/7 pass
Coverage audit

Every screen, every flow, accounted for.

This page is the full documentation surface for the mobile app — what ships in v1.0, what's queued for v1.2 through v1.5, and where in the source each flow lives. Every checkbox below maps to a section above and to a file under src/ in the mobile repo.

Flow Status Source Documented in
Scan a single tag v1.0 src/screens/ScanScreen.tsx § 1
Device detail & per-tag history v1.0 src/screens/DeviceDetailScreen.tsx § 1
Full-device history v1.0 src/screens/HistoryScreen.tsx § 6
Per-tag CSV export v1.0 src/export/csv.ts § 6
Audit-grade PDF report v1.0 src/export/pdf.ts § 6
Mock-NFC fallback (training / CI) v1.0 src/nfc/mock.ts § 1
Settings (operator name, default fixture, mock toggle) v1.0 src/screens/SettingsScreen.tsx § 1 footnote
Firmware regression test harness v1.0 src/firmware/testRunner.ts + builtinCases.ts § 7
Tag groups v1.2 § 2
CSV / group import v1.2 § 6
Location-pinned groups (GPS) v1.3 § 3
Image-overlay groups (manual placement) v1.4 § 4
Device-to-device sharing (P2P / QR) v1.5 § 5
8 Flows shipped in v1.0
5 Flows on the v1.2–v1.5 roadmap
0 Cloud accounts required, ever

Get the app.

App Store and Play Store listings are pending Apple Developer Program enrollment and Android developer-account verification (sibling op #6). While we finish that, contact us for a TestFlight or Play Internal Testing invite.