Version 3.5.9 of the Ecency mobile app is on the App Store and Google Play. It lands about three weeks after 3.5.8, so it is a smaller release, with three things worth opening the app for plus one fix you will only notice by its absence.
Everything below is in the shipped build.
Creator newsletters launched on the web in August. The app can now read and manage them.
Subscribe to a creator. An envelope button sits in the profile action row, next to Message. Pick weekly or monthly, confirm the link in your inbox, done.
Subscribe to a community. Community pages carry a Newsletter tag that opens the same sheet.
A card at the end of a post. When you finish reading someone, you are offered their digest. On a post inside a community you are offered that community instead. It never appears on your own posts, never on comments. Dismissing it is remembered per list rather than for everything at once.
One screen for all of it. Settings has an Email digests row. Subscriptions are grouped by email address, each with its own cadence, a resend if the confirmation went missing, leave for a single list plus a stop-everything action for one address behind a confirm.
Your own list. After your first post the app offers to set your readers up with a digest of your work. Your own profile then shows your weekly and monthly subscriber counts with a copyable subscribe link.
Your email address is asked for once, then reused for every list on that account. Composing and sending an issue to your readers stays on the web for now.
The tag you care about is usually not a community. Tags are followable now.
Follow from a tag screen. A Follow button under the search field on any tag feed.
Tags tab in Bookmarks, next to Favorites. Tap opens the feed, long press unfollows.
Notifications that match the tag. A quiet tag, which is most custom tags and every contest tag, notifies you per post. A busy tag folds into one summary an hour instead of a stream. The toggle is in notification settings and it is on by default.
You can hold up to 100 followed tags. One cosmetic change came with it: tag chips now read as the tag itself rather than carrying a # prefix, matching the web app. A community still reads as its title, so the two never look alike in a row.
This is the fix you will not see. It is also the biggest one in the release.
Requests in the app carried no deadline. React Native builds its Android HTTP client with connect, read and write timeouts all set to zero, which means wait forever. The fetch polyfill never set one either. So a connection that was accepted and then went quiet produced nothing at all: no result, no error, no retry. The screen held its loading skeleton until you killed the app. Android made it worse, because five stalled calls to one host parked every later call to that host behind them for the rest of the session.
Every request now carries a budget. Our own services get 20 seconds, third-party services get 30, an upload gets two minutes so a slow photo is never cut mid-send. When a request runs out of time, you get a screen that says so with a Retry, in the places that used to sit blank:
the feed tabs, which fell through to an empty post placeholder
notifications, which claimed an empty inbox for a request that never arrived
the daily quests card, which drew every quest at 0 of its goal, indistinguishable from a day you had done nothing
Reconnecting works too. React Query's own online detection waits for browser events that do not exist in a mobile app, so refetch on reconnect had never actually fired. It is now driven by the device's real network state.
A user on an Android phone reported three things at once: a photo stuck on "Uploading...", typed text coming out reversed or deleted and the image landing in the middle of an unrelated sentence. All three were the same piece of code and all three are fixed.
Typed text is no longer reverted when an upload starts or finishes. That was the reversal.
An image whose placeholder cannot be found is repaired in place when there is only one candidate. Otherwise it is left out of the body rather than dropped wherever your cursor happens to be. The upload is still in the gallery either way.
Placeholders that could never resolve are gone: results now flush when you leave the editor, an upload that returns nothing gets a verdict instead of hanging and old drafts carrying a dead placeholder are swept when opened.
Uploading while signed out wrote a placeholder that could never complete. Uploads now check you are signed in first, including from the share sheet.
Filenames with parentheses, like IMG_2024 (1).jpg, no longer leave garbage behind.
A failed upload no longer leaves a blank line where the image was.
Leaving the editor while an upload is in flight saves the finished image into the draft instead of losing it.
Dictation was already in the full editor. It is now in the quick composer too, so a wave or a comment reply can be spoken.
The toolbar had no free slot, so AI image generation moved into the AI assist sheet, where it sits as a card with its starting price. The two AI buttons were next to each other and behaved differently anyway: one opened a sheet, the other jumped to a screen. Expand moved to the end of the row, since it leaves the composer rather than adding to it.
Dictated text is appended to the end of what you have written. Waves are still capped at 250 characters and nothing is truncated, so a long transcript leaves the counter red until you trim it, exactly as typing past the cap does.
Follow, unfollow, ignore and blacklist are one family. None of the four passed the app's own filters, so a healthy server still produced nothing. All four now bump the badge, show a banner and open the right person's profile when tapped.
Two more notification fixes came with that. Push messages and websocket messages spell some event types differently. The app was checking push messages against the websocket spelling, so delegation and payout pushes never matched at all and the badge went stale for both. And a fresh login used to receive no delegation, payout, account update or weekly earnings pushes until you opened notification settings and saved once. Both lists now come from one place that a test holds in sync.
New in this release: an Ecency-powered app can ask you to sign in with your Ecency account, without a key or a token leaving the app.
Ecency asks you first, naming the app that is asking and what is shared: your username plus a sign-in proof, nothing else. With PIN lock on, the PIN screen gates it the same way signing does. The proof is single purpose. It identifies you to the app that asked for it and cannot be exchanged for a token or used to broadcast anything on your account. Refusing sends back a plain error that does not name any account on your device.
The first app using it, is coming out soon, exciting new game. If your account is signed in through HiveSigner or HiveAuth, the app tells the requester to use HiveSigner directly, since there is no key on the device to sign a proof with.
Received Hive Power delegations are read from the new balance API. A received row shows no date line rather than "Invalid Date".
The Email digests screen header no longer sits under the status bar and Generate again on the AI image screen no longer sits under the home indicator or the Android navigation bar.
Store purchase failures are now reported by their real error code. Tapping cancel on a purchase is no longer filed as an error, so real payment problems stop hiding behind cancellations.
The usual round of dependency updates.
3.5.9 is on the App Store and Google Play. If you sideload, the APK and the iOS build are attached to the GitHub release, where you can check them against the published SHA256 checksums:
fee46545627cb4e430f12b20e654cca20ce6f21a9475755ba08b2b9fe3ed372a Ecency-iOS.zip
a20cf47c38915491577c1c0b3cbac0ac308686250c305329565b705c70d611f7 Ecency-APK.zip
Every change above landed as a public pull request. The complete list is in the 3.5.9 release notes. Ecency is open source and always has been.
If something here does not behave on your device, tell us. An issue on GitHub or a reply to this post both reach us.