Android edits could stay pending after pull-to-refresh because content always queued and refresh only pulled. Save online when reachable, force-flush the outbox on refresh and resume, and surface retry/error details so Web sees Android changes again.
Related Issue: #185
Unsynced notes used local temporary IDs while multi-select delete only
called the remote API, so empty notes could not be removed and failed
silently. Delete local-only notes offline, soft-delete remotes after
API success, remap multi-select IDs, and surface delete errors.
Refs #184
Read-only Cloudflare forks were getting silent green no-ops when already
aligned, or unclear merge skips after Sync fork. Align deploy-only forks
with reset, keep merge for customized trees, always write a job summary,
and document force_redeploy plus an optional Cloudflare Deploy Hook.
Detail preview now uses static HTML WebView instead of Dom TipTap. Stagger
TextInput and editor host mount/teardown for edit, Me, create, and back so
Fabric ShadowNode measure and Hermes GC no longer SIGSEGV on iPadOS 26.5.
Apple rejected 1.10.1 for SIGSEGV in RCTTextLayoutManager and malloc
corruption during WKWebView media TCC probes on iPad. Drop Reanimated
list layout transitions, deny DOM/WebView media capture by default, and
declare required iOS privacy strings with full-screen phone-on-iPad
presentation for the next review build.
Read RN blobs via FileReader instead of missing Blob.arrayBuffer, dismiss
the action sheet before SAF/share UI, surface cancel/errors, and confirm
successful folder exports.
Give Web, desktop, and mobile the same product-baseline conflict recovery:
copy the local draft, then adopt the cloud version and rehydrate, instead of
telling users to reload while durable local conflict state remains.
Equalize columns via container-query widths so typical tables wrap in place, and scroll only inside tableWrapper when many columns still overflow. Preview and edit share LocalTiptapEditor styles.
Use MEMO_CONTENT_STYLE (15px / 24 line-height) for the mobile editor and
preview WebView instead of a hardcoded 17px body, and size headings in rem
so notes feel consistent with desktop reading density.
Wide tables and flex attachment rows were expanding the editor shell past
the viewport, so text and cells clipped on the right. Cap the shell/content
to 100%, use content-relative table column widths instead of 100vw, and
scroll wide tables inside their wrappers.
Bind resource actions on the image control itself instead of relying on
ProseMirror handleClick after pointerdown preventDefault, which Android
WebView often suppresses. Also accept resource URLs without a /blob suffix.
Prebuild a full iconutil ICNS (including 1024) instead of converting a lone
512 PWA PNG, validate Dock-critical types at package verify time, and set the
Dock icon at runtime as a Launch Services cache fallback.
Surface revision, content, edit-session, and offline-stale conflict details in the editor, keep error metadata through the sync queue, and avoid hook-order crashes plus stale dev service workers after failed HMR.
Make deleting notes one click on desktop list cards instead of buried under the more menu, while keeping the existing menu path for keyboard and right-click.
getStoredMermaidRenderer assumed localStorage always exists whenever window
was defined, so full bun test runs could fail after other suites stubbed a
partial window. Safe-read the storage key and clean up shared window mocks
so Verify update stays green for forked deployments.
Stop getMemo background refresh from overwriting newer local autosaves or
queued updates, and skip redundant setContent when reopening a note so the
caret no longer jumps to the end after detail refetches.
Let instance owners route new uploads to an external OSS while keeping
existing attachments on their original store. Secrets are encrypted with
EDGE_EVER_STORAGE_ENCRYPTION_KEY before being stored in D1.
Global app CSS sets html/body/#root { overflow: hidden } for the
three-pane workspace layout. Public share pages (/share/:token) inherit
this and cannot scroll when content exceeds the viewport. Restore
document scrolling when .edgeever-public-share is present via :has().