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.8.0import'package:nocterm/nocterm.dart';
voidmain() {
runApp(constCounter());
}
classCounterextendsStatefulComponent {
constCounter({super.key});
@overrideState<Counter> createState() =>_CounterState();
}
class_CounterStateextendsState<Counter> {
int _count =0;
@overrideComponentbuild(BuildContext context) {
returnFocusable(
focused:true,
onKeyEvent: (event) {
if (event.logicalKey ==LogicalKey.space) {
setState(() => _count++);
returntrue;
}
returnfalse;
},
child:Center(
child:Text('Count: $_count'),
),
);
}
}Run with hot reload:
dart --enable-vm-service your_app.dartTest your TUI components just like Flutter widgets:
awaittestNocterm('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 |
| simutil | Quick launch iOS simulators / Android emulators and more |
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
