Smos Logo Smos

A comprehensive self-management system


The changelog for all releases of all of the Smos tools and libraries



smos and smos-query: Consider the END timestamp exclusive for the purpose of the ongoing report. smos-data: Documented the meaning of common timestamp names. smos-calendar-import: Improved the ICAL parsing so that invalidly TEXT-encoded URL properties can still be parsed. smos: Replace [+] by [unsaved changes]. smos: Added style (colour) to the editor header text. smos-calendar-import: Retry http requests. smos-web-server: Fixed that the web ui did not resize upon the first load.



  • smos: pp for setting the phone_number property.
  • smos-jobhunt: Made the waiting threshold configurable.
  • smos-calendar-import: Now records whether you should be considered busy during an event in the busy property.
  • smos-query: The free command: For showing when you may be available.
  • smos-query: The tags command got a --show-archive flag.
  • smos: The AFTER timestamp: Don't show next actions if now is before the AFTER timestamp. Don't show deadlines if now is before the AFTER timestamp.
  • smos-server: Booking API: Users can now activate booking and be booked.
  • smos-web-server: Booking UI: Users can now activate booking and be booked.
  • smos-api and smos-client: An endpoint for deleting smos files.
  • smos-query: The ongoing command: For showing entries that are happening now.


  • smos-jobhunt: Fix that the url wasn't being filled in.
  • smos: Fixed that the email property was not coloured.
  • smos-jobhunt: Fixed that the sender didn't receive a copy of the email.
  • smos-jobhunt: Made the default waiting threshold 3 weeks.
  • smos-query: The tags command now hides the archive by default.
  • smos-query: Sped up the work report generation slightly by using difference lists.
  • smos-calendar-import: Updated the ical depnedency. This should speed up parsing of large calendars. It should also allow importing from ICloud where previously that was not possible because ICloud outputs invalid iCalendar files.
  • smos-query: Don't consider entries with the property busy: false in the "next begin" part of the work report.
  • smos-api: Bumped the API version to 0.4 with the addition of the booking API endpoints.
  • All packages: Upgraded to LTS 20.23 and nixpkgs branch nixos-23.05.
  • smos-web-server: Empty directories are now deleted in the web editor.
  • smos-notify: The notification now shows the filename of the entry that the notification is about.
  • smos: Fixed a bug where the cursor would sometimes become invisible in the work report.
  • smos-query: Added an ongoing section to the work report.
  • smos: Added an ongoing section to the interactive work report.
  • smos and smos-query: Fixed a bug that caused files in the top-level of the archive directory to still show up in reports that were meant to hide the archive.



  • smos-jobhunt: A new tool to help with application processes.
  • smos-cli: A library for making smos CLIs.
  • smos-directory and smos-directory-gen: Libraries for all the configuration related to smos directories.


  • smos-github: Fixed that the smos-github config was not included in the config file generated in the home manager module.
  • smos-calendar-import: Refactored most of the smos-calendar-import logic into a separate ical library. This means that:
    1. Calendar imports should be more accurate now; in particular around timezone changes.
    2. Smos can now more gracefully handle services outputting invalid .ics files. Indeed, Google, Apple, and Microsoft all sometimes spit out invalid .ics files.
    3. Importing the calendar is sped up by a lot, because that library computes recurrence and timezone resolution more efficiently.
  • smos-report: Sped up timestamp calculations by computing an Interval from a Period ahead of time.
  • smos-query: Refactored smos-report's handling of periods so that it no longer calculates periods at the end or beginning of a year incorrectly.
  • smos-query: Fixed that smos-report would get timezone information wrong about timestamps in the same timezone but in summer time (in winter) or vice versa.
  • smos-query: Support for the following time periods:
    • Past/Coming week
    • Past/Coming month
    • Past/Coming year
  • smos-scheduler: Fixed a bug in which relative timestamps would be scheduled relative to the current UTC time instead of the current local time.
  • smos-scheduler: Fixed a bug in which items scheduled into the future would have future timestamps in their entries' todo state history and could therefore not have their todo state changed until then.
  • smos-scheduler: Changed that scheduling rent-recurrence would happen in UTC time instead of in local time.
  • All binaries: Changed the --help text to always show global options, even when a command has already been supplied.
  • smos-archive: Changed the default log level from Warn to Info.
  • smos-server: Changed the default log level from Warn to Info.
  • smos-sync-client: Changed the default log level from Warn to Info.
  • smos-web-server: Renamed --web-port to --port.
  • smos-single: No longer parses directory settings that it doesn't use.
  • smos: Upgraded to brick-1.6, which should come with significant performance improvements.


This release only contained nix infrastructure changes.


  • Home manager module:

    • Only install smos-notify if programs.smos.notify.enable is true.
    • Only install smos-scheduler if programs.smos.scheduler.enable is true.
    • Only install smos-github if programs.smos.github.enable is true.
    • Only install smos-sync-client if programs.smos.sync.enable is true.
  • smos-calendar-import: Allow sources to be passed in as a file so that this sensitive information does not have to be in the config file.

  • smos-calendar-import: Allow an empty list of sources to be configured.

  • smos-sync-client: Allow the password to be passed in as a file so that this sensitive information does not have to be in the config file.

  • smos-github: Allow the oauth token to be passed in as a file so that this sensitive information does not have to be in the config file.



  • smos-scheduler: When a rent recurrence schedule is activated the first time, it is activated as if the current time is the time it would have been activated next.

  • Home manager module: The workflowDir option is now put into the smos config file, instead of only used for the backup script.

  • smos-server: Use the default compression level (3) for compressing backups instead of the maximum level (24).

  • smos: Fixed a bug in which the directory could not be switched if the target had the same contents (empty) as the currently selected directory.



  • The home manager module now does a config check for smos-query, smos-scheduler and smos-notify during activation.
  • The home manager module now does an extra local backup during activation.
  • Editor integration: You can now use vim or emacs to edit the contents of an entry.
  • Sandbox mode, so the editor integration cannot do damage in the web version.


  • All packages: Upgraded to lts-19.6 and nixpkgs branch nixos-22.05
  • smos-scheduler: Allow the schedule template to be specified as an absolute path as well.
  • smos-query: Fixed that the agenda entries in smos-query had incorrect pretty relative days for timestamps with a day-level granularity.
  • smos-query: Improved metavars for optparse documentation.
  • smos-web-server: Change the TUIR and TUIInstanceR routes to not accept any path.
  • smos-web-server: Use playground.smos in the playground instead of example.smos.
  • smos-web-server: Open the editor in the workflow directory by default, instead of example.smos.



  • smos-scheduler: Support for haircut recurrence
  • Time strings now support months and years as well.


  • Fixed that the automatic local backup service would fail if the workflow directory does not exist.
  • smos-scheduler overhaul:
    • The smos-scheduler tool is now stateless. It now uses the workflow directory to compute 'last run's instead of a state file.
    • The next command is now colourful.
    • A newly added schedule is now immediately run, instead of waiting until the second run.
    • The minimal scheduling interval has been removed. This means that schedules that are run "every minute" are no longer supported.



  • smos-query: Show relative time in agenda and work reports in days instead of times for timestamps with a day resolution.
  • smos: Don't show the time of day as 00:00 for timestamps with a day resolution.



  • Upgraded to LTS 19.6 and nixpkgs branch nixos-22.05.


  • smos-convert-org: It was wrong in multiple ways and was not being used.



  • The local backup now uses shell-scripting-friendlier filenames. For example; 2022-06-05_224543 instead of 2022-06-05_22:45:43.

  • Fixed a bug where the projects report reported done entries as the current entry. Thank you @CSVdB!


  • smos-server: Removed the "backup interval" feature. Backups are now made every time the backup looper runs, instead of only if the "backup interval" has expired. This means that the backup looper's period has effectively become the backup interval.
  • smos-server: Removed the server "max backups per user" feature. The maximum number of backups per user per period is now the default way to configure backup deletion. Configuring the maximum number of backups per user over all periods is no longer possible.



  • smos-server: Keep more backups: 4 in the last day and every hour in the last 4 hours as well.



  • The projects now no longer ignores entries without a state and their children. This fixes #242. Thank you @tgoossens!



  • smos-report: "By header", "By state" and "By timestamp" sorters.
  • smos-github: An "import" command for importing github issues and pull requests into a smos project.
  • smos and smos-query: The work report now warns against projects without a next state.


  • smos-calendar-import: Import sources in parallel, instead of one by one.

  • smos-calendar-import: Render the event UID as a property and the original event in contents when --debug is used.

  • smos: When opening a file, the uncollapse rule has been changed to skip over entries without a state.


      DONE something done
    ❯ some info with no state 
      NEXT thing to do


      DONE something done
      some info with no state 
    ❯ NEXT thing to do
  • smos: Contents with carriage return or tab characters can now be shown in smos correctly.

  • smos-report: Fixed a bug where some filters could not be parsed because they contained substrings "or" or "and".

  • Home manager module: Fixed the naming of systemd services to be prefixed by smos- for easier tab-completion.

  • smos-data: Simplified time-related data parsing.

  • smos-data: Fixed a bug where sometimes todo state histories where not considered valid when they should be.

  • smos-data: Upgraded to data format 2.0.0, which allows timestamps to be less precise.

  • smos-scheduler: Use atomic durable writes for the state, so that the state never gets lost when something goes wrong during a write.

  • smos-sync-client: Use atomic durable writes for the login session, so that the session never gets lost when something goes wrong during a write.

  • smos-archive: Don't mark entries without a state as cancelled while archiving



  • Upgraded to lts-18.16 and the nixos-21.11 branch of nixpkgs.
  • Reduced the closure size of the nixos module and the home manager module.
  • smos-server: Simplified to be single-command, so that you don't have to use serve anymore.
  • smos-web-server: Simplified to be single-command, so that you don't have to use serve anymore.
  • smos-notify: Fixed a bug where smos-notify would fail to send a notification when the notification summary or description started with a - character.
  • smos-data: Forward-compatibility with data format version 2.0.0.
  • smos-data: Clearer data formats with more comprehensive naming.
  • smos-api: Upgrade to version 0.3.0 with shorter names for username and password in the API.
  • smos-server: Changed the backup garbage collector to be smarter. It can now save one backup a day for the last 7 days, one backup a week for the last 8 weeks, and 1 backup a month for the last year.



  • smos: convResponded, which is like convRespondedButStillWaiting but does not duplicate the original entry and is bounded to <space>rs by default.
  • smos-calendar-import: You can now ignore calendar events by adding SMOS_NO_CALENDAR_IMPORT to their description.
  • smos-scheduler: A sample command to help you produce templates in a feedback loop.
  • smos: convUrlWaitingForReview, a convenience function for waiting for review at a given url.
  • smos-sync-client: Now removes empty directories after syncing, by default. See its documentation for information about how to turn this off.
  • smos-archive: Can now also take commands. The original use of smos-archive <file> still works, but can now also be invoked as smos-archive file <file>.
  • smos-archive: An export command that lets you export pieces of your archive for cold storage.


  • smos: convRespondedButStillWaiting now also adds a DONE "Respond" task inbetween.
  • Replaced yamlparse-applicative by autodocodec. This massively improved the documentation of configuration file formats, as well as the page about the smos file format. Now we can have finite schemas for recursive types, so we can show the entire schema.
  • Upgraded validity dependency to beyond genvalidity >=
  • smos: Smarter starter unfolding rule. Before, smos would go to the last deepest entry as a proxy for the "current" entry for a project. After this change, smos goes to the first, deepest, not-done entry. Any entirely-done subforests will also be collapsed on the way there.
  • Reduced the closure size of the smosRelease derivation from 4.9G to 160M.


  • The static builds. Even if anyone were to use them, and I don't think anyone did, I don't think they actually worked because of the way terminfo is dealt with.
  • The smos-shell libary and executable, as well as the reports in the browser. These reports were not configurable, and no one was using them. People would switch to the CLI, or use the interactive reports, before they would ever use the web reports.



  • smos: Fixed that the convRepinged and convRespondedButStillWaiting convenience functions that duplicate an entry would also duplicate their logbook.
  • Fixed that tests would fail after 2021-07-01.



  • smos-query: The entry and report reports now support multiple output formats: json, pretty-json, and yaml. This should allow for simpler integrations.

  • smos-scheduler: The next command to see when items will be activated next.


  • smos: Timestamps can now be deleted using the timestampsDelete and timestampsRemove actions.
  • smos-notify: smos-notify will no longer send a notification about timestamps that don't have a time component.
  • nixos-module.nix: The config attribute will now override other attributes.
  • smos-server: The server no longer migrates files periodically, but rather gives the administrator a button to do that instead.


  • smos-server: Removed the backup file migration looper. It went against the idea of backups.


  • smos-server: Now supports logging, and some logging has already been added as well.
  • smos: The convCopyContentsToClipboard action to copy the selected entry's contents to the system clipboard. This fixes issue 205. Thank you @distefam!
  • smos-web-server: An account overview page, including a button to delete your account.
  • smos-calendar-import: The rendered smos entries now all contain the description of the event as contents, instead of only the top-level event.
  • smos-notify: You can now put the magic string SMOS_NO_NOTIFY into event descriptions to have smos-notify ignore the event entirely.
  • smos-sync-client: Now sends the username of the user and the hostname of the device that makes the requests in the Referer header of every request. This information is only used for logging.
  • smos-web-server: Now requires a WEB_URL to be configured and sends it over in the Referer header of every request to the API.
  • smos: Fixed that the file browser filter was shown in an empty file browser as well.
  • smos-query: Added a header to each of the columns in the waiting report.
  • smos and smos-query: Made the filepaths not as prominent, visually.
  • smos and smos-query: Made report formatting more consistent
  • smos: No longer shows the .smos extension for every stuck project in the stuck projects report.
  • smos and smos-query: Allow thresholds for the waiting, stuck and work reports to be configured as more general time strings.
  • smos and smos-query: Added the waiting_threshold to allow for a custom per-entry waiting threshold.
  • smos: Fixed that the filter bar wasn't shown in the interactive work report. This fixes issue 206. Thank you @vidocco!
  • smos-server: Made the backup interval configurable
  • smos-github: Fixed that only pull requests would be listed but not issues.


  • smos-query: You can now configure colours more specifically: The 8 standard terminal colours and 24bit colours.
  • smos and smos-query: More strings are now recognised as durations: 5sec, 6 min, 7 hours, etc... This fixes Issue 104. See PR 195 for more details. Thank you @ketzacoatl!
  • smos-sync-client: Now sends the User-Agent header with smos-sync-client-<version>.
  • smos-web-server: Now sends the User-Agent header with smos-web-server-<version>.
  • smos-sync-client: Retry authenticating (once) if authentication fails. This should prevent users from having to remove the .cache/smos/sync-session.dat cache file when authentication fails because in the way authentication works.
  • smos-sync-client: More descriptive error messages if login fails.
  • smos-sync-client: Use the logger for warnings, so you can now ignore them by setting the log level higher than LevelWarn.
  • smos-client: A bit of a nicer error message when something goes wrong during the client's api-version check.
  • smos-sync-client: Use a separate lock file from the database file itself to lock the database. This prevents a SQLITE_BUSY infinite retry problem. See Issue 202 and PR 203. Thank you @jhbertra!
  • smos-query: Fixed that smos-query was not taking into account certain configurations for the work, waiting and stuck reports. This fixes Issue 201. Thank you @vidocco!
  • smos-query: Ripped out the functionality where you could configure smos-query in haskell. This functionality was complex and has already caused multiple bugs. It turns out that there is no need for this functionality because you can configure everything in smos-query with the different ways of option parsing. This is unlike smos where configuring it in Haskell is actually useful because you can define your own actions to key-bind. This change does not affect users that don't use smos-query as a library.


  • smos: A keybinding to open the url property in smos: <space>ou by default.
  • smos-server: Now performs auto-backups and backup garbage-collection beyond a maximum number of backups or backup size
  • smos-server: Now performs automatic smos file format migration for the smos files and smos backup files it stores
  • smos-server: Admin endpoint for the admin panel
  • smos-web-server: Admin panel with basic user information
  • smos-github: There is now a new column that suggests you to have another look at the issue/pr because there has been a recent enough update.
  • smos-github: Done entries are no longer mentioned in the list report.
  • smos-github: Show the state of the entries in the list report as well.
  • smos-query: Always show "no todo state" as (none) instead of the empty string.
  • smos-web-server: The footer icons now no longer overlap with the terminals.
  • smos-notify: Include the time that the notification is about in the notification as well.
  • smos: Fixed the way undo works in timestamps.
  • smos: Fixed the way undo works in tags.
  • smos: Fixed the way undo works in property names and property values.


  • smos-data: Updated the data format to include a data format version. This way, we can change change the data format in the future and not get crashes. The previous version was already forward-compatible with this change so you should not notice this change unless you wrote custom tooling to work with smos files. The newest data-format version is version 1.0.0.

  • smos: The components of an entry are now drawn in the following order:

    1. timestamps
    2. properties
    3. contents
    4. logbook
    5. history

    where they used to be drawn in this order:

    1. contents
    2. timestamps
    3. properties
    4. history
    5. logbook
  • smos-web-server: The web server now calls the API server during startup. This way the web server checks for both liveness of the API server and version compatibility.

  • smos-sync-client: The sync client now checks compatibility with the server's API version.

  • smos-client-gen: This package was empty


  • smos-query: The 'timestamp' projection. You can now use timestamp:DEADLINE as a column in your reports.
  • smos: Interactive agenda report with filter bar
  • smos: Filter bar for the interactive waiting report
  • smos: You can now exit any report using Esc, even when no file had been selected beforehand. Thank you @ketzacoatl!
  • smos: Interactive stuck projects report
  • smos: Filter bar for the built-in file browser
  • smos: The forestToggleCollapseEntryProperties action, bound to zp by default.
  • All commands: Autocompletion for the --config-file and --workflow-dir options.
  • smos: The propertiesEditProperty_goal action, bound to pg by default.
  • smos: Non-colour-based indicators of selection, for screens without colour or colour-blind users.
  • smos-query: All reports are now bicoloured by default. This can be configured via the configuration file.
  • smos-web-server: A fancy home page instead of just a login button.
  • smos-data: Allow spaces and parens in property values. Note that this means that smos files created in this new version of smos are potentially not backward compatible.
  • smos-scheduler: Explicitly setting a header's state to null now leaves the generated state as null instead of setting it to TODO. Thank you @prikhi!
  • smos-query: Moved the work report warnings to above the deadlines so that they are more in line with the order in which you should read the report.
  • smos-query and smos-report: Moved all the static configuration of the work report out of smos-query into smos-report so that smos can access it for the interactive work report.
  • smos: Hide properties of done entries on startup.
  • smos: The waiting report is now drawn with the configured threshold, instead of always with threshold 7.


  • smos: The browserSelectFirst and browserSelectLast actions, which are activated by gg and G respectively by default.
  • smos: The convArchiveFile function, activated by <space>fa by default. You can use it to archive a file while looking at the file.
  • Nixos module tests for home-manager configurations. The home manager module is now an official deliverable.
  • smos-archive: The timestamp appended to the filename during archiving now includes the local time of day instead of only the day.
  • smos: The contents of an entry are now aligned with its state and header instead of with its list indicator.
  • smos: Fixed a grammatical error in the description of the entrySelectTagsFromBack action.
  • smos: Fixed incorrect logic with respect to displaying an ellipsis when parts of an entry were collapsed and selected.
  • smos: Drastically reduced the idle CPU/memory usage by turning off idle GC.
  • smos: Changed the lister character - to a space for a cleaner UI.
  • smos-query: Fixed that check violations would not show up in the work report if the user had not configured any contexts.
  • Converted all test suites to using Sydtest and fixed three sources of flakiness as a result.


  • smos: You can now use Word-based movements in headers and contents. cursor/#12 Thank you @chiroptical!
  • smos-shell: A new package, to run smos commands in the browser without allowing full shell access.
  • smos: It is now possible to hide timestamps. Timestamps of done entries are hidden by default.
  • smos-query: It is now possible to run the work report without any context.
  • smos-query: The work report now also shows overdue waiting entries.
  • smos-calendar-import: The importer no longer fails on malformed URIs.
  • smos-calendar-import: The importer no longer fails on all other sources if any of them fails to parse.
  • smos-calendar-import: The importer now has a failing exit code if one of the sources failed to parse.
  • smos-web-server: The web server now sanitises output from the smos instance to make extra-sure that no non-UTF8 text gets to the client.
  • smos: When pressing ? twice, the help screen now gets closed instead of ending up in a strange empty help screen state.
  • smos-query: The stuck report now also takes timestamps of not-done entries into account.
  • smos-query: The stuck report now takes a --threshold argument.
  • smos-query: The work report now shows overdue stuck projects as well.
  • smos-query: The work report now requires you to configure a timewindow property if you make use of the time filter feature.
  • smos-query: The 'smart' mode for the work command has been removed. It is now the default.


  • Static builds for all executables
  • smos-query: Make AllTime the default period and OneBlock the default block for the agenda command instead of 'Today'. See the Note [Agenda command defaults] in the code for more info. The default block now also changes per period. For year-based periods the default block will by month, for month-based periods the block will be by week, for week-based persiods the default block will be by day.
  • smos-query: The agenda report now shows the "Now" line in the right place at night. #164. Thank you @jecaro!
  • smos: When selecting a timestamp, smos now correctly selects the value instead of the name. #170 Thank you @jecaro!
  • smos-asciinema: This package has been entirely removed and split out to a separate project


  • smos: The first version of the Smos TUI
  • smos-query: The first version of the Smos Query tool
  • smos-single: The first version of the Smos Single tool for creating single-task projects from the command-line
  • smos-archive: The first version of the Smos Arching tool for archiving Smos files
  • smos-asciinema: The first version of the Smos Asciinema tool for recording ascii casts of smos demonstrations
  • smos-calendar-import: The first version of the Smos Calendar Import tool for importing calendars into your smos files
  • smos-convert-org: The first version of the Smos Org-mode conversion tool for converting org-mode files to smos files
  • smos-scheduler: The first version of the Smos Scheduler tool for automatically scheduling recurring projects
  • smos-server: The first version of the Smos API Server
  • smos-sync-client: The first version of the Smos Sync Client for synchronising smos files accross multiple devices
  • smos-web-server: The first version of the Smos Web Server