Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
26eea20
feat(database): open the vault through the Sealite driver
pasichDev Oct 29, 2026
189083e
refactor: kotlinx-datetime and kotlin.uuid instead of java.time, Date…
pasichDev Oct 29, 2026
e4dad7c
refactor(serialization): note blocks through kotlinx.serialization in…
pasichDev Oct 29, 2026
225b295
refactor(security): own BIP-39 encoding instead of kotlin-bip39
pasichDev Oct 29, 2026
f71c279
refactor(import): kotlinx-io streams for import, export and hand-off
pasichDev Oct 29, 2026
6efad42
refactor(security): one internal crypto API in front of JCA
pasichDev Oct 29, 2026
92ffa59
refactor(di): Metro instead of Hilt
pasichDev Oct 29, 2026
861c457
refactor(editor): the block editor as a self-contained package
pasichDev Oct 29, 2026
b1179e0
ci: run the instrumented tests on an emulator (API 26 and 35)
pasichDev Oct 29, 2026
44d83f7
refactor: platform services behind interfaces in the data and domain …
pasichDev Oct 29, 2026
7b7518b
build: the block editor as a Kotlin Multiplatform module with convent…
pasichDev Oct 29, 2026
514e250
test(editor): remember the find state in the draw test
pasichDev Oct 29, 2026
30864df
build: the encrypted database as a Kotlin Multiplatform module
pasichDev Oct 29, 2026
2ff059c
build: common, crypto and security as Kotlin Multiplatform modules
pasichDev Oct 29, 2026
4d27f13
build(database): keep the iOS targets after the convention split
pasichDev Oct 29, 2026
ab35c27
build: UI strings as Compose Multiplatform resources
pasichDev Oct 29, 2026
50b4633
ci: run the app, library and release checks as parallel jobs
pasichDev Oct 29, 2026
228e72e
build(resources): keep the iOS targets after the convention split
pasichDev Oct 29, 2026
64ae266
feat(security): desktop PIN factor in the OS secret store
pasichDev Oct 29, 2026
9d2694d
ci: fail the keystore job when the real secret store test was skipped
pasichDev Oct 29, 2026
0428efe
refactor: the app's UI, domain and data in a shared Kotlin Multiplatf…
pasichDev Oct 29, 2026
b446bf0
feat(desktop): Encly as a desktop app for Windows, macOS and Linux
pasichDev Oct 29, 2026
aa304c5
ci: run the library checks under a virtual display for the desktop wi…
pasichDev Oct 29, 2026
ae34118
feat(ui): pointer and keyboard interaction for desktop
pasichDev Oct 29, 2026
eff1bc8
feat(ui): adaptive layout with list-detail and note tabs on wide windows
pasichDev Oct 29, 2026
511096a
feat(ui): one command router for desktop shortcuts and the menu bar
pasichDev Oct 29, 2026
3d392d3
ci: Flatpak bundle and installer signing when the secrets are set
pasichDev Oct 29, 2026
27047c2
fix(keystore): one Secret Service item per Linux install
pasichDev Oct 29, 2026
42544f0
feat(desktop): several windows, export to PDF and print
pasichDev Oct 29, 2026
96db7ed
feat(ios): crypto, vault and PIN key store for iOS
pasichDev Oct 29, 2026
4763d97
build(desktop): wrap the runtime module list
pasichDev Oct 29, 2026
20a01d4
build: build the Apple klibs on macOS only
pasichDev Oct 29, 2026
2c3aecc
feat(ios): Encly as an iOS app on the shared UI
pasichDev Oct 29, 2026
1ea1e59
feat: hide note previews, what's new after an update, trash empties i…
pasichDev Nov 7, 2026
2461ba0
fix(editor): keep the creation time, steadier lists and find in note
pasichDev Nov 7, 2026
3795237
fix(security): biometric unlock after a background lock, 5 and 10 min…
pasichDev Nov 7, 2026
8819a2e
ci: check that the fdroid build is reproducible, build only the app o…
pasichDev Nov 7, 2026
688e7c6
chore(release): 2.4.0
pasichDev Nov 7, 2026
955b5e9
test: give the screenshot allowance screen test the note previews vie…
pasichDev Nov 7, 2026
c70acba
fix: the duress vault never sees the real vault's tag, a lock saves t…
pasichDev Nov 7, 2026
d6a2666
build: keep native libraries as shipped, stricter reproducibility check
pasichDev Nov 7, 2026
de59c8d
fix(editor): forget undo history on a lock, keep emoji whole, safer l…
pasichDev Nov 7, 2026
e5bca0f
fix(security): a forgotten flags file never leads to a new vault over…
pasichDev Nov 7, 2026
ad7bcbf
build: database ABI dump for the trash purge, 2.4.0 in the Flatpak me…
pasichDev Nov 7, 2026
73474f6
fix(security): keep a biometric answer that arrives after the activit…
pasichDev Nov 7, 2026
37f9b6a
feat(backup): restore the user's settings with a backup
pasichDev Nov 7, 2026
fff7bdf
build: security ABI dump for the lock flush and the unreadable vault …
pasichDev Nov 7, 2026
0550b66
feat: Arabic and right-to-left layouts
pasichDev Nov 7, 2026
ee82cdb
fix(desktop): windows, locking, clipboard and storage ready for a fir…
pasichDev Nov 7, 2026
9d93b89
fix(ios): a PIN guess needs the Secure Enclave, local-only clipboard,…
pasichDev Nov 7, 2026
bbbfe4a
fix(keystore): read the Secret Service key exchange answer as dbus-ja…
pasichDev Nov 7, 2026
9a97159
feat(editor): select text across blocks, block selection, checklist l…
pasichDev Nov 7, 2026
bc86bfb
fix(desktop): Arabic in PDF export and print
pasichDev Nov 7, 2026
ec2dc36
feat(security): PIN of 6 to 12 digits, a password as a second way in,…
pasichDev Nov 7, 2026
db4bbcc
feat(editor): drag list items into place, nested lists up to three le…
pasichDev Nov 7, 2026
dd53cda
feat(editor): tables, code blocks and a toolbar you arrange yourself
pasichDev Nov 7, 2026
f41db3d
fix(security): no password unlock, a live lock state on Linux
pasichDev Nov 7, 2026
be1b9cb
fix(editor): cut and paste keeps blocks, faster lists and tables, loc…
pasichDev Nov 7, 2026
2658a04
chore(release): 3.0.0
pasichDev Nov 7, 2026
6674835
feat: sort notes by title, a shorter unlock animation
pasichDev Nov 7, 2026
e28e620
docs(editor): KDoc links Dokka could not resolve
pasichDev Nov 7, 2026
5836d0e
perf: the note transition no longer fills the GPU cache, one fingerpr…
pasichDev Nov 9, 2026
bc640c2
perf: screen transitions without full-window layers, fewer and smalle…
pasichDev Nov 9, 2026
40ffa8c
docs: the Weblate components, Import included
pasichDev Nov 9, 2026
ca7ea96
docs: release notes of 3.0.0 for android only
pasichDev Nov 10, 2026
bd9e13a
fix: a task or note never shows twice while its state changes
pasichDev Nov 10, 2026
2952e1c
docs: the task list crash in the 3.0.0 changelog
pasichDev Nov 10, 2026
41f8b4a
style: format and detekt fixes for the duplicate key fix
pasichDev Nov 10, 2026
84609f2
feat(database): a note can have several tags
pasichDev Nov 10, 2026
c54eb03
feat(backup): backups, imports and exports carry every tag of a note
pasichDev Nov 10, 2026
cee938b
feat(notes): lists, search and the editor handle several tags per note
pasichDev Nov 10, 2026
23b192a
feat(ui): pick several tags for a note and see them on its card
pasichDev Nov 10, 2026
9dd2439
docs: several tags per note in the 3.0.0 changelog
pasichDev Nov 10, 2026
5b0f609
build: bump agp 9.5.1, ksp, serialization, datastore, sqlcipher, grad…
pasichDev Nov 10, 2026
468309f
build: sealite 1.0.1, native libraries half the size
pasichDev Nov 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ if ! ./gradlew --quiet help >/dev/null 2>&1; then
echo "Run ./gradlew help to see why. This is not a formatting or detekt failure." >&2
exit 1
fi
if ! ./gradlew --quiet spotlessCheck :app:detekt; then
if ! ./gradlew --quiet spotlessCheck :app:detekt :shared:detekt; then
echo >&2
echo "pre-commit: checks failed. Fix formatting with ./gradlew spotlessApply, fix the" >&2
echo "detekt findings (do not add them to app/detekt-baseline.xml), then commit again." >&2
echo "detekt findings (do not add them to a detekt-baseline.xml), then commit again." >&2
exit 1
fi
2 changes: 1 addition & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
- [ ] No new path that puts plaintext outside the vault (clipboard, share, notifications, files, logs).
- [ ] If key derivation, the SQLCipher passphrase, the vault slots or any on-disk format changed:
existing installs still open (migration added and tested), and SECURITY.md is updated.
- [ ] If the Room schema changed: `DB_VERSION` bumped, a migration added, the new `app/schemas`
- [ ] If the Room schema changed: `DB_VERSION` bumped, a migration added, the new `core/database/schemas`
export committed, and `AppDatabaseSchemaTest` extended.
- [ ] User-visible changes are listed under `[Unreleased]` in CHANGELOG.md.
717 changes: 693 additions & 24 deletions .github/workflows/android.yml

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions .github/workflows/publish-play.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
persist-credentials: false

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
uses: gradle/actions/wrapper-validation@8da46b539cd8fe6ab27ca75128919a18d757604c # v6.4.1

- name: Tag must match version.properties
id: version
Expand Down Expand Up @@ -103,7 +103,7 @@ jobs:
java-version: '21'

- name: Set up Gradle
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
uses: gradle/actions/setup-gradle@8da46b539cd8fe6ab27ca75128919a18d757604c # v6.4.1
with:
cache-read-only: true

Expand Down
9 changes: 6 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ jobs:
timeout-minutes: 60
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
# The release is published with the action's own token; the build never needs git credentials.
persist-credentials: false

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
uses: gradle/actions/wrapper-validation@8da46b539cd8fe6ab27ca75128919a18d757604c # v6.4.1

- name: Tag must match version.properties
id: version
Expand Down Expand Up @@ -77,12 +80,12 @@ jobs:
java-version: '21'

- name: Set up Gradle
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
uses: gradle/actions/setup-gradle@8da46b539cd8fe6ab27ca75128919a18d757604c # v6.4.1
with:
cache-read-only: true

- name: Build and test release APKs (unsigned)
run: ./gradlew :app:testFdroidDebugUnitTest assembleRelease
run: ./gradlew :app:testFdroidDebugUnitTest :app:assembleRelease

- name: Sign APKs
env:
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,9 @@ keystore.properties
*.jks
*.keystore
*.p12

# Xcode
xcuserdata/
*.xcuserstate
DerivedData/
/iosApp/build/
44 changes: 44 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,50 @@ IzzyOnDroid) and used as the GitHub Release notes.

## [Unreleased]

### Added

- Encly for Windows, macOS and Linux (MSI, DMG, DEB and a Flatpak bundle): the same vault, notes and security as on the phone, with list and note side by side, note tabs, several windows, keyboard shortcuts and a menu bar, export to PDF and print, and the PIN's device key in the system's secret store ([#85](https://github.com/pasichDev/Encly/issues/85), [#106](https://github.com/pasichDev/Encly/issues/106)).
- Encly for iPhone: each PIN attempt needs the Secure Enclave, Face ID and Touch ID unlock, the vault locks when the app leaves the screen, and the app is hidden in the app switcher ([#107](https://github.com/pasichDev/Encly/issues/107)).

## [3.0.0] - 2026-11-07

versionCode 30000.

### Added

- Choose the length of your PIN: 6 to 12 digits, for the PIN, the wipe PIN and the duress PIN. PINs you already have keep working unchanged. The lock screen no longer sends the PIN by itself or shows how long it is: press Unlock when you have typed it ([#95](https://github.com/pasichDev/Encly/issues/95)).
- Arabic, and right-to-left layouts in every screen; each paragraph and list item of a note follows the direction of its own text ([#105](https://github.com/pasichDev/Encly/issues/105)).
- Backups carry your settings (appearance, lists, editor, language and privacy preferences); a full restore applies them after the notes. Security state never leaves the vault ([#93](https://github.com/pasichDev/Encly/issues/93)).
- Select text across paragraphs, lists and headings, like in a document: drag, use the handles or Shift with the arrow keys, or press Select all twice. Typing, pasting or deleting over a selection is one undo step, and copies go through the protected clipboard. Whole blocks can also be picked from their left edge ([#83](https://github.com/pasichDev/Encly/issues/83)).
- Give a note several tags: pick as many as you like in the note's sheet or the editor, and the note appears in the view of each one. Notes keep the tag they have, backups carry every tag, and a note with a hidden tag stays out of every list but that tag's own view ([#109](https://github.com/pasichDev/Encly/issues/109)).
- Nested lists up to three levels (Tab and Shift+Tab), and list items that can be dragged into place ([#76](https://github.com/pasichDev/Encly/issues/76)).
- Tables, code blocks, and a toolbar you can arrange yourself in Settings → Appearance ([#76](https://github.com/pasichDev/Encly/issues/76)).
- A lock button next to a checklist while you work in it, and lists indented under their heading ([#76](https://github.com/pasichDev/Encly/issues/76)).
- Settings → Security → "Show note previews": when off, the notes list, the grid and search results show only the title, tag and date; search still matches the text inside notes ([#105](https://github.com/pasichDev/Encly/issues/105)).
- Settings → Security → "Allow screenshots until the app locks": after your PIN or biometrics and a warning, screenshots and screen recording are allowed until Encly locks. The lock, PIN and recovery phrase screens stay protected, and the setting is never stored ([#94](https://github.com/pasichDev/Encly/issues/94)).
- Sort notes by title, A to Z or Z to A, in the language's alphabetical order.
- Auto-lock after 5 or 10 minutes ([#98](https://github.com/pasichDev/Encly/issues/98)).
- Notes are deleted for good after 28 days in the trash, the same way "Delete forever" does. Notes already in the trash start their 28 days with this update ([#97](https://github.com/pasichDev/Encly/issues/97)).
- After an update, the first unlock shows what changed in that version, once; Settings → About keeps it ([#105](https://github.com/pasichDev/Encly/issues/105)).

### Changed

- The unlock animation takes half as long, and is skipped when animations are turned off in the system settings.
- After you unlock with the recovery phrase, a PIN that still works is no longer replaced: choose "Keep my PIN" or "Set a new PIN". A new PIN is still required when the PIN or its key is lost, or while it is locked out ([#95](https://github.com/pasichDev/Encly/issues/95)).
- Encly is rebuilt on a Kotlin Multiplatform core ([#92](https://github.com/pasichDev/Encly/pull/92)). The encrypted database now opens through the Sealite driver (SQLCipher 4.20). Vaults, recovery phrases, backups and notes from earlier versions open unchanged.
- Opening and closing a note is quicker ([#76](https://github.com/pasichDev/Encly/issues/76)).
- Find in note highlights matches more strongly ([#76](https://github.com/pasichDev/Encly/issues/76)).
- Backspace at the start of a list item joins it into the item above, so holding delete runs through a list without stopping ([#76](https://github.com/pasichDev/Encly/issues/76)).

### Fixed

- Fingerprint unlock did not start, and its button did nothing, after Encly locked itself in the background ([#104](https://github.com/pasichDev/Encly/issues/104)).
- Checking or unchecking a task, or archiving a note in a hidden tag's view, could close the app.
- A new note lost its creation date at the first autosave. Notes that already lost it now sort by their last edit ([#103](https://github.com/pasichDev/Encly/issues/103)).
- Stepping through matches in Find in note now scrolls to each match, also inside long paragraphs and lists ([#76](https://github.com/pasichDev/Encly/issues/76)).
- Scrolling over a list no longer leaves its toolbar button active ([#76](https://github.com/pasichDev/Encly/issues/76)).
- The gap below a quote matches the gap above it ([#76](https://github.com/pasichDev/Encly/issues/76)).

## [2.3.1] - 2026-10-27

versionCode 20301.
Expand Down
Loading
Loading