A Svelte-host TUI framework for Node.js - Build terminal interfaces with the power of Svelte
FerroFrame brings the declarative, component-based approach of Svelte to terminal user interfaces. Write TUIs using familiar web development patterns while leveraging Svelte's reactivity and compilation optimizations.
- Svelte Components: Write TUI components using Svelte's syntax and reactivity
- Flexbox Layout: Familiar CSS-like flexbox layout system for terminals
- Reactive Updates: Efficient rendering with Svelte's fine-grained reactivity
- Component Library: Built-in components for common TUI patterns
- Developer Experience: Hot reload, debugging tools, and great DX
- Cross-Platform: Works on Windows, macOS, and Linux terminals
- CLI Tool: Powerful
ferro
command for all operations
# Install FerroFrame CLI globally
pnpm add -g @profullstack/ferroframe
# Create a new FerroFrame app
ferro new my-tui-app
# Navigate to your app
cd my-tui-app
# Start development server
ferro dev
# Install the FerroFrame CLI globally
pnpm add -g @profullstack/ferroframe
# Verify installation
ferro --version
# Add to existing project
pnpm add @ferroframe/core @ferroframe/components
# For Svelte integration
pnpm add @ferroframe/svelte-adapter svelte
The ferro
CLI provides a unified interface for all FerroFrame operations:
# Create a new FerroFrame app (interactive)
ferro new my-app
# Create with specific template
ferro create my-svelte-app
# Then choose: 1) Basic TUI App or 2) Svelte TUI App
# Start development server with hot reload
ferro dev # Shows help
ferro dev core # Watch core package
ferro dev components # Watch components package
ferro dev svelte-adapter # Watch svelte-adapter
ferro dev example hello-world # Run hello-world example
ferro dev example svelte-todo # Run svelte-todo example
# Build all packages for production
ferro build
# Run tests
ferro test
# Watch files and run tests automatically
ferro watch
# Lint your code
ferro lint
# Format code with Prettier
ferro format
# Show all available commands
ferro help
ferro --help
ferro -h
# Show version
ferro version
ferro --version
ferro -v
// main.js
import { FerroHost } from '@ferroframe/core';
import { Box, Text, Input, Button } from '@ferroframe/components';
const app = Box({
display: 'flex',
flexDirection: 'column',
padding: 2,
gap: 1,
children: [
Text({
children: 'Welcome to FerroFrame! π¨',
bold: true,
color: 'cyan'
}),
Input({
placeholder: 'Enter your name...',
onSubmit: (value) => console.log(`Hello, ${value}!`)
}),
Button({
children: 'Click me!',
variant: 'primary',
onClick: () => console.log('Button clicked!')
})
]
});
const host = new FerroHost();
await host.mount(app);
<!-- App.svelte -->
<script>
import { Box, Text, Input, Button } from '@ferroframe/components';
import { createFormStore } from '@ferroframe/svelte-adapter';
const form = createFormStore({
name: '',
email: ''
});
function handleSubmit() {
console.log('Form submitted:', $form);
}
</script>
<Box direction="column" padding={2}>
<Text bold color="cyan">Welcome to FerroFrame!</Text>
<Box direction="row" gap={1}>
<Input
placeholder="Name"
value={$form.name}
onChange={(v) => form.setFieldValue('name', v)}
/>
<Input
placeholder="Email"
value={$form.email}
onChange={(v) => form.setFieldValue('email', v)}
/>
</Box>
<Button onClick={handleSubmit} variant="primary">
Submit
</Button>
</Box>
// main.js
import { FerroHost } from '@ferroframe/core';
import { SvelteAdapter } from '@ferroframe/svelte-adapter';
import App from './App.svelte';
const adapter = new SvelteAdapter();
const app = await adapter.mount(App);
const host = new FerroHost();
await host.mount(app);
FerroFrame uses a host-based architecture where:
- Host Layer: Manages the terminal, input, and rendering lifecycle
- Component Layer: Svelte components that declare the UI
- Layout Engine: Calculates positions using flexbox algorithms
- Renderer: Efficiently draws to the terminal using ANSI sequences
Documentation is coming soon. For now, please refer to:
- The examples in the
examples/
directory - The source code in
packages/
for implementation details - The CLI help:
ferro help
Box
- Flexbox container with borders and paddingText
- Styled text rendering with colorsInput
- Text input field with cursor managementButton
- Interactive button with variantsList
- Scrollable, selectable list- More components coming soon!
# Clone the repository
git clone https://github.com/profullstack/ferroframe.git
cd ferroframe
# Install dependencies
pnpm install
# Run tests
ferro test
# or
pnpm test
# Build all packages
ferro build
# or
pnpm build
# Watch mode for development
ferro watch
# or
pnpm watch
# Run specific example
ferro dev example hello-world
ferro dev example svelte-todo
Check out the examples directory for:
- Hello World - Basic interactive counter
- Svelte Todo - Todo app with Svelte stores
Run examples using the CLI:
# Run hello-world example
ferro dev example hello-world
# Run svelte-todo example
ferro dev example svelte-todo
FerroFrame supports comprehensive styling options:
import { Box, Text } from '@ferroframe/components';
Box({
// Flexbox properties
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignItems: 'center',
gap: 2,
// Box model
padding: 2,
margin: 1,
// Borders
border: 'single',
borderColor: 'cyan',
// Sizing
width: 50,
height: 20,
children: [
Text({
children: 'Styled Text',
color: 'green',
backgroundColor: 'black',
bold: true,
underline: true
})
]
});
Current Version: 0.3.0 Status: β Production Ready - All core features implemented
- β Core TUI framework with host and renderer
- β Complete flexbox layout engine
- β Component system with lifecycle management
- β Built-in component library
- β Svelte adapter with reactive stores
- β
CLI tool with
ferro
command - β Development tools (hot reload, watch mode)
- β Project scaffolding
- β Working examples
Contributions are welcome! Please feel free to submit a Pull Request.
MIT Β© Profullstack, Inc.
Ready to build your next TUI? Get started with ferro new my-app
π