A WordPress reader client for Android. The app pulls posts, categories and YouTube videos from a WordPress REST API and a YouTube channel, then lets you browse, read and bookmark them offline. Everything is stored locally with Room and synced with Retrofit.
- Article feed with categories, search and infinite scrolling.
- Article detail with rendered HTML and images (Glide).
- YouTube videos feed and an embedded player, plus a live section.
- Bookmark (mark) articles and videos for offline access.
- Contact / social links screen driven by remote configuration.
- Light/dark theme, English and Turkish translations.
- Optional Firebase Analytics, Crashlytics and Performance.
![]() |
![]() |
![]() |
![]() |
|---|
The data, Hilt and repository layers live in the :wordpress-core library module, while
:app contains the UI on top of it:
wordpress-core/ # reusable library (:wordpress-core)
└── src/main/java/org/ferhatozcelik/
├── data/
│ ├── entity/ # Room entities (Article, Video, Categories, Marked*)
│ ├── local/ # Room database + DAOs + type converters
│ ├── model/ # API response models
│ └── remote/ # Retrofit AppApi
├── di/ # Hilt modules (ApiModule, AppModule, DatabaseModule)
└── repository/ # ArticleRepository, VideoRepository
app/ # demo application (:app)
└── src/main/java/org/ferhatozcelik/
├── App.kt
├── interfaces/ # UI item click listener
└── ui/
├── activitys/ # MainActivity + video player
├── adapters/ # RecyclerView adapters
├── dialogs/ # app info dialog
├── fragments/ # article, videos, marked, contact + view models
└── util/ # date/network/html helpers
The project follows MVVM: fragments observe LiveData from @HiltViewModel
view models, which call repositories backed by Room and Retrofit.
smoothbottombar is a local library module that provides the animated bottom
navigation bar used by the main screen.
The app reads its configuration from config/config.properties. This file is not
committed (it may contain private keys); a ready-to-use template lives in
config-example/config.properties.
mkdir -p config
cp config-example/config.properties config/config.propertiesWhen config/config.properties is missing the build automatically falls back to
config-example/config.properties, so a clean clone builds out of the box.
| Setting | Purpose |
|---|---|
APPLICATION_ID |
Application id (com.ferhatozcelik.wordpress). |
APPLICATION_NAME / APPLICATION_DESCRIPTION |
Shown on the contact screen. |
BASE_URL |
WordPress REST API base url (must end with /). |
YOUTUBE_API / YOUTUBE_API_KEY / CHANNEL_ID / PLAYLIST_ID |
YouTube feed configuration. |
*_STATUS |
Visibility of each social link (0 visible, 1 invisible, 2 gone). |
storePassword / keyAlias / keyPassword |
Optional release signing. |
- Firebase — drop your
app/google-services.jsonin place to enable Analytics, Crashlytics and Performance. The corresponding Gradle plugins are only applied when that file exists, so builds without it succeed. - Release signing — place
config/keystore.jksand set thestorePassword,keyAliasandkeyPasswordproperties. Without them the release build is produced unsigned instead of failing.
| Tool | Version |
|---|---|
| minSdk | 24 |
| compileSdk / targetSdk | 36 |
| Gradle | 8.14.5 |
| Android Gradle Plugin | 8.13.2 |
| Kotlin | 2.2.21 |
| Hilt | 2.57.2 |
| Room | 2.8.5 |
| JDK | 17 |
./gradlew :app:assembleDebug # debug APK
./gradlew :app:assembleRelease # release APK (signed only if configured)
./gradlew test # unit testsThe data, networking and repository layers are packaged as the :wordpress-core Android
library (com.ferhatozcelik:wordpress-core). It reads the same config/config.properties
for its BASE_URL and YOUTUBE_API values. Publish it to your local Maven repository and
consume it from another project:
./gradlew :wordpress-core:publishToMavenLocal -PVERSION_NAME=1.0.0repositories {
mavenLocal()
}
dependencies {
implementation("com.ferhatozcelik:wordpress-core:1.0.0")
}Apache License 2.0 — see LICENSE. If this project helped you, give it a ⭐️.



