Audit of README, docs/, android/README.md, android/contract.md and CLAUDE.md
against the current server, web and Android code: V3 navigation and settings
locations, Docker Hub release images, GitHub clone URL and CI, missing API
endpoints and error codes, architecture of lazy chunks/themes/sources, media
pages and routes, the Android bridge contract, and the new file-management and
member-upload permissions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove .cnb.yml and CNB references in the Dockerfile and Compose file; the
Compose default image is hectorqin/reader-pro:latest.
- Rename the Android applicationId/namespace and Kotlin package from
cool.cnb.reader to com.htmake.readerpro (shortcuts, ProGuard, shell check).
Installs under the old package are a different app and are not migrated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Reader (scroll paging): mask the line the page's bottom edge cuts through
(clip-path, --reader-page-mask) so no page shows a half-sliced last line;
re-measured after page-turn animations.
- Landscape sidebar layout: the sidebar owns the left safe-area inset, the page
column the right one; fix .shelf-head's swapped left/right padding; reader
top/bottom bars respect left/right insets.
- Guard all :hover rules with (hover: hover) and (pointer: fine), enforced by
test/design-tokens.test.ts.
- PWA update banner sits above the phone tab bar and reader toolbar.
- Top safe-area on sources header and phone media pages; 16px sidebar search
on touch (iOS focus zoom); larger hit areas for chips and cover controls.
- Manifest: unified launch colour #FDF9F6, maskable icon, drop
window-controls-overlay; regenerate branding assets.
- Docs: ui.md safe-area/touch/hover/reader rules, pwa.zh-CN.md icons and
window notes, CLAUDE.md stale bundle notes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The committed gradle-wrapper.jar was the real 8.11.1 wrapper jar nested
inside another jar, without the org/gradle/cli classes, so ./gradlew failed
everywhere with NoClassDefFoundError: org/gradle/cli/CommandLineParser
(CI was the first place it ran from a fresh checkout). gradlew was a
hand-written launcher and gradlew.bat, which the dev guide tells Windows users
to run, did not exist.
Regenerated with `gradle wrapper --gradle-version 8.11.1` from the official
distribution (sha256 f397b287…, matching services.gradle.org); the jar matches
the published gradle-8.11.1-wrapper.jar.sha256 (2db75c40…). The distribution
URL is unchanged. .gitattributes pins gradlew to LF and *.bat to CRLF.
The UI review job starts its media fixture through server/node_modules/tsx,
so it installs the server's dependencies too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check-shell.sh failed on main in three places, none of them real defects:
- Every `fun` at method indentation counted as a bridge method, so the
Kotlin-only SpeechBridge.interruptForMedia (called by the media bridge,
not the page) was reported as undeclared. Only methods directly under
@JavascriptInterface are the page's contract now.
- configuredServerUrl was declared as an optional *property*
(`configuredServerUrl?: () => string`), which the declaration reader does
not see. Written as the equivalent optional method, `configuredServerUrl?(): string`.
- The package/directory check stripped only src/main/java/, so every unit
test under src/test/java/ was reported as misplaced. Any source set's java/
root is stripped now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Support local and OpenList libraries, metadata, independent media navigation, themes, and audio/video playback. Preserve approved v2 prototypes and current documentation; archive superseded review artifacts and keep generated validation output outside version control.