Mobile app for viewing and visualizing data from ThingSpeak channels, built with Flutter.
- Browse and manage multiple ThingSpeak channels, with a configurable start screen (channel list or a chosen channel's detail screen)
- View latest field values per channel, including its description and website/source links when set, with pull-to-refresh
- Visualize field data as line, spline, step, or column charts, with date and time range filtering
- Per-field chart settings: custom title, axis labels, Y-axis min/max, fixed decimal rounding, and a "show change between readings" mode for counters
- Automatically pages past ThingSpeak's per-request result cap so large date ranges aren't silently truncated; non-finite (
NaN/Infinity) readings are skipped rather than breaking the chart - Supports public and private (API key) channels
- Custom server URL (self-hosted ThingSpeak instances)
- Light / dark / system theme
- Configurable date and time formats, with an optional timezone indicator (offset or name)
- Export/import a full backup (saved channels, app settings, and per-field chart overrides) as a single JSON file
- Responsive layout — master-detail split on tablets
Android is the actively supported and tested target. Web is built and deployed to the demo on every push, but isn't covered by automated tests. iOS/macOS/Windows/Linux build but aren't part of CI.
- mise — manages the Flutter version (
mise.tomlpins it) - Flutter 3.44.8 / Dart 3.12.2
Commands below assume an activated mise shell (mise activate / mise shell). If mise isn't activated, prefix each command with mise exec --, e.g. mise exec -- flutter test.
# Install Flutter via mise
mise install
# Install dependencies
flutter pub get
# Generate mocks (needed after changing @GenerateMocks annotations)
dart run build_runner buildflutter runflutter test
flutter analyzeCreate android/key.properties with your keystore credentials:
storePassword=...
keyPassword=...
keyAlias=...
storeFile=path/to/keystore.jks
Then build:
flutter build apk # Android APK
flutter build appbundle # Android App Bundle (Play Store)Edit res/images/thingviewer_icon.png (and thingviewer_icon_foreground.png for the adaptive foreground layer), then regenerate:
dart run flutter_launcher_icons| Concern | Library |
|---|---|
| HTTP | http |
| Local storage | shared_preferences |
| File picking | file_picker |
| Charts | fl_chart |
| Localisation | Flutter built-in ARB (intl) |
| App info | package_info_plus |
| URL handling | url_launcher |
| State management | ChangeNotifier + ListenableBuilder (built-in) |
MIT


