Install
Download jotty-android-1.4.0.apk from this release (release-signed when CI secrets are configured).
*Updating from an older -debug.apk or mixed signing? Android may show "App not installed" — uninstall once, then install this APK. Your Jotty server data is unchanged.
Full changelog: https://github.com/Darknetzz/jotty-android/blob/v1.4.0/CHANGELOG.md
Added
- Home-screen widget — A New note Glance widget opens the app straight into the create-note dialog.
- Markdown formatting toolbar — The note editor has a toolbar for bold, italic, code, heading, bullet list, quote, and link that wraps the current selection or inserts at the cursor.
- Share into Jotty — Text shared from other apps (and the widget) opens a prefilled new note via an
ACTION_SENDshare target. - Category management — Pick or type a category when creating notes/checklists and change it from the detail editor, with suggestions from existing categories.
- Sort menu — Notes and checklists can be sorted by Updated, Created, or Title; the choice is remembered.
- Material You — Settings → Appearance → Theme color adds a Dynamic option using wallpaper colors on Android 12+.
- Reader text size — Settings → Appearance → Reader text size (Small / Medium / Large / Extra large) scales note content.
- Quick instance switcher — The top bar shows the current instance accent and a menu to switch instances or manage them.
- Richer dashboard — Settings → Overview now breaks down checklist items and tasks with totals and completion progress bars.
- Reduced motion — Settings → Appearance → Reduced motion (System / On / Off). System follows the device accessibility setting; On skips decorative transitions such as the setup ↔ main cross-fade.
- Note list preview toggle — Settings → Behavior → Note preview in list shows or hides the body excerpt under each title in the notes list (encrypted notes still show the lock label).
- Update changelog from GitHub — When checking for updates, the app fetches
CHANGELOG.mdfrom the matching branch (mainfor stable,devfor dev-latest) and uses it for “What’s new” instead of the bundled file on the installed APK.
Changed
- Settings UX — “Offline mode” renamed to Local storage & sync; sync status when unreachable shows Server unreachable (not “Offline”). Export debug logs replaces the debug-logging toggle (in-app ring buffer, share as file). Default instance is set via the star in Manage instances only (removed from Settings overview). Settings split into Appearance, Behavior, and Troubleshooting; dashboard moved under Overview. Manage instances from Settings shows back navigation and a default-instance hint.
- Decrypt errors — Failed decrypt shows a collapsible Details section for technical messages (no debug toggle).
- About update status — Check-for-updates results use styled alert banners (success, info, error, and loading) with icons in the About dialog.
- In-app changelog — About → View changelog shows the bundled
CHANGELOG.mdfor the installed version; when an update is available, View changelog for … opens the matching section (or GitHub release notes as fallback) in a scrollable dialog. - Detail top spacing — Note and checklist detail screens now use a tighter top inset (4dp) so the title/header sits closer to the app bar while preserving a small visual gap.
- Online checklist parity — The online-only checklists screen gains the search field and category filter chips already present in the offline-enabled screen.
- Animated list ↔ detail — Opening and closing a note or checklist now slides between the list and detail (respecting Reduced motion).
- Loading skeletons — List screens show shimmer placeholders while loading instead of a centered spinner.
- Pull-to-refresh on empty/error — Empty and error states for notes and checklists can now be pulled to refresh.
- Category filter persistence — The selected notes/checklists category filter survives app restarts.
- Editing encrypted notes — Saving an edited encrypted note re-uses the passphrase from this session by default (same as when you unlocked it). Tap Change passphrase in the save dialog if you want a new one.
Added
- Legacy encryption detection — After decrypting a note encrypted with the old Android payload order (
tagthenciphertext), the app shows a warning that the note should be re-encrypted and saved to restore Jotty web compatibility.
Documentation
- Agent guide —
AGENTS.mdnow requires updatingCHANGELOG.mdunder[VERSION-dev]for user-visible changes; XChaCha20 format notes corrected (ciphertextthentag, legacy decrypt path).
Fixed
- Web decrypt after Android save — Notes encrypted or re-encrypted in the app now use hex-encoded salt, nonce, and payload (matching the Jotty web app) instead of base64, so the web UI can decrypt them with the same passphrase.
- Note content artifacts after save — Invisible Unicode (BOM / zero-width characters) embedded in web-authored HTML is stripped on decrypt and before re-encrypt so it no longer appears as odd symbols in the app or syncs back to the web. Font-family
<span>tags from the web editor are unwrapped for in-app display instead of showing broken HTML likepan style=.... - XChaCha20 encryption and Jotty web — Notes encrypted in the app now use AEAD combined order (
ciphertextthentag), matching the Jotty web app. Previously, web showed “Incorrect password” for the correct passphrase; existing legacy-format notes still decrypt in the app and are flagged for re-encryption. - Encrypted notes missing from list — Notes returned by the API with sparse or null fields (common on some encrypted payloads) are normalized on fetch/sync so they appear in the notes list instead of being dropped.
- Biometric settings when unavailable — Settings → Security hides auto-prompt, save-offer, and clear-all options when biometrics are not enrolled or not supported; only the status row is shown.
- Empty checklists/notes after first setup — Initial sync no longer runs in a
LaunchedEffectthat could be cancelled when connectivity or settings update (showing “Job was cancelled” with an empty list). Sync is started from the offline ViewModel scope and re-runs while the local cache is empty and the device is online; overlapping sync requests are serialized instead of skipped; cancelled syncs are not recorded as user-visible errors; debounce is skipped while the local checklist cache is empty. - Note image rendering from HTML content — Notes containing HTML image tags now render images in-app: standalone
<img>plus common wrapper patterns (<figure>,<picture>) are converted to Markdown image syntax before rendering, matching web-authored note content more reliably. - Colored note text from web HTML — Notes containing inline color spans (e.g.
<span style="color: ...">) now preserve color in-app by converting them to a renderer-friendly HTML color format before markdown rendering. - Bottom-tab reselect in detail — While viewing a note or checklist, tapping the active bottom tab (Notes/Checklists) now closes detail and returns to the overview list, matching back-button behavior.
- Edit decrypted notes — A decrypted note can now be edited; saving re-encrypts the body with a passphrase you confirm.
- Checklist undo restores items — Undoing a checklist delete now restores the full item tree (including nested items and completion state), not just the title and type.
- Duplicate note title removed — The note title no longer appears twice (it was rendered in both the app bar and the note view).
- Offline category moves — Moving an offline note between categories now sends
originalCategoryon sync so the server moves it correctly. - Theme palette edge cases —
sepia+dark andmidnight+light now use matching variants instead of falling back to unrelated schemes. - Note open crash — Fixed Compose layout crashes when opening notes: list/detail no longer compose two scrollables at once; detail uses
Scaffold(topBar)with a bounded bodyBox; online detail fills the list/detail pane; offline detail usesweight(fill = true); encrypted placeholder is centered in aBox; biometric auto-unlock waits briefly after navigation. Debug log export now includes uncaught crash stack traces.