Three open reports, and behind each of them something that had been built and
then never called.
A 90 MB attachment froze the app — because its bytes were routed through a layer
never meant to carry them. A folder rename quietly broke the search index, and
the error message said the opposite of what had happened. And a task created in
Plainva never reached your provider, although the capability to create one was
finished in all three of them and had, repository-wide, no caller at all.
Large files reach the server
plugin-http turns a request body into an array of numbers and then into JSON.
For a 90 MB file that is roughly 94 million boxed numbers — over a gigabyte
of peak memory, the main thread blocked for minutes. That single cause explains
the freeze, the crash and the blank window that were reported together.
The content no longer enters the renderer. A native command streams the file
straight to the service, so memory stays flat at any size — WebDAV, S3,
OneDrive, Dropbox and Google Drive, on the desktop and on the phone. Nothing
is capped: each service's own limit is the only ceiling left. One exception,
said rather than buried: in an encrypted workspace the old buffered path
still applies, because sealing a file needs its plaintext bytes in hand.
A second, independent problem sat beside it. The request timeout covered the
upload itself, so a flat 30 s silently demanded 3 MB/s — which no ordinary home
connection sustains for 90 MB. The budget grows with the payload now.
(#48)
Tasks travel both ways
Until now the reconciler only ever mirrored remote to local: a task created in
Plainva stayed a note. A task database can now name the list new tasks are
also created in — Google Tasks, the iCloud reminders, Microsoft To Do — with
None — stays a note as the first option. All three ways a task comes into
being go through one service, so it never depends on where a task was born
whether it reaches the provider.
Text files, and what a file extension is worth
.txt, .csv, .json, .yaml and source code open in Plainva again, with
highlighting resolved from the file name. Two things a promise like that needs:
an extension is a claim, not evidence — a file that does not decode cleanly is
handed to the system app instead of being shown and then destroyed on save. And
a foreign file leaves the way it arrived: line endings and a byte-order mark are
preserved, so a .bat from Windows does not come back doing something else.
The folder that would not delete
An index row kept an identity derived from its old path after a folder rename,
so the next refresh collided on UNIQUE constraint failed: files.path. Because
a full scan is written as one atomic batch, a single such row rolled the entire
scan back — and every caller swallowed the error, so the index stayed broken
across restarts. Deleting is where it became visible, and the message was the
opposite of the truth: the folder had been removed from disk.
The index repairs itself on the next scan. There is nothing to clean up.
(#34)
Also in this release
- Encrypted workspaces can be managed from the phone (experimental):
decommission, transfer ownership, revoke a device or a member. - Fewer consent prompts when connecting an account on mobile: the first
consent of a run covers several services at once, so a Microsoft account with
three services asks twice instead of three times. And the provider you tap is
the one whose form opens. - The calendar pulls only what changed where the provider offers a change
feed, and a dead sign-in stops costing a network round every cycle. - The start-up guard names the capability it found missing, with the user
agent, instead of a Safari version that may not describe the engine at all.
(#46) http://servers on a home network are reachable on Android.- Dropbox no longer needs a registration of your own.
Changed — please note
Text files open inside Plainva again. 0.6.4 handed .csv, .svg and .txt
to the operating system; they now open in the app's plain-text editor. And the
repair for daily notes that inherited plainva.tasks: false has been retired —
the FAQ describes the manual route.
Install: Windows .msi/.exe (signed), macOS .dmg (signed and notarised),
Linux .AppImage/.deb/.rpm. Existing installations update themselves.
Full list of changes: CHANGELOG.md