<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse" -->

---
title: Issue #637: Building Node TUIs with HTML and CSS — Node...
description: A curated roundup of Node.js links: TermDOM, a library for building terminal UIs with HTML and CSS as an alternative to Ink; a course on building agent...
canonical: https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Issue #637: Building Node TUIs with HTML and CSS — Node Weekly | daily.dev
og:description: A curated roundup of Node.js links: TermDOM, a library for building terminal UIs with HTML and CSS as an alternative to Ink; a course on building agent...
og:url: https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse
og:image: https://api.daily.dev/og/posts/tUNmdBXsE.png
og:image:alt: Issue #637: Building Node TUIs with HTML and CSS — Node Weekly
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Issue #637: Building Node TUIs with HTML and CSS — Node Weekly

**[Node Weekly](https://daily.dev/sources/ndwkly)** · 2 min read · 3 upvotes · 0 comments

## Summary

A curated roundup of Node.js links: TermDOM, a library for building terminal UIs with HTML and CSS as an alternative to Ink; a course on building agent harnesses for AI models; a TypeScript debugging story about a middleware bug that collapsed a return type to {}; five useful npx helper tools; an outbox pattern approach to the dual-write problem in Node.js; a deep dive into Hono's internals; unbash, a zero-dependency bash parsing library extracted from Knip; and njsscan 1.0, a semantic-aware SAST security scanner for Node apps.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://nodeweekly.com/issues/637>

## Questions this post answers

### What is TermDOM and how is it different from Ink for building terminal UIs in Node?

TermDOM is a library that implements a DOM, CSS cascade, and layout engine that paints to the terminal, letting developers write terminal UIs using HTML and CSS instead of React, which Ink requires. It has no native or WASM dependency and is pure JavaScript. Its official TodoMVC example runs with only a stylesheet swap, though the project is still in early days.

_Developers weighing React-free terminal UI options can follow tools like TermDOM as they mature on daily.dev._

### Why did adding a second middleware break my TypeScript return types and collapse them to an empty object?

A widely used key-filtering idiom leaks undefined when object properties are optional, which can collapse a composed return type down to an empty object type once a second middleware is layered in. This happens because TypeScript's type narrowing for filtered keys doesn't account for optional properties correctly when multiple transformations are chained together.

_Track subtle TypeScript typing pitfalls like this one on daily.dev before they surface in production middleware chains._

### What does njsscan 1.0 check for in Node.js applications?

njsscan 1.0 is a zero-config, pip-installable static analysis security tool that scans Node.js applications for insecure coding patterns using roughly 70 semgrep-powered rules. It targets vulnerability classes including XSS, SSRF, unsafe eval usage, JWT issues, and NoSQL injection.

_Developers choosing a Node.js SAST tool can compare options like njsscan on daily.dev._

## Similar posts on daily.dev

- [Issue \#797: Reimplementing htmx from scratch — JavaScript Weekly](https://daily.dev/posts/issue-797-reimplementing-htmx-from-scratch-javascript-weekly-wttoasjh9) · JavaScript Weekly · 2 upvotes · 0 comments
- [Issue \#642: 12 Node built-ins that replace npm packages — Node Weekly](https://daily.dev/posts/issue-642-12-node-built-ins-that-replace-npm-packages-node-weekly-pkfohz1we) · Node Weekly · 2 upvotes · 0 comments
- [Friday Links \#37 — JavaScript Trends & Tools](https://daily.dev/posts/friday-links-37-javascript-trends-tools-wcfijgz2p) · JS Dev Space · 0 upvotes · 0 comments
- [Frontend Weekly Digest \#475 \(13–19 July 2026\)](https://daily.dev/posts/frontend-weekly-digest-475-13-19-july-2026--ub93ciy1c) · Medium · 1 upvotes · 0 comments
- [Issue \#634: Domenic Denicola's modern dev setup — Node Weekly](https://daily.dev/posts/issue-634-domenic-denicola-s-modern-dev-setup-node-weekly-svegk0lpi) · Node Weekly · 1 upvotes · 0 comments

---

Tags: [#nodejs](https://daily.dev/tags/nodejs), [#typescript](https://daily.dev/tags/typescript), [#cli](https://daily.dev/tags/cli), [#appsec](https://daily.dev/tags/appsec)

[View this post on daily.dev](https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Issue #637: Building Node TUIs with HTML and CSS — Node Weekly","url":"https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse"},"datePublished":"2026-08-13T17:01:41.101Z","dateModified":"2026-09-14T08:49:30.633Z","description":"A curated roundup of Node.js links: TermDOM, a library for building terminal UIs with HTML and CSS as an alternative to Ink; a course on building agent...","image":"https://media.daily.dev/image/upload/s--ZrL_HSsR--/f_auto/v1722860399/public/Placeholder%2006","thumbnailUrl":"https://media.daily.dev/image/upload/s--ZrL_HSsR--/f_auto/v1722860399/public/Placeholder%2006","isAccessibleForFree":true,"articleSection":"Node Weekly","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Node Weekly","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/d9a53a9e9f1147e9ba5a36452cc68fad","url":"https://daily.dev/sources/ndwkly"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":3},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"nodejs,typescript,cli,appsec","timeRequired":"PT2M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Node Weekly","item":"https://daily.dev/sources/ndwkly"},{"@type":"ListItem","position":3,"name":"Issue #637: Building Node TUIs with HTML and CSS — Node Weekly"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/issue-637-building-node-tuis-with-html-and-css-node-weekly-tunmdbxse#faq","mainEntity":[{"@type":"Question","name":"What is TermDOM and how is it different from Ink for building terminal UIs in Node?","acceptedAnswer":{"@type":"Answer","text":"TermDOM is a library that implements a DOM, CSS cascade, and layout engine that paints to the terminal, letting developers write terminal UIs using HTML and CSS instead of React, which Ink requires. It has no native or WASM dependency and is pure JavaScript. Its official TodoMVC example runs with only a stylesheet swap, though the project is still in early days. Developers weighing React-free terminal UI options can follow tools like TermDOM as they mature on daily.dev."}},{"@type":"Question","name":"Why did adding a second middleware break my TypeScript return types and collapse them to an empty object?","acceptedAnswer":{"@type":"Answer","text":"A widely used key-filtering idiom leaks undefined when object properties are optional, which can collapse a composed return type down to an empty object type once a second middleware is layered in. This happens because TypeScript's type narrowing for filtered keys doesn't account for optional properties correctly when multiple transformations are chained together. Track subtle TypeScript typing pitfalls like this one on daily.dev before they surface in production middleware chains."}},{"@type":"Question","name":"What does njsscan 1.0 check for in Node.js applications?","acceptedAnswer":{"@type":"Answer","text":"njsscan 1.0 is a zero-config, pip-installable static analysis security tool that scans Node.js applications for insecure coding patterns using roughly 70 semgrep-powered rules. It targets vulnerability classes including XSS, SSRF, unsafe eval usage, JWT issues, and NoSQL injection. Developers choosing a Node.js SAST tool can compare options like njsscan on daily.dev."}}]}
```

