Skip to main content

Migration from blessed

Learn how to migrate your existing blessed applications to unblessed.

About unblessed​

unblessed is built on top of the original blessed library. It was born as a fork but has evolved to become its own modern, TypeScript-first terminal UI library with cross-platform support.

While unblessed brings modern features like TypeScript, browser support, and improved architecture, we understand that many applications depend on the blessed API. That's why we provide a 100% backward-compatible package for seamless migration.

Drop-in Replacement with @unblessed/blessed​

The easiest and recommended way to migrate is using @unblessed/blessed, which provides complete API compatibility with blessed.

Installation​

npm install @unblessed/blessed@alpha
# or
pnpm add @unblessed/blessed@alpha
# or
yarn add @unblessed/blessed@alpha

For CommonJS (require)​

If your project uses CommonJS:

- const blessed = require('blessed');
+ const blessed = require('@unblessed/blessed');

const screen = blessed.screen({
smartCSR: true
});

const box = blessed.box({
parent: screen,
top: 'center',
left: 'center',
width: '50%',
height: '50%',
content: 'Hello {bold}World{/bold}!',
tags: true,
border: {
type: 'line'
}
});

screen.key(['escape', 'q', 'C-c'], () => {
process.exit(0);
});

screen.render();

That's it! Your code should work without any other changes.

For ES Modules (import)​

If your project uses ES modules:

- import blessed from 'blessed';
+ import blessed from '@unblessed/blessed';

const screen = blessed.screen({
smartCSR: true
});

const box = blessed.box({
parent: screen,
top: 'center',
left: 'center',
width: '50%',
height: '50%',
content: 'Hello {bold}World{/bold}!',
tags: true,
border: {
type: 'line'
}
});

screen.key(['escape', 'q', 'C-c'], () => {
process.exit(0);
});

screen.render();

TypeScript Projects​

For TypeScript projects, you can continue using @types/blessed:

import blessed from "@unblessed/blessed";
import type { Widgets } from "@unblessed/blessed";

const screen: Widgets.Screen = blessed.screen({
smartCSR: true,
});

const options: Widgets.BoxOptions = {
parent: screen,
top: "center",
left: "center",
width: "50%",
height: "50%",
content: "Hello World!",
border: { type: "line" },
};

const box: Widgets.BoxElement = blessed.box(options);
screen.render();

Upgrading to Modern API (Optional)​

Once your app is working with @unblessed/blessed, you can gradually migrate to the modern API for better TypeScript support and tree-shaking:

Step 1: Switch to @unblessed/node​

npm install @unblessed/node@alpha

Step 2: Update imports​

- import blessed from '@unblessed/blessed';
+ import { Screen, Box } from '@unblessed/node';

Step 3: Update widget creation​

- const screen = blessed.screen({
+ const screen = new Screen({
smartCSR: true
});

- const box = blessed.box({
+ const box = new Box({
parent: screen,
top: 'center',
left: 'center',
width: '50%',
height: '50%',
content: 'Hello World!',
border: { type: 'line' }
});

The modern API offers:

  • ✅ Better TypeScript inference
  • ✅ Tree-shakeable imports
  • ✅ Class-based API with better IDE support
  • ✅ Cleaner, more explicit code

Compatibility Notes​

What Works Exactly the Same​

  • All widgets: Screen, Box, List, Form, Input, Table, etc.
  • All options: Positioning, styling, borders, scrolling
  • All events: Mouse, keyboard, focus, blur, etc.
  • All methods: .setContent(), .focus(), .render(), etc.
  • Color system: Named colors, hex colors, RGB
  • Tag system: {bold}, {red-fg}, etc.

Known Differences​

There are very few differences from blessed:

  1. Runtime initialization: unblessed uses runtime dependency injection, but this is handled automatically when you import the package
  2. Node.js version: unblessed requires Node.js >= 22.0.0 (blessed worked on older versions)

If you encounter any behavior differences, please report them as bugs!

Testing Your Migration​

After migrating, thoroughly test your application:

  1. Visual testing: Verify UI renders correctly
  2. Interaction testing: Test keyboard and mouse events
  3. Edge cases: Test scrolling, focus management, complex layouts
  4. Performance: Compare render performance

Consider using the @unblessed/vrt package for visual regression testing.

Need Help?​

If you encounter issues during migration:

Report Issues​

Please report bugs and compatibility issues on GitHub:

GitHub Issues

When reporting, include:

  • Your unblessed version
  • Your Node.js version
  • Minimal code to reproduce the issue
  • Expected vs. actual behavior
  • Screenshots if relevant

Ask Questions​

For questions about migration or unblessed features:

Contribute​

Found a compatibility issue and know how to fix it? Contributions are welcome!

  • Fork the repository
  • Create a feature branch
  • Submit a pull request with tests

Migration Checklist​

  • Install @unblessed/blessed@alpha
  • Update imports from blessed to @unblessed/blessed
  • Test core functionality (rendering, events, layout)
  • Test edge cases (scrolling, focus, complex UIs)
  • Update Node.js to >= 22.0.0 if needed
  • (Optional) Gradually migrate to modern API with @unblessed/node
  • Report any compatibility issues on GitHub

Next Steps​