KEVIN OUELLETTE.

Independent product developer

Board, firmware, server, app.

I build software and the hardware it runs on. In practice that means designing a circuit board, writing its firmware, standing up the server that collects what it sends, and shipping the apps people actually open. Below is what's currently in use.

Fig. 1 — Sensor to screen Typical data path
Sensor ESP32 · BME280 · DS18B20 Firmware C++ · PlatformIO · OTA Broker Mosquitto · MQTT Store + API TimescaleDB · Node Mobile Kotlin Multiplatform Web React · Vite · Docker

What I can build for you

Taking on work
01

Apps

iOS, Android, desktop and web. If you have an idea and a rough sketch, I can take it through to something real that people can download and use.

02

Sensors & boards

Custom circuit boards designed from schematic through layout to assembled hardware, and the firmware that runs on them. Sensors built for what you actually need to measure, rather than something off a shelf that nearly fits.

03

The connected system

The board, the server it reports to, and the app that reads it — built as one project rather than handed between three vendors who each blame the others when something doesn't line up.

Work

Six projects
Fahren mobile app showing live walk-in cooler and freezer sensor cards with temperature sparklines.

Fahren

fahrensense.com Live

Environmental monitoring and alarm hardware for walk-in coolers, freezers, server rooms and greenhouses — temperature, humidity and barometric pressure, plus dry contact monitoring for alarm panels and float switches. The sensor board, firmware, broker, database, mobile apps, dashboard and servers are all part of the same project.

  • Custom PCB around an ESP32-C3, with OTA firmware updates and an MQTT watchdog
  • Two sensor variants selected at compile time — BME280 for ambient, waterproof DS18B20 probe down to −55 °C for freezers
  • TimescaleDB hypertables with continuous aggregates and tiered retention: raw 90 days, hourly 2 years, daily forever
  • Duration-based alarms that require a condition to persist before firing, so a door opening doesn't page anyone
  • Contact-closure alarms latch until someone acknowledges them, and dispatch over push and SMS
ESP32-C3 BME280 DS18B20 PlatformIO MQTT / Mosquitto Node.js TimescaleDB Redis Kotlin Multiplatform React Docker Caddy Twilio
PropertyPlex mobile app showing a hotel work order dashboard with open, overdue and needs-parts counters.

PropertyPlex

prprtyplex.com Live · iOS & Android

Hotel maintenance and housekeeping software. Work orders, preventive maintenance scheduling, room turnover boards and asset tracking, with two-way sync into the property management systems hotels already run.

  • In use at two hotels, syncing room status and reservations
  • Five PMS connectors behind one generic interface — Cloudbeds, Mews, Guesty, Opera Cloud and Infor, including a SOAP webhook integration against Infor's Liaison Databridge
  • Multi-tenant from the ground up: organizations, tenants, plan limits, and three separate admin systems with independent auth
  • Equipment photographed and read into structured asset records by the Claude API
  • Shipped in five languages — English, Spanish, French, Jamaican Patwa and Romanian — across web and both mobile apps
Kotlin Multiplatform Compose Multiplatform Swift Node.js SQLite Stripe Firebase FCM APNs Claude API React Docker
The NMDrones website: Northern Michigan Drone Services, aerial photography and videography for real estate.

NMDrones

nmdrones.com Site live · Board in dev

A drone services business and the electronics behind it. The site handles client galleries and aerial photo stitching; the board in progress adds FAA Remote ID broadcast and LTE telemetry to an existing airframe.

  • Broadcasts FAA Remote ID over BLE to the ASTM F3411 standard, while streaming live position over LTE to a web dashboard
  • Laid out to the 30.5 mm Pixhawk mounting pattern with a JST-GH MAVLink connector, so it drops onto existing airframes
  • Power design sized for the LTE modem's 2 A transmit peaks — a buck converter for the radio, separate rail for logic
  • Client-facing site with photo galleries, uploads and a NodeODM-backed aerial stitcher
ESP32-S3 SIM7600G-H LTE u-blox NEO-M8N EasyEDA BLE Remote ID MAVLink Node.js NodeODM Leaflet Docker
The Minexus website: an AI-powered personal command center, showing feature cards for daily briefing, email intelligence and project tracking.

Minexus

minexus.ai Live

A desktop command center that reads across email and messages, tracks what each project is waiting on, and produces a daily briefing. Work and personal contexts stay separate.

  • Desktop app built and signed for both macOS and Windows on ARM
  • Email and iMessage/SMS pulled into one timeline rather than a stack of inboxes
  • Kotlin Multiplatform mobile companion for capture on the move
Electron React TypeScript Vite Node.js Kotlin Multiplatform
WorkLens custom camera screen showing flash controls, aspect ratio toggle, a zoom ruler at 1.4x, and photo and video modes.

WorkLens

Android & iOS Built & signed

A job-site camera and photo organizer — shoot, sort into albums, export a set to hand off. One Kotlin Multiplatform codebase, with the shared UI split into platform-specific implementations where Android and iOS actually differ.

  • Custom camera with a zoom ruler, aspect-ratio control, and photo/video modes rather than a system camera hand-off
  • Gallery and camera screens split through expect/actual — Android and iOS get separate implementations where insets, image scaling and fullscreen behaviour diverge
  • Albums with rename, export and batch delete
Kotlin Multiplatform Compose Multiplatform CameraX AVFoundation Swift
The PCFar website: end-to-end encrypted remote desktop, showing feature cards for encryption, post-quantum key exchange and login screen access.

PCFar

pcfar.com Live

A remote desktop tool written from scratch rather than wrapped around an existing protocol — screen capture, input injection, an encrypted channel, file transfer, and a self-hosted relay so two machines behind NAT can reach each other without anyone opening a port.

  • Own frame pipeline: dirty-region diffing against a framebuffer, JPEG-encoded tiles rather than whole frames
  • Direct TCP when both ends can see each other, falling back to the relay when they can't
  • Windows capture through Direct3D11 / DXGI desktop duplication; Avalonia gives one UI for host and viewer on both platforms
  • Consent prompt before an attended session starts, and stored credentials sealed with the OS keystore
C# .NET 9 Avalonia SkiaSharp Direct3D11 / DXGI Docker

What I work in

Silicon → screen
01

Silicon & boards

ESP32-C3 ESP32-S3 BME280 DS18B20 SIM7600G-H u-blox NEO-M8N EasyEDA Schematic & PCB layout
02

Firmware

C++ / Arduino PlatformIO OTA updates BLE I2C OneWire MAVLink
03

Transport

MQTT / Mosquitto REST Webhooks SOAP OAuth2 WebSockets Custom binary protocols NAT relay
04

Data

TimescaleDB PostgreSQL SQLite Redis Hypertables & continuous aggregates
05

Backend

Node.js Express JWT auth Multi-tenancy Stripe Firebase FCM APNs Claude API
06

Apps

Kotlin Multiplatform Compose Multiplatform Kotlin Swift Electron C# / .NET 9 Avalonia App Store & Play releases
07

Web

React Vite TypeScript Leaflet Internationalization
08

Infrastructure

Docker Docker Compose Caddy Let's Encrypt DigitalOcean Linux

Available for work

Have something you want built?

I take on projects where someone has a clear idea and needs it made real — hardware, apps, backends, or all three together. Tell me what you're trying to build and I'll tell you honestly whether I'm the right person for it.