Side Projects

Laiki 到哪了

Laiki 到哪了

房間制即時位置分享 App。開一個有時效的房間、分享連結,就能在同一張地圖上看到夥伴的位置、方向與電量,加上集合點、規劃路線與按住說話語音更新,房間到期自動關閉。支援精準/街區/城市三級定位、Ghost 模式與行程紀錄。Flutter 雙平台,後端全 Cloudflare(Workers、Durable Objects、D1、R2)。

要解決的問題

機車環島、露營、演唱會散場或家族出遊時,同行的人常常在群組裡一直問「你到哪了?」。常駐型的定位 App 能解決這件事,但要大家 24 小時互相分享位置,很多人不願意。Laiki 想要的是只在這一趟需要時分享,行程結束就自動停止。

畫面截圖

  • Laiki 隊伍地圖:同一張地圖上顯示所有成員的位置、速度與電量
  • Laiki 房內按住說話,地圖上標示正在說話的成員
  • Laiki 開房設定:房間時效與精確、街區、城市三級位置精度
  • Laiki 地圖上的補給點、集合點與預計路線

主要功能

  • 有時效的房間

    開一個房間、把連結丟到群組,大家就在同一張地圖上。房間可設 1 小時到 7 天,到期自動結束,不做全天候追蹤。

  • 即時隊伍地圖

    每位成員的位置、方向、移動速度與電量即時上圖,有人過彎脫隊或落後時更容易發現。

  • 按住說話

    房內內建語音對講,按住就能把集合或行程更新同步給全隊,不必停下來打字。

  • 集合點與路線

    在地圖上加地標、集合點與預計路線,全隊看到的是同一份資訊;也可以設定靠近提醒,成員到達指定距離內時通知。

  • 隱私由自己控制

    位置精度可選精確、街區或城市三級,另有幽靈模式可隨時停止上報,房間時效也由開房的人決定。

  • 免安裝也能回覆

    沒裝 App 的朋友可以先用瀏覽器打開活動連結回覆是否參加,要加入即時位置房間時再用 App。

技術架構

App 用 Flutter 寫,一份程式碼同時出 iOS 與 Android,地圖使用 MapLibre 搭配 Protomaps 的 PMTiles 向量圖資。後端全部放在 Cloudflare:Workers 負責 API、登入與信令,每個房間對應一個 Durable Object,用 WebSocket Hibernation 做位置廣播,房間閒置時不必一直佔著運算資源。帳號、好友與房間 metadata 存在 D1,底圖檔案與使用者主動保存的行程紀錄放在 R2,語音則走 Cloudflare Realtime 的 SFU。選擇一房一 Durable Object,是因為房間天然就是隔離的單位,狀態與權限判斷都能在伺服器端集中處理。

技術挑戰與取捨

  • 即時位置不能被「順便」保存

    Durable Object 在休眠時可以把資料序列化進 WebSocket attachment,讓連線醒來後還能接續,最省事的做法是把每個成員的最後位置也一起存進去。但這等於讓經緯度、速度、電量在連線期間一直被持久化,和「只在需要時分享」的前提相衝突。最後決定 attachment 只保留維持連線與權限判斷必要的身分資料,即時位置只放在 Durable Object 的記憶體裡。房間被喚醒後,伺服器只請仍在分享、且手上有兩分鐘內新鮮定位的成員重送一筆,過舊的位置不補報;幽靈模式、離房、被踢或房間到期時則立即清除。

  • 海外地圖靜默變成空白

    底圖分成三層:台灣區域檔、全球低縮放檔,以及更高縮放級別時改從外部的每日 build 讀取。外部 build 只保留一段時間,舊檔被刪掉後,國外 z8 以上的圖磚全部回傳空白,而台灣一切正常,沒有任何告警會響,是在測試離線下載時才被撞出來。比較過只提高全球檔縮放級別、補抽特定區域與自動追新日期等做法後,決定把整份全球底圖轉存到自己的 R2,移除對外部 URL 的依賴。上傳這份上百 GB 的檔案時也踩過串流重傳導致檔案損壞的坑,最後改成可續傳的平行分段上傳,並在組合前逐段核對大小、組合後比對總長度,相關腳本有回歸測試保護。

  • 離線地圖要誠實

    出國帶團時網路可能很慢甚至沒有,所以加入了離線地圖下載。最大的風險是使用者誤以為「離線也能分享位置」,因此 UI 明確標示離線時成員位置停在最後已知並顯示「離線中」,文案也不宣稱離線可用房間。技術上,一次區域下載會產生數千次圖磚請求,若和一般瀏覽共用路徑,會汙染用來決定下一個要補哪一區圖資的缺圖統計。解法是另開一條離線專用的 style 與圖磚路徑,兩者共用同一個圖磚服務函式,只差在離線路徑不記錄缺圖,並用測試鎖住這個行為;下載前也會先估算圖磚數量並限制範圍與縮放級別。

現況

iOS 版於 2026-08-31 在 App Store 上架,Android 版於 2026-09-22 在 Google Play 正式上架;官網 laiki.app 提供下載連結與網頁版活動回覆。

使用技術

  • Flutter
  • Dart
  • Cloudflare Workers
  • Durable Objects
  • D1
  • R2
  • WebSocket
  • iOS
  • Android

更多Side Projects