Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

kittoframework/kitto

Kitto is a framework for interactive dashboards written in Elixir

kittoframework/kitto.json
{
"createdAt": "2016-05-11T15:27:31Z",
"defaultBranch": "master",
"description": "Kitto is a framework for interactive dashboards written in Elixir",
"fullName": "kittoframework/kitto",
"homepage": "http://kitto.io/dashboards/sample",
"language": "Elixir",
"name": "kitto",
"pushedAt": "2020-12-06T21:16:55Z",
"stargazersCount": 959,
"topics": [
"dashboard",
"elixir",
"framework",
"react"
],
"updatedAt": "2025-11-17T20:54:05Z",
"url": "https://github.com/kittoframework/kitto"
}

kitto-logo


Build Status Package Version Coverage Inline docs Chat on Gitter

Kitto is a framework to help you create dashboards, written in [Elixir][elixir] / [React][react].

demo

The source for the demo dashboards can be found at: kittoframework/demo.

To start creating your own, read below.

  • Jobs are supervised processes running concurrently
  • Widgets are coded in the popular [React][react] library
  • Uses a modern asset tool-chain, [Webpack][webpack]
  • Allows streaming SSE to numerous clients concurrently with low memory/CPU footprint
  • Easy to deploy using the provided Docker images, Heroku ([guide][wiki-heroku]) or [Distillery][distillery] ([guide][wiki-distillery])
  • Can serve assets in production
  • Keeps stats about defined jobs and comes with a dashboard to monitor them ([demo][demo-jobs])
  • Can apply exponential back-offs to failing jobs
  • [Reloads][code-reloading] code upon change in development

Install the latest archive

Terminal window
mix archive.install https://github.com/kittoframework/archives/raw/master/kitto_new-0.9.2.ez
  • Elixir: >= 1.3
  • Erlang/OTP: >= 19
  • Node: 14.15.1
  • npm: 6.14.9

It may inadvertently work in versions other than the above, but it won’t have been thoroughly tested (see [.travis.yml][.travis.yml] for the defined build matrix).

You may also use the official Docker image.

Please open an issue to request support for a specific platform.

Terminal window
mix kitto.new <project_name>

Install dependencies

Terminal window
mix deps.get && npm install

Start a Kitto server (also watches for assets changes)

Terminal window
mix kitto.server

Try the sample dashboard at: http://localhost:4000/dashboards/sample

For configuration options and troubleshooting be sure to consult the [wiki][wiki].

Kitto is capable of serving multiple dashboards. Each one of them is served from a path of the following form /dashboards/<dashboard_name>.

A dashboard consists of a Gridster grid containing React widgets.

You will find a sample dashboard under dashboards/sample.

The snippet below will place a simple Text widget in the dashboard.

<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
<div class="widget-welcome"
data-widget="Text"
data-source="text"
data-title="Hello"
data-text="This is your shiny new dashboard."
data-moreinfo="Protip: You can drag the widgets around!"></div>
</li>

The most important data attributes here are

  • data-widget Selects the widget to be used. See: Widgets
  • data-source Selects the data source to populate the widget. See: Jobs

The other data attributes are options to be passed as props to the React widget.

By creating a new dashboard using mix kitto.new <project_name> you get a few sample jobs in the directory jobs/.

A job file is structured as follows:

# File jobs/random.exs
use Kitto.Job.DSL
job :random, every: :second do
broadcast! :random, %{value: :rand.uniform * 100 |> Float.round}
end

The above will spawn a supervised process which will emit a server-sent event with the name random every second.

Jobs can also run commands on the server. Data broadcast using commands is in the form {exit_code: integer, stdout: String.t}. For example the following job will broadcast a kitto_last_commit event with the results of the curl statement:

job :kitto_last_commit,
every: {5, :minutes},
command: "curl https://api.github.com/repos/kittoframework/kitto/commits\?page\=1\&per_page\=1"

You can set a job to start at a later time using the first_at option:

# Delay the first run by 2 minutes
job :random, every: :second, first_at: {2, :minutes} do
broadcast! :random, %{value: :rand.uniform * 100 |> Float.round}
end

Widgets live in widgets/ are compiled using Webpack and are automatically loaded in the dashboards. Assets are rebuilt upon change in development, but have to be compiled for production. See webpack.config.js for build options.

Example widget (widgets/text/text.js)

import React from 'react';
import Widget from '../../assets/javascripts/widget';
import './text.scss';
Widget.mount(class Text extends Widget {
render() {
return (
<div className={this.props.className}>
<h1 className="title">{this.props.title}</h1>
<h3>{this.state.text || this.props.text}</h3>
<p className="more-info">{this.props.moreinfo}</p>
</div>
);
}
});

Each widget is updated with data from one source specified using the data-source attribute.

[distillery][wiki.distillery] | [docker][wiki.docker] | [heroku][wiki.heroku] | [systemd][wiki.systemd]

Compile the project

Terminal window
MIX_ENV=prod mix compile

Compile assets for production

Terminal window
npm run build

Start the server

Terminal window
MIX_ENV=prod mix kitto.server

By scaffolding a new dashboard with:

Terminal window
mix kitto.new

you also get a Dockerfile.

Build an image including your code, ready to be deployed.

Terminal window
docker build . -t my-awesome-dashboard

Spawn a container of the image

Terminal window
docker run -i -p 127.0.0.1:4000:4000 -t my-awesome-dashboard

Please read the detailed [instructions][wiki-heroku] in the wiki.

Please read the [upgrading guide][upgrading-guide] in the wiki.

Terminal window
mix test
Terminal window
mix credo

Have a question?

It is heavily inspired by shopify/dashing. :heart:

The road to Erlang / Elixir starts with Kitto.

Copyright (c) 2017 Dimitris Zorbas, MIT License. See LICENSE.txt for further details.

Logo by Vangelis Tzortzis ([github][srekoble-github] / [site][srekoble-site]).

[elixir] !: http://elixir-lang.org [react] !: https://facebook.github.io/react/ [webpack] !: https://webpack.github.io/ [gridster] !: http://dsmorse.github.io/gridster.js/ [wiki] !: https://github.com/kittoframework/kitto/wiki [wiki-heroku] !: https://github.com/kittoframework/kitto/wiki/Deploying-to-Heroku [code-reloading] !: https://github.com/kittoframework/kitto/wiki/Code-Reloading [upgrading-guide] !: https://github.com/kittoframework/kitto/wiki/Upgrading-Guide [.travis.yml] !: https://github.com/kittoframework/kitto/blob/master/.travis.yml [distillery] !: https://github.com/bitwalker/distillery [wiki-heroku] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-Heroku [wiki-distillery] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-Distillery [demo-jobs] !: https://kitto.io/dashboards/jobs [wiki.distillery] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-Distillery [wiki.docker] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-Docker [wiki.heroku] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-Heroku [wiki.systemd] !: https://github.com/kittoframework/kitto/wiki/%5BDeployment%5D-systemd-Unit [source-1080] !: https://github.com/kittoframework/demo/blob/master/dashboards/sample1080.html.eex [srekoble-github] !: https://github.com/srekoble [srekoble-site] !: https://vangeltzo.com/