|
| 1 | +# MyFAQ.app |
| 2 | + |
| 3 | +Native iOS + Android client for phpMyFAQ. Planning stage — no code yet, only `plans/mobile-app-plan.md`. |
| 4 | + |
| 5 | +## Status |
| 6 | + |
| 7 | +- Repo: `phpMyFAQ/MyFAQ` (this checkout). Current contents: `plans/`, `LICENSE`. Source tree lands in Phase 0. |
| 8 | +- App versions track phpMyFAQ minor versions (app `1.0.0` → phpMyFAQ `4.2.x`). |
| 9 | + |
| 10 | +## Locked decisions (do not re-open without deliberate revisit) |
| 11 | + |
| 12 | +- **Stack**: Kotlin Multiplatform shared module; SwiftUI (iOS); Jetpack Compose (Android). |
| 13 | +- **Brand**: MyFAQ.app, domain `https://myfaq.app`. |
| 14 | +- **Model**: freemium. Read + offline free forever. Writes (login, ask, comment, rate, register) behind Pro unlock in Phase 3. |
| 15 | +- **Minimum phpMyFAQ version**: `4.2.0`. No back-compat to `v3.1`. OpenAPI client generated from 4.2.x spec only. |
| 16 | +- **iOS bundle ID**: `app.myfaq.ios`. Irreversible in store. |
| 17 | +- **Marketing site**: `https://myfaq.app` is a single landing page with download badges at launch. No mirrored docs. |
| 18 | + |
| 19 | +## Scope guardrails |
| 20 | + |
| 21 | +- **v1 is read-only.** No writes, no auth prompts in free tier. |
| 22 | +- **No `admin/api/*`.** Session + CSRF not a fit for native client. App is not a second admin panel. |
| 23 | +- **No push in v1.** Server contract missing. |
| 24 | +- **Excluded entirely**: `faq/create|update`, `category` POST, `backup/{type}`. |
| 25 | +- API surface pinned to phpMyFAQ public `v3.2` (`docs/openapi.yaml` upstream). |
| 26 | + |
| 27 | +## Shared libs (locked) |
| 28 | + |
| 29 | +Ktor · kotlinx.serialization · SQLDelight (FTS5) · Koin · openapi-generator · WorkManager/BGTaskScheduler · Coil/SDWebImageSwiftUI · StoreKit 2 / Play Billing v7+. |
| 30 | + |
| 31 | +Secure storage: iOS Keychain + Android `androidx.security.crypto`. DB encrypted: SQLCipher (Android), Data Protection Class B (iOS). Credentials NEVER in SQLite. |
| 32 | + |
| 33 | +## Phases |
| 34 | + |
| 35 | +- **0** — foundations: CI, KMP scaffold, generated client, `Entitlements` stub returns `false`. Detailed plan: `plans/phase-0-foundations.md`. |
| 36 | +- **1** — read-only MVP online, server search, paywall shell non-functional. |
| 37 | +- **2** — offline: SQLite + FTS5 + background sync + attachments. Public v1.0.0, free tier only. |
| 38 | +- **3** — Pro: StoreKit 2 + Play Billing, login/OAuth2, ask/comment/rate, `pending_writes` queue. v2.0.0. |
| 39 | +- **4** — polish: a11y, l10n, telemetry scrub. |
| 40 | +- **5** — stretch: widgets, watch, iPad split-view, push (pending server). |
| 41 | + |
| 42 | +## Pro SKUs (to finalize before Phase 3) |
| 43 | + |
| 44 | +`pro_lifetime` (one-time) + `pro_annual` (~1/3 lifetime price). Tech plan supports either alone or both. |
| 45 | + |
| 46 | +## Open questions (see plan §"Open questions") |
| 47 | + |
| 48 | +1. Pro pricing model — before Phase 3. |
| 49 | +2. Push architecture — before Phase 5. |
| 50 | + |
| 51 | +## Server-side asks (nice-to-have, non-blocking) |
| 52 | + |
| 53 | +Filed as phpMyFAQ issues: tombstones (`faqs/deleted?since=`), ETag on list endpoints, OAuth discovery, push registration contract. |
| 54 | + |
| 55 | +**Already shipped upstream**: `GET /api/v3.2/meta` (single bootstrap call — version, title, language, available languages, features, logo URL, OAuth discovery). App uses it for instance selector + sync bootstrap; legacy `version`+`title`+`language` fan-out kept only as fallback for older installs. |
| 56 | + |
| 57 | +## Working on this repo |
| 58 | + |
| 59 | +- Primary doc: `plans/mobile-app-plan.md`. Treat as source of truth for architecture questions. |
| 60 | +- Phase 0 plan: `plans/phase-0-foundations.md`. |
| 61 | +- When editing the plan: preserve "Decided" / "Open questions" structure. Do not move locked items back to open without explicit user request. |
| 62 | +- Mobile app source tree will live in this same repo (`phpMyFAQ/MyFAQ`), not in a separate `myfaq-app` repo. |
0 commit comments