TicTacToe is an open-source framework for IoT devices. It began on Linux systems built around TI Sitara AM335x and was later ported to other Linux platforms. Its goal is to give engineers remote access to device health and logs without requiring end users to configure their networks.

Lossless sensor-data upload

To preserve high-frequency samples over unreliable wireless networks—including LTE in remote locations—I designed a JSON-based compression format, an offline device cache, and cloud-side deduplication and integrity validation.

The format encodes sensor tags and values separately and maps repeated text labels to integer indexes. It reduced payload size by roughly 40%–50% on its own and 70%–85% when combined with gzip, lowering both network cost and local storage requirements.

Some devices lacked a hardware RTC. I therefore introduced a dual-timestamp design that records epoch time and system uptime. Cloud-side comparison and correction made sampling times more reliable after outages or clock errors.

Zero-configuration remote diagnostics

I designed a WebSocket-based diagnostic channel that works through ordinary outbound HTTPS connectivity. Users do not need to change router or firewall settings, while engineers can inspect device state and logs remotely. The design began in home Wi-Fi deployments and later expanded to industrial IoT.

The capability was later separated into two open-source projects: rds-agent collects diagnostic data on devices, and rds-relay-server receives and relays it in the cloud.

Brick-resistant factory recovery

Linux IoT devices can become unbootable after power loss or a failed update. I separated the immutable system into a read-only rootfs and stored user data and configuration in a writable overlayfs. A customized U-Boot flow checks a dirty flag at startup; after an unhealthy boot, it clears the writable layer and restores factory defaults.

The AM335x chain is ROM code → SPL → U-Boot → kernel, while Raspberry Pi normally uses GPU firmware → bootloader → kernel. To reuse the recovery design, I inserted U-Boot as a second-stage bootloader on Raspberry Pi.