# arcanist.sh > Haskell tooling for the age of AI-authored code: hx, a fast Rust-based package manager, and bhc, a verifying compiler. When generation is cheap, correctness must be checkable. arcanist.sh builds Haskell tooling for the age of AI-authored code, in Rust and in public. The thesis: when generating code is cheap, correctness has to be checkable. hx is the whole Haskell toolchain in one fast binary; bhc, the Basel Haskell Compiler, is a clean-slate compiler built to check everything it can (in beta); registry.arcanist.sh is a signed Haskell package repository where bhc builds every new version and records the result. Together they lead toward a commons of verified, content-addressed definitions. Every page below links to a clean Markdown copy; the HTML page is the same URL without `.md` (with a trailing slash). Writing on arcanist.sh is licensed CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/): reuse, quote and train on it with attribution, e.g. arcanist.sh, "Page title", URL, date. Code is licensed by its project: hx MIT, bhc BSD-3-Clause. Logos and quoted third-party material are excluded (https://arcanist.sh/license/). ## Products - [hx](https://arcanist.sh/hx.md): the whole Haskell toolchain in one fast binary. Installs GHC and Cabal, builds, tests, formats and lints, pins every dependency by hash, publishes packages, and serves agents over MCP (`hx mcp`). Docs: https://docs.arcanist.sh/hx/llms.txt - [bhc](https://arcanist.sh/bhc.md): the Basel Haskell Compiler, in beta. Native code through LLVM, WebAssembly for WASI, runtime profiles; compiles all 221 modules of Pandoc. Measured status: https://arcanist.sh/bhc/status.md. Docs: https://docs.arcanist.sh/bhc/llms.txt - [registry](https://arcanist.sh/registry.md): registry.arcanist.sh, a Haskell package repository cabal reads next to Hackage, signed with hackage-security; bhc-verified builds are recorded per version ## The thesis - [Manifesto](https://arcanist.sh/manifesto.md): Why we are rebuilding the Haskell ecosystem. In a world where AI writes the code, the language that wins is the one where correctness is checkable — where types are proofs and the compiler is the proof checker. Haskell is not niche. It is early. - [The Commons](https://arcanist.sh/commons.md): What a function becomes when verification accumulates instead of being repeated: a content-addressed, evidence-carrying, vouched-for unit of meaning — and the shared commons that bhc compiles into running systems. When generation is cheap, verification is the bottleneck. Doing it twice is the waste. - [Glossary](https://arcanist.sh/glossary.md): Definitions of the core ideas behind arcanist.sh: meaning engine, semantic artifact, correct by construction, and runtime profiles — the vocabulary of building Haskell tooling for the age of AI-authored code. - [Use cases](https://arcanist.sh/use-cases.md): Where arcanist.sh fits: machine learning and numerics, realtime and audio, edge and WebAssembly, verification and policy engines, and embedded systems — each mapped to a bhc runtime profile. - [bhc vs GHC](https://arcanist.sh/bhc-vs-ghc.md): How the Basel Haskell Compiler (bhc) compares to GHC: a clean-slate, compatibility-first compiler written in Rust, with runtime profiles and WebAssembly and GPU backends. The same language, different tradeoffs. - [hx vs Cabal and Stack](https://arcanist.sh/hx-vs-cabal-and-stack.md): How hx compares to Cabal and Stack for Haskell project management — startup, builds, dependency resolution, and workflow. hx is faster, unified, and compatible with your existing .cabal files. - [About](https://arcanist.sh/about.md): arcanist.sh is the home of hx and bhc — Haskell tooling for the age of AI-authored code, built in public and in Rust. What we are building, and why. - [Team](https://arcanist.sh/team.md): The people behind arcanist.sh — a small, focused team building Haskell tooling in public, with a workflow of AI coding agents. - [Get started](https://arcanist.sh/get-started.md): Get started with arcanist.sh in minutes: install the hx toolchain, create a Haskell project, build it with GHC or the bhc compiler, and run your tests — all from one fast command. - [Support arcanist.sh](https://arcanist.sh/support.md): hx, bhc and the registry are free and open source. If they are useful to you, you can support the work: a one-off tip or a monthly sponsorship, and free ways to help that count just as much. ## hx - [hx](https://arcanist.sh/hx.md): hx is the Haskell toolchain in one fast binary: it installs GHC and Cabal, builds, tests, formats and lints your code, pins every dependency by hash, and publishes your packages. Written in Rust. - [hx benchmarks](https://arcanist.sh/hx/benchmarks.md): Measured performance of hx against cabal: CLI startup, cold builds, no-op rebuilds and clean, with the test environment, the method and the commands to reproduce every number. ### hx blog - [hx 0.11.0: Builds That Match the Lockfile](https://arcanist.sh/hx/blog/hx-0-11-0.md) (2026-10-20): hx 0.11.0 builds exactly what hx.lock pins, adds --locked for CI so a stale lockfile fails the build, keeps cabal's index in step with the lock, and installs on Windows through winget. - [hx 0.10.0: Install, Lock, Share](https://arcanist.sh/hx/blog/hx-0-10-0.md) (2026-10-19): hx 0.10.0 installs Haskell tools like cargo install, manages multi-package workspaces, pins every dependency by hash for offline builds, and publishes to the new arcanist.sh registry. A tour of what is new and how to use it. - [hx and the 2026 Haskell Toolchain](https://arcanist.sh/hx/blog/hx-and-the-2026-haskell-toolchain.md) (2026-10-19): GHC 9.14, Cabal 3.18, HLS 2.14, Stackage LTS 24 and bhc 0.2.22: hx 0.9.3 installs and understands all of them, with or without ghcup. A tour of what is new and how to use it. - [hx 0.9.0: Build, Run, Test — on bhc, Dependencies and All](https://arcanist.sh/hx/blog/hx-0-9-0-bhc-dependencies.md) (2026-06-29): The bhc backend grows from compiling a single module to building a project and its dependencies from source into a package database — and running and testing the result. 0.9.0 makes build, run, and test work the same way on bhc, and fixes the plumbing underneath. - [hx 0.8.0: The Projects You Already Have](https://arcanist.sh/hx/blog/hx-0-8-0-real-projects.md) (2026-06-21): 0.8.0 is a milestone of correctness. Across the 0.7 series, hx learned to adopt, lock, and build real Haskell projects of every shape — single packages, multi-package workspaces, conditional dependencies, custom Setup.hs — and to be honest when it cannot. - [Verified Against Reality](https://arcanist.sh/hx/blog/verified-against-reality.md) (2026-06-21): hx 0.7.11 and 0.7.12 came out of pointing nightly CI at real Haskell projects and a real bhc toolchain. Correct by construction is the design; this is what it takes to keep it true. - [Speaking bhc Natively](https://arcanist.sh/hx/blog/hx-0-7-0-native-bhc-builds.md) (2026-06-17): hx 0.7.0 drives bhc through its own command-line interface instead of approximating it with GHC flags — native build flags, a filesystem package database, and a pinned toolchain. - [hx at Zurihac 2026](https://arcanist.sh/hx/blog/hx-at-zurihac-2026.md) (2026-05-26): hx will be at Zurihac 2026, 6–8 June in Rapperswil. What we'll demo, what install path to bring, and the questions most worth raising at the booth. - [Zero-Config bhc Experience](https://arcanist.sh/hx/blog/hx-0-6-0-zero-config-bhc.md) (2026-02-03): hx 0.6.0 makes going from zero to a running bhc project effortless — auto-detected backends, bundled toolchain installs, and smarter doctor checks - [Using the bhc Compiler Backend](https://arcanist.sh/hx/blog/using-the-bhc-compiler-backend.md) (2026-01-25): Learn how to use the Basel Haskell Compiler (bhc) with hx for optimized numeric and tensor workloads ## bhc - [bhc](https://arcanist.sh/bhc.md): bhc, the Basel Haskell Compiler, is a clean-slate compiler for the Haskell you already write. Written in Rust, it compiles to native code through LLVM and to WebAssembly, with a runtime profile chosen per build. - [bhc status](https://arcanist.sh/bhc/status.md): What bhc compiles today — concrete numbers, updated as the work lands. - [bhc runtime profiles](https://arcanist.sh/bhc/profiles.md): Same language, different compilation and runtime contracts - [bhc target backends](https://arcanist.sh/bhc/targets.md): Compile Haskell to multiple targets - [bhc numeric performance](https://arcanist.sh/bhc/numeric.md): Predictable performance for numeric workloads - [bhc compatibility charter](https://arcanist.sh/bhc/compatibility.md): bhc's commitment to Haskell compatibility - [bhc roadmap](https://arcanist.sh/bhc/roadmap.md): bhc development roadmap and milestones - [bhc playground](https://arcanist.sh/bhc/playground.md): Type Haskell and run it in your browser: a bhc interpreter compiled to WebAssembly parses, type-checks and evaluates your code with no server round-trips. ### bhc blog - [The Writer Runs End to End](https://arcanist.sh/bhc/blog/the-writer-runs-end-to-end.md) (2026-09-15): Pandoc's HTML writer executes a three-deep monad transformer stack — StateT over ExceptT over StateT — and bhc now runs the whole thing to completion. Getting there meant chasing one crash that kept moving one monadic action deeper into the writer's do-block, through the transformer machinery, the monomorphizer, and a string comparison that read a struct as a linked list. - [The Crash Ladder: a Day Inside readMarkdown](https://arcanist.sh/bhc/blog/the-crash-ladder.md) (2026-08-20): bhc-compiled Pandoc stopped failing at compile time and started failing at runtime — which is progress. Six distinct crashes, each one deeper into the real Markdown parser than the last, starting from a single missing dictionary that shifted every argument one slot. - [bhc Type-Checks All of Pandoc](https://arcanist.sh/bhc/blog/bhc-type-checks-all-of-pandoc.md) (2026-08-04): bhc check now passes every one of Pandoc's 221 library modules — zero failed, zero skipped, Template Haskell included. Two days ago the number was 153. This is the story of the endgame: the 84-error module that was one missing feature, the bugs that hide by deleting themselves, and what a permissive type checker is actually for. - [Reading Pandoc for Compiler Bugs](https://arcanist.sh/bhc/blog/reading-pandoc-for-compiler-bugs.md) (2026-08-02): bhc check now clears 153 of Pandoc's 221 library modules, up from 112 in late July. A large real-world library is a bug oracle: point the type checker at it, and it finds the holes in your front end faster than any hand-written test suite. Nine of the recent fixes, and the two techniques that found them. - [bhc runs on WebAssembly — and we can prove how much](https://arcanist.sh/bhc/blog/bhc-runs-on-webassembly.md) (2026-07-02): bhc compiles Haskell to WebAssembly (WASI), and the WASM output matches the native binary on 236 of 243 differential-test fixtures — file I/O included. Here is the measurement, and the exceptions, stated plainly. - [The Honest Hard Part: Type Classes and Hashable Code](https://arcanist.sh/bhc/blog/the-honest-hard-part.md) (2026-06-24): Content-addressing a language means naming a definition by what it means, not by how it was typed. For a language with type classes, that requires elaborating instance resolution away first. Dictionary passing is that step — and bhc already does it. - [bhc at Zurihac 2026](https://arcanist.sh/bhc/blog/bhc-at-zurihac-2026.md) (2026-05-25): We'll be at Zurihac 2026. Here is what compiles today, what we'll have running at the booth, and the questions that are most useful to bring. - [Four Parser Fixes, One Module](https://arcanist.sh/bhc/blog/four-parser-fixes.md) (2026-05-25): A week of chasing parser correctness bugs in bhc. Net effect on the Pandoc number: one module. Why each fix was still worth landing — and what the data says about where the real work is. - [bhc and the Verification Camp](https://arcanist.sh/bhc/blog/bhc-and-the-verification-camp.md) (2026-05-22): agentlanguages.dev makes the emerging field of AI-authored programming languages visible. bhc belongs near the verification camp, but it makes a different bet from agent-native languages like Vera. - [All Ten Zentinel Modules Compile](https://arcanist.sh/bhc/blog/zentinel-ten-modules-compile.md) (2026-05-04): bhc's multi-module pipeline now compiles all ten modules of zentinel-agent-policy to object code in one driver invocation. Cycles, qualified-name shadowing, and a missing IORef primitive — what changed between four out of ten and ten out of ten. - [bhc Runs a Real Haskell Library](https://arcanist.sh/bhc/blog/bhc-runs-a-real-haskell-library.md) (2026-03-12): We compiled zentinel-agent-policy — 10 modules, 1,500 lines, records and sum types across module boundaries — to a native binary that produces correct results at runtime. Here's the full story. - [bhc Parses All of Pandoc](https://arcanist.sh/bhc/blog/bhc-parses-all-of-pandoc.md) (2026-02-27): We pointed bhc at Pandoc's 221 source files and got zero parse errors. Here's what we found, what broke, and what it means for the road to compiling real-world Haskell. - [Standing on the Shoulders of HBC](https://arcanist.sh/bhc/blog/standing-on-the-shoulders-of-hbc.md) (2026-02-22): An email from Anthony Travers introduced us to HCT, his Haskell 98 translation of Lennart Augustsson's 1982 compiler. It gave bhc exactly the optimization roadmap we needed. - [One Developer, One Claude, One Month: Building a Haskell Compiler from Scratch](https://arcanist.sh/bhc/blog/one-developer-one-claude-one-month.md) (2026-02-15): Anthropic built a C compiler with sixteen parallel Claude instances. I built a Haskell compiler with one Claude and a Max subscription. We arrived at the same conclusions about the future of software development. - [Phase 2: Language Completeness is Complete](https://arcanist.sh/bhc/blog/phase-2-language-completeness.md) (2026-01-30): bhc now compiles real Haskell programs with pattern matching, closures, higher-order functions, recursion, type classes, and lazy evaluation. Here's what Phase 2 delivers. - [Phase 1: Native Code Generation is Complete](https://arcanist.sh/bhc/blog/phase-1-native-code-generation-complete.md) (2026-01-25): bhc can now parse Haskell, type check, lower to Core IR, generate LLVM IR, link with the RTS, and produce working native executables. Here's what we've achieved. ## Writing Essays and announcements from arcanist.sh. - [The Scorecard Is Right. The Weights Are Wrong.](https://arcanist.sh/blog/the-scorecard-is-right-the-weights-are-wrong.md) (2026-09-05): A programming language scorecard is making the rounds: five columns, ten languages, no 5/5. Haskell is not on it. Here is where it would land, why arcanist.sh exists, where hx and bhc actually stand against each column, and why the columns weigh differently once AI writes the code. - [Compiling Pandoc](https://arcanist.sh/blog/compiling-pandoc.md) (2026-09-02): bhc now compiles all 221 modules of Pandoc to native code and links a binary that runs. Why we picked Pandoc as the north star, what compiling it actually demands of a compiler, and where this sits on the road to a complete Haskell toolchain. - [Building the Commons](https://arcanist.sh/blog/building-the-commons.md) (2026-06-19): The engineering underneath a content-addressed commons of verified Haskell: how a definition gets an address, why that address is its meaning under a contract, how type classes stay hashable, and why a vouch is worth nothing without a sandbox that can re-check it. - [Introducing arcanist.sh](https://arcanist.sh/blog/introducing-arcanist-sh.md) (2026-06-17): arcanist.sh is the home of hx and bhc — a unified, fast, modern Haskell ecosystem, built for a world where AI writes the code. Here is what it is and why it exists. ## Documentation - [docs.arcanist.sh/llms.txt](https://docs.arcanist.sh/llms.txt): every hx and bhc documentation page, each with a Markdown copy - [bhc API reference](https://docs.arcanist.sh/bhc/api/): the standard library ## For agents - Each page as Markdown: its URL with `.md` instead of the trailing slash, e.g. https://arcanist.sh/manifesto.md; the home page is https://arcanist.sh/index.md - [llms-full.txt](https://arcanist.sh/llms-full.txt): every page and post in one Markdown file - Product slices: [hx/llms.txt](https://arcanist.sh/hx/llms.txt), [bhc/llms.txt](https://arcanist.sh/bhc/llms.txt) - [api-catalog](https://arcanist.sh/.well-known/api-catalog): RFC 9727 discovery of the machine-readable files and the registry API - Registry API (JSON, read without authentication): https://registry.arcanist.sh/api/v1/config - hx as a tool server: `hx mcp` serves build, test, run, lock, doctor and dependency tools over the Model Context Protocol - In the browser: WebMCP tools (get_current_page, get_page_markdown, get_site_index, list_products, get_install_command, define_term, cite_current_page, open_page) register when an agent exposes `document.modelContext` - Feed: [Atom](https://arcanist.sh/blog/atom.xml), every post from hx, bhc and arcanist.sh - No authentication and no rate limits on the site ([auth.md](https://arcanist.sh/.well-known/auth.md)). Crawling for search, answers and training is welcome (robots.txt Content-Signal). ## Optional - [Licence](https://arcanist.sh/license.md): Writing on arcanist.sh is licensed CC BY 4.0: read, quote, translate and train on it, with attribution. Code is licensed by its project: hx MIT, bhc BSD-3-Clause. - [GitHub](https://github.com/arcanist-sh): source for everything - [X](https://x.com/raskelll)