Show HN: Riot, a modern multicore actor-based ecosystem for OCaml A new open-source ecosystem called Riot launched for the OCaml programming language, providing a complete stack with a multi-core actor-model runtime, package registry, and standard library. The project ships with an agent-facing skill system that instructs AI agents how to build, test, fuzz, and maintain projects, including structured JSON output for machine readability. Riot aims to simplify OCaml development by offering a single command-line tool for building, formatting, linting, testing, and fuzzing, with opinionated defaults and no configuration options for formatting. Riot is a tech-demo of a stack and tooling for building applications in OCaml. It is heavily opinionated, and designed from the ground up to get out of your way and help you ship great software with agents. It comes with a single tool for all your needs, a modern package registry, a multi-core ready actor-model runtime, a whole new standard library, and first-class support for agentic work. Riot is also a tool: riot — and it's the only tool you need in this stack. Riot ships with agent-facing instructions, not just human docs. The riot-ml skill tells agents how to use the stack, which commands to prefer, where workflows live, and how to keep package discovery grounded in pkgs.ml. Every new Riot project created with riot init includes an .agents folder with the Riot skill already there. Start the project, then use your agent. The local skill explains how to build, test, benchmark, run, format, fix, fuzz, and maintain Riot projects. Riot commands prefer structured output with --json, so agents can inspect build results, diagnostics, test runs, package metadata, and registry flows without scraping prose. The skill links deeper workflow references for testing, fuzzing, benchmarking, snapshots, and package lookup, so agents can run the right loop instead of guessing. /llms.txt is the public discovery map for agents that find Riot from the web; inside a Riot workspace, the local skill is the starting point. riot build Easy, fast builds Riot builds packages. A package is the unit of the build, and each package is defined by a plain riot.toml file. Riot implements a new package-aware build system, so package boundaries, dependencies, targets, and generated artifacts all belong to the same model. riot.toml is ordinary TOML: no S-expressions, no separate configuration language, and no hidden build folklore. Build one package, the whole workspace, debug builds, release builds, and cross targets from the same command. Target selection supports exact triples and broad patterns like linux. riot fmt One house style riot fmt is a fast zero-config formatter optimized for readability and minimizing diffs. There is one house style, and no options. Done. Formatting is part of the stack, not a project-by-project bikeshed. Output should be readable first and stable enough that reviews show the actual change. riot fix Linting and codemods riot fix is an extensible linter with automated fixes, codemods, and package-provided rules. Riot fix should not just tell you something is wrong. When Riot knows the fix, it shows the edit and can apply it. Packages can register lint rules and fixes, then workspaces or packages can enable those rules in riot.toml. This is what makes upgrades smoother: the package that changed can ship the rule that helps your code move with it. riot test Testing Unit tests, property tests, snapshot tests, and fuzz cases live under one test runner. Use unit tests for exact behavior, property tests for broad invariants, and snapshots for generated output that needs review. Fuzz cases declared with the test API replay under riot test, so weird inputs found later become part of the ordinary regression loop. Package and suite filters keep the local loop tight when you only need one slice of the workspace. riot fuzz Coverage-guided fuzzing riot fuzz runs coverage-guided fuzzing campaigns against narrow boundaries such as parsers, codecs, protocol handlers, and CLI parsers. A fuzz case is an ordinary Std.Test case declared with Test.fuzz, with seeds, corpus files, and mutator hints. Generated coverage-increasing inputs are stored under .riot/fuzzing/