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

flocc

v0.6.6

Published

Agent-based modeling in JavaScript in the browser or server.

Downloads

1,706

Readme

Flocc

npm version License: ISC

Agent-based modeling in JavaScript. Build interactive simulations that run in the browser, on the server, or anywhere JavaScript runs.

Flocc makes it easy to create simulations where many autonomous agents interact with each other and their environment, producing emergent behaviors and complex dynamics. Whether you're a researcher, educator, or curious developer, Flocc provides the building blocks to explore complex systems.

Examples · Documentation + API Reference


What is Agent-Based Modeling?

Agent-based modeling (ABM) is a computational technique for simulating systems composed of autonomous, interacting entities called agents. Each agent follows simple rules, but their collective behavior can produce surprisingly complex, emergent patterns — much like how flocking birds, traffic jams, or market dynamics emerge from individual decisions.

ABM is used across many fields:

  • Ecology — predator-prey dynamics, ecosystem modeling
  • Social Science — opinion formation, segregation patterns, crowd behavior
  • Economics — market simulations, supply chain dynamics
  • Epidemiology — disease spread, vaccination strategies
  • Urban Planning — traffic flow, pedestrian movement

Unlike equation-based models, ABM lets you model heterogeneous agents with different behaviors, observe spatial patterns, and explore "what-if" scenarios interactively.


Features

  • 🌐 Browser-native — Build interactive, shareable simulations that run anywhere
  • 🚀 Lightweight — ~150KB minified, no dependencies
  • 📊 Built-in visualization — Canvas renderer, heatmaps, charts, and tables
  • 🗺️ Spatial environments — Continuous space, grids, networks, and terrains
  • ⏱️ Flexible scheduling — Sequential, random, or priority-based agent activation
  • 📡 Event system — Agents can emit and listen to events
  • 🎲 Seeded randomness — Reproducible simulations for research
  • 📜 Rule DSL — Define agent behaviors as composable, declarative data

Quick Start

Installation

npm install flocc

Or include directly in a browser:

<script src="https://unpkg.com/flocc"></script>

Your First Model: Random Walkers

import { Agent, Environment, CanvasRenderer } from 'flocc';

// Create an environment
const environment = new Environment({ width: 400, height: 400 });

// Create 50 agents with random positions
for (let i = 0; i < 50; i++) {
  const agent = new Agent({
    x: Math.random() * 400,
    y: Math.random() * 400,
  });
  
  // Each tick, move in a random direction
  agent.set('tick', (a) => {
    const angle = Math.random() * Math.PI * 2;
    a.set('x', a.get('x') + Math.cos(angle) * 2);
    a.set('y', a.get('y') + Math.sin(angle) * 2);
  });
  
  environment.addAgent(agent);
}

// Render to a canvas
const renderer = new CanvasRenderer(environment, {
  canvas: document.getElementById('canvas'),
  background: '#1a1a2e',
});
renderer.render();

// Run the simulation
function loop() {
  environment.tick();
  renderer.render();
  requestAnimationFrame(loop);
}
loop();

That's it! You have agents moving around a 2D space.


Core Concepts

Agents

Agents are the entities in your simulation. They have properties (data) and behaviors (rules that run each tick).

const agent = new Agent({
  x: 100,
  y: 100,
  energy: 50,
  speed: 2,
});

// Access and modify properties
agent.get('energy');        // 50
agent.set('energy', 45);
agent.increment('energy', -5);  // Decrease by 5

Environments

Environments hold agents and define the world they inhabit.

const env = new Environment({
  width: 800,
  height: 600,
});

env.addAgent(agent);
env.tick();  // Advance simulation by one step
env.getAgents();  // Get all agents

Behaviors

Define what agents do each tick:

// Function-based behavior
agent.set('tick', (agent) => {
  // Your logic here
  agent.set('x', agent.get('x') + 1);
});

// Or use the Rule DSL for declarative behaviors
import { Rule } from 'flocc';

const rule = new Rule(environment, [
  ["set", "x", ["add", ["get", "x"], ["random", -2, 2]]]
]);
agent.set('tick', rule);

Renderers

Visualize your simulation:

import { CanvasRenderer, Heatmap, Histogram } from 'flocc';

// 2D canvas for agents
const canvas = new CanvasRenderer(env, { canvas: document.querySelector('canvas') });

// Heatmap for density
const heatmap = new Heatmap(env, { property: 'temperature' });

// Histogram for distributions
const histogram = new Histogram(env, { property: 'energy' });

Examples

Explore interactive examples at flocc.net:

  • Flocking — Boids algorithm with alignment, cohesion, and separation
  • Schelling Segregation — How mild preferences lead to spatial segregation
  • Predator-Prey — Lotka-Volterra dynamics with wolves and sheep
  • Epidemic (SIR) — Disease spread through a population
  • Game of Life — Conway's cellular automaton
  • Ant Foraging — Stigmergic behavior with pheromone trails

Resources


Contributing

Contributions are welcome! Whether it's bug reports, feature requests, documentation improvements, or code contributions:

  1. Check existing issues or open a new one
  2. Fork the repository
  3. Create a branch for your changes
  4. Submit a pull request

See the codebase for development setup — it uses Rollup for bundling and Jest for tests.


Citing Flocc

If you use Flocc in academic work, please cite:

Donaldson, Scott (2021). "Flocc: From Agent-Based Models to Interactive Simulations on the Web." Northeast Journal of Complex Systems (NEJCS), Vol. 3, No. 1, Article 6. DOI: 10.22191/nejcs/vol3/iss1/6

@article{donaldson2021flocc,
  title={Flocc: From Agent-Based Models to Interactive Simulations on the Web},
  author={Donaldson, Scott},
  journal={Northeast Journal of Complex Systems (NEJCS)},
  volume={3},
  number={1},
  pages={6},
  year={2021},
  doi={10.22191/nejcs/vol3/iss1/6}
}

License

ISC License — free for personal and commercial use.