npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@profullstack/ferroframe

v0.3.4

Published

A Svelte-host TUI framework for Node.js - Build terminal interfaces with the power of Svelte

Readme

FerroFrame 🦀

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.

✨ Features

  • 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

🚀 Quick Start

# 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

📦 Installation

Global CLI Installation

# Install the FerroFrame CLI globally
pnpm add -g @profullstack/ferroframe

# Verify installation
ferro --version

Project Dependencies

# Add to existing project
pnpm add @ferroframe/core @ferroframe/components

# For Svelte integration
pnpm add @ferroframe/svelte-adapter svelte

🛠️ CLI Commands

The ferro CLI provides a unified interface for all FerroFrame operations:

Creating Apps

# 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

Development

# 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

Building & Testing

# 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

Help & Info

# Show all available commands
ferro help
ferro --help
ferro -h

# Show version
ferro version
ferro --version
ferro -v

🎯 Basic Example

Using Components Directly

// 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);

Using Svelte Components

<!-- 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);

🏗️ Architecture

FerroFrame uses a host-based architecture where:

  1. Host Layer: Manages the terminal, input, and rendering lifecycle
  2. Component Layer: Svelte components that declare the UI
  3. Layout Engine: Calculates positions using flexbox algorithms
  4. Renderer: Efficiently draws to the terminal using ANSI sequences

📚 Documentation

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

🧩 Built-in Components

  • Box - Flexbox container with borders and padding
  • Text - Styled text rendering with colors
  • Input - Text input field with cursor management
  • Button - Interactive button with variants
  • List - Scrollable, selectable list
  • More components coming soon!

🛠️ Development

# 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

📖 Examples

Check out the examples directory for:

Run examples using the CLI:

# Run hello-world example
ferro dev example hello-world

# Run svelte-todo example  
ferro dev example svelte-todo

🎨 Styling & Theming

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
    })
  ]
});

🚦 Project Status

Current Version: 0.3.0 Status: ✅ Production Ready - All core features implemented

Completed Features:

  • ✅ 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

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

📄 License

MIT © Profullstack, Inc.

🙏 Acknowledgments

  • Inspired by Ink and Blessed
  • Built with Svelte
  • Terminal rendering powered by ANSI escape sequences

Ready to build your next TUI? Get started with ferro new my-app 🚀