Post

Forter Dev Log (1) - Project Overview

Forter Dev Log (1) - Project Overview

Background

I had been using Torque Pro combined with the Vgate iCar Pro 2s OBD2 scanner to monitor my vehicle’s condition.

Torque Pro was released in 2012. At the time, its web server upload feature was sufficient — REST APIs, JSON payloads, and auth tokens were not yet common in mobile app design. However, by today’s standards, the integration capabilities are significantly limited.

OBD2 / BLE Control

  • Torque Pro delegates BLE handling entirely to the ELM327 adapter. BLE connection state, reconnection logic, and disconnect handling cannot be managed at the app level.
  • OBD2 connect/disconnect events can be broadcast as intents, but connection timing cannot be controlled.
  • The app occasionally crashes on BLE reconnection with no way to handle it.

API Call Limitations

  • The web server upload feature only supports simple GET requests.
  • Setting request headers, POST body, or auth tokens is not supported.
  • Transmission interval, retry logic, and filtering conditions cannot be customized.
  • Initialization requests fire even when OBD is not connected, generating unnecessary API calls.

To address these constraints, I decided to build a native Android app that gives full control over BLE management and API communication.

Forter is an Android native app that replaces Torque Pro and streams collected vehicle data to a self-hosted backend in real time. The name is a portmanteau of Forte + Porter, inspired by the target vehicle, KIA Forte.


Target Vehicle

FieldValue
ManufacturerKIA
ModelForte LPi Hybrid
Year2012
OBD2 ScannerVgate iCar Pro 2s (BLE)

System Architecture

1
2
3
4
5
6
7
8
9
10
11
[KIA Forte LPi Hybrid]
        │
   OBD2 Port (SAE J1962)
        │
[Vgate iCar Pro 2s]
        │  BLE (ELM327 AT Command)
[Forter Android App]
        │  HTTP
[Cloudflare Workers]
        │
[Upstash Redis]

Tech Stack

LayerTechnologyNote
AppAndroid Native (Kotlin)Jetpack Compose
BLENordic BLE Library 2.7.4 
OBD2ELM327 AT CommandSAE J1979
BackendCloudflare Workers 
DBUpstash Redis 
AutomationMacroDroidAuto-launch on BT connect

Android Native was chosen for the stability of BLE Foreground Service. Flutter and React Native were considered but excluded due to limitations in background BLE handling.


Development Environment

FieldValue
IDEAndroid Studio Panda 2025.3.1
LanguageKotlin
Minimum SDKAPI 31 (Android 12.0)
Test DeviceGalaxy S26

API 31 was set as the minimum SDK because Android 12 introduced a revised BLE permission model (BLUETOOTH_SCAN, BLUETOOTH_CONNECT).


Source Control


Progress

TaskStatus
Cloudflare Workers + Upstash Redis backend✅ Done
MacroDroid BT connection automation✅ Done
Android Studio project setup✅ Done
BLE permissions (AndroidManifest.xml)✅ Done
Nordic BLE library integration✅ Done
BLE scan & Vgate connection🔄 In Progress
ELM327 command communication⬜ Planned
Data parsing & Worker transmission⬜ Planned

Next Steps

Starting with BLE scan implementation. The goal is to discover the Vgate iCar Pro 2s device, establish a GATT connection, and send the ELM327 initialization command sequence.

This post is licensed under CC BY 4.0 by the author.