identicon: Flexible generation of identicons

[ bsd3, graphics, image, library ] [ Propose Tags ]

Flexible generation of identicons.

[Skip to Readme]


Manual Flags


Turn on development settings.


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 0.1.0, 0.2.0, 0.2.1, 0.2.2, 0.2.3
Change log
Dependencies base (>=4.15 && <5), bytestring (>=0.10.6 && <0.13), JuicyPixels (>= && <4) [details]
License BSD-3-Clause
Author Mark Karpov <>
Maintainer Mark Karpov <>
Category Graphics, Image
Home page
Bug tracker
Source repo head: git clone
Uploaded by mrkkrp at 2023-12-29T09:59:22Z
Distributions LTSHaskell:0.2.3, NixOS:0.2.3, Stackage:0.2.3
Reverse Dependencies 2 direct, 0 indirect [details]
Downloads 3719 total (31 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2023-12-29 [all 1 reports]

Readme for identicon-0.2.3

[back to package description]


License BSD3 Hackage Stackage Nightly Stackage LTS CI

The package implements a flexible framework for generation of identicons on top of Juicy Pixels.

Quick start

To use the package you usually need the following imports and language extensions:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

import Codec.Picture -- JuicyPixels
import Data.ByteString (ByteString) -- we use strict byte strings
import Data.Proxy
import Data.Word (Word8)
import Graphics.Identicon -- core definitions
import Graphics.Identicon.Primitive -- some visual primitives

You first write a type that represents the total number of bytes your identicon consumes and the number of distinct visual components it has (they are called “layers” in the terminology of the package):

type MyIcon = Identicon 12 :+ Consumer 4 :+ Consumer 4 :+ Consumer 4

Here we have an identicon that needs 12 bytes to be generated. It has three consumers that take 4 bytes each and generate layers, i.e. visual objects (circles, squares, etc.).

The second step is to write implementation of every layer. We can use the primitives available out-of-the-box, they live in the Graphics.Identicon.Primitive module:

myImpl :: Implementation MyIcon
myImpl = Identicon :+ a :+ a :+ a
    a :: Word8 -> Word8 -> Word8 -> Word8 -> Layer
    a r g b n =
      rsym $ onGrid 3 3 n $
        gradientXY (edge . mid) black (PixelRGB8 r g b)

Every byte is available to the layer-generating function as a distinct Word8 argument. The type system makes sure that:

  • you consume exactly as many bytes as you promised in the type of your identicon;

  • you have as many layers as you have described in the type of your identicon;

  • every function in your implementation has a correct signature (i.e. it takes as many Word8s as promised and produces a Layer in the end).

Mixing of layers and generation is handled by the library like this:

-- | Here is the function that generates your identicons. It's usually
-- convenient to wrap the 'renderIdenticon' function that comes with the
-- library.
genMyIdenticon ::
  -- | Identicon width
  Int ->
  -- | Identicon height
  Int ->
  -- | Input (some sort of hash or something)
  ByteString ->
  -- | Identicon, unless 'ByteString' is too short
  Maybe (Image PixelRGB8)
genMyIdenticon = renderIdenticon (Proxy :: Proxy MyIcon) myImpl

For more information head straight to the Haddocks. BTW, I have written a blog post about the package where I demonstrate some pictures generated with it.

The following packages are designed to be used with identicon:


Issues, bugs, and questions may be reported in the GitHub issue tracker for this project.

Pull requests are also welcome.


Copyright © 2016–present Mark Karpov

Distributed under BSD 3 clause license.