尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A native iOS reader for the books, comics and PDFs in your Jellyfin library.
Jellyfin is great at storing your library. It is not great at reading it on a phone. Self-Shelf
signs into your server, pulls down the shelf, and gets out of the way so you can read.
Everything is local-first. Your place in a book, your bookmarks, your highlights and your type
settings live in SQLite on the device, so the app opens instantly and works on a plane. Progress
is pushed back up to Jellyfin when the server is reachable.檢視完整 README ↗Jellyfin is great at storing your library. It is not great at reading it on a phone. Self-Shelf signs into your server, pulls down the shelf, and gets out of the way so you can read.
Everything is local-first. Your place in a book, your bookmarks, your highlights and your type settings live in SQLite on the device, so the app opens instantly and works on a plane. Progress is pushed back up to Jellyfin when the server is reachable.
Your library, the way you left it
A reader worth using
Offline and on-device
Austen, Jane - Emma.epub are parsed for title and author automaticallyNative where it counts
git clone https://github.com/jacclyons/JellyShelf.git
cd JellyShelf
npm install
npm run ios
Self-Shelf uses native modules, so Expo Go will not work. npm run ios builds and installs a dev
client. After that, npm start is enough for day to day work.
On first launch you get a short walkthrough, then a sign-in screen. Type your server address the
way you would in a browser (jellyfin.home.lan:8096 is fine, so is a pasted web client URL) and
Self-Shelf will sort out the scheme and strip the /web suffix.
| Command | What it does |
|---|---|
npm start | Start Metro against the dev client |
npm run ios | Build and run on a simulator or device |
npm run prebuild | Regenerate the native project from scratch |
npm run typecheck | tsc --noEmit |
npm run lint | Expo lint |
The reader is a single HTML file with epub.js, pdf.js, JSZip and unrar.wasm vendored alongside it.
It is copied out of the bundle into a hidden folder on first run and loaded over file://, which
means the WebView can fetch() any book on disk without a server in the middle. React Native and
the engine talk over a small typed message protocol, so the native side owns navigation, chrome and
persistence while the WebView only paints pages.
Books live under Documents/ so that both halves of that story work at once: iOS shows the folder
as "Self-Shelf" in the Files app for your own EPUBs, and downloads from Jellyfin land in a
dot-prefixed subfolder the Files app leaves alone.
src/
api/ Hand-written slice of the Jellyfin API, plus React Query hooks
app/ expo-router screens (tabs, book detail, reader, settings, sign-in)
reader/ WebView bridge, appearance and contents sheets, scrubber
state/ Auth session, SQLite store, reader preferences
lib/ On-disk layout, downloads, local book scanning, metadata
ui/ Theme, glass surfaces, covers, shelves, shared bits
assets/
reader/ The reader engine and its vendored libraries
expo-secure-store.