Native Android microblogging client for Ghost CMS. Offline-first, Jetpack Compose, Material 3.
Find a file
2026-03-19 10:56:43 +01:00
.github docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
.superpowers/brainstorm/17336-1773912049 merge: integrate post statistics feature (resolve conflicts) 2026-03-19 10:38:26 +01:00
app merge: integrate feed filters and sorting feature (resolve conflicts) 2026-03-19 10:56:43 +01:00
docs/superpowers merge: integrate post statistics feature (resolve conflicts) 2026-03-19 10:38:26 +01:00
gradle/wrapper feat: redesign setup screen with pulsing animated background and API key helper 2026-03-19 10:11:00 +01:00
.gitignore chore: exclude worktree directories from git 2026-03-19 10:38:35 +01:00
build.gradle.kts feat: implement Ghost CMS microblogging Android app (Swoosh) 2026-03-18 22:43:53 +00:00
CHANGELOG.md docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
CLAUDE.md feat: redesign setup screen with pulsing animated background and API key helper 2026-03-19 10:11:00 +01:00
CONTRIBUTING.md docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
gradle.properties feat: implement Ghost CMS microblogging Android app (Swoosh) 2026-03-18 22:43:53 +00:00
gradlew feat: redesign setup screen with pulsing animated background and API key helper 2026-03-19 10:11:00 +01:00
LICENSE docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
README.md docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
settings.gradle.kts test: add comprehensive TDD unit tests for all business logic (116 tests) 2026-03-18 23:24:49 +00:00

Swoosh

A native Android microblogging client for Ghost CMS. Write, publish, and manage short-form posts from your phone — with offline support, image uploads, link previews, and scheduled publishing.

Android Kotlin Jetpack Compose License

Features

  • Ghost Admin API — Full integration via JWT authentication (HS256)
  • Offline-first — Posts are saved locally and synced when connectivity returns
  • Image uploads — Attach photos from your gallery or camera
  • Link previews — Automatic Open Graph metadata extraction (title, description, thumbnail)
  • Scheduled publishing — Set a future publish date for your posts
  • Mobiledoc format — Native Ghost content format with text paragraphs and bookmark cards
  • Encrypted credentials — API keys stored with AES-256-GCM via AndroidX Security
  • Background sync — WorkManager handles upload queue with exponential backoff
  • Material 3 UI — Clean, modern interface built entirely with Jetpack Compose

Screenshots

Coming soon — contributions welcome!

Architecture

MVVM with Repository pattern, single-module Gradle project.

com.swoosh.microblog/
├── data/
│   ├── api/            # Retrofit client, JWT auth, interceptors
│   ├── db/             # Room database, DAOs, type converters
│   ├── model/          # GhostPost (API), LocalPost (DB), FeedPost (UI)
│   └── repository/     # PostRepository, OpenGraphFetcher
├── ui/
│   ├── feed/           # Post list with pull-to-refresh
│   ├── composer/       # Post creation and editing
│   ├── detail/         # Full post view
│   ├── setup/          # Initial configuration wizard
│   ├── settings/       # App settings and logout
│   ├── navigation/     # Compose Navigation graph
│   └── theme/          # Material 3 theming
└── worker/             # PostUploadWorker (WorkManager)

Data flow: Compose UI → ViewModel → Repository → Room (local) + Retrofit (remote). Posts are persisted to Room first, then queued for upload via WorkManager.

Getting started

Prerequisites

  • Android Studio Hedgehog (2023.1.1) or later
  • JDK 17
  • Android SDK 34
  • A Ghost blog with Admin API access

Ghost setup

  1. In your Ghost admin panel, go to Settings → Integrations
  2. Create a new Custom Integration
  3. Copy the Admin API Key (format: id:secret)
  4. Note your Ghost blog URL (e.g. https://yourblog.com)

Build and run

git clone https://github.com/pawelorzech/Swoosh.git
cd Swoosh
./gradlew assembleDebug

Install the debug APK on your device or emulator, then follow the setup wizard to connect your Ghost blog.

Building

./gradlew assembleDebug          # Debug APK
./gradlew assembleRelease        # Release APK (ProGuard enabled)

Testing

The project includes unit tests with JUnit 4 and Robolectric:

./gradlew test                   # Run all tests
./gradlew app:testDebugUnitTest  # Debug variant only

Test coverage includes JWT generation, mobiledoc building, URL normalization, data model serialization, auth interceptors, and time formatting.

Tech stack

Layer Technology
UI Jetpack Compose, Material 3
Navigation Compose Navigation
Architecture MVVM, StateFlow, Repository pattern
Networking Retrofit 2, OkHttp 4
Images Coil
Database Room
Background WorkManager
Auth JJWT (HS256), EncryptedSharedPreferences
Link parsing Jsoup
Testing JUnit 4, Robolectric, MockWebServer

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

This project is licensed under the PolyForm Noncommercial License 1.0.0 — you can use, modify, and share it for any non-commercial purpose. Commercial use requires permission from the author.

Author

Paweł Orzechpawelorzech.pl