Releases: LinkoraApp/Linkora
0.17.1
0.17.0
Linkora now runs on Web via Kotlin/Wasm and is currently experimental, try it out: https://linkora-app.netlify.app/ (scroll to bottom of this release notes for complete info)
If you use the sync-server, you must be on the latest version, v0.3.0 (at the time of writing this). Also, fill out this survey if you use sync-server, it'll give me insights on a possible rewrite in Rust with more solid syncing mechanisms and a couple more features beyond saving and syncing links.
From this release, all platform-specific artifacts are built via GitHub Actions.
What's New
- A new proxy is available to route all your requests through it, built specifically for the web app and disabled by default on other platforms since there's only one public instance.
- You can self-host the proxy, see the proxy repository for more info.
- You can now resize the list pane in the collection screen (currently restricted to two boundaries) on desktop, web, Android tablets, or any large screen.
- Added scrollbar support to Regular (and title-only) and grid layouts.
- Replaced the default snackbar with a custom UI.
Internals
- Collections Screen is now completely based on Material 3's adaptive-layout library, and the detail pane now uses its own navigation. I haven't migrated to Nav3 yet. There are a couple of limitations with the current Nav2, it basically binds the backstack with the NavHost and nested navigation becomes a mess. Had to do some workarounds. Once Nav3 is stable for KMP, I'll migrate eventually.
- Preferences are now based on UDF principles instead of the global object approach it previously used. There wasn't a strong reason to migrate on its own, but web handles preferences differently than Android and desktop, and forcing it to work the old way would've been a mess. I needed a common ground that keeps things simple, so that's that.
- All
expect/actualdefinitions no longer directly reference theFileobject received from a specific platform since it isn't supported on web. It now uses eitherByteArrayor whatever works in the specific case.
Basically, a lot of things are refactored. Again.
State of the Web App
Linkora on web is not stable by any means. It runs fine on web itself, but the core component that handles the database isn't stable, primarily because of OPFS. This is already a known issue (https://sqlite.org/forum/info/58a377083cd24a). If there's any possible workaround, I'll implement it and put out a release.
0.16.0
If you use sync-server, you must use the latest sync-server version, v0.3.0 (at the time of writing this).
Performance Improvements
These benchmarks are based on 100K+ rows collectively across multiple tables, with a JSON file of 18.27 MB and an HTML file of 7.18 MB (both exported from the same 100K+ rows dataset, though the HTML version excludes references to tags, panels, panel folders, images, and notes since browsers don't support these in bookmarks).
Both import operations are stable and take linear time to complete instead of quadratic. These reports are based on OPPO A77S hardware.
-
Importing via JSON now uses 56.1% less memory (heap) and, on average, 17% more CPU efficiency.
-
Importing via HTML now uses 58.7% less memory (heap). While it uses 6.2% more processing power on average, this increased throughput allows it to complete successfully without the previous version's crashes.
- Note: The performance gains might actually be higher than what is listed here. In the previous versions, both HTML and JSON imports crashed before finishing, so this comparison is based on the current stable version (0.16.0) against the recorded usage of the old version right before it crashed.
-
HTML exporting, copying of folders, and a couple of others now run in linear time instead of quadratic.
-
Pagination is now implemented using a cursor-based approach instead of offset-based.
- While this might be overkill for an app like Linkora, this prevents the app from processing thousands of skipped rows just to reach the current page, significantly reducing unnecessary database overhead during deep scrolls.
What's New
- Added an option to force write default internal folder IDs to respective links (in data settings screen)
Fixes
- Fixed the "PROCESS ENDED" crashes that occurred during large data imports.
Full Changelog: release-v0.15.2...release-v0.16.0
0.15.2
Fixes
- Sets AMOLED theme based on preference as expected (android-only) (#132)
As the desktop version remains unchanged, you can use builds from https://github.com/LinkoraApp/Linkora/releases/tag/release-v0.15.1 as usual.
Full Changelog: release-v0.15.1...release-v0.15.2
0.15.1
Fixes
- Updated the refresh type component label in the data settings screen to show "Image" instead of "Important Links"; functionality remains unchanged (v0.15.0) (idk how i missed this loll)
v0.15.0 release notes: https://github.com/LinkoraApp/Linkora/releases/tag/release-v0.15.0
0.15.0
What's New
- A custom reactive and resource-aware paginator is implemented in all the collection-based screens; Linkora will now load data faster and in a more efficient way than it ever did.
- 20 items per page/batch; auto-cancels and re-subscribes listening to the pages based on which pages are being displayed; at max 3 page read-connections will be active per screen.
- Links can be auto-saved when sharing from other apps (#121).
- Added support for Google Sans Flex Font.
- Date and time of a link addition can now be shown in the link views (enabled by default). (#51)
- Individual links can be refreshed based on either image/title or both, instead of force-refreshing everything. (#36)
- This same implementation is added when you are refreshing all the links from the data settings screen, and all of the links can be refreshed concurrently instead of sequentially.
- Default concurrent refreshes count is 15; this can be changed as per your preference.
- Material 3 Expressive "Loading" indicators are now used in certain components.
- New fixed-size scrollable components are used when selecting tags and folders during link additions or editing the links (which also supports the pagination implementation) replacing full-blown lists.
- Folder path is now shown in the search results (only for folder-based links & folders) (#71).
- Tags, date & time, and other elements are now supported in all of the link views. (#122)
- Links can now be force-saved even if the retrieval fails (enabled by default) (#108).
- Custom image URLs can now be added while saving or editing the links (#52).
- URLs of the links can also be edited; make sure you refresh after editing the URL to update title and image (#33).
- Both desktop and Android builds now use a bundled SQLite driver as some of the operations aren't supported in older Android versions (including LineageOS 20 (Android 13) which Waydroid is based on).
And a couple of other things which I'm sure I missed mentioning above.
Contributions
- Adding Russian metadata translation by @Korb in #120
- Adding German metadata translation by @Kachelkaiser in #124
- Added AUR mention by @MathisP75 in #127
- @Korb made their first contribution in #120
- @Kachelkaiser made their first contribution in #124
- @MathisP75 made their first contribution in #127
Internals
Well, there's a new paginator class which handles pagination stuff. While my initial design was to implement cursor-based since it's much faster (if you are scrolling even 100k+ items manually) than the current offset-based implementation, I thought of implementing window-based (idk, it popped randomly loll). I might change it to cursor-based in future updates.
Besides this, things are now based on both MVVM and MVI (MVVIM-SH) architectural patterns (there were things I wanted to be in a different way, playing around with code for absolutely no reason).
Added a new UnifiedLazyState interface for "detecting" if nearing the end of the list to do stuff with the paginator. Since there was no common interface for LazyGridLayoutInfo, LazyListItemInfo, and LazyStaggeredGridItemInfo that provided the visibleItemsInfo & totalItemsCount (all three have common properties but use individual interfaces), so yeah, that's that.
Full Changelog: release-v0.14.0...release-v0.15.0
[PREVIEW] 0.15.0
- custom pagination for loading data very efficiently
- scrollable components for selecting tags and folders instead of full blown lists
- material 3 expressive "loading" indicators
- feat: couple tag creation and tag list for individual components into TagSelectionComponent
- feat: use
ContainedLoadingIndicatorfor indicating "loading" status in CollectionsScreen - feat: add pagination support for add-a-new-link dialog component
- feat: add pagination support for rename-a-link dialog component
- feat: add pagination support for collections
- refactor: lil improvements
- add sliding window test for the custom Paginator
- feat: implement a custom paginator to load the data batch wise
27/01/26
- feat: add support for showing tags, date in link views (#122)
- feat: show the folder path in search results (#71)
- feat: preload data when nearing end of list with paginator(s)
- refactor and fix issues in TODO()s after pagination refactoring
- feat(desktop): use material 3 expressive "loading indicators" when saving links
- feat: use current system time epoch when importing the data
- refactor: use enum instead of sealed class for sync-server routes
- feat(pagination): show empty data indicator when data is empty
- feat(pagination): show proper loading indicator when data is being loaded
- feat: add pagination support for home screen panel folders
- chore: convert app icon's image resources to webp
- feat: use
momo_signaturefont for app label - feat: add pagination support for Search
- feat: add pagination support for collection screens
[PREVIEW] 0.14.1
This is a preview release, which means things might not be fully implemented or tested, and might only work on my machine. You can still open issues for "bugs" or improvements. The tag this release is published under may also not match the uploaded builds.
Last Updated: 06/01/26
Changes
- feat(android): add auto-save support for links shared from other apps (#121)
- fix(android-mobile): use proper padding for tags-row in menu when image header is disabled
- feat: use preferred action on grid link item click (#121)
- feat: add support for Google Sans Flex font (defaulting to Poppins)
Happy New Year???
- feat(android): verify the notification permission status before starting auto-save service
- feat: support date and time display in link components (#51)
- feat: process links refreshing asynchronously with concurrency of 15
0.14.0
If you use sync-server, you must use the latest sync-server version, v0.2.0 (at the time of writing this).
What's New
- Tags - We do tags now, yup, you read that right, Linkora now supports tags [#12]
- Folders and Tags are in the same Collection screen; you can slide or manually switch from the collection switcher
- JSON-based exports support tags, HTML exports don't
- Your preference to shrink or expand the tag section when saving links is persisted
- New alternate icons on Android, icon made by LOLCATpl (on Discord) supports themed icon alongside legacy & regular icons, other icons don't. You can change the icon from the general settings screen
- Folders can be searched and sorted [#43] while saving a link; the manual tree still exists if you prefer that
- Double-tap on the search icon from the
android-mobilebottom nav will automatically open the search bar - All clickable elements now show a pointer cursor on hover
- Desktop now follows a minimum window size
- During multiple link selection, the addresses of selected links can be shared (split by a line) [#111]
Improvements
- Grid/Staggered (Link) Component has been completely rewritten
- Menu bottom sheet UI for links has been improved
These two are also based on the designs created by LOLCATpl 🦅🦅🦅
Fixes
- Resetting the local database (remote if preferred) has been re-added [#107]
Internals
- Lots of refactoring around navigation in the collections screen - removed all the singletons that were guiding most of the navigation context across all platforms, which was a mess. And all the other refactorings that went with it.
- I'll refactor more as I keep seeing stuff that can be done better.
- I have started using context params; existing extension functions will stay, but I'm gonna use more of these wherever it makes sense.
Full Changelog: release-v0.13.7...release-v0.14.0
[PREVIEW] 0.14.0
Last Updated: 24/10/25 1:30 PM IST
I'm planning to publish Linkora on Google Play. As of now, I need at least 12 testers and this test will continue for at least 14 days, to make the app available globally, so, if you're interested, please send your email address via:
https://forms.gle/zjTuMa8VXPvHg7nz9
I'll contact you via email once a release is available for testing.
This preview must not be used for regular usage,
as the implementation for remote sync isn't yet completed/partially implementedit's done, but there will be no server previews; a new version will be published soon. You must only test this locally without connecting to the server.
Builds released under this release may be updated at any time and may not match the build(s) of the current tag this release is published under.
Changes
- we do tags now [#12]
- internal improvements (a lot)
- improved grid link component
- improved menu sheet
- add support for searching & sorting folders during link addition
- add ability to expand and collapse tags section in AddANewLinkDialogBox (persisted)
- use bottom sheet for AddANewLinkDialogBox content instead of dialog box (on android-mobile)
Known issues
Import fails with tags connected to different links than the source, i.e., Tags export works, but import doesn't.FixedTags do not follow the selected sorting order.FixedMain FAB misbehaves, folder creation, editing, and multi-selection (for copy, moving, and deleting) don't work as expected (well, I'm refactoring the entire navigation code, so this is expected)FIXEDCopying links with multi-action doesn't copy their associated tags (I didn't even implement this)FIXED