Skip to content

feat: Android feature-parity — 11 milestones (DMs, auth, sharing, doc-collab, moderation, GitHub, +more) - #1

Merged
Adron merged 26 commits into
mainfrom
feature/parity-wip
Aug 1, 2026
Merged

feat: Android feature-parity — 11 milestones (DMs, auth, sharing, doc-collab, moderation, GitHub, +more)#1
Adron merged 26 commits into
mainfrom
feature/parity-wip

Conversation

@Adron

@Adron Adron commented Aug 1, 2026

Copy link
Copy Markdown
Member

Summary

Brings the Android client to near-complete feature parity with interlinedlist.com. 13 of 14 milestones delivered, unit-tested per module, wired into the app, and verified running on an emulator (live login, all major surfaces, and the delta-sync worker executing to SUCCESS). :app:assembleDebug is green.

Milestones delivered

Milestone Notes
A Direct Messages new :feature:directmessages, 5th "DMs" tab
B Auth lifecycle register / forgot / reset / verify (+ deep links)
D Moderation block / mute / report user — profile screen and message-author menu
E Notification preferences per-event push / in-app / email
F Sharing & share links lists + documents, "Shared with me", claim-via-token
G Document collaboration + delta sync WorkManager worker device-verified running
H Cross-posting compose targets (mastodonProviderIds[], crossPostTo{Bluesky,LinkedIn,Twitter})
I Message edit PATCH /api/messages/{id} + "edited" marker
K Account & session security sessions/revoke (+ device-labeled sessions), connected accounts, change-email, in-app delete
L Browse public content Posts / Lists / Documents on other-user profiles
M Lists + documents polish rename, folders, contributors, create-in-folder, templates
N GitHub integration repos / issues / comments
Platform app nav wiring, deep-link intent-filters, WorkManager bootstrap

Also merges the branding + dark-mode + message-fix work and the cross-platform brand-kit.

Verified on-device (emulator, live account)

5-tab nav · DMs · Account hub · Active Sessions ("This device" labeled) · Blocked & muted · GitHub connect state · folder browser · templates · full sign-out → login · and the documents delta-sync worker running to SUCCESS against the live API.

Product decisions

  • Billing is NOT in the Android app — subscriptions are handled on the web app.
  • The sync-token now sends a deviceLabel so the app's session is identifiable (not a generic "CLI").

Not included — externally gated only

  • C Push / FCM — needs a Firebase project + google-services.json.
  • H OAuth account-linking — needs registered redirect URIs. (Cross-posting to already-linked accounts is included.)
  • Live E2E of write paths (DM send/receive, share-claim, collaboration, moderation, cross-post delivery) — needs a 2nd + a non-subscriber test account.

Testing

~700+ unit tests across the touched modules are green; :app:assembleDebug succeeds; on-device smoke test + delta-sync execution verified.

🤖 Generated with Claude Code

Adron and others added 26 commits July 18, 2026 11:51
Empty :feature:lists, :feature:messages, :feature:documents library modules
registered in settings.gradle with the full compose/hilt/room/paging/coil
dependency set, ready for per-domain build-out. Verified each configures and
assembles empty.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Brings the three core-domain feature modules (:feature:lists, :feature:messages,
:feature:documents) into the app and wires them into a post-login bottom-navigation
shell (Lists / Messages / Documents / Account) with detail routes for list detail,
message detail, and the document editor.

Each module is a self-contained offline-first vertical slice (own Retrofit API off
the shared authenticated client, own Room cache, repository, ViewModels, Compose UI,
Hilt DI) built to the live OpenAPI contract, mirroring the :feature:auth pattern.

- lists: index, create, schema-driven detail, row CRUD, delete, folders, search (32 unit tests)
- messages: feed, compose, detail+replies, dig/undig, delete, search (36 unit tests)
- documents: index, create, markdown editor+preview, delete, folders, templates, search (37 unit tests)

Verified: :app:assembleDebug + full testDebugUnitTest green; installed on emulator and
confirmed all three tabs render live against production (documents shows real data).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the three core-domain feature modules (lists, messages, documents) as
offline-first vertical slices, integrated into a post-login bottom-nav shell.
105 domain unit tests green; app builds; verified live on emulator.
Empty android-library module registered in settings, verified to assemble,
so parallel worktree agents branch from a base that includes it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tures + Phase 2 profiles

Round 2 of the parallel build-out, integrated into the app:

- documents: redesigned into a Files-app style drill-down folder browser
  (breadcrumb + push/back), with create/rename/delete folders, move documents,
  in-browser search, and image upload; replaces the old flat index (55 tests)
- lists: schema editing, watchers, GitHub refresh, and connections (72 tests)
- messages: media attach/upload, scheduled messages, report, link previews (62 tests)
- profile (Phase 2, new :feature:profile): my-profile view/edit, avatar, other-user
  profiles, and user search; becomes the Account tab (37 tests)

Navigation rewired: Documents tab -> folder browser with documents/folder/{folderId}
drill-down; lists/{listId}/schema + /watchers; messages/scheduled; Account tab -> new
ProfileRoute (sign-out reuses the auth-backed logout) + editProfile/userSearch/user/{username}.

Built by four parallel worktree agents (each resynced to origin/dev), then integrated.
:app:assembleDebug + full testDebugUnitTest green (234 unit tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reorders the bottom navigation and defaults the landing tab to Messages,
mirroring how interlinedlist.com organizes the sections.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a Hub action to the Lists top bar that opens the connections screen
(ConnectionsRoute was built and tested but previously unreachable).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Empty android-library modules for Phases 5/7/8, registered and verified to
assemble, so parallel worktree agents branch from a base that includes them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s 5/7/8)

Integrates four modules and restructures the Account tab into a hub:

- profile: Following — follow/unfollow, follower/following lists, follow requests;
  Account screen becomes a hub (Followers/Following/Requests/Notifications/
  Organizations/Integrations/Edit/Search/Sign out) (77 tests)
- notifications (new): polled notifications list, mark read / mark-all / dismiss (42 tests)
- organizations (new, Phase 7): org list/create + detail + member management (37 tests)
- integrations (new, Phase 8): CSV data exports via share sheet + read-only
  connected-accounts status; OAuth connect flows deferred (13 tests)

Nav rewired: Account hub wires Notifications/Organizations/Integrations to the new
modules; followers/following/user-profile drill-down; ProfileRoute's follower/following
callbacks pass the current username. Feature UI uses MaterialTheme.colorScheme roles
(no brand-color constants), so it is independent of the design-system palette.

Built by four parallel worktree agents (resynced to origin/dev), then integrated.
:app:assembleDebug + full testDebugUnitTest green (366 unit tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ProfileContent owned a verticalScroll while the Account hub also wrapped it in a
scrolling Column, throwing IllegalStateException (infinite-height measure) at
render. ProfileContent is now a plain content block; the hub scrolls header+menu
together, and UserProfileScreen supplies its own scroll. Verified live on emulator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lestone E)

GET/PATCH /api/user/notification-preferences — per-event push/inApp/email
toggles with optimistic update + rollback. Files integrated from the
worktree build onto the real :feature:notifications module (its build.gradle,
DI, and shared TestDoubles kept; only the new NotificationPreferences* files
added). Nav wiring into the Account hub deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Active Sessions (list + revoke device), Connected Accounts (view + unlink
identity), Change email, and a type-to-confirm Delete Account flow (Play
requires an in-app deletion path). Endpoints: /api/user/sessions (GET/DELETE),
/api/user/identities (GET, DELETE by ?provider), /api/user/change-email/request,
/api/user/delete. 107 unit tests green. Nav wiring deferred (snippet in report).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New self-contained :feature:directmessages — inbox (cursor paged), thread
with image attach + read receipts + lifecycle-scoped update polling, and a
recipient picker. Offline-first (own Room db interlinedlist-dm.db), owns its
DirectMessagesApi from the shared authed Retrofit. Endpoints: /api/dm (+ {id}
read/trash/restore), /api/dm/recipients, /api/dm/thread/{username}(+/updates),
/api/dm/unread-count, /api/dm/images/upload. 25 unit tests green. Nav wiring
deferred (snippet in report).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds Posts/Lists/Documents tabs to the other-user profile plus a mutual-
connections indicator, and read-only public list/document viewers. Endpoints:
/api/user/{username}/messages, /api/users/{username}/lists(+/{id}(+/data)),
/api/users/{username}/documents, /api/documents/{id}, /api/users/lookup,
/api/follow/{userId}/mutual (counts-only). 123 profile unit tests green.
Stacks on Milestone K. Nav wiring deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Create/list/revoke tokenized share links (view/edit/admin) on lists and
documents; resolve + claim shared links; 'Shared with me' backed by
/api/lists/watching (with role). Endpoints: {lists,documents}/{id}/share-links
(+/{token} DELETE), {lists,documents}/shared/{token} (GET/POST), lists/watching,
lists/shared/{token}/data. lists 92 + documents 72 unit tests green. Deep-link
intent-filters + nav wiring deferred (snippets in report).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds Register, Forgot-password, Reset-password, and Email-verification flows to
:feature:auth (was login-only), reusing login's sync-token/session path. New
module-local AuthApi (POST /api/auth/register|forgot-password|reset-password|
verify-email|send-verification-email) — no :core:network edits. Self-contained
unauth nav sub-graph with reset/verify deep-link definitions. 29 unit tests
green. App-level nav + manifest intent-filters deferred (snippets in report).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Edit list metadata (PUT /api/lists/{id}), folder rename/move/delete
(PUT/DELETE /api/folders/{id}), contributors (GET /api/lists/{id}/contributors,
shown in watchers), and single-row fetch (GET /api/lists/{id}/data/{rowId}).
111 lists unit tests green. Documents slice (create-in-folder, templates
seed-defaults) follows after Milestone G. Nav wiring deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a 5th 'DMs' bottom-nav tab (directMessagesGraph); wires the auth
lifecycle nested graph (register/forgot/reset/verify); profile Account &
Security (sessions/connected-accounts/settings, aliasing the profile vs
integrations ConnectedAccountsRoute clash); public content (list/document);
notification preferences (gear in Notifications); and lists/documents share +
shared/{token} deep-link routes + folder browser. app/build.gradle.kts now
depends on :feature:directmessages. :app:assembleDebug BUILD SUCCESSFUL.
App-manifest deep-link intent-filters still deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ge-access

Delta sync (GET/POST /api/documents/sync via WorkManager worker + cursor),
PATCH save with If-Match optimistic concurrency (409 -> Conflict state),
document /tree, collaborators CRUD (+user search) and lightweight presence
heartbeat. 99 documents unit tests green. Wires the Manage-access route
(documents/{id}/access -> DocumentCollaboratorsRoute) from the editor.
:app:assembleDebug SUCCESSFUL. NOTE: the @HiltWorker delta-sync worker still
needs the app-level HiltWorkerFactory bootstrap + a schedule call to run at
runtime (deferred to device verification).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Create-document-in-folder (POST /api/documents/folders/{id}/documents; browser
FAB auto-routes when inside a folder) and seed default templates (POST
/api/documents/templates/seed-defaults) with a Templates screen. Also fixes the
live getTemplates parse (templates arrive under the 'templates' key). 112
documents unit tests green; :app:assembleDebug SUCCESSFUL. Completes Milestone M.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e J)

New thin :feature:billing module: UpsellScreen with Subscribe (POST
/api/stripe/create-checkout-session) and Manage subscription (POST
/api/stripe/create-portal-session), opening the returned Stripe URL via
ACTION_VIEW (no new deps). 16 unit tests green. App-nav wiring (403-gate ->
upsell + Account hub) deferred to the app-level pass. NOTE: shipping Stripe web
checkout on Google Play needs a payments-policy decision (code works either way).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a GitHub section to :feature:integrations: list connected repos, browse a
repo's issues, create an issue (title/body + optional labels/assignees), and
comment on an issue; graceful 'GitHub not linked' state (live: 400
{error:'GitHub account not linked'}). Endpoints: /api/github/repos, /issues
(GET/POST), issue comments, repo assignees/labels. 33 integrations unit tests
green (20 new). Hub GitHub entry gated behind a defaulted onOpenGitHub; app-nav
wiring deferred to the app-level pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ile-side)

Overflow menu on the other-user profile (Block/Mute/Report with confirm +
reason) and a 'Blocked & muted' management screen in the Account hub. Endpoints:
/api/users/{username}/block|mute|report (+ status GETs), /api/user/blocks|mutes.
Report body confirmed {reason, detail?}. 150 profile unit tests green (27 new).
The message-feed moderation menu stays deferred (touches :feature:messages).
Nav wiring deferred to the app-level pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds account/blocked-muted (BlockedMutedRoute), integrations/github (GitHubRoute),
billingGraph + a 'Subscription' Account-hub row (onOpenUpgrade -> upsell), and
app-manifest deep-link intent-filters for lists/documents shared/{token} +
reset-password/verify-email (https autoVerify + interlinedlist:// scheme).
:app:assembleDebug SUCCESSFUL. (Folder-browser/templates routes remain
registered-but-unreached; WorkManager bootstrap still deferred to #17.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ssions

Per product decision, subscription billing stays on the web app: removes the
:feature:billing module, its nav graph, the Account-hub 'Subscription' row, and
the app dependency + settings include. Reverses Milestone J on Android.

UX fix: the sync-token request now sends a deviceLabel ('InterlinedList Android
· <model>') so the app's session is identifiable in Active Sessions instead of
appearing as a generic 'CLI' entry. :app:assembleDebug green; profile 150 +
auth 29 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…hable

Adds a Folders top-bar action on the Lists screen -> FolderBrowserRoute
(lists/folders), and a Templates action on the Documents browser -> new
documents/templates route (DocumentTemplatesRoute). Completes the deferred
folder/templates reachability (UX polish). :app:assembleDebug green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Adron
Adron marked this pull request as ready for review August 1, 2026 03:07
@Adron
Adron merged commit 8177dce into main Aug 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant