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 🙏

© 2026 – Pkg Stats / Ryan Hefner

fraktos

v0.1.0

Published

Orchestrates and runs multiple projects concurrently with dependency ordering and log multiplexing.

Readme


Fraktos solves the headache of starting up and maintaining multiple local development servers concurrently. Whether you're running a backend in Python (FastAPI/Django), multiple frontends in React/Next.js, or supporting services in Go, Fraktos launches them in a coordinated, dependency-aware DAG, aggregates their logs with custom coloring, and guarantees clean, signal-level cleanup with absolutely zero zombie processes left behind.

✨ Features

  • ⛓️ DAG-based Asynchronous Scheduler: Resolves dependencies asynchronously. Frontends start automatically and concurrently the millisecond their required backend services have spawned.
  • 🎨 Log Multiplexing (Vibrant UX): Captures stdout/stderr from each sub-process, format-pipes it line-by-line, and prefixes it with the project's name in a unique color.
  • 🛑 Graceful Process Group Teardown: Uses Unix process groups (via detached spawning) to forward termination signals down the entire execution subtree (e.g. killing npm run dev also terminates its child node servers).
  • ⚙️ Localized Variables & Routing: Fine-grained controls over individual working directories (cwd) and env overrides.
  • 🔌 Dual CLI & Programmatic API: Use as a standard command-line utility or import directly into your custom developer tools as a library.

🚀 Quick Start

1. Installation

To use it in your project:

npm install fraktos --save-dev

Or run it directly using npx:

npx fraktos --help

2. Configuration (fraktos.config.json)

Create a fraktos.config.json in the root of your project:

{
  "projects": [
    {
      "name": "backend-python",
      "path": "./backend",
      "command": "poetry run uvicorn main:app --port 8000",
      "env": {
        "DEBUG": "true",
        "DATABASE_URL": "sqlite:///local.db"
      }
    },
    {
      "name": "frontend-admin",
      "path": "./apps/admin",
      "command": "npm run dev",
      "depends_on": ["backend-python"]
    },
    {
      "name": "frontend-client",
      "path": "./apps/client",
      "command": "npm run dev",
      "depends_on": ["backend-python"]
    }
  ]
}

3. Execution

Launch your orchestrated workspace by running:

npx fraktos

Need to use a custom configuration file? Simply specify it with the --config flag:

npx fraktos --config ./configs/my-custom-config.json

💻 Programmatic Usage

Fraktos can be imported and executed programmatically within your node-based scripts:

import { loadConfig, FraktosRunner, setupGracefulShutdown } from 'fraktos';

// Load and validate configuration
const { config, configDir } = loadConfig('./fraktos.config.json');

// Initialize the runner
const runner = new FraktosRunner(config, configDir);

// Register process SIGINT / SIGTERM hook traps
setupGracefulShutdown(runner);

// Run the tasks asynchronously
await runner.run();

🛠️ Architecture

Fraktos is structured as follows:

graph TD
  CLI[src/cli.ts] --> Config[src/config.ts]
  Config --> Runner[src/runner.ts]
  Runner --> Logger[src/logger.ts]
  Runner --> Shutdown[src/shutdown.ts]
  
  subgraph Runner Operations
    Spawn[child_process.spawn]
    ProcessGroup[Detached PGID]
  end

  Runner --> Spawn
  Spawn --> ProcessGroup
  • src/config.ts: Configuration loading, validation, and cycle detection using DFS back-edge validation.
  • src/logger.ts: Output formatting and line-by-line streaming.
  • src/runner.ts: Asynchronous topology engine and environment manager.
  • src/shutdown.ts: Intercepts terminal interrupts and applies process-group level teardown sequence.

📄 License

MIT © Fraktos Contributors.