Video. You can now attach videos to posts and comments! (And you can insert them into the post text as well.) For now, the maximum size is limited to 150 MB, purely to save storage space.
Cloud file storage. The server can now store images, videos, and other files in Amazon S3 cloud storage. This is much cheaper than storing them in the local filesystem, and the available space is limited only by the budget. Files should also load a little faster.
Server-side image compression. Large images are now compressed on the server rather than on the client. This makes it possible to use several good techniques that were unavailable on the client, improving both the compression ratio and the quality of the resulting image at the same time. The maximum image size before compression is: no more than 8192 px on either side, no more than 40 Mpx in total, no more than 20 MB for JPEG and PNG formats, and no more than 3 MB for all other formats. Larger images will be shown as attached files. All compressed images are now stored in JPEG format.
Attached files of any type. You can now attach any files to a post or comment, not just images. The size limits are the same as for videos.
Any files also means malicious files. This is a real problem, and it needs to be solved the Moera way, without concentrating power in a single pair of hands. Obviously, it is impossible to detect every malicious file at upload time, but at the very least, it is possible to maintain a database of known malicious files and prevent users from downloading them. For this purpose, a special Security Guard account has been created. It keeps this database (a list of hashes), and others can check files against it. There can be many such databases; any user can choose which one to use (or several at once), or whether to use one at all.
Who performs the check, and when? Performing it on the client device is difficult, while the node hosting the file cannot be trusted—it may be distributing malicious files intentionally. That leaves the home node. Therefore, every attached file you are about to download is first transferred to your home node, where it is checked against the list you have chosen. If the check succeeds, the file becomes available for download. This may take some time, but it is for your own safety 😉
Here is an example of a “malicious” file, so you can see how it works.
In the future, more sophisticated protection systems may be installed on the home node, or Security Guard may proactively search the network for files and scan them—anything is possible.
Anonymous comments. Those who want to can now allow comments from unregistered users. You can enable this at the bottom of the post editor: Advanced options > Comments > Commenting allowed to, then select Everybody (anonymously). Clicking the star will make this the default setting.
The capabilities available to unregistered users are limited: they have no avatar, cannot upload images, and cannot edit comments. An anonymous comment is immediately sent for premoderation and will become visible to everyone only after the post author manually reveals it.
As a side effect, it is now also possible to enable premoderation for other user groups of your choice (in the same place).
View counter. Blog owners can now see an approximate number of views for each post.
Other changes
- Folded blocks can now be freely expanded while viewing a post in the feed.
- If a post contains many folded blocks, an Expand all / Collapse all button appears at the beginning of the post.
- The login and password recovery forms now include a reminder that Moera names are case-sensitive.
- If a user enters their name with an
@character at the beginning, that character is now silently ignored. - Link previews for other Moera posts now show the date of the referenced post. (Thanks to @unidentified for the idea.)
- In the user's pop-up card, clicking the number of their posts now opens that user’s feed.
- The reaction and comment counters in the “Most Popular” list are now clickable as well. (Thanks to @tigra for the suggestion.)
- Opening a non-existent blog no longer causes endless attempts to load its feed.
- New versions of Firefox on Linux have assigned the
Ctrl-.keyboard shortcut to emoji input. Therefore, typographic quotation marks are now entered usingAlt-[Shift-],andAlt-[Shift-].. - Copying posts from X (Twitter) has been improved. (Thanks to @LeonidKoganStavsky for testing.)
- When copying posts from Telegram, Moera now tries to guess where a paragraph break should be used instead of a simple line break.
- Carte data belonging to another user is no longer saved when working with different accounts in different browser tabs.
- Visited links in posts and comments are now shown in a different color, as is customary on the Web.
- The comment editing dialog no longer covers the dialog asking about restoring a comment from a draft.
- Search by the News feed has been removed because the search engine no longer has access to it.
- During sign-up, users can no longer click the registration button again and end up stuck between two states. (Thanks to @IrinaVulf for testing.)
- A message has been added telling users to refresh the page when a new version of the client has been published.
- Frequently visited blogs are now shown first in search bar suggestions.
- Flash notifications with long messages now stay visible longer, giving users enough time to read them.
- And many other minor bugs have been fixed.
Technical
Large file uploads. An API for uploading large files to a node has been added. A file is split into chunks and can be uploaded using several parallel threads.
Large file leasing. When a news feed is assembled, all posts included in it are copied to the home node. Until now, all attachments were copied as well. For very large files, however, this is too expensive. A mechanism has therefore been implemented that allows one node to lease files from another, and the client can now display posts with attached files that are physically stored on a different node. A detailed description of the leasing mechanism is available in the documentation. Leasing takes view permissions, deletion of the original post, and other factors into account. The maximum size of an attached file that is still copied rather than leased can be configured in the Settings.
Drafts, both for posts and comments, are now stored only on the home node.
Media files are now uploaded only to the home node. If you write a comment under someone else’s post and attach a file to the comment, the node hosting the comment initially only leases that file from you. It may later copy the file if it considers that necessary.
This has two beneficial consequences. First, you no longer need to worry about what image and file sizes are allowed by the blog where you are commenting. Note that you can now attach uncompressed images and videos to comments. Second, it eliminates the possibility of a DoS attack by uploading large numbers of images to someone else’s node.
New media storage structure. The structure of local media storage has changed as well. There is no longer an explicit division between public and private sections. Access to all files is provided through presigned URLs—URLs with an additional parameter containing a cryptographic signature. The signature is verified by Nginx.
Anonymous user. All comments from unregistered users are signed with the reserved username unk and the same key. This key is publicly known. When a node receives a comment from unk, it signs the comment with this key itself.
The anonymous user follows a “deny everything unless explicitly allowed” model. At the moment, the only permitted actions are posting comments and viewing one’s own comments for 3 hours if they have not yet been revealed by the post author.
Because all anonymous users operate under the same name, an individual user is identified by a random client ID generated by the client. It is stored in the comment metadata for 3 hours and then deleted. This allows an anonymous user, for a limited time, to see their own—and only their own—comment even if it has not yet been revealed.
The client ID is sent in the Client-ID HTTP header, which now consists of two parts: a persistent part that is updated no more frequently than once every 3 hours, and a variable part that is updated every time the page is reloaded.
Minor technical changes
- Moera node now requires Java 21 or later and PostgreSQL 12 or later.
- Carte now supports binding to multiple IP addresses, most commonly the IPv4 and IPv6 addresses of the same server. Multiple addresses can now also be specified in the configuration file.
- The maximum name length is now the same everywhere: 135 characters.
- The separate
view-mediapermission has been removed because it no longer makes sense with presigned URLs. Onlyview-contentis now checked.