>

2026/06 ~ 現在

香譜 Scentlog・香水收藏紀錄

全端開發
PWA
離線同步
Cloudflare
進行中
精選

基於 Hono + Cloudflare Workers 的香水收藏 PWA,記錄試香感想、收藏跟每日使用,依天氣跟個人偏好推薦今天的香水

香譜 Scentlog・香水收藏紀錄

採用技術

Hono

Worker 路由、公開頁面 SSG 跟會員 API

React 19

以 islands 方式處理頁面上的互動元件

Cloudflare Workers

邊緣運算執行環境,處理登入流程、API 跟頁面輸出

Cloudflare D1

Serverless SQLite,會員資料跟版本的唯一基準

Cloudflare R2 / KV

R2 存放香水圖片,KV 快取可丟棄的讀取結果

Durable Objects

以 WebSocket 通知同一會員的其他裝置重新同步

WorkOS AuthKit

會員登入與 Session 管理

Tailwind CSS v4

Utility-first CSS 框架

Framer Motion

抽屜、分頁切換等介面動態

專案介紹

香譜是一款香水收藏與試香紀錄工具。去專櫃試了好幾支,隔週就忘了哪支喜歡;收藏越來越多,每天出門前也不知道該噴哪一支。香譜把試香感想、收藏檔案跟每日使用紀錄放在一起,讓這些紀錄反過來幫你挑今天的香水。

整個服務跑在 Cloudflare Workers 上,搭配 D1、R2、KV 跟 Durable Objects,可以安裝成 PWA,在沒有網路的專櫃也能先記下來,回到線上再自動同步。

技術架構

前端

以 Hono JSX 產生頁面外殼,互動區塊用 React 19 islands 掛載,搭配 Tailwind CSS v4、Base UI 跟 Framer Motion 處理抽屜、分頁等手機原生感的操作。

後端

執行於 Cloudflare Workers,D1 是資料跟版本的基準,R2 存放香水圖片,KV 只快取可丟棄的讀取結果,key 包含會員跟 D1 版本,資料更新後自然失效。

認證系統

使用 WorkOS AuthKit 登入,Worker 處理 PKCE、callback 跟 Session 更新。密封後的 Session 放在 HttpOnly Cookie,HTTPS 環境使用 __Host- 前綴,瀏覽器只拿得到會員基本資料。

離線同步

IndexedDB 保存資料快照跟離線操作佇列(outbox),恢復連線後依序送出。Durable Objects 透過 WebSocket 通知同一會員的其他裝置重新讀取 D1,前景每五分鐘再補查一次版本。

資料隔離跟共用目錄

會員資料各自隔離

評分、心得、使用跟購買紀錄都屬於個人。所有私人查詢都經過同一個資料存取層,從已驗證的會員身分產生查詢範圍;資料庫 triggers 再檢查跨表關聯的擁有者,私人 API、頁面跟圖片也不進共享快取。

共用目錄需經審核

找不到的香水只要填品牌跟名稱,就能先建立自己的紀錄,同時提出收錄申請。管理員逐欄核實來源跟使用範圍後才會公開;審核通過會自動連結共用資料,個人的評價、紀錄跟私人圖片都保留。

不批次爬取

來源整理預設不啟用任何網站,需要先記錄網域的讀取依據,再逐筆讀取產品頁的結構化資料。只保存待核實的欄位建議,不複製圖片、介紹文案或評論。

推薦機制

推薦不呼叫生成式 AI,而是用規則計算:個人偏好標籤、評分、適合的場合跟天氣、近期使用紀錄,再加上選填的即時天氣(體感溫度、濕度、降雨機率)。每一支推薦都會附上理由,例如「偏熱友善:清新,個人天氣:多雲」,讓你知道它為什麼被選出來。