Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Adding a version section here is what publishes a release, so this file is the one place a version is decided: see Releases. Versions that shipped before this file existed are on the releases page.
[5.0.1] - 2026-09-28
Section titled “[5.0.1] - 2026-09-28”Changed
Section titled “Changed”- Building from source needs Go 1.27 or newer.
Removed
Section titled “Removed”- macOS 12 Monterey. Releases run on macOS 13 Ventura or later; on macOS 12, stay on 5.0.0.
- Files uploaded to Drive, attached to mail or added to Pass items were typed from the system’s own list of file types, so on a system without one most were stored as
application/octet-streamand the Drive index skipped their text. They get the type Proton’s web client gives them, on every system.
Security
Section titled “Security”- Releases are built with Go 1.27, which carries Go’s August fixes to TLS, HTTP and URL handling that 5.0.0 was built without.
[5.0.0] - 2026-09-28
Section titled “[5.0.0] - 2026-09-28”Highlights
Section titled “Highlights”- Sign in without typing a password -
account login --qrprints a code that a device already signed in approves, andaccount sessions createapproves one from here, so a machine reached over SSH never sees your password. - The rest of Proton’s security pages -
account keysmanages the keys of your addresses,account settings emergency-accessandrecovery-contactschoose who can help you back in,account breachesis Dark Web Monitoring, andaccount deletecloses the account. - An inbox with less noise -
mail mailing-listsshows who writes to you as a list and files or leaves them,mail messages trackers listnames what a message tried to track, and links read without their tracking onceimage-proxyis on. - Let people book a time with you -
calendar booking-pageshands out a link for booking an appointment in your calendar, andcalendar settings linkspublishes a calendar as a feed anyone can follow.
account login --qrsigns in by approving a code on a device that already holds a session, with nothing typed here, andaccount sessions create CODEis the approving side.account keyslists, shows, exports, creates, imports and deletes the keys of your account and addresses, andkeys updatemoves the primary or marks a key obsolete or compromised. Every change asks for your password, even signed in.account settings emergency-accessandaccount settings recovery-contactschoose who can help you back into your account, andlist --incomingshows who chose you. Emergency access needs a paid plan and opens after--wait, 7 days unless set;emergency-access access --as PROFILEthen saves the account that trusted you as a profile.account breachesis Dark Web Monitoring: the breaches your addresses were found in, what each exposed,resolveandreopen, andenableanddisable, with--emailsfor the emails it sends.account settings sentinelshows and switches Proton Sentinel, andaccount settings notificationsswitches each email and notice Proton sends you by name.account deletedeletes the account and everything in it, and then removes the profile from this machine.mail mailing-listslists the senders that write to you as a list, files their mail withupdate --intoand--mark-read, and unsubscribes from them.mail messages trackers listnames each tracker a message’s images carry and each link that had its tracking taken out. It needsimage-proxy on.mail messages countandmail conversations countshow every folder, label and category tab with its total and unread count, or one with--folder.--request-receiptonmail messages send,reply,forwardandmail draftsasks for a read receipt,messages getshows aReceiptline, andmail messages receiptsends one back.mail settings importsbrings another mailbox in over IMAP, and follows, cancels, resumes, undoes or deletes an import, ones started in Proton’s apps included.mail settings categoriesshows or hides each category tab and turns its notifications on and off, and--folder primarylists the Primary tab.mail settings folders reorderandlabels reorderset the order Proton’s apps show, naming the first ones or--alphabetical, and both listings come back in that order.mail settings settakesimage-proxy(Block email tracking),category-view,category-view-counters,font-face,font-size,block-sender-confirmationanddaily-notifications.- Mail listings and bulk verbs take
--has-attachments,--read, and--via ADDRESSfor mail that arrived at or left from one of your addresses, which--tomisses for Bcc, lists and catch-alls. Listings take--sort size. mail conversations update --expires DURATION|nevermakes whole threads delete themselves, or stops it, and listings mark mail that will with⧗in FLAGS andexpiresin JSON.calendar booking-pagesmakes a link anyone can open to book a time with you in the calendar you pick, Monday to Friday 09:00-17:00 unless--availablesays otherwise. Needs a paid plan.calendar settings linkspublishes a calendar as an.icsfeed anyone can follow, showing only busy times unless--access full, and lists, renames and revokes what has been handed out.calendar settings holidays listshows the public holidays calendars Proton offers, andcalendars create --holidays Austriaadds one.calendar settings calendars leavegives up a calendar somebody shared with you, andcalendars update --defaultmakes a calendar the default.calendar busy-times list EMAIL...shows when people are busy, over the next 7 days unless--afteror--beforesay otherwise. Needs a Duo, Family, Visionary or business plan.contacts createandupdatetake--photo: an image file,-or a web address.contacts emails listandupdateset how mail to each address goes ---email-format,--encrypt,--signand--scheme- andprotonsends it that way.- A contact keeps every note, organization, job title, role, nickname, language and time zone it holds: each flag repeats, and
updatehas a--clear-flag for each. drive photos albums shareanddrive photos shareshare an album or a single photo with people, anddrive photos linksmakes a public link for a photo. An album takes no public link.drive items abuse,drive items revisions abuseanddrive invitations abusereport to Proton something shared with you.--good-faithis required, and a report cannot be withdrawn.pass vaults hideandunhidekeep a vault out of your own listings, as the Pass app does.pass items excludeandincludetake a login out of Pass Monitor’s checks and put it back, anditems list --excludedlists those.pass items getshows when a Pass app last filled an item in, anditems list --sort usedorders by it.pass items update --simplelogin-noteand--clear-simplelogin-notechange an alias’s SimpleLogin note,--clear-display-nameremoves its display name, andpass aliases create --notegives a new alias a note.pass breaches resolvemarks an address’s breaches resolved, andenableanddisable --type proton|aliasswitch watching for every address of that kind on a paid plan;list --typefilters by it.
Changed
Section titled “Changed”- Breaking.
contacts keys pinandunpinarecontacts keys trustanduntrust, and reporttrustedanduntrusted. Their--schemeand--no-encryptarecontacts emails update --schemeand--encrypt off, andcontacts keys listdrops ENCRYPT and SCHEME. - Breaking. Contact JSON carries
nicknames,organizations,job_titles,roles,notes,languagesandtimezoneslists in place ofnickname,org,title,role,note,languageandtimezone. - Breaking. Mail sent outside Proton follows the account’s
signandpgp-schemesettings where a contact states none, so withsign onorpgp-scheme pgp-inlineit goes out signed that way. - Breaking.
calendar events createandevents importwithout--calendargo into your default calendar rather than the first one listed. - Breaking.
calendar settings calendars listhas a KIND column, a calendar shared with you issharedrather thanpersonal, and each command refuses what a calendar’s kind does not take - events into one you cannot write to, sharing one that is not yours. - Breaking.
--folderwith a category tab selects only mail still in the inbox, as the tab shows it.mail messages emptyrefuses a tab, inbox, drafts, sent, starred, archive, all and scheduled, andmove --intorefuses starred, drafts, sent, all, scheduled and snoozed. - Breaking. With
almost-all-mail on,--folder alland a bulk verb given no--folderleave spam and trash out. - Breaking.
settings set --output jsonreportsvalueas the wordsettook ("30d") rather than Proton’s number, in every app.remove-image-metadatatakesonoroff, andspam-actiontakesask. - Breaking. With
image-proxy on,mail messages getandconversations getprint links without their tracking, in text, html and JSON, and replies and forwards quote them that way.--render rawis the body as sent. - Breaking.
drive items share get --output jsonnames the item underrefrather thanpath. - Breaking.
pass breaches get --output jsonreports each breach’sstate(new,openorresolved) instead ofresolved. - Breaking.
account getshows only the display name under Name, and the username on a row of its own. - Breaking. Pass listings across vaults and
pass trash emptyleave out vaults hidden in the Pass app.--vaultstill reaches one, andpass exportstill backs it up. - Breaking.
pass items update --display-name ""is refused; use--clear-display-name. mail settings getshows every keysettakes, under the namesetknows it by.mail messages watchcovers starred mail, and with categories on, only the tabs that notify.mail messages update --expireskeeps an expiry the sender set and sets none in trash or spam, and says what it left alone.- Bulk mail verbs name each message or thread Proton refused, and count only what landed.
- A mail index built before this release is read again once: a filtered search says it has fallen behind until
index updateruns, which keeps the bodies. drive photos uploadleaves a photo the library already holds alone and printsNothing to uploadwith its ID; JSON carriesduplicate_of.drive invitations listnames what an invitation offers and what kind of thing it is.- A command that takes an address refuses anything but a bare address before signing in.
- Flags that contradict each other are refused as
--a and --b contradict each other.wherever they meet. --foldercompletes your own folders and labels, and--intocompletes folders in mail and vaults in Pass.- The published
openapi.yamldocuments the image proxy, lists the query parameters of every request, and gives optional fields their real type rather thanstring. Regenerate anything built from it.
Removed
Section titled “Removed”calendar settings set default-calendar. Usecalendar settings calendars update REF --default.mail settings set message-buttons, which no Proton app offers.member_countfrom calendar JSON, which only ever counted your own memberships.
- Changing your default address made
account login --userwith the old one exit4until the profile was signed out, and could break every command that asks for your password again. Any of the account’s addresses resumes the session. account login --dry-runsigned in for real. It previews and changes nothing.account sessions revokecould not revoke another session from a script. It takes--password-file, which Proton asks for.- A mistyped address on
mail settings addresses getandupdate,mail settings forwarding create,mail settings smtp-tokens createandpass settings domains update --catch-allacted on the account’s only address, or read as ambiguous. It is not found, exit3. mail messages unsubscribeonly ever sent Proton’s one-click request. It leaves by whichever of the three ways the list offers, says which, and refuses a list that offers none.mail settings folders create --parentandupdate --parenttook only an ID, though the example named a folder. They take a name or short ID, and--parent nonemoves a folder to the top level.- After a partly refused bulk change,
idsunder--output jsonlisted what was asked rather than what changed. Affects the bulk mail verbs,drive items trashanddelete,drive photos delete,drive volumes restoreandaccount keys reactivate. pass breaches listshowed most breached aliases as clean. Each count lands on its own row, and one that does not come back reads?rather than0.calendar settings calendars updatedropped the reminder given--remindor--remind-all-daybeside--no-remind. It refuses the pair.- An all-day event on a day the clocks change lasted
23hor25hrather than1d. - A mistyped
--attendeefailed as a bug. It is refused before signing in. - An upload over a capitalised name another Proton app wrote landed beside it instead of being refused, and
drive photos uploadcould recognise no photo Proton’s apps backed up. - A passphrase from
pass generate --wordscould hold one of four hyphenated words, so split on hyphens it read as more words than were asked for. pass vaults updatefinds a vault by its name, as its example shows.- An error naming something of yours keeps your spelling of its name.
Security
Section titled “Security”- A message signed by a key its owner marked compromised reads
Signature: invalid, and Pass invitations and forwardings no longer trust such a key.
[4.3.0] - 2026-09-22
Section titled “[4.3.0] - 2026-09-22”Highlights
Section titled “Highlights”- Your account’s own security settings - the password, two-password mode, an authenticator app, security keys, and recovery by email, phone or phrase are set from
proton account settings, andproton account security-logreads Proton’s record of the sign-ins. Every write reads its secrets from files, so an unattended script can make the change. - Search inside your files -
drive items list --keywordmatches what your text files say, not only what they are called, onceproton index create drivehas read them. - Messages behind a password -
proton mail protectedopens one from the terminal, its attachments and a reply included, and needs no account to do it. - Your own alias domain, and access tokens -
pass settings domainstakes a domain you own from its DNS entries to a working catch-all, andpass settings access-tokensmints a token that reads only the vaults it is handed.
account settingsreaches what Proton’s security page does:password set,second-passwordfor two-password mode,two-factorfor an authenticator app, andrecovery-email,recovery-phoneandrecovery-phrase. Each proves your current password and reads every secret from a file, so an unattended run can make the change; recovery codes and a recovery phrase are shown once and kept nowhere.account settings security-keysregisters a security key you plug in, renames it and removes it. Registering one used to mean going to the browser.account security-logreads Proton’s sign-in log, says whether it is recording and whether it keeps IP addresses, andsecurity-log deleteclears it. Nothing you do throughprotonappears in it: Proton records a sign-in from a named client, and this is not one.pass settings domainshandles an alias domain you own: add it, read every DNS entry it needs beside the verdict Proton last reached, choose the domain new aliases take, and once it is verified set its catch-all mailboxes, display name and random prefix. Needs a paid plan.pass settings access-tokensmints a token that reads the vaults it is handed and nothing else, for pass-cli or an agent working through it. The token is on the screen once, andaccess-tokens activitysays what it has done. Needs a paid plan.mail settings smtp-tokenslists, shows, creates and deletes the tokens a printer or another service sends mail with. A token sends from one custom domain address, which is the SMTP username, and it is on the screen once.mail protectedopens a password-protected message somebody sent you: read it, download its attachments and reply, named by the link that arrived or the id in it, with the password from a file or standard input. It needs no account.drive items list --keywordmatches what a text file says as well as what it is called, onceindex create drivehas read the text: up to 1 MB a file, with a PDF, an image or anything larger searchable by name alone. A drive index built before this holds no text untilindex delete driveandindex create driverebuild it.drive items download --recursivetakes a folder, which lands as a directory of its own name inside--dest-dir.
Changed
Section titled “Changed”- Breaking. A listing’s JSON key is one word, so
pass breaches list --output jsonkeys its rows underwatched_addressesrather thanwatched addresses. Every other collection is unaffected. - Breaking.
pass settings domains list --output jsonrows carrystatus,id,aliasesandcreatedin place ofmx_verified. - Breaking. The published
openapi.yamltakes Drive from Proton’s own Drive spec: 113 operations are back or newly there, albums and file revisions among them, and Drive’s operations are named the way Proton names them. Regenerate anything built from the spec. - A filtered Drive listing shows each item’s full path.
mail messages getcarries anExpiresline wherever Proton set one.- A password-protected link handed to
mail messages getsays which command opens it instead of failing to find it.
account keys reactivate --recovery-phrasefailed withPath not found. Those endpoints answer at Proton’s account host, and the CLI was asking the host Mail is served from.- Proton temporarily limiting an account exited
4, which a script reads as an ambiguous reference. It exits5, the code to wait and retry on.
[4.2.3] - 2026-09-18
Section titled “[4.2.3] - 2026-09-18”- A calendar this account cannot open stopped taking in changes after the first one, so a search over it answered as of the build. It keeps up now, each event indexed by the day and time Proton keeps in the clear.
index listcounted a calendar’s unreadable events again every time the calendar was read, so the number grew past what the index holds. It counts what is in the index.
[4.2.2] - 2026-09-17
Section titled “[4.2.2] - 2026-09-17”- A message that arrived or was edited while its body could not be fetched was missing from every indexed listing until the mailbox was read again. It is indexed by its envelope, and the next run fetches the body.
- A page of changes the index could not apply was skipped for good - by
index watch, and on disk byindex updatefor a calendar. It is asked for again. - A Drive index whose files a password reset had moved to a new volume read the whole tree on every run and never caught up. It follows the files to the new volume.
- A damaged record in an index took every record after it along, without a word, and the index still called itself complete. What survives is kept, and the app is read again for the rest.
index listsaid0 bodiesfor a mail index built before 4.2.1 untilindex createorindex updateran. Any command that opens the index puts the count right, a search included.- A Drive or calendar listing answered from an index that its own catch-up had just found wanting. It reads Proton until the index is brought up to date.
- Contact writes -
contacts update,contacts merge,contacts keys pinandunpin- failed about two in five times when run back to back, as though the card had been wrong. Proton was refusing the pace; they wait it out. mail messages emptyandmail settings filters applywere refused while Proton was still finishing an earlier job on the mailbox. They wait for it, up to a minute.mail messages emptyreported emptying one message, a number it never had. It names the folder or label, and--output jsoncarriesfolderorlabelaskindrather thanmessage.
[4.2.1] - 2026-09-17
Section titled “[4.2.1] - 2026-09-17”Changed
Section titled “Changed”- Mail is indexed in two passes: every message first, then the bodies newest first. A filtered listing such as
--unread,--fromor--afteris answered from the index minutes into a build rather than after the hours the bodies take, and a--keywordsearch says how many bodies it has read while the rest arrive.index listnames both counts, and--output jsoncarriesbodies. index watchfinishes a build that was interrupted, and reads an app again where Proton could not say what changed. It still indexes nothing that has no index.
- Downloading from or uploading into a share link failed with
Path not found. Proton retired the endpoints behind--linkand--shared. - An index went on reporting itself complete after Proton could not describe what had changed, silently missing whatever happened in the gap.
index createandindex updateread the app again and take out what is gone, and a search says the index has fallen behind until they do. - A message whose text changed, a draft being written among them, kept its old text in the index.
- A file uploaded together with its folder was indexed at the top of Drive rather than inside it, and stayed there.
- Items inside a trashed or deleted folder stayed in an indexed listing.
- A calendar this account cannot open was missing from an indexed search without a word. Its events go in by their times and are counted under UNREADABLE, and a calendar that could not be read leaves the build unfinished rather than claiming to hold it.
- A
--keywordmatched every message of a thread when one of them quoted the word. - A reference beginning with
-, which about one ID in sixty-four does, was refused by the command that had just printed it. index update --output jsoncalled one entry anentrie.
[4.2.0] - 2026-09-17
Section titled “[4.2.0] - 2026-09-17”proton indexkeeps an encrypted copy of your mail, files and events under~/.config/proton-cli/index/, and a search reads it once it exists:--keywordreaches message bodies,--fromand--tomatch display names, a Drive--patternis answered without opening every folder, and an event is found by what it says. A build can be stopped and resumed,index updateandindex watchkeep it current, andindex deletetakes it off the machine. Proton’s search operators stop applying to an indexed search, which matches every term literally.
calendar events listandevents exporttake any date range. Proton refuses a window wider than a few months, so a semester failed outright; the range is fetched six weeks at a time and the answers joined.- A calendar that cannot be read is reported under the listing or export rather than leaving it short without a word, and an export says which events it could not decrypt.
- A starred mail listing returned a short page with a count that included the messages it had dropped.
--starrednarrows before paging. pass trash list,pass trash restore --allandpass trash emptyalways came back empty, however much was in the trash.
[4.1.0] - 2026-09-15
Section titled “[4.1.0] - 2026-09-15”Changed
Section titled “Changed”- Breaking. A calendar listing given one end of its range takes the other 30 days away from it, rather than always ending 30 days from today.
calendar events list --after 2027-01-01lists that January instead of nothing, and--after 2020-01-01lists January 2020 rather than everything since.events exportandreminders listread the same way. - Breaking. A mail listing refuses
--beforeearlier than--after, as a calendar listing already did. It used to return an empty listing and exit0. - A malformed
--afteror--beforeon a mail listing is refused before signing in, as--after expects YYYY-MM-DD.rather than as Go’s own parse error.
calendar events listandevents exportsaid to narrow the range with--startand--end; the flags are--afterand--before. All three calendar listings now state their default range as well.mail messages reply --helpdescribed--all; the flag is--everyone.pass items totpon an item with no two-factor secret said to store one with--totp-uri, which no longer exists. It names--secret-file totp-uri=FILE, and so does the refusal of a secret no code can come out of.
Security
Section titled “Security”- The diagnostic log no longer keeps the name of a Pass item, vault, attachment or Drive file written into a failure.
proton reportstands<name>in its place.
[4.0.0] - 2026-09-15
Section titled “[4.0.0] - 2026-09-15”pass breacheswatches an address for leaks: the account’s own addresses and the hide-my-email aliases in your vaults are listed beside each other, and an address you own elsewhere can be added, verified, paused and removed.pass items list --risk compromised|missing-2fa|reused|weakis the password half; onlycompromisedreaches the network, sending six characters of a password’s SHA-1 and never the password.drive items share addandpass vaults|items share addtake an address with no Proton account. Proton emails an invitation,share getsays who is ready, andshare confirmhands the key over once they have joined.update,removeandresendreach the held offers too.mail settings domainshandles a custom domain: add one, read every DNS entry it needs beside the verdict Proton’s last check reached, point stray mail at a catch-all address, and give the domain up. Needs a paid Mail plan.pass items passkeys listandpasskeys deleteshow what a login signs in with and take one off. A login whose only way in is a passkey no longer reads as a login with nothing in it.
Changed
Section titled “Changed”- Breaking. One name per idea across the tree:
--page-sizeis--limit,--editis--access viewer|editor,--move-tois--into,--plainis--html=false,--messageonmail settings autoreply setis--body,--clear-catch-allis--catch-all none, andupdate’s--checkand--reinstallare--dry-runand--force. - Breaking. A Pass vault’s
--iconand--colortake Pass’s names rather than numbers:--icon star --color teal. - Breaking. Calendar listings take
--afterand--beforerather than--startand--end, both days included and read in your working zone. Mail’s--beforenow includes its own day too. - Breaking. One command per idea:
mail messages expireismail messages update --expires,drive items share linkandunlinkare thedrive linkscollection,mail settings senders forgetisremove, andcalendar settings calendars share listisshare get. - Breaking.
contacts groupsandcontacts keystake an address as an argument rather than--email.
Removed
Section titled “Removed”- Every
--…-stdinflag. The matching--…-filetakes-for standard input. pass aliases options.pass settings domains listandpass settings mailboxes listsay the same.
- A listing the CLI pages itself answers whole unless a page is asked for.
pass aliases listreported fewer aliases than the account holds, which read as a short answer rather than a wrong one. curl … | sh -s -- --helpprints the help instead of failing with an awk error - the one flow the script’s own header documents.- An installed binary that cannot run on the machine fails the install and shows what the program said, instead of reporting success with the version silently missing.
- The install script’s
wgetfallback gives up as quickly as itscurlpath rather than retrying for a quarter of an hour.
[3.8.0] - 2026-09-13
Section titled “[3.8.0] - 2026-09-13”pass importreads exports from sixteen password managers, and--managernames which one wrote the file.pass export --format csv|jsonwrites the two flat shapes beside the archive.- Files go on a Pass item with
--attachand--detach, andpass items attachmentslists, downloads, renames and restores them. They need a paid Pass plan, and a backup carries them both ways. - A message Proton distrusts carries
phishing,suspiciousordmarc_failedin a listing and a read.mail messages mark legitimateandmark phishinganswer a verdict. account keys reactivateopens the keys a password reset locked, with the previous password, a recovery phrase or a recovery file.drive volumes list,restoreanddeletehandle the Drive volume the same reset locked.
Changed
Section titled “Changed”- Data sealed to a key a password reset locked says so and names the remedy, instead of failing as a bug worth reporting.
- A message that will not decrypt fails the read rather than printing
(decryption failed)where the body goes. A thread drops that message and warns, an export keeps the armour, and a reply refuses rather than quoting ciphertext. - Every Drive command works in the active volume rather than whichever one Proton lists first.
- Both attachment download commands take an attachment’s own name, not only its ID.
- YAML is rendered from the JSON, so
apikeeps Proton’s key order and an integer too wide forint64.
- A Pass backup restores with its dates, its trash and its alias addresses intact, and an export carries trashed items.
- An archive too large to read says so, instead of being reported as a file some other password manager wrote.
- Prompts are no longer padded to a common column.
Security
Section titled “Security”- A raw
proton apirequest counts as a deletion whichever method it carries, soPROTON_CONFIRM='deletions=deny'covers it. Proton deletes withPUTas well asDELETE, so a fence reading the method never held. That policy now turnsproton apioff entirely, reads included. - An export written with
--forceis private whatever the permissions of the file it replaced. Files are published by rename, so a destination cannot be swapped for a symlink between the moment it is checked and the moment it is written. - Text from a message can no longer drive your terminal. On a terminal only
proton’s own styling is passed through and anything else is shown; redirected and piped output carries its bytes exactly. - The log
proton reportcollects no longer keeps an address written into a warning, or the name of a Pass item written into an error. - Release artifacts are built from actions pinned to commits rather than moveable tags, and only from a commit the checks ran on.
[3.7.0] - 2026-09-10
Section titled “[3.7.0] - 2026-09-10”drive items list,getanddownloadtake--link URL, opening a public link somebody sent you - with no Proton account at all, if you have none.drive shared addkeeps a link so--shared REFopens it later, andshared removeforgets one.--computer NAMEworks inside a computer syncing through the Drive desktop app, and--shared REFinside an item somebody shared with you. A path still means what it always meant; the flag says which tree it is in.drive items uploadanditems createtake--linkand--shared, putting a file or folder into somebody’s link. Signed in, the upload names your address; with no account it names nobody. A link that allows viewing only says so before anything is planned, and--if-exists replaceis refused there because a link takes no new revisions.drive items updateanditems deletework inside a link on what you uploaded there yourself, for an hour, signed in. A link has no trash, so a folder goes with everything in it.drive shared leavegives up an item somebody shared with you directly. Only a new invitation brings it back.mail settings addresses create,disable,enableanddelete. A new address is given its first key; the keys of an address that has them are never touched. Proton asks for your password, so they take--password-fileand--password-stdin.mail settings addresses create alice@pm.meturns on the account’s short-domain address, andaddresses reordermakes an address the default - name the ones that should come first, and the rest keep their order.mail settings forwarding acceptanddeclineanswer a forwarding somebody sent you, anddelete,disable,enableandresendhandle one in either direction.pass settings extra-password get,enableanddisable, which the Pass app offers under Settings. Enabling stores a verifier and never the password; disabling proves the current one first.
Changed
Section titled “Changed”- Forwarding one of your addresses outside Proton costs that address its end-to-end encryption.
forwarding createsays so before it acts, and taking the last one down turns encryption back on. - Every file uploaded to Drive now carries its own encrypted record of itself - size, block sizes, modification time and SHA-1 - so uploads report a checksum and other clients show the real modification date.
- A command that is waiting shows a sign of life on stderr after a tenth of a second, taken back by the first byte of the answer, so one that has printed nothing no longer looks hung.
- A wait for Proton to answer, or to stop rate limiting, is a sentence with the delay in it rather than a log record.
- A wrong number of arguments is refused by the name the usage line shows, with a working example to copy.
proton help <command>shows the screen--helpshows, and--helpafter a word the command tree does not hold is refused rather than answering with the parent’s.- Reading
-from a terminal says so and names the key that ends it, and a second Ctrl-C ends a run that did not stop on the first. drive shared listsays what each row lets you do, anddrive items getsays whether a link allows editing and names you on your own uploads into one. An item read through a link reports no author, which is all Proton serves there.
- Sending mail and creating Drive share links from an address that has ever accepted a forwarding. Everything leaving the address was encrypted to every key it holds, and a forwarding key carries no encryption key at all, so the send failed outright and told you to file a report. Affects any account whose address holds one, however the forwarding was accepted.
mail settings forwarding createwas refused by Proton every time. The key it published was not shaped like the ones Proton’s own clients write.- A session refresh that never reached Proton exits
5rather than telling you to sign in again over a network that was down. - A dry run of
drive items upload --if-existsfailed as a bug, and an upload destination that turns out to be a file now reads as a mistake rather than a bug. - Six
settings setexamples in--helpnamed keys that do not exist, mailsignatureand driverevision-retentionamong them.
[3.6.0] - 2026-09-07
Section titled “[3.6.0] - 2026-09-07”Changed
Section titled “Changed”- Breaking.
--page-size 0on a mail listing returns the whole folder rather than the first 25, and a size above 150 is filled rather than cut short. Affectsmail messages list,mail conversations listandmail drafts list. - Breaking.
--limit 0on a mail bulk verb lifts the cap rather than acting on the first 25; the default is still 150. - Breaking. A negative
--page,--page-sizeor--limitis refused, as is--pagebeside--page-size 0. - A mail bulk verb’s dry run and confirmation say when the selection filled
--limitand more may exist. proton skillstates what the commands do and leaves how an agent should behave to you - whether it asks before a change is yours to set. It now covers paging and how an all-day event’s dates read.
pass items revisions listandrevisions getreached only an item’s 50 most recent revisions.
[3.5.0] - 2026-09-05
Section titled “[3.5.0] - 2026-09-05”proton skillprints the instructions an AI agent reads before using proton: what it is for, how to name things, which filters a listing takes, and to preview a change and ask before making it. It is written from the installed build, so it names exactly the commands you have.--body-onlyleaves the frontmatter off, for an agent that reads it as it runs rather than from a saved file.
[3.4.0] - 2026-09-05
Section titled “[3.4.0] - 2026-09-05”calendar events createandupdatetake--color, giving one event a colour of its own by accent name or hex;events getreports it. It colours what the reference names: one occurrence,--onwardsfor that one and every later one, or the whole series. A colour can only be changed, never taken off, and Proton’s own apps draw a per-event colour only on a paid plan.calendar events exportcarries an event’s own colour as aCOLORproperty, andimportreads one back as the nearest of Proton’s twenty accents, so a round trip keeps it.contacts exportwrites each address’s groups asCATEGORIES, andcontacts importfiles addresses into the groups a card names, creating any you do not have.--no-groupsleaves them out.--force-color, orFORCE_COLOR, paints even when the output is piped: a pager, a multiplexer, a CI log that renders the escapes itself.
Changed
Section titled “Changed”- Breaking. What you write decides whether a calendar event has a time of day.
events create --start 2026-07-01needs--all-dayto agree, and--all-daybeside a time of day or a duration under a day is refused.events update --startwith a bare day moves the event and keeps its time of day instead of dropping it to midnight;--all-day=falsegives one back, with a--startsaying which time. - Breaking.
--endon an all-day event is the last day it runs through, not the midnight after it. A script that added a day to compensate now books one day too many. - Breaking.
calendar events createwith neither--endnor--durationlasts as long as its calendar says a new event lasts, rather than a fixed hour.calendar settings calendars getshows that length. - Sending stops when a recipient’s contact cannot be read, instead of encrypting to whatever key Proton hands back. A contact that will not open cannot say whether it pins a key. Affects
mail messages send,reply,forwardandmail drafts send. - Every change says when the run could not read part of what it acted on - in the confirmation, the dry run, the result, and as
skippedunder--output json- the way a listing already does. contacts update,merge,keys pinandunpinsave over a card whose signature does not verify and say so.updaterefused outright and the others said nothing; a detached signature cannot tell tampering from a retired key.calendar settings calendars getandcontacts groups getshow a colour as its swatch and name, which their listings already did.
- An all-day calendar event could not be given a time of day back: a
--startnaming one was accepted, discarded, and reported as a success. - Colour in a Windows console. Nothing there sets
TERM, so every screen was drawn plain. pass invitations accepttook the server’s word for who sent an offer. The key an offer carries is now checked against the keys Proton publishes for the address it names as sender, and one nobody signed is refused;pass invitations listleaves a vault’s name blank rather than reading it from such a key.- A vault key written here is sealed to your primary user key alone, as Proton’s own client seals it. Every key the account ever had could open one created or accepted before, retired ones included.
[3.3.1] - 2026-09-04
Section titled “[3.3.1] - 2026-09-04”contacts create,update,importandmergewere refused withInvalid PGP packetson an account holding more than one user key. A contact card is now sealed to your primary user key alone, which is what Proton’s own clients send.contacts updateandcontacts mergeadded a second copy of the address and of every pinned key each time they ran.contacts exportandcontacts keys listshowed one copy per past edit; runningcontacts updateon an affected contact once more clears it.mail settings autoreply enableanddisabletake--password-file,--password-stdinand--totp. Proton guards the switch whichever way it goes, so both failed outside a terminal.
[3.3.0] - 2026-09-04
Section titled “[3.3.0] - 2026-09-04”proton mail settings forwardinghands mail arriving at one of your addresses to another Proton account, end-to-end encrypted:list,get,create,delete,enable,disable,resend. Accepting a forwarding somebody sent you is not built - that happens in a Proton client.
Changed
Section titled “Changed”- An account or recipient using post-quantum encryption now works instead of exiting
8. Signing in, sending, and sharing a calendar, file or vault all read Proton’s ML-DSA and ML-KEM keys.protonstill never creates one. - Sharing with an address outside Proton exits
1with a sentence naming the address, instead of4carrying Proton’s own error. Affectscalendar settings calendars share add,pass vaults share addanddrive items share add. proton reportlinks the bug form directly and no longer asks in its own words for what the form already asks for.proton reportsays where your settings came from rather than the file’s path, which holds your home directory.
Removed
Section titled “Removed”- The
go installrow from the install instructions. It resolved to a version from before the command moved and installed nothing; use a package manager, the install script or a release binary.
- Sharing with a Proton address whose key this build cannot read says so, instead of calling it an address outside Proton.
proton reportcarries the whole run. A report of a listing that made 750 requests held two lines. A run too large for an issue form is trimmed to its first and last records plus everything above debug between them, and says how many it left out;--destwrites all of it.proton reportruns on the defaults when the config file is too broken to parse, and says what was wrong with it. It was the one command that could not run in exactly the situation worth reporting.
[3.2.0] - 2026-09-03
Section titled “[3.2.0] - 2026-09-03”- Tab completion offers back what your listings showed: where a command takes a reference, the short ID and the subject, name or address beside it. It reads what this machine remembers rather than asking Proton, so a collection you have not listed yet offers nothing and says which listing would fill it.
- Exit code
8means the command reached a Proton feature this build does not implement. Nothing about the command was wrong, and neither a retry nor different arguments changes the answer.
Changed
Section titled “Changed”- A short ID printed by a
getresolves in the next command. Only what a listing showed was remembered before. - An account or recipient whose keys use post-quantum encryption says so and exits
8. Signing in to such an account failed as a wrong password, and sending to one as an unreadable key.
[3.1.0] - 2026-09-03
Section titled “[3.1.0] - 2026-09-03”proton reportprints what a bug report needs: the build, your settings and a redacted trace of the run that failed. It needs no account and no network.--alltakes every run still kept,--destwrites a file to attach.- Every run records what it did to
~/.config/proton-cli/logs/, one file per day, whatever--log-levelsays. Addresses, IDs and filenames are replaced by stand-ins before anything is written, so a log is safe to attach to an issue. The last 16 files are kept;--no-log,PROTON_NO_LOGorno-log:in the config file writes none. - Exit code
7means the failure is a bug in proton rather than something you typed. Every failure you can act on keeps the code it had.
Changed
Section titled “Changed”- A crash prints one line pointing at
proton reportinstead of a Go stack trace. - Refusals that arrived as bare text now say what to do: a pinned key that does not match the recipient’s, an inline attachment with no
--html, a reply to a message with no reply address, an unknownpass items create --type, an alias in a Pass import, and a--remindthat is not a warning time. uninstall --purgealso removes the diagnostic log.
- A listing that cannot decrypt something says how many are missing instead of dropping them in silence, and
--output jsoncarries askippedcount. - “Failed to unlock any address keys.” now says which of four things went wrong, and the log records it per key.
--log-level debugshows what Mail, Drive, Calendar, Contacts and Pass log while they work. It never showed those lines before.
[3.0.0] - 2026-09-02
Section titled “[3.0.0] - 2026-09-02”- A config file.
~/.config/proton-cli/config.yamlholds what you would otherwise retype on every command or export as its own variable -output,profile,zone,quiet,log-leveland the rest - with aper-profile:section for narrowing one to an account. It does not exist until you write it, and a key it does not recognise is an error rather than a line quietly ignored.--configandPROTON_CONFIGread a different one. - A confirmation policy says what
protonmust stop for and what it must not do at all:--confirm,PROTON_CONFIRM, orconfirm:in the config file, scoped as narrowly as one command. A denied command exits6and nothing answers it - not--yes, not--dry-run, not a--confirmon the command line. Nothing you can write makesprotonless careful than it is with no configuration at all. - Pass protected with an extra password can be reached at all: the first
passcommand asks for it, and Proton then lets the session reach Pass for as long as it lives.account login --extra-password-fileor--extra-password-stdinhands it over for a run with nobody to ask. pass items share add|get|remove|updateshares one item and leaves the vault around it alone: what travels is the item’s own key, so they can open that item and nothing else.pass vaults share updatechanges what somebody may do with a vault, andpass vaults transfermakes a member the owner of it.pass shared listshows the items other people share with you,pass sharing listthe ones you share. An item shared with you is in no vault of yours, soitems listnever had it.pass items move REF --into VAULTputs an item in another vault, keeping its history. It gets a new ID, which the command prints.pass items revisions get REF REVISIONreads an earlier version back in full, andpass links get REFprints a link’s whole URL.pass generate --words Nmakes a passphrase from Proton’s own wordlist, and--generate-passwordonpass items create|updatemakes the password on your machine and prints it beside the new ID, so a new login needs no file to read from.--zone, andTZbeside it, set the one zone a run works in: what a written time means, what a listing prints, what an event is anchored to. Every event created or re-timed says which zone that was.drive trash listshows each item’s name and when it was trashed, and sorts and pages like any other listing:--sort name|size|trashed,--desc,--page,--page-size.--expires neverremoves an expiry, on a public link and on a message.- The changelog and a browsable Proton API reference are on the site. The reference is generated from the same
openapi.yamlthe repository holds, served at proton-cli.lerchster.dev/openapi.yaml for a code generator or an HTTP client to read.
Changed
Section titled “Changed”- Breaking.
--outputmeans the response format on every command. The commands that write bytes to disk take--destand--dest-dirfor where they go - everydownload, plusmail messages export,contacts export,calendar events exportandpass export. A script passing a path to--outputnow fails, naming the three formats it accepts. - Breaking. A secret is never a flag value.
pass items create|updateno longer take--password,--totp-uri,--totp-field,--hidden,--number,--cvv,--pinor--private-key; use--secret-file NAME=FILE,--secret-stdin NAMEor--generate-password.drive items share link --passwordis now--link-password-file/--link-password-stdin, with--clear-link-passwordto take one off.--eo-passwordonmail messages send,reply,forwardanddrafts sendis now--eo-password-file/--eo-password-stdin. - Breaking. No Pass listing carries a secret, in any format.
items list,aliases list,trash listandshared listused to print every password in the account under--output json; read one withitems get,items revisions getorlinks get. - Breaking.
--futureis now--onwards, oncalendar events updateandcalendar events delete. - Breaking.
pass vaults share listis nowpass vaults share get, and answers one record rather than a list. - Breaking.
pass exportholds the vaults you own, as Proton’s own export does. A vault somebody shared with you is theirs to back up; the command says on stderr how much it left out. - Breaking. An empty list under
--output jsonand--output yamlis[]rather than a missing key, sojq '.attendees[]'iterates nothing instead of failing onnull. - Breaking. A timed event whose zone cannot be named is refused rather than stored without one, and a clock reading that names two instants or none - the four hours a year the clocks move - needs an explicit offset instead of being settled in silence.
02:30on a spring morning used to be stored as03:30. - An occurrence count is exact or it is not given. “Every weekday forever” reported a thousand occurrences and deleting a series reported two hundred, both of them the cap the walk stopped at;
occurrence_countis now absent where there is no number, and a change reaching a whole series shows what it would touch first. - A filtered
drive items trash|delete|move|copysends fifty items to a request rather than one, so a large selection finishes in a fraction of the round trips.
drive trash listshows everythingdrive trash emptydeletes. Trashed photos sit on a volume of their own and were missing from the listing whileemptydestroyed them anyway, so the number you confirmed was not the number that went.- A filtered Drive command counts a folder and the files inside it once rather than twice - a folder is trashed, deleted, moved and copied whole - and names what Proton refused rather than reporting the count it hoped for.
proton apikeeps stdout for the response. A proxy’s HTML error page standing in for the API’s answer arrived on stdout with exit0, so ajqdownstream broke while the pipeline looked like it had worked; it goes to stderr now and exits5.mail settings autoreply setrefuses a schedule its--repeatmode does not allow before it reports anything, so--dry-runno longer predicts a change the real run would be refused for.drive items downloadrefuses a path that already exists before the transfer rather than after it.
Security
Section titled “Security”- A failed Drive block transfer no longer quotes the signed storage URL it was talking to. That URL is a credential for the block it names, and it was landing in error text that gets logged and pasted into issues. A redirect off the host Proton named is no longer followed with the storage token in hand.
[2.10.0] - 2026-08-31
Section titled “[2.10.0] - 2026-08-31”- Signing in with a security key. An account with one is asked to touch it, and one that also has an authenticator app reaches for the key when the code prompt is answered with nothing. The same answer satisfies the re-authentication guarding
calendar settings calendars delete,mail messages expireandmail settings autoreply set, which an account with only a key could not give before. - A CAPTCHA can be solved on any device.
protonprints the page, opens it in your browser where it can, and waits while you solve it - here, on your phone, anywhere. A machine with no display signs in like any other. --verified TOKENandPROTON_VERIFIEDcarry a verification solved out of band, for a run that cannot wait for one. A run that may not ask ---no-input, or no terminal - now prints the page and the token to repeat the command with, so a scheduled job can hand the link to a person and try again.
Changed
Section titled “Changed”- A CAPTCHA opens in your own browser rather than a window
protondraws. Nothing to install on Linux:libwebkit2gtk,libgtk-3andglib-networkingare no longer needed, the.deband.rpmpackages no longer depend on GTK or WebKit, and ago installbuild verifies exactly as a release binary does.
Removed
Section titled “Removed”- The embedded CAPTCHA webview helper, and
PROTON_HV_HELPERwith it. Your browser does the job and there is no helper left to point at.
[2.9.0] - 2026-08-31
Section titled “[2.9.0] - 2026-08-31”- Accounts in Proton’s two-password mode can be used at all:
account loginasks for the second password once the sign-in is through, or reads it from--second-password-fileor--second-password-stdin. Such an account used to sign in and then fail on every key it tried to open. account settings getsays whether an account keeps the password that signs it in apart from the one that opens its data, as aTwo-Password Moderow and astwo_password_mode.- Every command, argument and flag has a reference page at proton-cli.lerchster.dev, generated from the same command tree
--helpprints from.
Changed
Section titled “Changed”- A
--helpscreen ends with a link to that command’s page instead of repeating the global flags, which are listed onproton --helpalone. - A short ID starts after the dash an ID may begin with, so nothing a listing shortens can be read as a flag when it is pasted back. About one ID in sixty-four begins with one, and a short ID copied for such a thing before this release needs listing again.
- Keys that do not open name the secret that was refused -
Incorrect second password.in two-password mode - rather than coming out as a decryption failure. - An ambiguous reference lists its candidates as short IDs, unless shortening them would print the same token twice.
- Installing an older version from the APT repository works again: it carries the last ten releases rather than only the newest, so
apt install proton-cli=2.8.0and a rollback find something to install. - The key password kept with a session is a cache: one that has stopped opening the keys is worked out again instead of leaving a profile that decrypts nothing, which is what a password changed elsewhere used to leave behind. Signing in drops the one a previous session left, so
account getno longer calls such a profile unlocked. - A command that needs your password but takes no
--password-filepoints atproton account login, instead of naming a flag it would reject.
[2.8.0] - 2026-08-28
Section titled “[2.8.0] - 2026-08-28”- Messages say which thread they belong to:
conversation_idis on every message under--output jsonand--output yaml, frommail messages list,watchandget. Acting on the whole thread no longer costs a second lookup.
Changed
Section titled “Changed”calendar reminders listandcalendar reminders watchreport the event a reminder warns about in full - its location, description, attendees and the rest sit on the row besidefires,remindandsays.reminders listgains aLOCATIONcolumn, so a script reading that text output by column position will shift.
- Signing in survives a bad moment at Proton’s edge: a 502 or a dropped connection is waited out and asked again, instead of coming out as a complaint about JSON and exit
1. Only what spends nothing is ever asked twice - a two-factor code least of all. - A sign-in refused for a wrong password or two-factor code exits
2, and one that outlasts the waiting - a rate limit included - exits5, so a scheduled job can tell “fix the password” from “come back later”.
[2.7.0] - 2026-08-27
Section titled “[2.7.0] - 2026-08-27”mail messages watchprints a line the moment a message arrives and stays attached until you stop it. Without--folderit covers the inbox and every folder set to notify, and a thread coming back from snooze counts as arriving.calendar reminders listsays which reminders fall due between two dates, andcalendar reminders watchprints each one at the second it is due. When a reminder fires is Proton’s own answer, so an all-day event reminds at the hour its calendar chose rather than at midnight.--notifyonmail settings folders createandmail settings folders updatesays whether mail landing in a folder is worth being told about. It is whatmail messages watchcovers when you name no folder.- A watch’s output is a line per thing rather than a collection: under
--output jsoneach line is one object instead of an envelope with a count, and under--output yamleach thing is its own document. Stopping one with Ctrl+C or SIGTERM exits0.
Changed
Section titled “Changed”mail settings folders listshows aNOTIFYcolumn, and a folder carriesnotifyin JSON. A script reading that text output by column position will shift.
[2.6.0] - 2026-08-26
Section titled “[2.6.0] - 2026-08-26”- Calendar sharing:
calendar settings calendars share add|list|removehands a calendar to another Proton account, andcalendar invitations list|accept|declineis the other side of it. calendar settings calendars create --urlsubscribes to a calendar published elsewhere, andcalendar settings calendars getshows one in full.calendar events exportandcalendar events import PATHread and write.icsfiles. An import is addressed by each event’s UID, so exporting, editing and importing back is a restore rather than a second copy.- Events take
--end,--status, optional attendees, and reminders that email rather than notify. contacts exportandcontacts import PATHread and write vCard files, addressed by UID the same way.contacts mergefolds duplicate contacts into one, andcontacts groups getshows which addresses are in a group.- Contact values can say what kind they are -
--email work:jane@acme.com- and eleven more fields are settable, among them the organization, the title and the birthday. - Vault sharing:
pass vaults share add|list|removeandpass invitations list|accept|decline. pass exportandpass import PATHwrite and read a Proton Pass archive, the same zip the web client produces. Without a passphrase the archive is not encrypted, and says so as it writes.pass links create|list|revokeshows one item to somebody without a Proton account, for a while or a number of views.pass breaches list|getreports which of your addresses have turned up in somebody else’s data breach.pass aliases contacts create|list|block|allow|deletegives an alias an address per correspondent, so a reply leaves as the alias instead of the mailbox behind it.pass settings mailboxes list|create|verify|resend|update|deletemanages where aliases forward, andpass settings domains listshows what an alias can be made on.pass items revisions list,pass items pin|unpin,pass items totp,pass vaults get, andpass generatefor a password.- Items take custom sections:
--field SECTION/NAME=VALUE,--hiddenfor a secret one, and--totp-fieldfor a second code. An identity takes all 31 of its fields, not 13. pass vaults createandupdatetake--description,--iconand--color.mail settings filters create --if "subject contains invoice" --move-to Archivedescribes a filter in conditions and actions and lets Proton write the Sieve;--sievestill takes a script of your own.filters getshows an existing one in the same words, andfilters updaterewrites a rule in place, keeping its position in the order.mail settings filters applyruns filters over mail already in the mailbox, andfilters reordersets the order they run in.mail settings senders list|block|allow|spam|forgetmanages the block and allow lists.mail conversations snooze|unsnoozetakes a thread out of the inbox until a time you choose, andsnoozedis addressable wherever a folder is - as are the categories Proton sorts into:social,promotions,newsletters,transactionsandupdates.mail messages expiremakes a message delete itself later,mail messages unsubscribeasks a mailing list to stop, andmail messages empty --folderempties a folder outright.- Five more mail settings:
next-message-on-move,pgp-scheme,remove-image-metadata,right-to-leftandspam-action. drive shared listshows what other people have shared with you anddrive sharing listwhat you have shared.drive items share update|resendchanges or resends an invitation, anddrive photos albums update --coversets an album’s cover.PROTON_HV_HELPERnames a CAPTCHA helper to run instead of the built-in one, which is what lets ago installbuild verify at all.--passphrase-fileand--passphrase-stdinhand over a passphrase without putting it in the command line.
Changed
Section titled “Changed”- Breaking.
mail messages searchandmail conversations searchare gone.mail messages listandmail conversations listtake the same filters; they were always one request to Proton. - Breaking.
drive folders createis nowdrive items create, anddrive share ...is nowdrive items share .... Update any scripts that call them. - The CAPTCHA window works on a Nix install. It opened blank saying “TLS support is not available”, because nothing supplied the TLS backend GIO loads as a module.
contacts createreports Proton’s refusal instead of exiting0having written nothing. Proton answers inside a successful response, and only the response was being read.contacts groups addputs every one of a contact’s addresses in the group, as it always said it would, and--emailacts on the address you named rather than one that happens to belong to another contact.pass aliases optionslists the domain an alias can be made on rather than a whole suffix. Proton mints the word in front of it afresh on every request, so what was listed had already stopped working by the time it could be typed back.drive photos albums createprints the new album’s ID instead of nothing.
[2.5.0] - 2026-08-17
Section titled “[2.5.0] - 2026-08-17”- An install no package manager owns says when a release lands: once a day, under the command’s own output.
PROTON_NO_UPDATE_CHECK=1ends it, and a package-managed copy, a pipe and--quietnever see it. proton changelogsays what a release changed, including one you have not installed.--sinceand--untilcover the ground between two.- Windows on ARM64 has its own build. winget, npm, the PowerShell installer and
proton updatehand an ARM64 machine a native binary; npm had none for it at all.
Changed
Section titled “Changed”update --dry-runanduninstall --dry-runno longer ask you to sign in: they change this machine, not your account.
- Tab completion answers again - every shell’s completion script was being refused as a mistyped command.
[2.4.1] - 2026-08-16
Section titled “[2.4.1] - 2026-08-16”Changed
Section titled “Changed”drive items upload --recursivesends a deep tree in fewer round trips.
drive folders create /a/b/cmakes the folders abovecinstead of failing, and says how many it made.drive folders createnames the file standing in the path instead of failing withLink has no hash key.
[2.4.0] - 2026-08-16
Section titled “[2.4.0] - 2026-08-16”Changed
Section titled “Changed”- The command is
proton.proton-clistays on yourPATHas a second name, so nothing already written breaks and upgrading does not sign you out. - Breaking.
go install github.com/roman-16/proton-cli/cmd/proton@latest- the path gained/cmd/proton. Every other way of installing is unchanged. - Colours are asked for by name, so output follows your terminal’s theme instead of overruling it. Swatches keep their exact colour.
[2.3.0] - 2026-08-15
Section titled “[2.3.0] - 2026-08-15”drive items revisions download PATH REVISION_REFreads an earlier version out to disk or into a pipe, leaving the file as it is.drive items revisions delete PATH REVISION_REFremoves an earlier version permanently.pass aliases disable REFandpass aliases enable REFstop and start an alias receiving mail without burning the address.--if-exists replace|rename|skipondrive items uploadanswers a name Drive already has: a new revision, both under a numbered name, or nothing. Without it an upload still refuses.pass items getandpass items updatehandle aliases as themselves: the address, whether it is on, where it forwards,--mailboxand--display-name.pass aliases createprints the address Proton made, since it adds a word to your prefix.- Single-letter forms for the global flags:
-p,-o,-n,-q,-y. They cluster, so-qnis a quiet dry run. - A caveat prints as its own
!line on stderr, rather than as commentary above the green tick.
Changed
Section titled “Changed”- Breaking. An unrecognised reference exits
3(not found) rather than1. Update scripts that read1as “no such thing”. - Breaking. A bad command line exits
1(user error) rather than2(authentication), even when signed out. - Colour marks only what carries a verdict or a colour of its own; every verdict is still spelled out in words.
- Label, folder, calendar and group lists show a colour as its swatch and name rather than a hex code.
- The
FLAGScolumn counts attachments instead of drawing📎, which no monospace font sizes correctly. - Tables measure width in terminal cells, so CJK subjects and emoji filenames stay aligned.
- An empty result reads
No messages match.after a filter, rather thanNo messages. - Transfers show speed and time left, and number themselves within a batch (
[3/27]). - Commands send independent requests together and never fetch the same thing twice, so they finish in fewer round trips.
- Commands that decrypt no longer wait out the key unlock before they start.
Removed
Section titled “Removed”--app-versionandPROTON_APP_VERSION. Nothing needed them.
- IDs that begin with
-are no longer read as flags, in full, short andSHARE/ITEMreferences. drive items revisions restorereports success instead of an error when Proton accepts it.- A recursive upload meeting a file where a folder must go is refused before anything is written, not part way through.
- A command that needs a feature your plan lacks says so, instead of retrying and losing the reason.