Description | Screenshots | Features | Requirements | Built With | Building | Download | License
An Android client for Shiori, the self-hosted bookmark manager. It talks to a server you run yourself: there is no account to sign up for and no service behind the app, only your own.
The whole library is kept on the device, so the list, the tags and any article you have already saved are there with no connection at all. What you change while offline — adding, editing, deleting, asking the server for a fresh copy of a page — is queued and sent when the server can be reached again.
![]() |
![]() |
![]() |
![]() |
| Bookmarks | Compact | Tags | Editor |
![]() |
![]() |
![]() |
![]() |
| Bookmarks, dark | Compact, dark | Settings | Settings, dark |
The list is a staggered grid that takes as many columns as the window can hold: one on a phone, two on an unfolded foldable, three on a tablet.
![]() |
![]() |
| Tablet | Tablet, dark mode |
![]() |
![]() |
| Unfolded foldable | Unfolded foldable, dark mode |
- Save from any app. Shiori registers as a share target, so a page reaches your library from the browser's Share menu without opening the app.
- Read offline. Articles are stored as readable text, stripped of the site around them, and stay available with no connection.
- Works offline, syncs later. Changes made without a connection are queued and replayed against the server once it answers again.
- Search titles, excerpts and URLs, on the device, so it also answers offline.
- Tags. Filter the list by tag, rename or delete tags, or hide one tag from the list entirely.
- Batch actions. Select several bookmarks to tag, re-cache or delete them in one go.
- EPUB. Download the ebook the server made of a page, and pass it on to a reader app.
- Adaptive layout. The list is a staggered grid that takes as many columns as the window can hold, and on a large screen it can put the article beside the list instead of over it.
- Material 3 with dynamic colour, light and dark.
- A Shiori server you can reach, 1.7 or newer. Sign-in uses its
/api/v1/authAPI, and logout falls back to the pre-1.8 route when the newer one is not there. - Android 8.0 (API 26) or newer.
The app asks for the server's address on first launch. Anything the server cannot do, it cannot do either: it is a client, not a second copy of Shiori.
- Jetpack Compose and Material 3 for the whole UI — there are no XML layouts
- Room and Paging 3 for the local copy of the library, which is what the list is actually read from
- WorkManager to replay offline changes once the server answers again
- Retrofit and OkHttp for the API
- Koin for dependency injection
- Coil for thumbnails
- DataStore for settings and the session
- Coroutines and Flow throughout
Laid out in six Gradle modules — presentation, domain, data, network, model, common —
so the UI cannot reach the network without going through a use case first.
./gradlew :presentation:assembleProductionDebugDebug builds need nothing beyond a JDK 21 toolchain. Release builds are signed, and read the
keystore from KEYSTORE_PATH, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS and
RELEASE_KEY_PASSWORD.
Tests:
./gradlew testShiori is available for download on various platforms:
This project is licensed under the Apache License - see the LICENSE file for details.












