Changelog
All notable changes to Tilde. Generated from the commit history by git-cliff.
0.6.1 - 2026-11-08
Section titled “0.6.1 - 2026-11-08”Bug fixes
Section titled “Bug fixes”- pgp: Report the cancellation when it cut the input, even if gpg ended first
0.6.0 - 2026-11-08
Section titled “0.6.0 - 2026-11-08”Features
Section titled “Features”- scripting: Add the bar and sys modules for the bars of tt
- tui: Build the bars of tt from the functions of the scripts
- ui: Draw a bar line with pieces of colour and drop items when it is narrow
- tui: Show the bars of the scripts on the main screen
- scripting: Choose the colour theme from Lua with ui.theme
- tui: Show the keys that work in a bar at the bottom of the reader
- tt: Search the whole mail cache of the open account with g/
Bug fixes
Section titled “Bug fixes”- tests: Keep the bar tests free of the default bars file
- tui: Apply the review of the bars
- scripting: Apply the review of ui.theme
- scripting: Refuse a bar set from inside a bar function
- tui: Apply the review of the reader key bar
- tui: Keep Close in the reader bar on a narrow terminal
- tui: Show the shortest key in the hints and update the pages and the screenshots
- bars: Close the re-entry gaps and apply the small findings of the review of the bars
- bars: Keep the bars set while a reload runs
- bars: Apply the minor findings of the review
- screenshots: Wait for the clock with seconds in the top bar shot
- tt: Apply the findings of the review of the cache search
- screenshots: Never reach a server or the real runtime folder in the compose run
- tests: Make the link test of bars.lua independent of the umask
- tests: Mark the bars.lua link test as not for Windows
Refactoring
Section titled “Refactoring”- mail: Carry Message-ID, References, In-Reply-To and Reply-To in MailMessage
Documentation
Section titled “Documentation”- Describe the bars that scripts set
- Add the screenshots of the reader, the top bar and a theme, and regenerate help.svg
- Apply the minor findings of the review of the screenshots
- Fix the pages that contradict the pictures and the program
- Say what a file with mistakes does and list the keys for writing and answering
- Say that the demo has no account and where the text of a new mail goes
- Add the pictures of the tree, a command message, the compose window, a key description and a narrow bar
- Apply the minor findings of the review of the new pictures
0.5.0 - 2026-11-07
Section titled “0.5.0 - 2026-11-07”Features
Section titled “Features”- tui: Add the scheduler and the loop of tilde-t
- tui: Add tilde-t with the main screen
- cli: Add tcli cache build
- cli: Add tcli read to show and save the attachments of a message, decrypted when it is OpenPGP
- tui: Dim the selection of the list without focus and bind the arrow keys
- cache: Index the bodies of a Maildir in batches with several tasks
- tui: Move the selection with the mouse wheel
- tui: Add the command line opened with a colon
- tui: Search the messages with a slash, n and N
- tui: Show the real accounts and the inbox
- release: Ship tilde-t as a single file, in the archives and in the Debian packages
- tui: Load colour themes from themes/*.toml
- ui: Add the TextView widget
- ui: Add the TreeView widget
- scripting: Bind ? to help.show in the default keybind.lua
- rules: Publish an event when a rule fires on a message that arrives
- tui: Show the folders of the accounts in the sidebar
- tui: Call the executable of the terminal interface tt
- cli: Add –config to tcli and tt to move the root directory
- tui: Open a message and read it in a reader window
- tui: Add help.show_keys, a window that lists the key bindings
- tui: Add –theme to pick the theme from the command line
- ui: Add KeyResolverText, a hint that shows the keys of a command
- tui: Run the editor of the user on a text in a private temporary file
- core: Write and read the file in which a mail is composed
- core: Make the template of a new mail, a reply and a reply to all
- tui: Write a new mail in the editor of the user and send it
- tui: Answer a message with r and R
- tui: Decrypt and verify OpenPGP messages in the reader
Bug fixes
Section titled “Bug fixes”- tui: Apply the review of the scheduler and the loop
- tui: Run only the actions queued at the start of a scheduler call
- tui: Apply the review of tilde-t
- cli: Apply the review of cache build
- pgp: Open the PGP/MIME message that Proton Bridge rebuilds as multipart/mixed
- pgp: Accept only real public keys beside a Proton Bridge ciphertext
- cli: Harden tcli read after the review
- tui: Apply the review of the focus colours
- cache: Apply the review of the batch indexing
- ui: Keep the bright selection under a window and keep a custom selected role
- ui: Find the focus that comes back to the content when a window is shown again
- tui: Leave the wheel mode on when tilde-t exits
- tui: Apply the review of the command line
- tui: Apply the review of the search
- tui: Apply the review of the real data
- release: Apply the review of the packaging
- release: Apply the minor findings of the review
- tui: Apply the review of the themes
- ui: Apply the review of the TextView
- ui: Apply the review of the TreeView
- rules: Apply the review of the rule applied event
- tui: Apply the review of the folders in the sidebar
- cli: Apply the review of the root directory option
- tui: Apply the review of the reader
- deb: Name the metapackage tilde-all
- deb: Say tilde-all on the home page of the site
- tui: Apply the review of the key help
- tests: Dispose the test classes that xunit 2 ignored
- tests: Dispose CachedImapTests and guard the integration project too
- tests: Apply the minor points of the review of the disposal fix
- tui: Apply the review of –theme
- tui: Apply the minor points of the review of –theme
- ui: Apply the minor points of the review of RowsView
- ui: Apply the review of KeyResolverText
- ui: Apply the minor points of the review of KeyResolverText
- tui: Apply the review of the external editor
- tui: Apply the minor points of the review of the external editor
- core: Apply the review of the compose file
- core: Apply the review of the compose templates
- core: Apply the minor points of the review of the compose templates
- tui: Apply the review of the compose command
- tui: Apply the minor points of the review of the compose command
- tui: Apply the review of the reply command
- tui: Apply the minor points of the review of the reply command
- tui: Apply the review of the reader with OpenPGP
Refactoring
Section titled “Refactoring”- ui: Share the code of ListView and TreeView in RowsView
Documentation
Section titled “Documentation”- tui: Name the archives of tt as the build makes them
- Keep the name of the former program out of the changelog
- site: Add the website scaffold from Astro Starlight
- site: Keep the site free of references to its predecessor
- site: Apply the review of the website scaffold
- site: Check the length of the pages and report the stubs
- site: Apply the review of the site checks
- site: List every page of the site and add the stubs
- site: Apply the review of the page manifest
- site: Encode the brand tokens in the theme
- site: Add the chat sign and the social image
- site: Write the home page
- site: Apply the review of the brand and the home page
- site: Write the Start pages
- site: Keep the title of an aside when a page is imported
- site: Apply the review of the Start pages
- tui: Describe how the HTML of a message is shown
- site: Write the Use tt pages
- site: Write the Reference tables
- site: Describe help.show_keys in the Reference of tt
- site: Write the Scripts pages
- site: Write the Plugins pages
- site: Write the Contribute pages
- site: Let the guard pass words that hold the letters of the former program
- site: Say that the question mark opens the key help
- site: Write the tutorial of tt
- site: Write the Configure pages
- site: Write the tcli and the Keys and rules pages
- site: Say that the question mark opens the key help on the keys page
- site: Add the screenshot script and its page
- site: Apply the review of the screenshot script
- site: Make the pages agree with each other
- site: Show the screens of tt on the pages
0.4.0 - 2026-11-06
Section titled “0.4.0 - 2026-11-06”Features
Section titled “Features”- input: Add the key service with contexts, vim notation, counts and sequences
- scripting: Add the keys module
- scripting: Add the default keybind.lua
- ui: Add the widgets and the layout of the terminal interface
- ui: Draw the widgets into a buffer of cells
- ui: Load a screen from an XML file
- ui: Bind the widgets to the properties of a view model
- ui: Add the main view model and the commands of the lists
- ui: Run the commands of the keys that are pressed
- ui: Add the window widget
- ui: Add the status bar component
- ui: Add two-way bindings
- ui: Add the text box
- ui: Add the password box
- cli: Add tcli cache search
- cli: Add tcli plugins list
- ui: Add the scroll bar to the list
- tui: Add the ANSI terminal of tilde-t
- release: Sign SHA256SUMS with the release key
Bug fixes
Section titled “Bug fixes”- ui: Measure a text with a lone surrogate and let a text block be subclassed
- build: Pass the analyzers of a clean build with warnings as errors
- ui: Apply the review of the key router
- ui: Apply the review of the window widget
- ui: Apply the review of the status bar
- ui: Apply the review of the two-way bindings
- ui: Apply the review of the text box
- ui: Apply the review of the password box
- cli: Apply the review of cache search
- cli: Apply the review of plugins list
- ui: Apply the review of the scroll bar
- cache: Tell a failed search from an empty one
- cache: Apply the review of the search failure
- tui: Apply the review of the ANSI terminal
- release: Apply the review of the checksum signing
Refactoring
Section titled “Refactoring”- host: Move the default plugins and the scripts folder out of the CLI host
- host: Apply the review of the host library
- input: Apply the review of the key service
- scripting: Apply the review of the keys module
- ui: Apply the review of the widgets and the layout
- ui: Apply the review of the cell rendering
- ui: Apply the review of the XML loader
- ui: Apply the review of the bindings
- ui: Apply the review of the main view model
- ui: Raise the status from the setter of the selected message
- ui: Simplify the properties of the widgets
0.3.0 - 2026-11-06
Section titled “0.3.0 - 2026-11-06”Features
Section titled “Features”- cli: Tcli watch writes one line for each event
Bug fixes
Section titled “Bug fixes”- cli: Watch listens before the accounts start and ends with 0 on Ctrl+C
- cli: The findings of the review of watch
- cli: CliApplication.RunAsync takes the cancellation token last
Refactoring
Section titled “Refactoring”- cli: Pass the folder listing as a method group in cache rebuild
0.2.0 - 2026-11-05
Section titled “0.2.0 - 2026-11-05”Features
Section titled “Features”- pgp: Open signed and encrypted mail
- pgp: Sign and encrypt the mail I send
- cli: Tcli cache rebuild empties the mail cache and fills it again
- cache: Full text search over Maildir accounts
- cli: Tcli scripts loads init.lua and shows what the scripts did
- pgp: Inline PGP, reading and sending
- pgp: The keyring event for Lua and the docs of OpenPGP
- cli: Tcli cache rebuild indexes the body of every message
- cli: Tcli rules applies the mail rules, all or one by name
- pgp: A key for each mail account (gpg_key)
Bug fixes
Section titled “Bug fixes”- pgp: The findings of the review of the read path
- pgp: The findings of the review of the write path
- cli: The findings of the review of cache rebuild
- cache: The findings of the review of the Maildir search
- pgp: The findings of the review of inline PGP
- cli: The findings of the review of tcli scripts
- cli: The findings of the review of cache rebuild –bodies
- pgp: The findings of the review of the account key
- cache: Rebuild –bodies asks an IMAP server about the folder once for many messages
- cache: The findings of the review of the folder check of the indexer
0.1.0 - 2026-11-05
Section titled “0.1.0 - 2026-11-05”Features
Section titled “Features”- core: Add in-memory EventHubService and move contracts to Tilde.Abstraction
- abstraction: Add connection and mail contracts
- abstraction: Add chat contracts
- abstraction: Add middleware, search, cache, log and account contracts
- abstraction: Add mail events and account id on chat events
- core: Add middleware chain builder and debug logging
- core: Add ConfigService with typed sections and expanded values
- core: Add TildePaths.ResolveDirectory
- core: TildeBootstrap and internal plugins (#2)
- abstraction: Extend IMailStore and publish mail events
- maildir: Add the Maildir project, its settings and the file name parser
- maildir: Add the nested folder layout and the folder directory
- maildir: Read folders and messages with MaildirMailStore
- maildir: Write operations of MaildirMailStore
- maildir: Add the Maildir++ folder layout
- maildir: Publish arriving mail and connection state, and give the factory the account id
- maildir: Add the Maildir factory and plugin
- core: Add author and url to the plugin metadata
- maildir: Log the operations of the Maildir store
- imap: Add the IMAP project, its settings and the parts without a network
- imap: Connect to an IMAP server and publish the connection state
- imap: Read folders and messages
- imap: Flags, moving, copying, saving, expunge and folders
- imap: Announce arriving mail, and add the IMAP factory and plugin
- abstraction: List a window of the messages of a folder
- core: Add AccountService, which wraps every connection in the middleware chain
- abstraction: Extend MailDraft and build the message to send from it
- core: Publish MailMessageSentEvent from a middleware and put it in every transport chain
- smtp: Add the SMTP plugin on MailKit
- chat: Add presence to the chat contract
- core: Publish the events of every chat client on the hub
- xmpp: Add the XMPP plugin project and its settings
- xmpp: Map XMPP stanzas to chat events
- xmpp: Add the XMPP chat client, factory and plugin
- maildir: Keep a per-folder list of message files
- maildir: Recover from a failed file system watcher
- core: Write the logs to a file when logging.log_to_file is true
- core: Add the job scheduler
- irc: Add the IRC plugin project and its account settings
- irc: Read and write the lines of the IRC protocol
- irc: Turn IRC lines into chat events
- irc: Read lines with a size limit and wait for the answer of the server
- irc: Add the IRC chat client, factory and plugin
- chat: Add MarkReadAsync and ChatMessageReadEvent to the chat contract
- xmpp: Sync what is read or answered on my other devices
- core: Add WhoNeedsMeService, the list of what waits for me
- core: Port the timer wheel of Moongate
- core: Run the timers on a dedicated thread and keep a failing timer from stopping the others
- core: Start and stop the timer service with the bootstrap
- core: Add the command registry shared by C# and Lua
- irc: Accept read markers without sending any
- scripting: Add the Tilde.Scripting library with the Lua engine
- irc: Report renames and kicks, and bound what the mapper remembers
- irc: Count the relay prefix in the size of a message and skip a repeated join
- irc: Bound the queue of chat events
- irc: Space out the lines the client sends
- irc: Add the reconnect and channels settings
- irc: Connect again after a lost connection and put the account back
- scripting: Add the events module and the bridged hub events
- scripting: Add the commands module and the reload command
- scripting: Add the jobs and timers modules
- scripting: Write the editor definitions and document the library
- abstraction: Give MailFolder a validity token that IMAP fills with the UIDVALIDITY
- irc: Build the IRC client on IRCDotNet.Core
- cache: Add the Tilde.Cache library with the configuration, the size parser and the full-text query
- cache: Open the cache file encrypted and create its schema with linq2db
- cache: Store folders, headers and whole messages
- cache: Search the cache with full-text queries
- cache: Keep the cache under size_max by dropping the whole messages used least
- core: Let plugins decorate the store of an account
- cache: Decorate a mail store with the cache
- cache: Add the cache plugin, its configuration and the reset command
- cache: Search the mail of an account through IMailSearchService
- irc: Show who goes away, and send and read /me actions
- cache: The follow-ups of the reviews
- connections: Say which account a connection event belongs to, and report IMAP reconnects
- chat: Publish the messages I send and the errors a network gives back
- mail: Events for failed sends, folder counts of outside arrivals and an emptied cache
- chat: Events for kicks, renames, my own joins and leaves, invitations and topics
- xmpp: Events for corrections, retractions, receipts, chat states and subscription requests
- core: A service that tells which plugins are active
- accounts: Tell the application which part of an account could not be created
- cli: Add the Tilde.Cli project
- cli: Tcli skeleton and the accounts command
- mail: Tell what other clients do to the mailbox
- scripting: Lua events for the chat, account and outside-change events
- mbox: The scanner, the status flags and the settings of the mbox plugin
- mbox: The read only mbox mail store, its factory and its plugin
- cli: Tcli check and check –connect
- xmpp: Room message ids, moderation, mentions on corrections and nick changes in a room
- mail: Watch the other IMAP folders, and tell when a folder must be read again
- cli: Tcli send email
- chat: Messages say if they mention me and if they come from the history
- pgp: Find gpg, read the keyring and list the keys
- cli: Tcli send chat and tcli cache reset
- rules: The contract and the data of the rules engine
- rules: Matching, planning and running the mail rules
- rules: The rules service follows the new mail
- rules: The Lua module rules
- rules: Matching and running the chat rules
- rules: Chat rules from Lua
- rules: A Lua function as the action of a rule
- pgp: Import, export and delete keys
- config: Tell every wrong section, unknown key and unknown section, with its line
- Generate THIRD-PARTY-NOTICES from the NuGet packages
- pgp: Look up, receive and refresh keys
- Automatic versioning from Conventional Commits and tcli archives
- cli: Tcli prints a header with its version when it starts
- cli: Debian packages of tcli and a release workflow
- pgp: Sign, verify, encrypt and decrypt a MIME entity
Bug fixes
Section titled “Bug fixes”- core: Keep the events of a finished operation and specify the mail store contract
- maildir: Survive files renamed by other programs, never follow links and finish a delivered append
- maildir: Handle duplicates, renames inside new and a missing tmp, and make the watcher tests deterministic
- maildir: Check the arguments of MaildirPlugin.RegisterAsync
- imap: Never send the password in clear text with auto security
- imap: Do not repeat commands that change data, and close the races of connect and dispose
- imap: Follow UIDVALIDITY, keep what arrived during a reconnection and fix stale folders
- core: Do not block the start on a slow account, publish the accounts as a snapshot and keep expanded values out of messages
- smtp: Handle idle timeouts, cancellation and invalid drafts
- maildir: Stop the watcher for good and stop recovering forever
- maildir: Forget messages that left new and survive a folder deleted during recovery
- core: Keep the log folder private and bring the docs in line
- xmpp: Cancel a connect that hangs and keep room private messages private
- core: Publish a job failure without holding the worker
- irc: Log in with the account, send a text whole or not at all, refuse more joins
- Close the critical findings of the review of WhoNeedsMeService
- core: Do not spin before a timer is due and start the timer thread under the lock
- core: Publish the command event from another thread and clean the message better
- scripting: Let modules resolve the engine and start after a reload
- scripting: Never wait for the gate from inside a unit and keep the unit from leaking
- irc: Wait longer after a connection that drops at once and throttle every line
- scripting: Cancel a queued timer run, validate extreme intervals and write the definitions whole
- core: Keep the Tilde folder absolute when the config folder does not exist yet
- core: The root directory is ~/.config/tilde, not the old folder
- imap: A zero UIDVALIDITY means no token, and name the GreenMail delay
- irc: End a connect when the user disconnects, ignore CTCP, and keep the session of a second welcome
- cache: Keep whole messages that only moved, and the other findings of the review
- cache: The findings of the review of the cached store
- irc: Address review of away-notify and /me
- cache: The findings of the global review
- irc: Read /me on each line of a text
- cache: The findings of the review of the follow-ups
- cache: A cache file knows its account, and a crash while it is created no longer switches the cache off
- cache: The findings of the review of the owner and the creation
- imap: The findings of the review of the connection events
- chat: The findings of the review of the sent and error events
- mail: The findings of the review of the mail events
- chat: The findings of the review of the membership events
- xmpp: The findings of the review of the XMPP events
- core: The plugin service hands out read-only lists and the bootstrap refuses a second one
- cli: The findings of the review of the tcli skeleton
- mail: The findings of the review of the outside changes
- chat: Close the limits left by the first round of events
- mbox: The findings of the review of the mbox plugin
- mbox: The minor findings of the review of the mbox plugin
- cli: The findings of the review of tcli check
- xmpp: The findings of the review of the room ids and moderation
- imap: The findings of the review of the folder poller
- cli: The findings of the review of tcli send email
- pgp: The findings of the review of the key listing
- cli: The findings of the review of tcli send chat and cache reset
- rules: The findings of the review of the rules engine
- rules: The minor findings of the review of the rules engine
- rules: The findings of the review of the chat rules
- pgp: The findings of the review of the keyring management
- config: The findings of the review of the config diagnostics
- Use the genuine GPL-3.0 text in the license texts
- The findings of the review of the third-party notices
- pgp: The findings of the review of the key lookup
- cli: The findings of the review of the header
- cli: The findings of the review of the Debian packaging
- The findings of the review of the release automation
- pgp: The findings of the review of the PGP/MIME protector
Refactoring
Section titled “Refactoring”- maildir: Give two lambdas of the store an explicit return type
- core: Move the MimeKit mapping into Tilde.Core
- core: Share the mail server settings, the security type and the certificate rule
- Move the protocol plugins from src to plugins
- cli: Pass the console method as the log and align the README tables
Documentation
Section titled “Documentation”- Document the configuration rules and the Abstraction boundary
- xmpp: Document the XMPP account settings and the chat event rule
- Add a short README and the mascot
- Mention the XMPP plugin in the README
- Mention the job scheduler in the README
- Mention the IRC plugin in the README
- cache: Document the cache
- cache: Say the encryption is optional, and the other findings of the review
- rules: The rules engine
- rules: Chat rules and the run action