41554 blogs · [ { "id": "01a0bb52-a191-710b-ac33-51c18b4072c9", "title": "Tilia—a new formatter for Haskell", "url": "https://markkarpov.com/post/announcing-tilia.html", "published_at": "2026-09-16T00:00:00+00:00" }, { "id": "01a087a0-4a58-7368-ae5a-3e1edbadf9b5", "title": "Announcing Ahab", "url": "https://markkarpov.com/post/announcing-ahab.html", "published_at": "2026-08-14T00:00:00+00:00" }, { "id": "01a087a0-4a58-7368-ae5a-3e1edc07f6dd", "title": "Tomorrow comes", "url": "https://markkarpov.com/post/tomorrow-comes.html", "published_at": "2026-08-05T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a35103a9", "title": "Integrating Coverity static analysis with Bazel", "url": "https://www.tweag.io/blog/2026-02-05-bazel-coverity-integration/", "published_at": "2026-02-05T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a42cbdb8", "title": "How to keep a Bazel project hermetic?", "url": "https://www.tweag.io/blog/2022-09-15-hermetic-bazel/", "published_at": "2022-09-15T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a5100249", "title": "TPS evaluation for Tezos", "url": "https://research-development.nomadic-labs.com/tps-evaluation.html", "published_at": "2022-04-19T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a57d67bc", "title": "Simulating Tenderbake", "url": "https://www.tweag.io/blog/2021-05-21-tenderbake-simulator/", "published_at": "2021-05-21T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a66c386c", "title": "Ormolu internship", "url": "https://www.tweag.io/blog/2021-04-23-ormolu-intership/", "published_at": "2021-04-23T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a6b82558", "title": "GitHub actions for Haskell CI", "url": "https://markkarpov.com/post/github-actions-for-haskell-ci.html", "published_at": "2020-07-15T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a6dc25d0", "title": "Setting up Buildkite for Nix-based projects using Terraform and GCP", "url": "https://www.tweag.io/blog/2020-07-08-buildkite-for-nix-ci/", "published_at": "2020-07-08T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a7760ff9", "title": "The story with data-default", "url": "https://markkarpov.com/post/data-default.html", "published_at": "2020-05-30T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a86d7d29", "title": "Setting up a shared build cache using Bazel", "url": "https://www.tweag.io/posts/2020-04-09-bazel-remote-cache.html", "published_at": "2020-04-09T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c1901981d9", "title": "Setting up a shared build cache using Bazel", "url": "https://www.tweag.io/blog/2020-04-09-bazel-remote-cache/", "published_at": "2020-04-09T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a8c20337", "title": "Struggling to forget", "url": "https://markkarpov.com/post/struggling-to-forget.html", "published_at": "2020-01-03T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a93210a0", "title": "Exposure without giving up artistic control", "url": "https://markkarpov.com/post/exposure.html", "published_at": "2020-01-02T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816a9e5f868", "title": "Haskell vs OCaml", "url": "https://markkarpov.com/post/haskell-vs-ocaml.html", "published_at": "2019-12-06T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816aac7c89e", "title": "Canon EOS R settings I use", "url": "https://markkarpov.com/post/canon-eos-r-settings.html", "published_at": "2019-11-16T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816abbe0c54", "title": "Digital photography workflow for Linux", "url": "https://markkarpov.com/post/digital-photography-workflow.html", "published_at": "2019-11-16T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816acb1dd4e", "title": "Megaparsec 8", "url": "https://markkarpov.com/post/megaparsec-8.html", "published_at": "2019-11-07T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816ad547832", "title": "Ormolu: announcing first release", "url": "https://www.tweag.io/posts/2019-10-11-ormolu-first-release.html", "published_at": "2019-10-11T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c193c107fa", "title": "Ormolu: announcing first release", "url": "https://www.tweag.io/blog/2019-10-11-ormolu-first-release/", "published_at": "2019-10-11T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816ad9557fe", "title": "What does a humped critter have to teach us?", "url": "https://markkarpov.com/post/what-does-a-humped-critter-have-to-teach-us.html", "published_at": "2019-09-29T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816ae28e1de", "title": "Why Haskell is important", "url": "https://www.tweag.io/posts/2019-09-06-why-haskell-is-important.html", "published_at": "2019-09-06T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c1957b5c1e", "title": "Why Haskell is important", "url": "https://www.tweag.io/blog/2019-09-06-why-haskell-is-important/", "published_at": "2019-09-06T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816aec5db9c", "title": "Ormolu: format Haskell code like never before", "url": "https://www.tweag.io/posts/2019-05-27-ormolu.html", "published_at": "2019-05-27T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c1959c7ae5", "title": "Ormolu: format Haskell code like never before", "url": "https://www.tweag.io/blog/2019-05-27-ormolu/", "published_at": "2019-05-27T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816af99f6ed", "title": "The monads of Haskell", "url": "https://markkarpov.com/post/the-monads.html", "published_at": "2019-04-16T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b074469e", "title": "The types got you", "url": "https://www.tweag.io/posts/2019-02-13-types-got-you.html", "published_at": "2019-02-13T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c1976a57a0", "title": "The types got you", "url": "https://www.tweag.io/blog/2019-02-13-types-got-you/", "published_at": "2019-02-13T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b171b168", "title": "Existential quantification", "url": "https://markkarpov.com/post/existential-quantification.html", "published_at": "2018-11-11T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b271705e", "title": "Megaparsec 7", "url": "https://markkarpov.com/post/megaparsec-7.html", "published_at": "2018-08-27T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b2ffcfd3", "title": "Smart constructors that cannot fail", "url": "https://markkarpov.com/post/smart-constructors-that-cannot-fail.html", "published_at": "2018-06-16T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b33ef22d", "title": "Announcing GHC syntax highlighter", "url": "https://markkarpov.com/post/announcing-ghc-syntax-highlighter.html", "published_at": "2018-05-13T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b3b3e126", "title": "Stackage HEAD is now live!", "url": "https://www.tweag.io/posts/2018-04-17-stackage-head-is-live.html", "published_at": "2018-04-17T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c19a20fb22", "title": "Stackage HEAD is now live!", "url": "https://www.tweag.io/blog/2018-04-17-stackage-head-is-live/", "published_at": "2018-04-17T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b4572a7d", "title": "Bazel now supports building Haskell", "url": "https://www.tweag.io/posts/2018-02-28-bazel-haskell.html", "published_at": "2018-02-28T00:00:00+00:00" }, { "id": "01a0bb52-a191-710b-ac33-51c19a2365f0", "title": "Bazel now supports building Haskell", "url": "https://www.tweag.io/blog/2018-02-28-bazel-haskell/", "published_at": "2018-02-28T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b521a746", "title": "MMark status update", "url": "https://markkarpov.com/post/mmark-status-update.html", "published_at": "2018-02-14T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b5c022e2", "title": "Req 1.0.0, HTTP client, and streaming", "url": "https://markkarpov.com/post/req-1.0.0-http-client-and-streaming.html", "published_at": "2017-12-02T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b68bbb76", "title": "Announcing MMark", "url": "https://markkarpov.com/post/announcing-mmark.html", "published_at": "2017-11-17T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b696296e", "title": "Short ByteString and Text", "url": "https://markkarpov.com/post/short-bs-and-text.html", "published_at": "2017-10-30T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b7278999", "title": "Free monad considered harmful", "url": "https://markkarpov.com/post/free-monad-considered-harmful.html", "published_at": "2017-09-27T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b78a30e9", "title": "Announcing Hasky Stack", "url": "https://markkarpov.com/post/announcing-hasky-stack.html", "published_at": "2017-08-13T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b846c49a", "title": "Evolution of error messages", "url": "https://markkarpov.com/post/evolution-of-error-messages.html", "published_at": "2017-07-26T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b86c8830", "title": "A major upgrade to Megaparsec: more speed, more power", "url": "https://markkarpov.com/post/megaparsec-more-speed-more-power.html", "published_at": "2017-07-06T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b941f29e", "title": "Path 0.6.0 released", "url": "https://markkarpov.com/post/path-0.6.0-released.html", "published_at": "2017-06-16T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b955dff8", "title": "Migrating text metrics to pure Haskell", "url": "https://markkarpov.com/post/migrating-text-metrics.html", "published_at": "2017-06-13T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b96444b7", "title": "Working with text without pain", "url": "https://markkarpov.com/post/working-with-text-without-pain.html", "published_at": "2017-06-07T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816b9ef2a40", "title": "New site", "url": "https://markkarpov.com/post/new-site.html", "published_at": "2017-06-06T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816badafc71", "title": "Putting together a form validation library", "url": "https://markkarpov.com/post/putting-together-a-form-validation-library.html", "published_at": "2017-05-02T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bb1584fd", "title": "Hapistrano's new features", "url": "https://www.stackbuilders.com/news/hapistrano-s-new-features", "published_at": "2017-03-29T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bbca2f20", "title": "Latest additions to Megaparsec", "url": "https://markkarpov.com/post/latest-additions-to-megaparsec.html", "published_at": "2016-11-24T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bbe617e3", "title": "Category Theory Basics, Part I", "url": "https://markkarpov.com/post/category-theory-part-1.html", "published_at": "2016-09-18T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bc5b0f27", "title": "Concurrent Haskell in the real world", "url": "https://www.stackbuilders.com/news/concurrent-haskell-in-the-real-world", "published_at": "2016-08-02T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bcaa157a", "title": "Cassava Megaparsec library released", "url": "https://www.stackbuilders.com/news/cassava-megaparsec-library-released", "published_at": "2016-06-29T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bd644a4f", "title": "The Identicon package", "url": "https://markkarpov.com/post/the-identicon-package.html", "published_at": "2016-05-28T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816be3dc7aa", "title": "Announcing Megaparsec 5", "url": "https://markkarpov.com/post/announcing-megaparsec-5.html", "published_at": "2016-05-15T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816beb727a8", "title": "The true power of Dvorak", "url": "https://markkarpov.com/post/dvorak-rocks.html", "published_at": "2016-03-15T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bebfd577", "title": "Megaparsec 4 and 5", "url": "https://markkarpov.com/post/megaparsec-4-and-5.html", "published_at": "2016-02-23T00:00:00+00:00" }, { "id": "01a087a0-4a59-728f-9e99-3816bf919e53", "title": "Lisp and Haskell", "url": "https://markkarpov.com/post/lisp-and-haskell.html", "published_at": "2015-10-23T00:00:00+00:00" } ] posts Claim your blog
Back to Mark Karpov
Blog · corpus.blog/blogs/markkarpov.com/posts

Mark Karpov

markkarpov.com

2026

2022

2021

2020

2019

2018

2017

2016

2015