HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
chjj
blessed
JavaScript2013–2026
chjj / blessed

blessed

A high-level terminal interface library for node.js.

26Distinct people
30Mentions
1Explicit recommenders
11.9KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A high-level terminal interface library for node.js.

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Fun fact - xterm.js was originally created by chjj who also wrote the code for Handshake DNS among other things. My favorite is blessed [1]. He’s definitely a super programmer.…

rasengan used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:03:16 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year30 dated mentions

Observed mentions: 2013-07-17 16:48:42 UTC to 2026-03-27 15:01:54 UTC.

02462013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20132014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 6 mentions; 3 submissions, 3 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 3 mentions; 1 submissions, 2 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 6 mentions; 1 submissions, 5 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC202
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC101
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC633
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC404
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC312
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC110
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC211
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC615
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC101
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC202
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC000
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC000
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC110

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
blessed A curses-like library with a high level terminal interface API for node.js. Blessed is over 16,000 lines of code and terminal goodness. It's completely implemented in javascript, and its goal consists of two things: Reimplement ncurses entirely by parsing and compiling terminfo and termcap, and exposing a Program object which can output escape sequences compatible with any terminal. Implement a widget API which is heavily optimized for terminals. The blessed renderer makes use of CSR (change-scroll-region), and BCE (back-color-erase). It draws the screen using the painter's algorithm and is sped up with smart cursor movements and a screen damage buffer. This means rendering of your application will be extremely efficient: blessed only draws the changes (damage) to the screen. Blessed is arguably as accurate as ncurses, but even more optimized in some ways. The widget library gives you an API which is reminiscent of the DOM. Anyone is able to make an awesome terminal application with blessed. There are terminal widget libraries for other platforms (primarily python and perl), but blessed is possibly the most DOM-like (dare I say the most user-friendly?). Blessed has been used to implement other popular libraries and programs. Examples include: the slap text editor and blessed-contrib. The blessed API itself has gone on to inspire termui for Go. Install $ npm install blessed Example This will render a box with line borders containing the text 'Hello world!', perfectly centered horizontally and vertically. NOTE: It is recommend you use either smartCSR or fastCSR as a blessed.screen option. This will enable CSR when scrolling text in elements or when manipulating lines. var blessed = require('blessed'); // Create a screen object. var screen = blessed.screen({ smartCSR: true }); screen.title = 'my window title'; // Create a box perfectly centered horizontally and vertically. var box = blessed.box({ top: 'center', left: 'center', width: '50%', height: '50%', content: 'Hello {bold}world{/bold}!', tags: true, border: { type: 'line' }, style: { fg: 'white', bg: 'magenta', border: { fg: '#f0f0f0' }, hover: { bg: 'green' } } }); // Append our box to the screen. screen.append(box); // Add a png icon to the box var icon = blessed.image({ parent: box, top: 0, left: 0, type: 'overlay', width: 'shrink', height: 'shrink', file: __dirname + '/my-program-icon.png', search: false }); // If our box is clicked, change the content. box.on('click', function(data) { box.setContent('{center}Some different {red-fg}content{/red-fg}.{/center}'); screen.render(); }); // If box is focused, handle `enter`/`return` and give us some more content. box.key('enter', function(ch, key) { box.setContent('{right}Even different {black-fg}content{/black-fg}.{/right}\n'); box.setLine(1, 'bar'); box.insertLine(1, 'foo'); screen.render(); }); // Quit on Escape, q, or Control-C. screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); }); // Focus our element. box.focus(); // Render the screen. screen.render(); Documentation Widgets Base Nodes Node (abstract) Screen Element (abstract) Boxes Box Text Line ScrollableBox (deprecated) ScrollableText (deprecated) BigText Lists List FileManager ListTable Listbar Forms Form Input (abstract) Textarea Textbox Button Checkbox RadioSet RadioButton Prompts Prompt Question Message Loading Data Display ProgressBar Log Table Special Elements Terminal Image ANSIImage OverlayImage Video Layout Other Helpers Mechanics Content & Tags Colors Attributes Alignment Escaping SGR Sequences Style Colors Attributes Transparency Shadow Effects Events Event Bubbling Poisitioning Rendering Artificial Cursors Multiple Screens Server Side Usage Notes Windows Compatibility Low-level Usage Testing Examples FAQ Widgets Blessed comes with a number of high-level widgets so you can avoid all the nasty low-level terminal stuff. Base Nodes Node (from EventEmitter) The base node which everything inherits from. Options: screen - The screen to be associated with. parent - The desired parent. children - An arrray of children. Properties: Inherits all from EventEmitter. type - Type of the node (e.g. box). options - Original options object. parent - Parent node. screen - Parent screen. children - Array of node's children. _data, , $ - An object for any miscellanous user data. index - Render index (document order index) of the last render call. Events: Inherits all from EventEmitter. adopt - Received when node is added to a parent. remove - Received when node is removed from it's current parent. reparent - Received when node gains a new parent. attach - Received when node is attached to the screen directly or somewhere in its ancestry. detach - Received when node is detached from the screen directly or somewhere in its ancestry. Methods: Inherits all from EventEmitter. prepend(node) - Prepend a node to this node's children. append(node) - Append a node to this node's children. remove(node) - Remove child node from node. insert(node, i) - Insert a node to this node's children at index i. insertBefore(node, refNode) - Insert a node to this node's children before the reference node. insertAfter(node, refNode) - Insert a node from node after the reference node. detach() - Remove node from its parent. emitDescendants(type, args..., [iterator]) - Emit event for element, and recursively emit same event for all descendants. get(name, [default]) - Get user property with a potential default value. set(name, value) - Set user property to value. Screen (from Node) The screen on which every other node renders. Options: program - The blessed Program to be associated with. Will be automatically instantiated if none is provided. smartCSR - Attempt to perform CSR optimization on all possible elements (not just full-width ones, elements with uniform cells to their
Read the full README on GitHub

What Hacker News says

30 sources
rasengan·Oct 8, 2021Recommendation phrase
Fun fact - xterm.js was originally created by chjj who also wrote the code for Handshake DNS among other things. My favorite is blessed [1]. He’s definitely a super programmer. Thank you for all your contributions to this world @chjj! [1] https://github.com/chjj/blessed
In Xterm.js
I commented on this in another HN discussion thread [1] on Blessed [2]. You might want to look at what Vermont Views did [3] to avoid reinventing the wheel of what to implement. I'm sure if you put the call out for it, someone, somewhere, reading on HN, will be able to post up the documentation if you want a detailed look, or send you the obfuscated source code (which these days could probably be re-constituted with modern re-factoring editors). I tried emailing and hard copy mail contacting them a few years back to buy the rights so I could turn around to open source it as I anticipated a resurgence of interest in TUI's because the browser-based latency issue is simply not improving fast enough, but never got a response, so as far as I can tell, they went abandonware (their corporate form is inactive [4], but someone is updating their of
Read the rest
In Building Rich Terminal Dashboards
Hello HN, This is an (Partially)[0] Open source Multiplayer Battleship game that runs in CLI. I made it to try out blessed[1] library, but also thought would be a nice idea to kill some time while running scripts on another window in CLI. Repo: https://github.com/batuhandirek/battleship-rocks-client 0: Only client code is public for the moment 1: https://github.com/chjj/blessed Edit: Added repo link and description
In Show HN: Battleship.rocks – Multiplayer Battleship Game in CLI
Such things existed in the pre-GUI-everywhere days: https://en.wikipedia.org/wiki/DESQview is probably the most well known example. If you are not wanting a full windowing OS (just a windowing display) then https://en.wikipedia.org/wiki/Tmux may do the job for you in unix-a-like environments, with or without https://en.wikipedia.org/wiki/Byobu_(software). In fact I sometimes have several log monitoring windows open in one tmux screen, essentially a dashboard like this and you describe. Done this way all that is running is console applications: almost any existing console application can work well and there is no need for extra development to interface a new windowing API. You could use an existing CUI/TUI library to write such a condole-based windowing system, if tmux/similar don't quite do what you are looking for. For example https://gi
Read the rest
thub.com/chjj/blessed if node.js is your bag. Similar libraries exist for other languages too (go, .net, ...) - search for "Terminal UI <language>" or "Console UI <language>" and options should pop up.
In WTF: A personal information dashboard for your terminal

Showing the 15 most recent of 30 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.