Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@visulima/pail

visulima2kMIT2.1.22TypeScript support: included

Highly configurable Logger for Node.js, Edge and Browser.

ansi, anolilab, browser, browser-logger, callsite, callsites, cli, color, colorful, colorize, consola, console, console-logger, debug, error-logging, file-logger, file-logging, filesystem-logger, filter, fs-logger, handling exceptions, json, json-logger, json-logging, log level, log, log-cleaner, log-rotation, log4j, log4js, log4ts, logger, logging, node, stream, pretty, node-logger, pail, pino, pretty-error, pretty-log, print, progress, redact, rotating-log, show error, timer, universal, visulima, warning-logging, winston

readme

Visulima Pail

Highly configurable Logger for Node.js, Edge and Browser, built on top of

[@visulima/fmt][fmt], @visulima/colorize, ansi-escapes, safe-stable-stringify, string-length, terminal-size and wrap-ansi


[typescript-image][typescript-url] [![npm-image]][npm-url] [![license-image]][license-url]


Daniel Bannert's open source work is supported by the community on GitHub Sponsors


Why Pail?

  • Easy to use
  • Hackable to the core
  • Integrated timers
  • Custom pluggable processors and reporters
  • TypeScript support
  • Interactive and regular modes
  • Secrets & sensitive information filtering
  • Filename, date and timestamp support
  • Scoped loggers and timers
  • Scaled logging levels mechanism
  • String interpolation support
  • Object and error interpolation
  • Stack trace and pretty errors
  • Simple and minimal syntax
  • Spam prevention by throttling logs
  • Browser and Server support
  • Redirect console and stdout/stderr to pail and easily restore redirect.
  • Pretty or JSON output
  • CJS & ESM with tree shaking support
  • Supports circular structures
  • Fast and powerful, see the benchmarks

Install

npm install @visulima/pail
yarn add @visulima/pail
pnpm add @visulima/pail

Concepts

Most importantly, pail adheres to the log levels defined in [RFC 5424][rfc-5424] extended with trace level. This means that you can use the log levels to filter out messages that are not important to you.

Log Levels

Pail supports the logging levels described by [RFC 5424][rfc-5424].

  • DEBUG: Detailed debug information.

  • INFO: Interesting events. Examples: User logs in, SQL logs.

  • NOTICE: Normal but significant events.

  • TRACE: Very detailed and fine-grained informational events.

  • WARNING: Exceptional occurrences that are not errors. Examples: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong.

  • ERROR: Runtime errors that do not require immediate action but should typically be logged and monitored.

  • CRITICAL: Critical conditions. Example: Application component unavailable, unexpected exception.

  • ALERT: Action must be taken immediately. Example: Entire website down, database unavailable, etc. This should trigger the SMS alerts and wake you up.

  • EMERGENCY: Emergency: system is unusable.

Reporters

Reporters are responsible for writing the log messages to the console or a file. pail comes with a few built-in reporters:

Browser (console.{function}) Server (stdout or stderr)
JsonReporter JsonReporter
PrettyReporter PrettyReporter
x SimpleReporter
x FileReporter

Processors

Processors are responsible for processing the log message (Meta Object) before it's written to the console or a file. This usually means that they add some metadata to the record's context property.

A processor can be added to a logger directly (and is subsequently applied to log records before they reach any handler).

pail comes with a few built-in processors:

  • CallerProcessor - adds the caller information to the log message
    • The Meta Object is extended with a file name, line number and column number
  • RedactProcessor - redacts sensitive information from the log message

    The redact processor needs the "@visulima/redact" package to work. Use npm install @visulima/redact, pnpm add @visulima/redact or yarn add @visulima/redact to install it.

  • MessageFormatterProcessor - formats the log message (Util.format-like unescaped string formatting utility) [@visulima/fmt][fmt]
  • ErrorProcessor - serializes the error with cause object to a std error object that can be serialized.

Usage

import { pail } from "@visulima/pail";

pail.success("Operation successful");
pail.debug("Hello", "from", "L59");
pail.pending("Write release notes for %s", "1.2.0");
pail.fatal(new Error("Unable to acquire lock"));
pail.watch("Recursively watching build directory...");
pail.complete({
    prefix: "[task]",
    message: "Fix issue #59",
    suffix: "(@prisis)",
});

usage

Custom Loggers

To create a custom logger define an options object yielding a types field with the logger data and pass it as argument to the createPail function.

import { createPail } from "@visulima/pail";

const custom = createPail({
    types: {
        remind: {
            badge: "**",
            color: "yellow",
            label: "reminder",
            logLevel: "info",
        },
        santa: {
            badge: "🎅",
            color: "red",
            label: "santa",
            logLevel: "info",
        },
    },
});

custom.remind("Improve documentation.");
custom.santa("Hoho! You have an unused variable on L45.");

custom-types

Here is an example where we override the default error and success loggers.

import { pail, createPail } from "@visulima/pail";

pail.error("Default Error Log");
pail.success("Default Success Log");

const custom = createPail({
    scope: "custom",
    types: {
        error: {
            badge: "!!",
            label: "fatal error",
        },
        success: {
            badge: "++",
            label: "huge success",
        },
    },
});

custom.error("Custom Error Log");
custom.success("Custom Success Log");

override default types

Scoped Loggers

To create a scoped logger from scratch, define the scope field inside the options object and pass it as argument to the createPail function.

import { createPail } from "@visulima/pail";

const mayAppLogger = createPail({
    scope: "my-app",
});

mayAppLogger.info("Hello from my app");

simple scope

To create a scoped logger based on an already existing one, use the scope() function, which will return a new pail instance, inheriting all custom loggers, timers, secrets, streams, configuration, log level, interactive mode & disabled statuses from the initial one.

import { pail } from "@visulima/pail";

const global = pail.scope("global scope");

global.success("Hello from the global scope");

function foo() {
    const outer = global.scope("outer", "scope");
    outer.success("Hello from the outer scope");

    setTimeout(() => {
        const inner = outer.scope("inner", "scope");
        inner.success("Hello from the inner scope");
    }, 500);
}

foo();

extended scope

Interactive Loggers (Only on if stdout and stderr is a TTY)

To initialize an interactive logger, create a new pail instance with the interactive attribute set to true. While into the interactive mode, previously logged messages originating from an interactive logger, will be overridden only by new ones originating from the same or a different interactive logger. Note that regular messages originating from regular loggers are not overridden by the interactive ones.

import { createPail } from "@visulima/pail";

console.log("\n");

const pail = createPail();

const interactive = createPail({ interactive: true });

pail.info("This is a log message 1");

setTimeout(() => {
    interactive.await("[%d/4] - Process A", 1);
    setTimeout(() => {
        interactive.success("[%d/4] - Process A", 2);
        setTimeout(() => {
            interactive.await("[%d/4] - Process B", 3);
            setTimeout(() => {
                interactive.error("[%d/4] - Process B", 4);
            }, 1000);
        }, 1000);
    }, 1000);
});

pail.info("This is a log message 2");
pail.info("This is a log message 3");
pail.info("This is a log message 4");

For a more complex example, use can use the getInteractiveManager function, see the following code:

import { createPail } from "@visulima/pail";

const interactive = createPail({ interactive: true });

const TICKS = 60;
const TIMEOUT = 80;
const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
const messages = ["Swapping time and space...", "Have a good day.", "Don't panic...", "Updating Updater...", "42"];
let ticks = TICKS;
let i = 0;

const interactiveManager = interactive.getInteractiveManager();

interactiveManager.hook();

// eslint-disable-next-line no-console
console.log(" - log message");
// eslint-disable-next-line no-console
console.error(" - error message");
// eslint-disable-next-line no-console
console.warn(" - warn message");

const id = setInterval(() => {
    if (--ticks < 0) {
        clearInterval(id);

        interactiveManager.update(["✔ Success", "", "Messages:", "this line will be deleted!!!"]);
        interactiveManager.erase(1);
        interactiveManager.unhook(false);
    } else {
        const frame = frames[(i = ++i % frames.length)];
        const index = Math.round(ticks / 10) % messages.length;
        const message = messages[index];

        if (message) {
            interactiveManager.update([`${frame} Some process...`, message]);
        }
    }
}, TIMEOUT);

Timers

Timer are managed by the time(), timeLog() and timeEnd() functions. A unique label can be used to identify a timer on initialization, though if none is provided the timer will be assigned one automatically. In addition, calling the timeEnd() function without a specified label will have as effect the termination of the most recently initialized timer, that was created without providing a label.

import { pail } from "@visulima/pail";

pail.time("test");
pail.time();
pail.timeLog("default", "Hello");

setTimeout(() => {
    pail.timeEnd();
    pail.timeEnd("test");
}, 500);

timers

Its also possible to change the text inside time() and timeEnd() by using the options object.

import { createPail } from "@visulima/pail";

const pail = createPail({
    messages: {
        timerStart: "Start Timer:",
        timerEnd: "End Timer:",
    },
});

pail.time("test");
pail.timeEnd("test");

Disable and Enable Loggers

To disable a logger, use the disable() function, which will prevent any log messages from being written to the console or a file.

import { pail } from "@visulima/pail";

pail.disable();
pail.success("This message will not be logged");

To enable a logger, use the enable() function, which will allow log messages to be written to the console or a file.

import { pail } from "@visulima/pail";

pail.disable();
pail.success("This message will not be logged");
pail.enable();
pail.success("This message will be logged");

Api

Supported Node.js Versions

Libraries in this ecosystem make the best effort to track Node.js’ release schedule. Here’s a post on why we think this is important.

Contributing

If you would like to help take a look at the list of issues and check our Contributing guild.

Note: please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Credits

About

  • pino - 🌲 super fast, all natural json logger
  • winston - A logger for just about everything.
  • signale - Highly configurable logging utility
  • consola - 🐨 Elegant Console Logger for Node.js and Browser

License

The visulima pail is open-sourced software licensed under the [MIT][license-url]

[typescript-url]: https://www.typescriptlang.org/ "TypeScript" "typescript" [license-image]: https://img.shields.io/npm/l/@visulima/pail?color=blueviolet&style=for-the-badge [license-url]: LICENSE.md "license" [npm-image]: https://img.shields.io/npm/v/@visulima/pail/latest.svg?style=for-the-badge&logo=npm [npm-url]: https://www.npmjs.com/package/@visulima/pail/v/latest "npm" [rfc-5424]: https://datatracker.ietf.org/doc/html/rfc5424#page-36 [fmt]: https://github.com/visulima/visulima/tree/main/packages/fmt

changelog

@visulima/pail 2.1.22 (2025-03-07)

Bug Fixes

  • updated @visulima/packem and other dev deps, for better bundling size (e940581)

Miscellaneous Chores

  • updated dev dependencies (487a976)

Dependencies

  • @visulima/colorize: upgraded to 1.4.21
  • @visulima/error: upgraded to 4.4.16
  • @visulima/fmt: upgraded to 1.1.15
  • @visulima/inspector: upgraded to 1.0.21
  • @visulima/redact: upgraded to 1.0.14

@visulima/pail 2.1.21 (2025-01-26)

Bug Fixes

  • pail: dont call extra log on the a function (a272682)

@visulima/pail 2.1.20 (2025-01-25)

Bug Fixes

  • fixed wrong node version range in package.json (4ae2929)

Miscellaneous Chores

  • fixed typescript url (fe65a8c)
  • updated all dev dependencies (37fb298)

Dependencies

  • @visulima/colorize: upgraded to 1.4.20
  • @visulima/error: upgraded to 4.4.15
  • @visulima/fmt: upgraded to 1.1.14
  • @visulima/inspector: upgraded to 1.0.20
  • @visulima/redact: upgraded to 1.0.13

@visulima/pail 2.1.19 (2025-01-22)

Miscellaneous Chores

  • updated all dev dependencies and all dependencies in the app folder (87f4ccb)

Dependencies

  • @visulima/colorize: upgraded to 1.4.19
  • @visulima/error: upgraded to 4.4.14
  • @visulima/inspector: upgraded to 1.0.19
  • @visulima/redact: upgraded to 1.0.12

@visulima/pail 2.1.18 (2025-01-13)

Dependencies

  • @visulima/colorize: upgraded to 1.4.18
  • @visulima/error: upgraded to 4.4.13
  • @visulima/inspector: upgraded to 1.0.18

@visulima/pail 2.1.17 (2025-01-12)

Bug Fixes

  • updated @visulima/packem, and all other dev dependencies (7797a1c)

Dependencies

  • @visulima/colorize: upgraded to 1.4.17
  • @visulima/error: upgraded to 4.4.12
  • @visulima/fmt: upgraded to 1.1.13
  • @visulima/inspector: upgraded to 1.0.17
  • @visulima/redact: upgraded to 1.0.11

@visulima/pail 2.1.16 (2025-01-09)

Bug Fixes

  • pail: fixed wrong description (14f0d57)

@visulima/pail 2.1.15 (2025-01-08)

Dependencies

  • @visulima/colorize: upgraded to 1.4.16
  • @visulima/error: upgraded to 4.4.11
  • @visulima/inspector: upgraded to 1.0.16

@visulima/pail 2.1.14 (2025-01-08)

Dependencies

  • @visulima/colorize: upgraded to 1.4.15
  • @visulima/error: upgraded to 4.4.10
  • @visulima/inspector: upgraded to 1.0.15

@visulima/pail 2.1.13 (2024-12-31)

Miscellaneous Chores

  • updated dev dependencies (9de2eab)

Dependencies

  • @visulima/colorize: upgraded to 1.4.14
  • @visulima/error: upgraded to 4.4.9
  • @visulima/inspector: upgraded to 1.0.14

@visulima/pail 2.1.12 (2024-12-12)

Bug Fixes

  • allow node v23 (8ca929a)
  • allowed node 23, updated dev dependencies (f99d34e)
  • updated packem to v1.8.2 (23f869b)
  • updated packem to v1.9.2 (47bdc2d)

Styles

Miscellaneous Chores

  • updated dev dependencies (a916944)

Dependencies

  • @visulima/colorize: upgraded to 1.4.13
  • @visulima/error: upgraded to 4.4.8
  • @visulima/fmt: upgraded to 1.1.12
  • @visulima/inspector: upgraded to 1.0.13
  • @visulima/redact: upgraded to 1.0.10

@visulima/pail 2.1.11 (2024-10-05)

Dependencies

  • @visulima/colorize: upgraded to 1.4.12
  • @visulima/error: upgraded to 4.4.7
  • @visulima/inspector: upgraded to 1.0.12

@visulima/pail 2.1.10 (2024-10-05)

Bug Fixes

  • updated dev dependencies, updated packem to v1.0.7, fixed naming of some lint config files (c071a9c)

Dependencies

  • @visulima/colorize: upgraded to 1.4.11
  • @visulima/error: upgraded to 4.4.6
  • @visulima/fmt: upgraded to 1.1.11
  • @visulima/inspector: upgraded to 1.0.11
  • @visulima/redact: upgraded to 1.0.9

@visulima/pail 2.1.9 (2024-09-24)

Bug Fixes

  • update packem to v1 (05f3bc9)
  • updated esbuild from v0.23 to v0.24 (3793010)

Miscellaneous Chores

  • updated dev dependencies (05edb67)

Dependencies

  • @visulima/colorize: upgraded to 1.4.10
  • @visulima/error: upgraded to 4.4.5
  • @visulima/fmt: upgraded to 1.1.10
  • @visulima/inspector: upgraded to 1.0.10
  • @visulima/redact: upgraded to 1.0.8

@visulima/pail 2.1.8 (2024-09-11)

Bug Fixes

Miscellaneous Chores

  • updated dev dependencies (28b5ee5)

Dependencies

  • @visulima/colorize: upgraded to 1.4.9
  • @visulima/error: upgraded to 4.4.4
  • @visulima/fmt: upgraded to 1.1.9
  • @visulima/inspector: upgraded to 1.0.9
  • @visulima/redact: upgraded to 1.0.7

@visulima/pail 2.1.7 (2024-09-07)

Bug Fixes

  • fixed broken chunk splitting from packem (1aaf277)

Dependencies

  • @visulima/colorize: upgraded to 1.4.8
  • @visulima/error: upgraded to 4.4.3
  • @visulima/fmt: upgraded to 1.1.8
  • @visulima/inspector: upgraded to 1.0.8
  • @visulima/redact: upgraded to 1.0.6

@visulima/pail 2.1.6 (2024-09-07)

Bug Fixes

  • added types support for node10 (604583f)

Styles

Miscellaneous Chores

  • update dev dependencies (0738f98)

Dependencies

  • @visulima/colorize: upgraded to 1.4.7
  • @visulima/error: upgraded to 4.4.2
  • @visulima/fmt: upgraded to 1.1.7
  • @visulima/inspector: upgraded to 1.0.7
  • @visulima/redact: upgraded to 1.0.5

@visulima/pail 2.1.5 (2024-08-30)

Bug Fixes

  • pail: update safe-stable-stringify package to version 2.5.0 (e463964)

Styles

Miscellaneous Chores

  • updated dev dependencies (45c2a76)

Dependencies

  • @visulima/colorize: upgraded to 1.4.6
  • @visulima/error: upgraded to 4.4.1
  • @visulima/inspector: upgraded to 1.0.6
  • @visulima/redact: upgraded to 1.0.4

@visulima/pail 2.1.4 (2024-08-08)

Miscellaneous Chores

  • updated dev dependencies (da46d8e)

Dependencies

  • @visulima/error: upgraded to 4.4.0

@visulima/pail 2.1.3 (2024-08-04)

Dependencies

  • @visulima/colorize: upgraded to 1.4.5
  • @visulima/error: upgraded to 4.3.2
  • @visulima/inspector: upgraded to 1.0.5

@visulima/pail 2.1.2 (2024-08-01)

Bug Fixes

  • upgraded @visulima/packem (dc0cb57)

Miscellaneous Chores

  • updated dev dependencies (ac67ec1)

Dependencies

  • @visulima/colorize: upgraded to 1.4.4
  • @visulima/error: upgraded to 4.3.1
  • @visulima/fmt: upgraded to 1.1.6
  • @visulima/inspector: upgraded to 1.0.4
  • @visulima/redact: upgraded to 1.0.3

@visulima/pail 2.1.1 (2024-07-22)

Miscellaneous Chores

  • updated dev dependencies and sorted the package.json (9571572)

Dependencies

  • @visulima/inspector: upgraded to 1.0.3

@visulima/pail 2.1.0 (2024-07-10)

Features

  • pail: added new options for the json error serializer (6df9535)

@visulima/pail 2.0.1 (2024-07-09)

Bug Fixes

  • fail: fixed types for error and inspect options (cc4202c)

@visulima/pail 2.0.0 (2024-07-09)

⚠ BREAKING CHANGES

  • removed abstract-file-reporter - the new base is now the AbstractJsonReporter, removed ErrorProcessor - was replaced with @visulima/error Signed-off-by: prisis d.bannert@anolilab.de

Features

  • switched error serialize to @visulima/error, export type for reporter options (a761356)

@visulima/pail 1.4.4 (2024-07-09)

Bug Fixes

Styles

Miscellaneous Chores

  • added private true into fixture package.json files (4a9494c)
  • changed typescript version back to 5.4.5 (55d28bb)
  • pail: fixed benchmarks (238aeaf)
  • updated dev dependencies (34df456)
  • updated dev dependencies (c889486)

@visulima/pail 1.4.3 (2024-06-14)

Bug Fixes

  • pail: fixed striping of spaces from messages (6d6ae8b)

@visulima/pail 1.4.2 (2024-06-14)

Bug Fixes

  • pail: fixed broken grouping of logs (2922a17)

@visulima/pail 1.4.1 (2024-06-14)

Bug Fixes

  • pail: fixed missing warning on timeEnd, added more tests, fixed wrong default of pail server and browser (a67254d)

@visulima/pail 1.4.0 (2024-06-14)

Features

  • pail: adding inspector into pretty reporters (#424) (76b1435)

@visulima/pail 1.3.1 (2024-06-14)

Bug Fixes

  • pail: fixed rendering of undefined and null as a message (eb80d23)

Styles

@visulima/pail 1.3.0 (2024-06-14)

Features

@visulima/pail 1.2.2 (2024-06-14)

Bug Fixes

  • pail: fixed wrong global import of rotating-file-stream, this did call the require to early (ac0c8bc)

@visulima/pail 1.2.1 (2024-06-13)

Bug Fixes

  • pail: fixed wrong require use of rotating-file-stream (37d9353)
  • pail: moved import of rotating-file-stream into a lazy import, removed wrong never typing (0513e27)

@visulima/pail 1.2.0 (2024-06-13)

Features

  • added simple reporter, fixed caller return, changed log color (#418) (e22b954)

@visulima/pail 1.1.13 (2024-06-13)

Miscellaneous Chores

Build System

  • fixed found audit error, updated all dev package deps, updated deps in apps and examples (4c51950)

Dependencies

  • @visulima/colorize: upgraded to 1.4.3

@visulima/pail 1.1.12 (2024-06-06)

Bug Fixes

Miscellaneous Chores

  • updated dev dependencies (a2e0504)

Dependencies

  • @visulima/colorize: upgraded to 1.4.2
  • @visulima/fmt: upgraded to 1.1.5

@visulima/pail 1.1.11 (2024-05-24)

Styles

Miscellaneous Chores

  • changed semantic-release-npm to pnpm (b6d100a)
  • updated dev dependencies (2e08f23)
  • updated dev dependencies (abd319c)
  • updated dev dependencies (0767afe)
  • updated dev dependencies (d7791e3)
  • updated dev dependencies (6005345)

Dependencies

  • @visulima/colorize: upgraded to 1.4.1

@visulima/pail 1.1.10 (2024-04-27)

Bug Fixes

  • api-platform: updated ts-japi dep (4f4d29f)

@visulima/pail 1.1.9 (2024-04-17)

Bug Fixes

  • pail: fixed log rendering for small terminal, exported error processor (47afd8a)

@visulima/pail 1.1.8 (2024-04-10)

Dependencies

  • @visulima/colorize: upgraded to 1.4.0

@visulima/pail 1.1.7 (2024-04-09)

Dependencies

  • @visulima/colorize: upgraded to 1.3.3

@visulima/pail 1.1.6 (2024-04-09)

Dependencies

  • @visulima/colorize: upgraded to 1.3.2

@visulima/pail 1.1.5 (2024-04-07)

Bug Fixes

  • pail: fixed error handling as context (#389) (f24e3a0)

@visulima/pail 1.1.4 (2024-03-30)

Bug Fixes

  • pail: fixed wrong function call on wrapConsole (0ae24cf)

@visulima/pail 1.1.3 (2024-03-27)

Bug Fixes

  • added missing os key to package.json (4ad1268)

Dependencies

  • @visulima/colorize: upgraded to 1.3.1
  • @visulima/fmt: upgraded to 1.1.4

@visulima/pail 1.1.2 (2024-03-19)

Bug Fixes

@visulima/pail 1.1.1 (2024-03-07)

Bug Fixes

  • fixed logger function type, for better input typing (f08bbd4)

@visulima/pail 1.1.0 (2024-03-04)

Features

Bug Fixes

  • fixed all found type issues (eaa40d1)
  • minifyWhitespace on prod build, removed @tsconfig/* configs (410cb73)

Dependencies

  • @visulima/colorize: upgraded to 1.3.0
  • @visulima/fmt: upgraded to 1.1.3

@visulima/pail 1.0.0 (2024-02-28)

Features

  • added all tests to the is-ansi-color-supported, updated deps (6639e75)
  • added correct badge display, adding new docs (5c7ff29)
  • added count and countReset, fixed time, timeLog and timeEnd (bef8926)
  • added header images (21e8d5a)
  • added more docs (ec33d26)
  • added new color pacakge (ca23c3d)
  • added new interactive manager, fixed tests, fixed styling, and more (e7359d3)
  • added tests (e30de63)
  • added time, timeLog and timeEnd, better design for browser console, some fixes (737378a)
  • adding interactive mode (a88ccb4)
  • adding new raw reporter and raw function to pail (#320) (e6cf56f)
  • fixed some design issues between server and browser, added trace (57a34b6)
  • improvement (1964590)
  • more work (3d41672)
  • more work (435ca60)
  • more work on the logger (01f2f94)
  • more work on the logger (3b8b1f0)
  • more work on the logger (93b658b)
  • more work on the logger (95e5f2a)
  • more work on the logger (93a9d4c)
  • new color and support color package (c580e05)
  • new console interface func, fixed some eslint errors (84917bd)
  • removed child handling (39abe92)
  • removed some deps (bd6150a)
  • speed up pail (2caab01)
  • split pail into browser class and server class (23dbcd6)
  • updated readme (69278b3)
  • updated readme (faa6425)
  • updated readme (10adfed)
  • updated string template to normale strings (a796e0f)

Bug Fixes

Dependencies

  • @visulima/colorize: upgraded to 1.2.2