Website | Docs | pub.dev | Quick Start
If you know Flutter, you know Nocterm. Build terminal UIs with the same patterns—StatefulComponent, setState(), Column, Row, and hot reload.
dependencies:
nocterm: ^0.5.1import 'package:nocterm/nocterm.dart';
void main() {
runApp(const Counter());
}
class Counter extends StatefulComponent {
const Counter({super.key});
@override
State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int _count = 0;
@override
Component build(BuildContext context) {
return Focusable(
focused: true,
onKeyEvent: (event) {
if (event.logicalKey == LogicalKey.space) {
setState(() => _count++);
return true;
}
return false;
},
child: Center(
child: Text('Count: $_count'),
),
);
}
}Run with hot reload:
dart --enable-vm-service your_app.dartTest your TUI components just like Flutter widgets:
await testNocterm('counter test', (tester) async {
await tester.pumpComponent(Counter());
await tester.sendKey(LogicalKey.space);
expect(tester.terminalState, containsText('Count: 1'));
});See the full documentation for guides on components, state management, testing, and more.
| Package | Description |
|---|---|
| nocterm_bloc | Bloc state management for Nocterm |
| nocterm_lints | IDE assists — wrap with, swap, move, convert to stateful/stateless |
| Project | Description |
|---|---|
| vide_cli | Multi-agent coding IDE for the terminal |
| nocterm_3d | Experimental 3D renderer for the terminal |
| cow | Local LLM chat client powered by llama.cpp |
| snake | Classic Snake for the command line |
| minesweeper | Classic Minesweeper for the command line |
Built something with Nocterm? Open an issue to get it listed here!
We use hooksman to manage git hooks. To install the hooks, run:
dart run hooksmanMIT
