Plainva 0.5.1: one sign-in, one place for your bars, and a sync that arrives again
0.5.0 was about getting in — importing your notes from Notion, Evernote, Keep. It was the biggest release Plainva has had, and it left the app slightly out of breath: a lot of features that each worked, and did not quite know about each other.
0.5.1 is three days of fixing exactly that.
Three consents for one account
Here is something I built wrong and only noticed when someone connected a Microsoft account properly.
Plainva could sync your files with OneDrive, read your Outlook calendar, and read your Outlook mailbox. Three useful things. Three separate OAuth flows, three browser consent screens, three refresh tokens — for one account. If you wanted all three, Microsoft asked you three times whether Plainva may act on your behalf, and Plainva stored three separate answers.
That is not a security feature. That is just me having built each service when I needed it and never stepping back.
There is now one token broker per cloud account. A Microsoft account consents once, with the union of the scopes it needs, and files, calendar and mail draw their tokens from that one sign-in. The broker is audience-scoped — a mail token cannot be handed to the file sync — and it serialises refreshes, so two services renewing at the same moment cannot destroy each other’s token. Google works the same way: one consent covers files and calendar.
The same idea applies to app passwords. If you rotate the app password on a Nextcloud or Fastmail account, you now enter it once, under Credentials, and every service of that account picks it up.
Existing accounts are not forced anywhere. They get an offer — one login for all services — and if you ignore it, the old per-service path keeps working exactly as before.
One place for every bar
Plainva has four bars: the action bar on the far left, the two sidebars, and on the phone the navigation bar. Over time each of them grew its own way of being configured, and two of them had no way at all.
They now share one model and one settings area. Each bar is a single list: visible above the line, hidden below it, drag to reorder. It is stored per vault, inheriting from a global default — which matters more than it sounds, because the vault is the only thing that travels between your devices.
In the app itself there are no drag handles. You hold an item and it lifts; right-click offers the same actions without holding. Handles live in the settings list, where you are deliberately arranging things, and stay out of the surfaces you use all day.
Tabs can be pinned now, too. Pinned tabs move to the front, swap their close button for a pin, and survive “close all”.
The sync that split itself in two
This one is my favourite bug of the release, in the way that only a bug you eventually understand can be a favourite.
Several people reported the same thing: settings and accounts do not arrive on the second device. Passphrase entered, sync switch on, nothing happens.
The profile sync writes one file into your vault. If you have set a sync passphrase, it writes a sealed one (settings.enc); if not, plain JSON (settings.json). What I had not thought through is the state in between: a device that has a passphrase but has not been unlocked yet. That device does not know the key, so it wrote the plaintext file. An unlocked device, meanwhile, wrote the sealed file — and cleaned up the plaintext one it considered stale.
So two files sat next to each other in the same folder, each written by a different device, neither ever reading the other. The screenshot a user sent me showed both, two days apart, with the plaintext one being newer.
A locked device now waits instead of writing a second truth. A leftover plaintext file is read, merged and then removed — and the settings profile itself merges per field with tombstones, so two people in the same vault stop overwriting each other’s settings. Personal things — accounts, bookmarks, bar layouts — moved out of the shared document entirely and live per member.
If you use the sync passphrase: unlock every device once after this update. A locked device deliberately no longer writes, and that is what stopped the two files from fighting.
Tasks that come back
A task can now carry a repeat rule. Tick it off and the next one is created.
I went back and forth on where the rule should live, and settled on the task’s own frontmatter rather than a database column. A repeat belongs to that task; as a column it would have to exist in every task database you own, whether or not you use repeats. Monthly arithmetic clamps to the end of the month, so 31 January plus one month is 28 February, not 3 March — otherwise a monthly task drifts a full year over a decade.
There is no series object, deliberately. Each generated task is an ordinary note. Delete it and the chain ends. No dialog can lie to you about what “delete series” means, because there is no series.
The calendar icon on a task row does something related but separate: it blocks time for the task as a linked event. Tasks in Plainva are day-granular on purpose, and I did not want to teach them about clocks — so the event carries the time, and the task keeps pointing at it.
Mail, on both ends
The phone got a full mail client: connect a mailbox (Microsoft or plain IMAP/SMTP), read, write, reply, select several messages at once, save attachments, search a folder, keep reading offline. The IMAP and SMTP implementation is our own, deliberately — it is more work than pulling in a library, but it is code I can actually audit.
The desktop got the pieces that were missing: a signature per mailbox (swapped, not stacked, when you change sender), sender addresses in the menu rather than accounts, and the same offline cache the phone uses.
Also in this release
- The Databases sidebar section now shows the open note the way its database sees it: the columns of the first view, editable, with its position (“12 / 34”) and a step to the neighbour.
- F5 re-reads the vault — and folders mounted through a symlink or junction are finally walked. They could never be indexed before, which is why restarting never helped anyone who asked.
- Right-click reaches Recently opened and Bookmarks above the file tree.
- iCloud reminder lists show up as task lists instead of pretending to be calendars, and a deleted folder stays deleted instead of being quietly recreated by the next full listing. Both came out of one long issue thread; thanks, Jeff.
Still experimental
Encrypted workspaces have not been independently reviewed and are still marked experimental. Nothing about that changed in this release, and I would rather repeat it than let it quietly fade from the release notes. Keep backups.