# Notty — Declaring terminals
> **Community takeover:** This is a community-maintained fork of the original
> [notty](https://github.com/pqwy/notty) project by [@pqwy](https://github.com/pqwy).
Notty is a declarative terminal library for OCaml structured around a notion
of composable images. It tries to abstract away the basic terminal programming
model, providing something simpler and more expressive.
The core layout engine and IO codecs are pure platform-independent OCaml.
Distribution includes modules with input and output facilities for Unix, and Lwt
on Unix.
As an attempt to redefine terminal programming, Notty has to be
_opinionated_. It assumes Unicode throughout, does not have universal support
for various terminals out there, and has a peculiar programming and rendering
model.
Notty's core API was heavily influenced by Haskell's [Vty][vty].
## Where to start
Check out the [documentation], [examples], or peek directly into the [interface]
file.
Building with `dune build @ex` will produce several little example programs that
also double as tests.
```OCaml
(* Game of Life with ZX Spectrum kitsch. *)
let dot : image = I.uchar A.(fg lightred) (Uchar.of_int 0x25cf) 1 1
let background step (n, m) =
let k = 24. *. sin (float (step + m + n) /. 10.) |> truncate in
if k > 0 then I.char A.(fg (gray k)) '.' 1 1 else I.void 1 1
let render (w, h) step life : image =
I.tabulate w (h - 1) @@ fun x y ->
let pt = (x, y) in
if CSet.mem pt life then dot else background step pt
```
[documentation]: https://ocaml.org/p/notty-community/latest/doc/index.html
[examples]: https://github.com/ocaml-community/notty-community/tree/master/examples
[interface]: https://github.com/ocaml-community/notty-community/blob/master/src/notty.mli
[vty]: https://hackage.haskell.org/package/vty
## What?
- _Notty?_
Terminals are tedious to program for. Notty tries to abstract the tedium away,
leaving you with a more pleasant programming surface that's quite unlike a TTY.
Hence, _No-TTY_.
- A new kind of Rust terminal?
This Notty has no connection to any other body of code named Notty.
- Why make yet another terminal output library?
Because:
* It allows one to *describe* what should be seen, as opposed to *commanding*
a terminal.
* It's pretty compact. Both bells and whistles can be implemented separately.
* Core is easy to glue onto various IO backends.
* Pure platform-independent OCaml.