BSD-3-Clause licensed by Justus Adam
Maintained by
This version can be pinned in stack with:marvin-0.2.5@sha256:cff9eb3860fa6e5bf0472947224b69667f97bd0073956870662b22bd817c8286,6104

Marvin, the paranoid bot (β stage)

Travis Hackage

Marvin is an attempt to combine the ease of use of hubot with the typesafety and easy syntax of Haskell and the performance gains from compiled languages.

Installing and using marvin

The verbose documentation can be found on readthedocs It should hopefully answer all your questions.

Installation instructions are on this documentation page.


A teaser

module MyScript where

import Marvin.Prelude

script :: IsAdapter a => ScriptInit a
script = defineScript "my-script" $ do
    hear "sudo (.+)" $ do
        match <- getMatch

        reply $(isL "All right, i'll do #{match !! 1}")
    respond "repeat" $ do
        message <- getMessage

        send $(isL "You wrote #{message}")
    respond "what is in file (\\w+)\\??" $ do
        match <- getMatch 
        let file = match !! 1

        contents <- liftIO $ readFile file

        send contents
    enterIn "#random" $ do
        user <- getUser
        username <- getUsername user

        send $(isL "Hello #{username} welcome to the random channel!")

Testing and Talking

There’s a slack channel where you can ask questions or play around with a test instance of marvin.

It’s currently invite-only, so send me an email if you would like to join.


Any kind of contribution is very welcome.

Issues and errors

If you are a marvin user, please report any error, issues, or improvement suggestions to the issue section or write me an email.


I welcome anybody who tests marvin by deploying it. Especially testing different adapters is a huge help.


If you want to hack on marvin, feel free to do so and send me your changes as pull requests.

Current hot places to get started:

  • Convenient HTTP requests API in Marvin.Util.HTTP.
  • Convenient JSON handling API in Marvin.Util.JSON.
  • New adapters as submodules of Marvin.Adapter.
  • A basic library of scripts (maybe as a Marvin.Scripts.Prelude module?) (inspiration:


0.2.4 - 24.09.2017

  • Compatibility changes for aeson >= 1.2

0.2.4 - 23.09.2017

  • Fixed an old bug when getting information about unnamed channels

0.2.3 - 05.03.2017

  • A big thanks to @lubomir for testing the IRC adapter and contributing the following changes
    • Better command recognition in IRC adapter
    • Bot now properly registers in IRC
    • Added config setting to IRC for channels which the bot should join

0.2.2 - 05.03.2017

  • Removed the integration tests from the cabal package config

0.2.1 - 04.03.2017

  • Fixed the templates for the initializer
  • added tests to ensure integration test bot and project created by initializer actually compile
  • Fixed the travis configurations

0.2.0 - 25.02.2017

  • Implemented an adapter for IRC
  • Added manual lens class instances to expose the datatyes and instances using them.

0.1.2, 0.1.3, 0.1.4, 0.1.5 - 17.02.2017

  • Added manual version bounds to be compatible with stackage and the hackage build (sorry for the version spam)

0.1.1 - 17.02.2017

  • Added changelog
  • Added version bounds