All releases

Version 0.107.0

2026-08-30 12:23:03 UTC

HotfixBeta

Changed

1
  • When the storage service refuses an upload request, the answer now says whether it was the request or the service.

    Every refusal from that side used to come back as one answer meaning "something upstream is broken", which asks the caller to try again. A request that was refused for its own contents will be refused the same way forever, and a day's spending limit is not a fault at all. The three are now separate: your request to correct, a wait until the limit resets, or a genuine fault. What happens to the credits is unchanged — none of the three spends them, and they are returned in every case.

Fixed

2
  • A file list that had grown past about 7.5 MB could not be saved. The documented ceiling of 8 MiB now really is the ceiling.

    File names and folders live only inside the list your browser encrypts, so a drive with a great many files has a large one. Past a certain size the save did not fail — it hung for thirty seconds and came back with a bare "Internal Server Error", which named nothing that was true. The cause was in front of the server rather than in it: the web app copies each request body on its way through, that copy had a limit lower than the server's own, and passing it cut the copy short without reporting anything, so the server sat waiting for the rest. That limit now sits above the server's, a list larger than the server accepts is refused immediately, and a request whose body stops arriving is no longer held open indefinitely.

  • "Forget this device's memory and load it" did nothing on the devices that show it. It works now, and the choice is always yours.

    A device remembers the highest version of your file list it has ever opened, so a server sending back an older one is caught, and the screen offers one way through: take what the server sent and forget what this device remembers. It did not work — forgetting left the older copy in the device's cache, opening that copy set the memory straight back, and the server's list was refused again. That press now reads the server without the cache for exactly one load, which is what the confirmation always promised. A branch that used to decide this by itself is also gone: it compared when the account was created, and that date comes from the same server, so a question with two opposite right answers now always goes to the person holding the account.

Security

2
  • Refusals no longer quote back what you sent or name what the server is built with.

    When a field carried the wrong kind of value, the reply was written by the web framework rather than by us: it named the exact number type the field uses, the libraries doing the reading, and — with no limit on length — the entire value that had been sent. None of that helps the person who made the request, and the part that does help, which field was wrong, is the part that stays. The reply is now one of a fixed set of sentences plus the name of the field. If a future framework version words its refusals differently, the reply falls back to saying less rather than more, and a test fails so we notice.

  • Two operator-only addresses answered questions about themselves before checking the operator key. Both now refuse first.

    Each of these checks the key on its first line, but the web framework reads the request body before that line runs — so a request with no key at all was told which field its body was missing, which reveals that the address exists and what it takes. The same gap was closed for the administration addresses a week ago; these two were beside them and were missed, because the test written then knocked on exactly one address. A check now reads the source instead of a list: every route that refuses without the operator key must sit behind the layer that answers first, and it finds twenty-nine of them.

NMTS — cloud storage that encrypts in your browser