imm: Execute arbitrary callbacks for each element of RSS/Atom feeds

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.



Cf README file

[Skip to ReadMe]


Change logNone available
Dependenciesaeson, async, atom-conduit (>=0.7), base-noprelude (>=4.7 && <5), binary, blaze-html, blaze-markup, bytestring, case-insensitive, conduit, connection, containers, dhall, directory (>=, fast-logger, filepath, hashable, HaskellNet (>=0.5), HaskellNet-SSL (>=, http-client (>=0.4.30), http-client-tls, http-types, imm, microlens, mime-mail, monad-time, network (<3), opml-conduit (>=0.7), optparse-applicative, prettyprinter, prettyprinter-ansi-terminal, refined (>=0.4.1), relude, rss-conduit (>=0.4.1), safe-exceptions, stm, stm-chans, streaming-bytestring, streaming-with, text, time, timerep (>=, tls, typed-process, uri-bytestring, xml-conduit (>=1.5), xml-types [details]
Authorkamaradclimber, koral
Home page
Source repositoryhead: git clone git://
Executablesimm-sendmail, imm-writefile, imm
UploadedSun Jun 9 16:16:50 UTC 2019 by koral




Maintainers' corner

For package maintainers and hackage trustees

Readme for imm-

[back to package description]


imm is a program that executes arbitrary callbacks (e.g. sending a mail, or writing a file) for each element of RSS/Atom feeds.

imm is written in Haskell, configured in Dhall. The project includes:


Callbacks are configured through the $XDG_CONFIG_HOME/imm/callbacks.dhall file. A commented template file is bundled with the project.

imm will call each callback once per feed element, and will fill its standard input (stdin) with a JSON object structured as follows:

  "feed": "RSS document or Atom feed (XML)",
  "element": "RSS item or Atom entry (XML)"

imm expects callbacks to return 0 in case of success, or any other exit code in case of failure, in which case the standard error output (stderr) will be displayed.

Example use cases

Online feed reader

For the sake of I-want-the-mutt-of-feed-readers zealots, it is possible to turn any mail reader into a feed reader, by having imm send an e-mail with unread elements to an arbitrary address. You can then browse your feeds through your favourite mail reader, and leverage any mail-related tool on your feeds. Bonus points if your mail reader is online as you can now access your feeds from any computer connected to the Internet.

Here is an example configuration:

let Callback : Type =
  { _executable : Text
  , _arguments : List Text

let sendMail =
  { _executable = "imm-sendmail"
  , _arguments = ["--login", "-u", "", "-P", "password", "-s", "", "-p", "587", "--to", ""]

let config : List Callback = [ sendMail ]
in config

Offline read-it-later

imm is able to store a local copy of unread elements, to read them later while offline for example. External links won't work offline though.

let Callback : Type =
  { _executable : Text
  , _arguments : List Text

let writeFile =
  { _executable = "imm-writefile"
  , _arguments = [ "-d", "/path/to/folder" ]

let config : List Callback = [ writeFile ]
in config

Example usage