New Features
Universal URLs. These new URLs of Moera pages use a central redirector at moera.page
host and include a node name. Read the details in the documentation.
Direct Image Serving. To speed up the serving of images to the client, a new feature has been added allowing to configure the server to serve images directly from the local file system, without accessing the node. (In case you're using a separate web server as a reverse proxy.) Private images are assigned a random identifier that periodically changes to prevent unauthorized access. This also eliminates the need for authentication when accessing images directly, resolving issues such as images failing to load when switching from Wi-Fi to mobile data.
Sorting Notifications by Importance. Now, more important notifications (such as comments and mentions) will appear higher in the list compared to less important ones (like reactions). This applies only to unread notifications. Once a notification is viewed, its position remains unchanged. This behavior can be disabled in the Settings. (thanks to @Drakoniha for the idea and @Orbb1974 for the feedback)
Freezing Inactive Nodes. Nodes whose owners haven't accessed them in the last year are now frozen. This means notifications to these nodes are queued and not processed by the node itself, only recorded in the database. If a node remains inactive, old notification records are purged without processing. This stops the frozen node from building the Newsfeed and frees up other nodes from unnecessary work. However, the content of the frozen node continues to be served as usual. When an administrator accesses a frozen node, it's unfrozen, all queued notifications are processed, and the Newsfeed is built as soon as possible.
FCM Relay. Notifications for mobile clients can now be sent through relays, acting as intermediaries between the Moera network and centralized message delivery systems. The first such relay is built for Firebase Cloud Messaging (FCM), used in Android. For more details, see the relay description.
Account Deletion Requests. A mechanism has been added to send requests to the provider for account (node) deletion. This capability is required by Google Play and legislation in some countries.
OAuth2. A new mechanism has been added that allows users to grant specific administrative permissions to third-party applications. Administrative privileges are divided into various scopes to enable fine-grained access control. To gain access, a third-party application must first register a Moera name and then send an OAuth2 request using a simplified flow. Once approved, the application can perform administrative tasks on the user's node using its own authentication tokens. For more details, please refer to the documentation.
Speed improvements
- Improved Redux selectors to avoid unnecessary re-rendering of React components.
- Made client initialization process faster.
- Do not request information about the same node many times.
- Migrated from create-react-app scripts.
- Updated all dependencies that had security issues.
- Replaced some minor dependencies with our own code.
- Reduced size of the main bundle of the client by lazy-loading parts of the code that are not needed on the start.
- Moved WebSockets events processing code to a web worker.
- Precompile JSON schemas and perform validation in a web worker.
- Do not build FontAwesome icon library on the start, because it blocks the main thread for a while.
- Pass node name in
X-Moera
header. - Avoid duplicate requests to the naming server. Cache names for several naming servers and do not clean the cache after switching user.
- Do not show a loading indicator if loading is fast enough.
- The Newsfeed is now stored in the client's memory all the time, allowing going back to it quickly.
- A service worker has been added for caching client code, frequently used images, and naming server responses. The client now starts quickly even with poor connectivity.
- Database queries have been optimized, resulting in faster execution of many queries.
- Caching of information about images attached to posts or comments has been implemented.
Other Changes
- Browser add-on support removed.
- Node now requires Java 17 for running.
- Developers' naming server is now used in development environments.
- Converted all React components to be functional and use React hooks.
- Generation of Node API classes, JSON schemas and routines in TypeScript and Python from Node API definition in YAML.
- Improved the Node API documentation.
- Improved debug logging of Redux actions, making possible to see actions that caused them.
- Made WebSockets connection more reliable.
- Improved accessibility of buttons that have no text on them.
- Set correct dimensions of image placeholders in the text of posts/comments to avoid layout shifts when loading images.
- Use more convenient wording: "create a blog" instead of "sign up", and "log in/out" instead of "connect/disconnect".
- A lot of refactoring in the client.
- Less punctuation and mathematical characters are now allowed in node names (thanks to Eliyahu Duvidzon for proposal).
- The debug log now contains more information, enabling tracking of the processing and timing of each individual request. Statistics on requests' execution time throughout the server's uptime have also been added.
- Part of the Novacrypto project's code has been migrated to
moera-node
due to the repository's demise. - Errors in sitemap generation have been fixed, and sitemap delivery to clients has been sped up, improving search engine indexing.
- Duplicate pages (those with multiple addresses) and feeds have been excluded from search engine indexing. Only posts, comments, and general blog information remain indexed.
- A universal mechanism for executing asynchronous tasks with persistent state, recovery after failures and server restarts, error handling, and various error recovery options has been implemented. All asynchronous tasks now utilize this mechanism.
- When grouping multiple comment notifications into one, the link now points to the first of these comments rather than the last.
- Comment notifications are no longer grouped with those already read.
- Unread reactions and comment notifications are now grouped, even if significant time has passed between them.
- A universal mechanism for managing pop-up dialogs and dropdown menus has been implemented, allowing closing them one by one in the order of opening — by clicking outside the dialog, the Esc key, and the "Back" button on mobile devices.
- A button has been added to the feed, allowing quick skipping of all pinned posts and jumping to the first non-pinned one. (thanks to Tigra for the idea)
- An error preventing the hiding of multiple paragraphs of text under a spoiler has been fixed.
- Hashtags are now treated as regular text when pasted from Facebook.
- Emojis consisting of multiple characters are now correctly processed when pasted from Facebook.
- A registration button has been added to the login dialog.
- An error displaying other users' avatars in comments in the Web UI has been fixed.
- An error causing the cursor to disappear when selecting a name from the list has been fixed.
- Remove escaping backslash only when it prepends a smiley (thanks to Tigra for reporting).
- Allow
<strike>
tag. Use<s>
for strikeout in the editor in HTML mode (thanks to Igor Braginsky for reporting). - The word
complain
in the API has been replaced withcomplaint
everywhere.