Native Android microblogging client for Ghost CMS. Offline-first, Jetpack Compose, Material 3.
Find a file
Paweł Orzech 689b8cc8c2 feat: add Member model, API endpoints, and model parsing tests
Add MemberModels.kt with GhostMember, MemberLabel, MemberNewsletter,
MemberSubscription, SubscriptionPrice, and SubscriptionTier data classes.
Add getMembers() and getMember() endpoints to GhostApiService.
Add comprehensive JSON parsing tests for all member model types.
2026-03-20 00:26:32 +01:00
.github docs: add open-source project files (README, license, contributing) 2026-03-19 10:17:46 +01:00
.superpowers/brainstorm feat: bold expressive theme with custom green palette, elevated cards, and high-contrast swipe actions 2026-03-19 14:02:48 +01:00
app feat: add Member model, API endpoints, and model parsing tests 2026-03-20 00:26:32 +01:00
docs/superpowers feat: bold expressive theme with custom green palette, elevated cards, and high-contrast swipe actions 2026-03-19 14:02:48 +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 docs: update CLAUDE.md and README.md to reflect current project state 2026-03-19 15:49:13 +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: update CLAUDE.md and README.md to reflect current project state 2026-03-19 15:49:13 +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
  • Multi-account — Connect up to 5 Ghost blogs and switch between them
  • Image uploads — Attach photos from your gallery or camera
  • Link previews — Automatic Open Graph metadata extraction (title, description, thumbnail)
  • Hashtag support — Auto-extracted hashtags converted to Ghost tags
  • Scheduled publishing — Set a future publish date for your posts
  • Statistics dashboard — Post counts, word counts, reading time, and more with animated counters
  • Search & filtering — Filter by status (Published, Draft, Scheduled) and sort by date
  • 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 — Bluesky-inspired feed design with polished animations and Light/Dark/System themes

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), PostStats, GhostAccount
│   └── repository/     # PostRepository, OpenGraphFetcher
├── ui/
│   ├── animation/      # SwooshMotion shared animation specs
│   ├── components/     # Reusable composables (dialogs, placeholders)
│   ├── feed/           # Post feed with search and filtering
│   ├── composer/       # Post creation with images, links, hashtags, scheduling
│   ├── detail/         # Full post view
│   ├── preview/        # HTML post preview
│   ├── stats/          # Statistics dashboard
│   ├── setup/          # Configuration wizard and add-account flow
│   ├── settings/       # App settings, account management, theme toggle
│   ├── navigation/     # Compose Navigation with bottom nav bar
│   └── theme/          # Material 3 theming (Light/Dark/System)
└── 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.

Navigation: Bottom bar with three tabs (Feed, Stats, Settings). Composer and Detail screens slide in as overlays.

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

24 test classes covering JWT generation, mobiledoc building, URL normalization, data model serialization, auth interceptors, time formatting, hashtag parsing, account management, feed preferences, and theme modes.

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