Repository navigation
Releases: vorjdux/txc
Release list
txc 0.8.0
Added
-
Supply chain and verification.
deny.toml, checked in CI with cargo-deny, bans every HTTP, TLS and
network-socket crate, allows only permissive licences and crates.io.- The protocol and keyholder modules
forbid(unsafe_code). - Property tests feed arbitrary input to every parser of the folder, the
local files and people's text, andfuzz/holds cargo-fuzz targets
for the same, run a minute each in CI. - CI gates: listing and the interface's view decrypt no secret, and a
thousand entries after a year of edits on two devices stay under 5 MB
and 500 files, with a quick warm open (160 files, 1.7 MB and about
30 ms here). - Releases carry a CycloneDX SBOM, are built with fixed paths, and a
second build from another directory must match byte for byte.
-
txc vault restore VAULT/ENTRYbrings back an entry removed from a
synced vault in the last 30 days, with the values it had; fields removed on
their own before it stay removed.txc vault list VAULT --removedlists
what can come back. After the 30 days a snapshot drops the removed values,
so they no longer outlive the window. -
Recovery without txc.
docs/recovery-without-txc.mdgives the whole
path from two sheets and the card to a backup's contents with a SLIP-39
tool and age, andscripts/recovery-key.py, written from that
description and checked against txc in the tests, turns the recovery
secret into the age key. -
The kit on paper.
txc vault recovery print --printerprints the
sheets and the card withlpstraight from memory, after warning that
network printers keep copies;--pdf FILEwrites them to a new file only
you can read, andstatusasks you to delete it until it is gone. Each
sheet carries, in the clear, its root and share marks, and
txc vault recovery check --root MARK --share MARKconfirms a sheet
belongs to the vault with nothing secret typed. -
Offline backups.
txc vault backup --to DIRwrites one age file,
sealed to the vault's recovery key and this device, holding the whole
vault as documented JSON (txc-backup-v1), removed entries still inside
their window included, and a signature beside it thatbackup --verify
checks. The folder is remembered: while it is there, as a backup drive
plugged in, a new backup is written on its own once a week, andstatus
says when the last one is a month old.txc vault recovery keygives the
recovery key from two sheets and the card, with no vault needed, so
age -d -i key.txt BACKUPreads a backup with age alone. -
Recovery without any device.
txc vault recovery restore NAME --from OLD --folder NEWreads a vault's folder with two sheets and the card alone
(the recovery key is a recipient of every control object, so it holds every
sender key) and rebuilds it as a new vault with new sheets; protected
entries come back as normal ones until a security key is added.
txc vault recovery drilldoes the same without keeping anything, as the
yearly rehearsal. Sheet checks and drills are dated, andstatusreminds
you when one is due, folding several reminders into one line that
status --allexpands. -
txc vault recovery reissuereplaces the sheets and the card after one
was lost or seen. Two current sheets and the card sign a root fact naming
new root keys, a new recovery recipient and new share commitments, and
carrying over what the old roots had signed; every device then seals to
the new recovery recipient and changes its sender key, and a recovery
package gives the new sheets the history. The old sheets sign nothing and
read nothing written afterwards. -
Devices, keys and root actions.
txc vault device removeflags every entry the removed device could
read until one of its secrets changes, on any device:statussays how
many, and
txc vault list VAULT --stalenames them.device removealso removes its security keys unless another device
uses them (--key-lostremoves those too).--wipetells the device to
wipe its keys when txc next opens the vault there; only a kill from a
device that adds devices, or from root, counts.txc vault hardware remove KEYremoves a lost security key, and
device listshows the keys.- With two sheets and the card,
txc vault device promote DEVICElets a
device with a security key add devices,device allow DEVICE --more N
lets it add more, anddevice removeof such a device revokes it. - A security key added to a certificate now counts against the admin's
allowance, as a new device does. txc vault device forgetremoves a vault's keys from this device, as
before a border crossing.
-
Setup that suggests. A new passphrase at the terminal comes with a
suggested one of seven random words, and one that looks weak (under about
50 bits) gets a word of warning.txc vault initpoints at a sync folder
it finds (Dropbox, Syncthing, Nextcloud, Google Drive, OneDrive, iCloud
Drive) for a synced vault, and--foldermakes the last folder of the
path when its parent exists. -
Exports of protected entries. A synced vault's export asks, one by
one, whether to include each protected entry, instead of always leaving
them out; root-grade and operation-only entries are never exported. A
plaintext export from a device with a security key also asks for the
passphrase and a touch. -
A quieter status.
txc vault status --snoozehides the yellow lines
shown now for 30 days (a line that changes shows again, and red lines are
never snoozed);status --alllists them with their date, and how many
devices and security keys each admin has added of those it may.
txc vault unlockshows each synced vault's red lines every time and its
yellow ones at most once a day. -
Swap, X11 and the screen lock. Where swap or the hibernation target is
not encrypted (Linux: not on dm-crypt, nor zram), protected entries refuse
to release andstatussays why; macOS swap is always encrypted, and
where the system cannot tell,status --allsays so. Under X11, where any
program on the display reads the keys, a passphrase is not asked for at
the terminal or in the interactive screen unlessTXC_VAULT_ALLOW_X11=1
is set; a passphrase file or a session still works. On Linux the
interactive screen locks, and ends the session, when the desktop session
locks. The keyholder locks its memory out of swap where the system's lock
limit allows. -
Look-alike names and addresses. Entry names that mix Latin with
Greek, Cyrillic, Armenian or Cherokee letters in one word are marked
"(mixed scripts)" in lists,showand the interactive screen, and a web
address whose host has letters beyond ASCII is shown in punycode, as
https://xn--pple-43d.comfor an "аpple.com" with a Cyrillic "а". -
Root-grade entries.
txc vault add ENTRY --root-gradeseals an entry
as--protectdoes, and each release also asks for the passphrase again,
whatever the session holds; it goes only to a program as a file. -
Two-step rotation.
txc vault rotate ENTRYwrites a new secret beside
the old one in a synced vault, both readable;txc vault copy ENTRY --pendinggets the new one to set where it is used, androtate --commit
makes it current, or--abortkeeps the old.statuslists a rotation
until it is finished, so a change that failed halfway loses nothing. -
2FA codes. A login has a 2FA key field (
totp) for the setup key a
site shows when you turn on two-factor login, or itsotpauth://link,
andtxc vault code ENTRYshows the current six-digit code, as an
authenticator app would, in either kind of vault (RFC 6238, SHA-1,
SHA-256 and SHA-512). In the interactive screen,pcopies it, and the
details pane says so beside the key. The key itself is never shown; a
protected entry's code asks for its security key. -
Checkpoints, staleness and receipts. Opening a synced vault writes a
checkpoint at least once an hour, dated by the device's clock. When no
other device has written one for a week,statussays so and adding
devices, approving, promoting and reissuing are refused until the folder
syncs again; removing a device never waits. Changes that have waited three
days for objects that never arrived ask, in the checkpoint, for a
snapshot, which a device that adds devices writes at its next sync. Device
changes and reissues print a receipt, whichtxc vault compare --receipt
checks against the signed history. -
A smaller command surface. The keys, trust and format commands of vaults
that are not synced (identity,writer,writers,recipients,trust,
fingerprint,history,upgrade) are grouped undertxc vault advanced;
their old spellings still work but are no longer listed.txc vault create NAME --folder DIRmakes another synced vault,device approvealso covers
whatdevice ackdid, andstatusreplacessync. -
txc vault passwdcovers synced vaults. It changes the passphrase of the
identity and of every synced vault the current passphrase opens, keeping
each vault's second factor, keystore or hardware;--vault NAMEchanges one. -
Synced vaults.
txc vault init --folder DIRcreates a vault in a sync
folder that several devices share: signed, encrypted objects with random
names, post-quantum from end to end (agemlkem768x25519, composite
ML-DSA-65 + Ed25519 signatures).txc vault joinandtxc vault device add | list | removepair devices through two pasted lines and a six-digit
code; removing a device keeps it out of everything written afterwards.
Concurrent edits keep both versions untiltxc vault resolve.
txc vault statusreads what other devices wrote and shows what needs
doing, one line each. Keys at rest need
the passphrase and a second factor from the system keystore. R...
txc 0.7.2
Changed
- The interface asks for the write passphrase on the first change rather than
at unlock. Asking up front, before knowing whether a session would change
anything, was surprising; now the first add, edit, delete, star, move or new
vault opens the prompt, before any form so nothing is lost, and the write key
is kept for the rest of the session. Locking the vault drops it with the
identity, so it is asked for again when next needed.
Fixed
- The cursor in the write-passphrase dialog sat in the middle of the field
label rather than at the start of the input. - Unlocking in the interface drew the progress window on top of the dialog that
started it, one window inside another. Only the progress window shows while
the work runs now.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.7.1
Fixed
- Changing a vault from the full-screen interface could get stuck asking for
the write passphrase: the prompt was opened by the change itself, then hidden
behind the change's own form, so adding an entry went nowhere. The interface
now asks for the write passphrase once, right after the identity is unlocked,
so later changes go through without stopping. A session that dismisses that
prompt to read only is offered it again, before any form, the first time it
changes something.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.7.0
The read/write split. Reading a vault and changing one are now separate
powers, so a device, or an automated job, can be given the ability to read
without the ability to write.
Security
- A vault is now signed by a write key, an Ed25519 key kept apart from the
identity and protected by its own passphrase. The signature is checked when a
vault is parsed, before any trust decision, against the writer keys this
device has pinned. A vault signed by a key you have not pinned does not open,
and a device that holds only the identity, such as one given
--passphrase-file, cannot produce a vault that any txc will open. This
closes the case where a singlerecipients --add, or amoveinto a more
widely shared vault, by anything holding the identity, granted an attacker
retroactive read access. The write passphrase is never read from
--passphrase-file. - Because the check does not rest on
trust.json, which a holder of the
identity can forge, forging the trust record no longer helps: an unsigned or
wrongly signed vault is still refused.
Added
txc vault writerprints this device's writer public key and fingerprint.txc vault writerslists the pinned writer keys, and--add/--remove
pin or unpin one (an authorization change, so it needs a terminal or--yes).
Several keys can be pinned, so two of your devices can both write and a
colleague's writer can be trusted.txc vault writer --rotatereplaces the write key with a fresh one and
re-signs every vault. It unlocks the current write key first, so a holder of
the identity alone cannot rotate to a key they control, and it keeps the old
key pinned while re-signing, so a vault is always signed by a pinned key and
never stops opening, even if the rotation is interrupted. Retire the old key
withwriters --removeonce every device has the new one.txc vault upgrade [VAULT]re-signs vaults still in the old format.txc vault delete <VAULT>removes a whole vault, keeping its last version
beside it as a single.deletedrecovery file and printing themvthat
restores it. It opens the vault first, so it must be trusted and its
signature must verify, needs the write key like any change, and confirms by
the vault's name typed at a terminal or--yes. It refuses rather than
overwrite an existing recovery file, and clears the vault from the trust
record and the recent list.txc vault grant <entry> --to <recipient> --expires 1hseals one secret to
another key, andtxc vault redeem <file>opens it, so an automated host can
be given exactly one secret without the identity or a passphrase.--to-file
bundles a fresh key for the quick local case, at the cost that the file then
is the secret. A grant is a snapshot and cannot be revoked: rotating the
secret is the only real revocation, and the expiry is hygiene thatredeem
checks. Issuing a grant is a read, so it needs no write key.txc vault init --reader-onlyprovisions a device that can read but never
write: an identity and an empty writers list, and no write key.--write-passphrase-file <PATH>, mirroring--passphrase-file, for a device
that legitimately writes without a person present. Its help says plainly that
giving it on a machine where untrusted code runs as you removes the split.
Changed
txc vault initnow also creates the write key, asking for its own
passphrase, and creates it too on an existing 0.6.0 home that has none. Run it
once after upgrading.- The vault file format is now version 2, carrying the writer and the
signature. This release reads version 1 as well and writes version 2; a
future release will stop reading version 1.rage -dstill opens a vault, as
the signature is an ordinary field. - The trust decision log now records a write only when the recipients or the
writer changed, so routine edits no longer push the genuine decisions out of
the capped log.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.6.0
Security
txc vault trust <name> --yesnow accepts only a vault that is new to this
device. It no longer accepts a vault that changed under a name you already
trust, which an unattended job could previously have been made to pin: anyone
who knew your public key could drop a same-name vault encrypted to their own
key into a syncedvaults/directory, and--yeswould trust it. Accepting a
changed vault now needs a person at a terminal, or the fingerprint passed with
--expect <fingerprint>, verified out of band.
Added
txc vault fingerprint <name>prints a vault's fingerprint, a short string
derived from its key, so two devices can confirm out of band that they mean
the same vault.txc vault trustprints it as well, and accepts it through
--expect <fingerprint>to trust a changed vault without a prompt.txc vault history <name>lists what this device has trusted for a name and
what each decision replaced.
Fixed
- A vault changed by two devices at the same generation is now refused instead
of reported as trusted, which previously let one device's version overwrite
the other's entries without warning. The trust record keeps a digest of the
bytes it last opened and treats a different vault at the same generation as a
divergence to be shown and accepted.
Changed
- The device trust record
trust.jsonis written in a new format that also
stores each vault's digest and a short log of trust decisions. Records written
by an older txc are read and upgraded in place; atrust.jsonwritten by this
version is not read by an older one, so run the same version on every device
that shares an identity. - Hardened the code against latent panics. A strict set of clippy lints now
guards production code against unchecked indexing, overflowing arithmetic and
quietly dropped errors, and the few unreachableunwrap/expectsites this
surfaced are now ordinary errors. There is no change in behaviour on valid
input.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.5.2
Fixed
- Each entry in the vault list is now shown over two lines, the name on its own
and the kind and vault below it, so a name is no longer cropped to share the
row with them. The list is a narrow column, leaving the wider pane beside it
for reading the selected entry.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.5.1
Added
txc vault move <entry> <vault>(alsomv, andmin the interface) moves
an entry to another vault, decrypting each secret and sealing it again to
the destination's keys. The destination is written before the entry is taken
from the source, so an interrupted move never loses it.
Changed
- The README leads with the project and a one-line install, and the ways to
install are grouped below rather than spread through it. Only the install
methods that are published are shown as commands. - When the key reference along the bottom of the interface is too wide for the
terminal, it now drops the About key before the vault key, so the vault key
stays on screen for longer.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.5.0
The vault release: txc now keeps secrets as well as text, in encrypted files
on your own machine.
Added
txc vault, an encrypted vault for passwords, payment cards, API keys,
notes and other secrets, kept in local files and built entirely on the age
format:init,identity,passwd,create,list,add,show,
favourite,copy,edit,rm,recipientsandtrust.- Thirteen kinds of entry, each with the fields that suit it: login, payment
card, secure note, API key, SSH key, database, server, Wi-Fi network, bank
account, ID document, software licence, crypto wallet and other secret.
Each field is plain or secret by definition, and a secret field given as a
plain--fieldis refused. - Favourites, stored in the vault so they follow it to other devices, and a
list of what was used recently, kept on the device in its own encrypted
file.txc vault listtakes--favourites,--recent,--kindand
--tag, across every vault. - "Unlocking..." on the terminal while the passphrase is checked, which takes
a moment on purpose. - The identity is an age X25519 key encrypted with a passphrase through scrypt
at N = 2^18. Each vault is one age file, encrypted to one or more public
keys, and each secret inside it is sealed again on its own, so browsing a
vault decrypts no secret and copying opens exactly one. - Trust records per device, authenticated with a key derived from the
identity. A vault that is new to the device, rebuilt with another key,
encrypted to different recipients, or older than the version last opened is
refused untiltxc vault trustshows what differs and it is accepted. - Secrets are never taken as arguments: they are typed without echo,
generated with--generate, or piped in with--secret-from-stdin.copy
keeps them out of clipboard history where the system allows, clears the
clipboard again after 20 seconds if the secret is still there, and never
falls back to OSC 52.--printwrites to a pipe and refuses a terminal. - Vault files are written atomically and never through a link, and on Unix are
readable by their owner alone and refused when they are open to other users.
Keys and secrets are wiped from memory when dropped; on Unix core dumps are
disabled while the vault is in use, and on Linux the process is also marked
not dumpable. - A vault screen in the interactive interface, on
F3. Favourites, recently
used, all items, each kind and each vault are down the left; adding an
entry starts by choosing its kind and opens that kind's form, with
generated passwords and PINs and a real editor for notes. A secret can be
revealed for 15 seconds and a note opened to read; otherwise secrets are
drawn only as dots or a fixed mask. The passphrase is checked in the
background behind a spinner, and the vault locks after five minutes without
a key and when the interface closes. - Pasting into the interactive interface arrives in one piece, so a multi line
value no longer presses Enter part of the way through. This needs bracketed
paste, which the Windows console does not have; there a paste still arrives
as typing. - A
vaultcargo feature, on by default.--no-default-featuresbuilds txc
without the vault and without its dependencies.
Changed
- Unsafe code is denied across the crate, except in the one module that makes
system calls to harden the process. - The release binary is about 1.3 MiB larger with the vault built in.
- The cryptography crates are optimised even in development builds, where
checking a passphrase otherwise took fifteen seconds rather than half of one.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.4.1
Added
- A Command line panel along the bottom, writing the selected operation out in
two forms:argspells it out in full,pipesays the same thing as briefly
as the operation allows. Both follow the options panel and the input, so they
reproduce what is on screen rather than a generic example. The panel is
dropped on a terminal shorter than 20 rows, where the panels above need the
space more.
Fixed
txc tuino longer hangs when its input is not a terminal. On Windows
crossterm reads the console the process is attached to rather than the
standard streams, so under a pipe the interface started and then waited for
a key that would never arrive. It now reports the same error there as
everywhere else. This is what left a CI job running for six hours.
Changed
- Every CI and release job has a timeout, so a job that blocks rather than
fails costs minutes instead of the six hour default. - The end to end tests kill a
txcthat has not finished within a minute and
fail, rather than waiting on it.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.
txc 0.4.0
A documentation release: the library half of txc is now documented in full,
and the whole crate is held to a stricter set of lints.
Added
- Documentation on every public item. The crate root reads as an
introduction, covering how to run an operation, pass parameters, chain
operations, walk the catalogue and read the errors back. - 100 examples, which run as part of
cargo test, so they cannot go stale. OpFnandParamKindare re-exported from the crate root, so declaring an
operation no longer needs theregistrymodule path.- The dependency audit runs in CI, weekly as well as on every change, since an
advisory can be published without anything here changing. - The documentation is built in CI with warnings denied: a broken link would
otherwise show up only as a mangled page on docs.rs.
Changed
- The crate is linted with
clippy::pedantic, plususe_selfand
missing_const_for_fn. What that fixed is invisible from outside, other
than more functions beingconstand returning values now being
#[must_use]. - Reading time in
statsis worked out in whole numbers. In floating point,
205 words came out as 61 seconds rather than 62, because 61.5 is not
representable and the value landed just below it.
Install
curl -sSf https://raw.githubusercontent.com/vorjdux/txc/main/install.sh | shirm https://raw.githubusercontent.com/vorjdux/txc/main/install.ps1 | iexEvery archive is listed in SHA256SUMS.