Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Retsomm/TravelInTime: 沉靜式電子書閱讀器 · GitHub
Skip to content

Repository files navigation

Travel in Time — 沉靜式電子書閱讀器

feature-graphic-1024x500

一款專注於沉靜、專注閱讀體驗的跨平台 EPUB 閱讀器,支援語音朗讀、畫線註記、繁簡轉換。 目前包含四個子專案:穩定可用的桌面版(Electron)與網頁版(PWA),以及兩個開發中的專案—— 行動 App(Expo / React Native)與網頁版重寫版(Next.js,未來將加入雲端同步)。


功能特色

  • EPUB 閱讀:完整支援 EPUB 格式,含複雜章節結構與圖片排版
  • 語音朗讀:使用系統內建語音(無需 API),邊讀邊高亮同步,支援即時調速
  • 畫線註記:多種顏色高亮、自由加筆記,按章節分組匯出
  • 繁簡轉換:一鍵切換繁體 / 簡體中文顯示
  • 閱讀設定:字體、字級、行距、字距自由調整
  • 深色模式:自動跟隨系統或手動切換
  • 閱讀進度:自動記錄每本書的最後位置,下次繼續
  • 睡眠定時器:設定朗讀時間到自動關閉應用
  • 本機優先:EPUB 書籍檔案與本機設定僅儲存於 IndexedDB / LocalStorage / 裝置本機,不上傳 (pwa-next/ 的雲端同步僅同步書庫清單、進度、書籤、註記等輕量資料,不包含 EPUB 檔案本體,詳見下方)

版本與現況

子專案路徑狀態
桌面版(Electron)electron/ + renderer/穩定,已發布
網頁版(PWA)pwa/穩定,目前線上使用的版本
網頁版重寫(Next.js)pwa-next/開發中,尚未上線/未取代 pwa/
行動 App(Expo RN)mobile/開發中,程式碼完成、待實機測試,僅設定 Android 發布

桌面版(Electron)

前往 Releases 頁面下載對應平台的安裝檔:

平台格式
macOS.dmg
Windows.exe(NSIS 安裝精靈)
Linux.AppImage

網頁版(PWA,目前線上版本)

直接在瀏覽器開啟,支援安裝至桌面或主畫面,可離線使用。

  • 原始碼位於 pwa/ 資料夾
  • 部署至 Vercel 後即可透過網址存取
  • 所有資料儲存在本機瀏覽器(IndexedDB / LocalStorage),無帳號、無雲端同步

網頁版重寫(Next.js,開發中)

pwa-next/pwa/ 的重寫版本,未來會取代現有 pwa/(不是額外新增的獨立後端)。 主要目的是加入雲端同步,解決「本機儲存被清除就無法挽回」的問題:

  • 使用 Clerk 登入後,書庫清單、閱讀進度、書籤、註記會同步到雲端資料庫(Postgres,透過 Prisma)
  • EPUB 檔案本體不會上傳,只同步上述輕量資料,檔案仍需使用者自行重新匯入
  • 閱讀器 UI 已從 pwa/ 移植大部分功能,但尚未逐項比對功能是否完全對等,尚未準備好切換上線
  • 詳細背景、決策過程與待辦見 CLOUD_SYNC_PROGRESS.md

行動 App(Expo React Native,開發中)

mobile/ 是以 Expo(React Native)打造的行動版閱讀器,核心閱讀邏輯透過 react-native-webview 內嵌一份用 epub.js 打包的網頁閱讀器(mobile/reader-web/,由 yarn build:reader 產生)。

  • 功能涵蓋書庫管理、EPUB 匯入、閱讀、書籤、畫線註記、語音朗讀(expo-speech)、繁簡轉換、深色模式
  • 目前僅設定 Android 建置與發布(eas.jsonstore-assets/google-play/),尚未設定 iOS 上架
  • 程式碼已完成函式化重構,等待使用者實機測試驗證後才算完成(見 FP_REFACTOR_PROGRESS.md

技術棧

桌面版(Electron)

層級技術
桌面框架Electron 28
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
打包發布electron-builder + GitHub Actions
測試Playwright (E2E)

網頁版(PWA)

層級技術
前端React 18 + TypeScript + Vite
樣式Tailwind CSS
PWAvite-plugin-pwa + Workbox
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js
語音朗讀Web Speech API
部署Vercel

網頁版重寫(pwa-next)

層級技術
前端框架Next.js 16(App Router)+ React 19 + TypeScript
樣式Tailwind CSS 4
身份驗證Clerk (@clerk/nextjs)
資料庫PostgreSQL + Prisma 7(driver adapter:@prisma/adapter-pg
EPUB 解析epub.js
狀態管理Zustand
中文轉換opencc-js

行動 App(mobile)

層級技術
框架Expo(SDK 57)+ Expo Router + React Native 0.86
語言React 19 + TypeScript
EPUB 解析epub.js(打包成 HTML 後透過 react-native-webview 內嵌執行)
語音朗讀expo-speech
本機儲存@react-native-async-storage/async-storage、expo-file-system
中文轉換opencc-js
打包發布EAS Build / EAS Submit(目前僅 Android)

開發環境啟動

桌面版

# 安裝依賴
yarn install
cd renderer && yarn install &&cd ..
# 開發模式(同時啟動 Vite + Electron)
yarn dev

網頁版(PWA)

cd pwa
yarn install
yarn dev # 開發伺服器 http://localhost:5174

網頁版重寫(pwa-next)

cd pwa-next
yarn install # postinstall 會自動執行 prisma generate
yarn dev # 開發伺服器 http://localhost:3000

需先設定 .env(Clerk 金鑰、資料庫連線字串等),詳見 CLOUD_SYNC_PROGRESS.md

行動 App(mobile)

cd mobile
yarn install
yarn ios # 或 yarn android / yarn web

start / android / ios 執行前會自動跑 build:reader,將 mobile/reader-web/ 打包成 mobile/lib/readerHtml.generated.ts 供 WebView 使用,不需手動執行。


打包 / 部署

桌面版

# 建置
yarn build
# 打包(輸出至 release/)
yarn electron-builder

網頁版(PWA)部署至 Vercel

cd pwa && yarn build # 輸出至 pwa/dist/

Vercel 專案設定:

設定項目
Root Directorypwa
Framework PresetVite
Build Commandyarn build
Output Directorydist

行動 App 打包(EAS)

cd mobile
eas build --profile preview # 內部測試用 APK
eas build --profile production # 上架用 Android App Bundle
eas submit --profile production # 提交至 Google Play

CI/CD

.github/workflows/ 目前只涵蓋桌面版:

Workflow觸發時機內容
release.yml推送 v* tag於 macOS / Windows / Linux 建置並發布 Electron 安裝檔
e2e.ymlpush / PR 至 main、master於 3 個作業系統跑 renderer/ 的 Playwright E2E 測試

pwa/pwa-next/mobile/ 目前沒有自動化 CI,變更後需手動建置與測試。


目錄結構

TravelInTime/
├── electron/ # Electron 主程序
│ ├── main.ts # 視窗管理、自動更新
│ └── preload.ts # IPC 安全橋接
├── renderer/ # 桌面版 React 前端
│ └── src/
│ ├── components/ # UI 元件(Reader、Library、Toolbar 等)
│ ├── hooks/ # 自訂 Hook(useTTS、useLibrary)
│ └── store/ # Zustand 狀態(閱讀設定、註記)
├── pwa/ # 網頁版(PWA,目前線上版本)
│ ├── public/ # 靜態資源(icons)
│ ├── vite.config.ts # PWA plugin 設定
│ └── src/ # 與桌面版共用相同元件架構
├── pwa-next/ # 網頁版重寫(Next.js + Clerk + Prisma,開發中)
│ ├── prisma/schema.prisma # Book / ReadingProgress / Bookmark / Annotation 資料模型
│ └── src/
│ ├── app/api/ # 雲端同步 API routes
│ ├── page/ # Library / Reader / Notes / Privacy 頁面
│ └── utils/cloudSync.ts # 登入時全量同步、資料變動時推送
├── mobile/ # 行動 App(Expo React Native,開發中)
│ ├── app/ # expo-router 路由(書庫、設定、閱讀器)
│ ├── reader-web/ # 內嵌 WebView 的 epub.js 閱讀器原始碼
│ ├── lib/readerHtml.generated.ts # 由 reader-web 打包產生(勿手動編輯)
│ └── eas.json # EAS Build / Submit 設定(目前僅 Android)
├── store-assets/ # 商店上架素材(目前僅 Google Play)
├── 隱私權政策.md # 隱私權政策(涵蓋桌面版、PWA、行動 App)
├── .github/workflows/ # CI/CD(目前僅涵蓋桌面版:發布 + E2E 測試)
└── package.json # Electron 桌面版建置設定

注意事項(macOS 安全性警告)

由於此應用程式尚未申請 Apple 程式碼簽署,macOS 首次開啟時可能出現安全性警告,無法直接雙擊開啟。

解法(終端機指令):

  1. 使用 Spotlight(Cmd + 空白鍵)搜尋並打開「終端機」
  2. 貼上以下指令並按 Enter
sudo xattr -rd com.apple.quarantine /Applications/Travel\ in\ Time.app

若應用程式不在「應用程式」資料夾,可貼上指令後加一個空格,再將應用程式圖示拖入終端機視窗。

  1. 輸入 macOS 開機密碼(輸入時不會顯示字元,屬正常現象),按 Enter
  2. 關閉終端機,重新開啟應用程式

About

沉靜式電子書閱讀器

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages