尚未检测到更新。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.