All blogs / Dev tools / editors / IDEs
Tweag
Engineering blog from Tweag
Dev tools / editors / IDEsHaskellFunctional / PL theoryDevOps / SRE / infrastructure
- Posts
- 328 from 8 Sep 2015 to 29 Oct 2026
- Posting
- weekly (27 in the last year)
- Kind
- company blog
- Feed
- https://www.tweag.io/rss.xml
2026 20
- Running local development services
- Adopting Nickel in CodeCommons
- How to set up and run a Nixpkgs team
- Tricorder MCP server: feedback your agent won't forget
- Restoring type class support in Liquid Haskell
- Are we formal proofs yet? On formal proofs of programs with coding agents
- Five years of Cardano smart-contract audits: a retrospective
- Topiary: Formatting Forests
- Sheaves in Haskell
- Writing static checks to an unsuspecting library with Liquid Haskell
- Intersect Proposals 2026-2027 (revised)
- Intersect Proposals 2026-2028
- A statement from Tweag by Modus Create to the Cardano community
- 𝕯𝖔𝖈 𝖎𝖙 𝖑𝖎𝖐𝖊 𝖎𝖙'𝖘 𝖍𝖔𝖙
- Accessing external resources reliably with Bazel
- Nickel since 1.0
- How I learnt to stop worrying and love AI
- Integrating Coverity static analysis with Bazel
- Streamlining CodeQL Analysis with CodeQL Wrapper
- The quest for grammar combinators: introducing the Pup library
2025 31
- Announcing rules_img: a faster path to container images in Bazel
- In memoriam: Alexander Esgen
- The anatomy of a dependency graph
- The History of History Expiry
- Shrinking while linking
- Tweag@BazelCon2025
- Migrating to Bazel symbolic macros
- Single-line and multi-line formatting with Topiary
- Managing dependency graph in a large codebase
- Qualified Imports and Alias Resolution in Liquid Haskell
- Introduction to the dependency graph
- CodeQL: code organization, metadata, and running in CI
- Getting started with CodeQL, GitHub's declarative static analyzer for security
- Integrating Nix and Buck2
- Publish all your crates everywhere all at once
- Bazel workshop made public
- Intersect Proposals 2025 - Part 2
- Intersect Proposals 2025
- Why we blog
- Come meet us at VoxxedDays Luxembourg 2025
- The minimal megaparsec tutorial
- Frontend live-coding via ghci
- Practical recursion schemes in Rust: traversing and extending trees
- Come meet us at DevLille 2025
- A hundred pull requests for Liquid Haskell
- Bazel and Testwell CTC++, revisited
- Evaluating the evaluators: know your RAG metrics
- From minimal skeletons to comprehensive transactions with cooked-validators
- Bashfulness
- The refactoring of a Haskell codebase
- Writing a formatter has never been so easy: a Topiary tutorial
2024 21
- GHC's wasm backend now supports Template Haskell and ghci
- Introducing rules_gcs
- Python Packaging in the Real World: Biomedical projects vs. PyPI
- Reflecting away from definitions in Liquid Haskell
- Adding algebraic data types to Nickel
- Deploying Buildbarn on Kubernetes with mTLS on the side
- Programming Languages & Compilers Activity Report - Q2 2024
- Let there be types: observable type sharing for GHC Core
- Nickel modules
- Safe composable Python
- Liquid Haskell through the compilers
- LLM-based work summaries with work-dAIgest
- Nickel: Toward a Programmable LSP for Configurations
- The right words in the right place
- Re-implementing the Nix protocol in Rust
- Cloud Native Computing in 2024—feeling the pulse at Kubecon
- Software Identifiers through the eyes of Nix
- Extending destination-passing style programming to arbitrary data types in Linear Haskell
- Bazel remote execution with rules_nixpkgs
- Evaluating Retrieval in RAGs: A Gentle Introduction
- A look under GHC's hood: desugaring linear types
2023 44
- BazelCon Community Day - Munich
- Source filtering with file sets
- Separating debug symbols from executables
- Organist: stay sane managing your development environments
- Integrating Testwell CTC++ with Bazel
- Great Nickel configurations from little merges grow
- nixtract 0.1.0
- JSON Schemas to Nickel contracts
- rhine-bayes: a library for online reactive Bayesian inference
- CLI User Experience Case Study: Topiary
- Behind the scenes with FawltyDeps v0.13.0: Matching imports with dependencies
- Supercharging your Rust static executables with mimalloc
- Building a Rust workspace with Bazel
- How to Prevent GHC from Inferring Types with Undesirable Constraints
- Python Monorepo: an Example. Part 2: A Simple CI
- A Tour Around Buck2, Meta's New Build System
- Packaging Topiary in OPAM
- Assumptions for Liquid Haskell in the large
- Coverage-guided fuzzing of Haskell programs for cheap
- Announcing halide-haskell - a Haskell interface for the Halide image and array processing language
- Testing Control-Flow Translations in GHC
- Announcing Tf-Ncl 0.1
- Functional Python, Part III: The Ghost in the Machine
- Announcing Nickel 1.0
- A journey through the auditing process of a smart contract
- Announcing Skyscope
- Type-safe data processing pipelines
- Processing medical images at scale on the cloud
- crem: compositional representable executable machines
- Python Monorepo: an Example. Part 1: Structure and Tooling
- Linear Constraints: the problem with scopes
- Announcing FawltyDeps - a dependency checker for your Python code
- Announcing Topiary
- Chainsail: Now Unchained and Open-Source
- Taking the pulse of infrastructure management in 2023
- opam-nix: Nixify Your OCaml Projects
- smtlib-backends: faster SMT-LIB-based Haskell interface to SMT solvers
- Running a NixOS VM on macOS
- announcing jupyenv 0.1.0
- A Semester of HLS: An Internship Report
- Linear Constraints: the problem with O(1) freeze
- Nix with; with Nickel
- Functional Python, Part II: Dial M for Monoid
- Haskell at Work
2022 58
- Making GHC faster at emitting code
- Announcing Nickel 0.3.1
- Bazel and Nix: A Migration Experience
- Optimizing NixOS Search
- Creating a Delta Lake in Haskell with Sparkle
- Higher-orderness is first-order interaction
- Threads and messages with Rust and WebAssembly
- WebAssembly backend merged into GHC
- JupyterWith Next
- Staged programming with typeclasses
- Reinforcement Learning for Open Games
- Functional programming from sets and functions
- Recompilation avoidance in rules_haskell
- Hard user separation with NixOS
- A nub in the haystack
- Implementing Bayesian Replica Exchange in Chainsail
- Converting a polyglot project build to Bazel: part 1
- Improving the Probabilistic Programming Language monad-bayes
- Testing stateful systems, part two: Linear Temporal Logic
- Worry-free NixOS refactors
- Bazel rules to test Bazel rules
- Four months into The Nix Book
- Building Nix flakes from Rust workspaces
- Optimizing Nickel's Array Contracts
- How to keep a Bazel project hermetic?
- Construction and analysis of the build and runtime dependency graph of nixpkgs
- Functional Python, Part I: Typopædia Pythonica
- Unit Test Your Nix Code
- Introducing the Scalable Build Systems Team
- Introduction to NixOS specialisations
- Better soft k-means clustering with Chainsail - multimodality treated right
- Announcing Chainsail: a web service for sampling multimodal probability distributions
- Our roadmap for Nix
- Profiling non-CPU time in Haskell
- A dialogue with Liquid Haskell
- Nix – taming Unix with functional programming
- Introducing Pirouette 2: formal methods for smart contracts
- Incremental builds for Haskell with Bazel
- Smooth, non-invasive Haskell Stack and Nix shell integration
- Reproducible probabilistic programming environments
- Comparing strict and lazy
- Existential optics
- Union and intersection contracts are hard, actually
- Announcing WebAuthn
- Getting Things Merged
- How I stopped worrying and learned to run wasm and native hybrid code
- Our first audit of Minswap and the aftermath
- Porting libffi to pure WebAssembly
- First release of Nickel
- Improving Criterion.rs
- Named Routes in Servant
- Type-checking plugins, Part III: writing a type-checking plugin
- Ormolu: the challenge of formatting operator chains
- Trustix - Consensus and voting
- A Case Study on Correctness and Safety Testing of Stateful Systems
- Why Liquid Haskell matters
- Trustix - Good things come in trees
- Scoped Effect Resources for Polysemy
2021 41
- Nix 2.4 and 2.5
- 21.11 Zero Hydra Failures Moscow Hackathon: Report and Suggestions
- Type-checking plugins, Part II: GHC's constraint solver
- Implementing a content-addressed Nix
- The Varieties of the Haskelling Experience
- Safe Sparkle: a resource-safe interface with linear types
- A Haskell memory leak in way too much detail with Cachegrind
- Hacking on Ormolu: An internship report
- Type-checking plugins, Part I: Why write a type-checking plugin?
- Denotational Homomorphic Testing
- A higher-order integrator for Hamiltonian Monte Carlo
- Functional data pipelines with funflow2
- Building a Go project using Bazel
- Daily ICFP: Day 5
- Daily ICFP: Day 4
- Daily ICFP: Day 3
- Daily ICFP: Day 2
- Daily ICFP: Day 1
- Daily ICFP: Day 0
- Convert Cabal-based projects to Bazel automatically
- Integrated shrinking in QCheck
- Searching for COVID-19 treatments using metabolic networks
- Exploring linear Traversable using generics
- Building OCaml Projects with Bazel
- Deconstructing classes
- 2021-06-15-asciidoc-haskell-pandoc
- Simulating Tenderbake
- Ormolu internship
- Arrows, through a different lens
- Ad-hoc interpreters with capability
- Incubating the Haskell Foundation
- How to build hybrid Haskell and Java programs
- Types à la carte in Nickel
- Announcing Gomod2nix
- Battle-tested monadic OCaml: Tezos
- Derivation outputs in a content-addressed world
- linear-base makes writing Linear Haskell easy and fun
- Integrating refinement and dependent types: a fellowship report
- Intern opening to improve GHC performance
- Programming with contracts in Nickel
- Haskell dark arts, part I: importing hidden values
2020 41
- Trustix: Distributed trust and reproducibility tracking for binary caches
- The Shrinks Applicative
- A tale of Template Haskell and cross compilation
- Self-references in a content-addressed Nix
- Pure destination-passing style in Linear Haskell
- Introduction to Markov chain Monte Carlo (MCMC) Sampling, Part 4: Replica Exchange
- Nickel: better configuration for less
- Edge computing with servant on Cloudflare
- Making GHCIDE smarter and faster: a fellowship summary
- Fully statically linked Haskell binaries with Bazel
- Announcing Lagoon
- Implicit Dependencies in Build Systems
- Towards a content-addressed model for Nix
- How Nix grew a marketing team
- Developing Python with Poetry & Poetry2nix: Reproducible flexible Python environments
- Introduction to Markov chain Monte Carlo (MCMC) Sampling, Part 3: Hamiltonian Monte Carlo
- Nix Flakes, Part 3: Managing NixOS systems
- Fall 2020 Fellowships: Funding for Open Source Contributors
- Qualified do: rebind your do-notation the right way
- Setting up Buildkite for Nix-based projects using Terraform and GCP
- Splittable pseudo-random number generators in Haskell: random v1.1 and v1.2
- Nix Flakes, Part 2: Evaluation caching
- Linear types are merged in GHC
- Long-term reproducibility with Nix and Software Heritage
- Calling to the JVM from Haskell: Some benchmarks
- Tweag Open Source Fellows
- Nix Flakes, Part 1: An introduction and tutorial
- A taste of Bazel: build a library, a service and hspec tests
- Deriving Isomorphically
- The three kinds of Haskell exceptions and how to use them
- Setting up a shared build cache using Bazel
- Eager vs. Lazy Instantiation: Making an Informed Decision
- Inferred or Specified Types? Your Choice!
- Code is Engineering, Types are Science
- Probabilistic Programming with monad‑bayes, Part 3: A Bayesian Neural Network
- On linear types and exceptions
- Tweag Fellowships: Funding for Open Source Contributors
- Safe memory management in inline-java using linear types
- Locating Performance Bottlenecks in Large Haskell codebases
- A Tale of Two Functors or: How I learned to Stop Worrying and Love Data and Control
- Introduction to Markov chain Monte Carlo (MCMC) Sampling, Part 2: Gibbs Sampling
2019 28
- Haskell art in your browser with Asterius
- How to make your papers run: Executable formal semantics for your language
- Untrusted CI: Using Nix to get automatic trusted caching of untrusted builds
- Probabilistic Programming with monad‑bayes, Part 2: Linear Regression
- Here You See the Small Porcupine Perched in Its Tree, Preparing and Crunching Some Data with Me
- Markov chain Monte Carlo (MCMC) Sampling, Part 1: The Basics
- Ormolu: Announcing First Release
- Bazel, Cabal, Stack: Why choose when you can have them all?
- Bazel's Persistent Worker Mode for GHC: An Industrial Internship
- Probabilistic Programming with monad‑bayes, Part 1: First Steps
- War Stories of Asterius: Numerics & Debugging
- Why Haskell is important
- Code Line Patterns: Creating maps of Stackage and PyPi
- Revelations from repetition: Source code headers in Haskell and Python
- CPP considered harmful
- Ormolu: Format Haskell code like never before
- inline-js: seamless JavaScript/Haskell interop
- The Sneakernet: Towards A Much Faster Internet
- Securely storing secrets in Terraform with terraform-provider-secret
- Introducing lorri, your project's nix-env
- Capability is about free monads. It's a bird… It's a plane… It's a free monad!
- Tweag Internship Programme 2019
- Configuring and testing Kubernetes clusters with KubeNix and kind
- JupyterWith: Declarative, Reproducible Notebook Environments
- Clodl: build, copy, and run
- The types got you
- Mapping a Universe of Open Source Software
- Towards Interactive Data Science in Haskell: Haskell in JupyterLab
2018 15
- Asterius GHC WebAssembly backend reaches TodoMVC
- DIY benchmark history with Criterion and Shiny
- capability: the ReaderT pattern without the boilerplate
- Haskell WebAssembly calling JavaScript and back again
- Funflow Example: emulating Make
- Streaming with linear types
- Fibonacci compiles end-to-end — Haskell to WebAssembly via GHC
- Funflow: typed resumable workflows
- Stackage HEAD is now live!
- We're hiring! Software engineers
- Nix + Bazel = fully reproducible, incremental builds
- Implementing a safer sort with linear types
- Build large polyglot projects with Bazel... now with Haskell support
- Tweag Internship Programme
- Free monads for cheap interpreters
2017 24
- All about reflection: a tutorial
- Making two garbage collectors be good neighbours (using linear types)
- Parallelising your array code
- Nix on the Windows Subsystem for Linux
- The Exodus to Streamgard, an epic poem
- Using Stackage for GHC regression testing
- Announcing the GHC DevOps Group
- Array fusion with vector
- How to compose streaming programs
- Immutability and unboxing in array programming
- GHC compiler plugins in the wild: typing Java
- Java from Haskell: a tutorial
- Tracking performance over the entire software lifecycle
- Enter the matrix, Haskell style
- Compact normal forms + linear types = efficient network communication
- Diversity through inline code
- Array programming in Haskell
- Encode state transitions in types using linear types
- I am a functional programming evangelist
- Streaming programs without laziness: a short primer
- R and Haskell: best of both worlds with HaskellR
- Typing Nix
- We're hiring! Technical evangelist
- Linear types make performance more predictable