Connected-car remote control service
We built a digital key that lets a smartphone stand in for the car key. The phone and the car talk directly over Bluetooth Low Energy, and because the iPhone does not keep that connection alive in the background, we designed a workaround that uses GPS location. Since a failed unlock leaves someone stranded, we reproduced dropped links and failures on real cars and sensors in the field and fixed them there. The iPhone and Android apps connect to a web dashboard that manages issued keys and sharing.
A key that opens as you approach and locks as you leave
The phone and the car connect directly over Bluetooth Low Energy. Without opening the app, the phone looks for the car's signal in the background, gauges distance from signal strength, and unlocks as you approach and locks as you walk away. The iPhone does not keep a Bluetooth connection alive while the app is in the background, so left alone the link drops. We worked around that limit within Apple's rules with a design that uses GPS location to keep the connection going. The trigger distance can be set to near, middle, or far, and behavior that changes with distance and surroundings was checked and fixed in the field on real cars and sensors. The Bluetooth communication code is packaged as a module separate from the app itself, so changes on the communication side do not shake the whole app. From the home-screen widget, start, lock, and hazard lights are one tap away without opening the app, and only the buttons that fit the car's trim are shown.

It becomes a key only after the phone and the car verify each other
On first registration, the phone connects to the car's key module over Bluetooth, confirms the vehicle's delivery status, then verifies the car's unique certificate, the owner certificate, and a one-time certificate in turn before it becomes a key. After registration, key credentials are refreshed every few minutes so a stale key cannot open the car. A separate flow transfers ownership after the car is sold. Every step leaves a record, so when a registration stalls in the field, the web dashboard shows at once which step failed and why.

Sharing a key, with permissions set per person
Send a key by name and phone number, and it exists only once the recipient accepts. Each car can share with up to two people, each with their own settings for the card key, Bluetooth, safe mode, and auto-lock, and access can be revoked at any time. Issued keys, sharing status, and failed registrations are all on one screen of the web dashboard.

A month of driving and the car's condition, on one report
Each month's driving and the car's condition come together on one report. Distance, driving time, fuel economy, and idle time are shown against the previous month, and tapping a date lays out that day's morning and afternoon trips one by one. Fault diagnosis is split into powertrain, chassis, and vehicle communication systems, each marked normal or needs inspection, and consumables due for replacement are flagged first. Replacements done at a garage can be logged with the date and mileage.

Highlights
A Bluetooth Low Energy digital key that unlocks as you approach and locks as you walk away
Registration through step-by-step certificate checks, and sharing with up to two people with per-person permissions
iPhone and Android apps, a web dashboard for digital keys, and a home-screen control widget
Insights
GA4 client_storage: 'none'은 정말 쿠키를 막을까?
두 달 전 이 블로그에 「GA4 쿠키 없이 쓰기」라는 글을 썼습니다. clientstorage: 'none' 으로 쿠키 저장을 끄고, 자체 분석이 쓰던 익명 ID 를 clientid 로 넘기면 쿠키 0개로 GA4 를 쓸 수 있다는 내…
GA4 Measurement Protocol: gtag.js 없이 서버에서 이벤트 보내기
랜딩 페이지의 전송량을 파일 단위로 쪼개 보다가, 가장 큰 파일이 우리 코드가 아니라는 것을 알았습니다. Google Analytics 의 gtag.js 였고, 방문 한 번에 176KB 를 받고 있었습니다. 페이지 전체가 1,094K…
중소 제조업 AI 도입 순서: DX를 먼저 끝내야 할까?
공장을 가진 중소·중견 제조기업 16만여 곳 가운데 스마트공장을 도입한 곳은 19.5%입니다. 회사가 작을수록 이 비율은 더 떨어집니다. 중소벤처기업부가 2025년 4월에 낸 제1차 스마트제조혁신 실태조사 결과입니다. 그림: 기업 규…
Next.js loading.tsx와 404: 버튼이 화면보다 먼저 살아나게 하기
관리 화면 왼쪽 위에 사이드바를 접고 펴는 ☰ 버튼이 있습니다. 폭 하나 바꾸는 버튼인데, 대시보드에서 누르면 2초 넘게 아무 반응이 없었습니다. 레이아웃만 바꾸는 일이 왜 이렇게 오래 걸리는지부터 들여다봤습니다. Next.js 16…



