**libmutton v0.4.2** November 09, 2025 This is purely a dependency bump release. ## Dependencies - Bumped (direct/replaced) - Go: v1.25.3 => v1.25.4 - github.com/rwinkhart/rcw: v0.2.2 => v0.2.3 - github.com/rwinkhart/peercred-mini: v0.1.1 => v0.1.2 - github.com/rwinkhart/sys: v0.37.0 => v0.38.0 - github.com/rwinkhart/go-winio-easy-pipe-handles: switched to tagged v0.1.0 of `github.com/rwinkhart/go-winio` --- **libmutton v0.4.1** October 26, 2025 This is a dependency bump release with only minor changes for developers. ## Breaking (for developers) - (b9175d7ff3bea3bc703c20468defebcb1ac7e412) Standardized on "password" rather than a mix of "passphrase"/"password" - Some function names changed as a result - (aa10016f77b0be66ab75279df967f5d080d2b826) Developers using `LibmuttonInit` can now force clients into offline mode programmatically - This means `LibmuttonInit` now requires an extra parameter ## Dependencies - Bumped (direct/replaced) - Go: v1.24.6 => v1.25.3 - github.com/pkg/sftp: v1.13.9 => v1.13.10 - golang.org/x/crypto: v0.41.0 => v0.43.0 - github.com/rwinkhart/sys: v0.35.0 => v0.37.0 --- **libmutton v0.4.0** August 17, 2025 This is the largest update to libmutton yet, and as such, these patch notes are non-exhaustive. Many minor changes and fixes to features mentioned in these patch notes have been made. Please see the commit history for a more complete list of changes. ## Breaking (for users) - GPG has been entirely replaced with [RCW](https://github.com/rwinkhart/rcw) - All entries created in previous versions must be converted using [this conversion program](https://github.com/rwinkhart/sshyp-labs/releases/tag/v2.0.0) - Steam TOTP keys now must be in base32 format - (3c5db78da9861e09112ac308c086c2d19f2abfeb) Release binaries of `libmuttonserver` now target x86_64_v2 and arm64v8.7 - (3dd07e7165874e323586c21a14853935bb3dc61c) Offline mode is now manually specified in libmutton.ini ## Breaking (for developers) - libmutton has been further modularized - The `core` package has been split into `core`, `global`, `crypt`, and `cfg` - The `sync` package has been split into `syncclient`, `syncserver`, `synccommon`, and `synccycles` - This decreases the size of the server binary and allows for more modular clients - (40f0f35f452008997bb5ecfb72f496646c42ba06) Errors are now returned, rather than printed ## Features - (111324cc25e84a5bd8b6b8206b90b00394311590) Deletions (server-side) now follow the client through device ID changes - (ca277ba7735dd75cc94b26c1c2357f7d3192e26b) Added the `EntryRefresh()` function for re-encrypting entries with a new passphrase/optimizing bloated entries - (74b8261bc88fc122a25df5207b34edc3dee81e9a) Added the `LibmuttonInit()` function to ensure clients initialize libmutton as intended - (bed23e987d89b133204991c2c34b8fa1e8e335c9) (41a12c6e4a7c09b22fac0faf6bdef5993264f5de) Added iOS clipboard support - (3fdcc9e96d71bb4bef3baf9f43a627782237b142) (1a66a30bc184528ec971306497cca3597072202a) (d023058630958842f0f521ba2bef43b12955b9d8) Support one-time TOTP copy - (fb2120c94ebc69f7ac8e15163f1e27b2c8057d9a) Support custom device ID prefixes ## Fixes - (50ab27c6749d13fc6842d92259f8e0fd8fa5340c) libmutton.ini is now always created with 0600 permissions on *nix platforms - (4a0e0f8e9e96805b27232001bce81336ac2e6a4d) Old devices IDs are no longer removed from clients when registration of a new device ID fails ## Dependencies - Dropped - github.com/fortis/go-steam-totp (functionality now covered by github.com/pquerna/otp) - Bumped (direct) - Go: v1.24.2 => v1.24.6 - github.com/pquerna/otp: v1.4.1-0.20231130234153-3357de7c0481 => v1.5.0 - golang.design/x/clipboard: v0.7.0 => v0.7.1 - golang.org/x/crypto: v0.37.0 => v0.41.0 - Added (direct) - github.com/rwinkhart/go-boilerplate v0.1.0 - github.com/rwinkhart/rcw v0.2.2 --- **libmutton v0.3.1** April 21, 2025 ## Features - (da95ede80704e667f75372e2142de4cef1dd42da) Added `EntryAddPrecheck()` utility function for ensuring the target locations for new entries are valid - (17223758b11eae301106f398fe2a8815a04f2d62) (44924737ab0830ad49e90c1d1930b05bba307284) (0f90e8251413af2be73f56d071c14af6c00cdb79) Added initial native Android support - (51bb67f3150e70c2c8e8dc3cc72de5666d7c058a) Split device ID retrieval into dedicated exported function, `GetCurrentDeviceID` - (4ed816cb112686d995b1cb7ae8f5df990117ae4d) Allow more control over string generation to improve generated password compatibility ## Fixes - (51bb67f3150e70c2c8e8dc3cc72de5666d7c058a) Fixed clients having multiple device IDs after failed registrations - (451d695649c659a510a117254a9311fe621082b1) Fixed inability to add a folder on the server if the folder was already created on a client that failed to sync ## Dependencies - Bumps (direct and indirect) - Go: v1.24.0 => v1.24.2 - github.com/pkg/sftp: v1.13.7 => v1.13.9 - golang.org/x/crypto: v0.34.0 => v0.37.0 - golang.org/x/sys: v0.30.0 => v0.32.0 - New - Android builds only - golang.design/x/clipboard v0.7.0 - golang.org/x/exp/shiny v0.0.0-20250408133849-7e4ce0ab07d0 - golang.org/x/image v0.26.0 - golang.org/x/mobile v0.0.0-20250408133729-978277e7eaf7 --- **libmutton v0.3.0** February 22, 2025 ## Features - (f9aa2fc374b77fc8325d0c7644ffc9c96169c3c6) (d2034b458b702b8f1664bc188c1840040ec0f704) (81b78068a75a23c73be607cbe6d4dc8b1539f831) (e9d0c3704362c8963e63a6c3b70d036f3e6c2493) `core.LaunchClipClearProcess`, `core.WriteToStdin`, `core.ExpandPathWithHome`, and `core.PrintError` are now exported utility functions for direct use by clients - (c28d45c9da94ec45d89dbda6d645042a7fdbcd29) One-off sync functions can now be forced to run in offline mode - (5028fb21b019e8a867d031463f5de1402fc053f4) SSH connection attempts now have a 3-second timeout - (89b74cec1e014dba31e2b728e3544941d6edd2c2) Individual keys can now be removed from the config file - Many features for building interactive (GUI/TUI) clients - (619e4220a60fc0cb284f5640eaf9af86c0651ac7) Clipboard clearing can now be handled much more sensibly by interactive clients - (3b57d59ddcf0694b2bbae8c86ec06faff299e950) (55be8a30759ee5d12628c631af94a57d582281a4) The clipboard can now be cleared instantly (no timer); useful for clearing on client exit - (2feeeb74d7813dbbb75795d5ccdd817bbcea3602) `core.ParseConfig` now returns errors for proper handling in interactive clients - (68e3108741fae0aaf316dcf33a5074b0e19a7b4f) `sync.RunJob` can now return lists of synchronized entries for display in interactive clients ## Fixes - (eb2b349697ede136ea031cf7d82bfb72a5a0dcf9) Deletions are now synchronized before folders to avoid sync failures under unlikely conditions - (fc1cd349b8c5468afa3feaf7b5b9042eb4c467e7) Double-space line breaks with Markdown formatting are now preserved when saving an entry - (4689cae3f4a1e19486935f2da5b06bf0a90c731c) Sheared folder names now always end in a trailing slash for clarity and reduced duplicate entries in the deletions directory - Many fixes for building interactive (GUI/TUI) clients - (1cebb395460fb6068ebf4253ec8bd93e9d2b2a96) The soft exit function now specifies a return value - (a4a39a3a995d1560514dc3b782abb26329214c3f) Passphrase-protected SSH identity files are no longer broken for interactive clients - (1c650d475145c3db4e370576d89eb77abe6e5e52) (0162b737c84d42e168803e0c074103b5c0676384) Interactive clients will no longer crash on SSH dialing failures - (173574eb85b3172414d104a2bf391a3bce4ddc95) Error messages not making sense for interactive clients have been addressed ## Optimizations - (f2f9c523f441b49d682795c01454167d68aae573) An unnecessary variable declaration was removed in `core.DecryptGPG` - (fb5449cf1f75aa0f93c0484d590abca04f977d7a) A redundant (and late) check for the pre-existence of a new entry has been removed - (e9d0c3704362c8963e63a6c3b70d036f3e6c2493) `core.PrintError` can be used to decrease the overall size of client binaries through code re-use ## Dependencies - Bumps (direct and indirect) - Go: v1.23.4 => v1.24.0 - golang.org/x/crypto: v0.31.0 => v0.34.0 - golang.org/x/sys: v0.28.0 => v0.30.0