Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ jobs:

strategy:
matrix:
stack: ["2.7.3"]
ghc: ["8.10.7"]
stack: ["3.11.1"]
ghc: ["9.10.3"]

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
Expand Down Expand Up @@ -71,7 +71,7 @@ jobs:
path: ~/.stack
key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}

- name: Build site executable
- name: Build site executables
run: stack build --system-ghc

- name: Build site
Expand Down
2 changes: 1 addition & 1 deletion contact/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ <h3 class="font-semibold text-xl">HF Discourse</h3>
</p>
<div class="flex flex-col sm:flex-row justify-around md:flex-col lg:flex-row">
<div class="mt-8 mx-3 center">
<a class="arrow-link" href="https://discourse.haskell.org/c/haskell-foundation/11">>> Discourse</a>
<a class="arrow-link" href="https://discourse.haskell.org/c/haskell-foundation">>> Discourse</a>
</div>
<div class="mt-8 mx-3 center">
<a class="arrow-link" href="https://gitlab.haskell.org/hf/minutes">>> Meeting Minutes</a>
Expand Down
4 changes: 2 additions & 2 deletions events/2026-haskell-ecosystem-workshop.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ The registration link is available [on Eventbrite](https://www.eventbrite.com/e/

## Video Recordings

Recordings will be made available shortly after the event. Last year's recordings [are available on YouTube](https://www.youtube.com/playlist?list=PLQpeDZt0_xQe319u9EdkpxjibYFtGsugc).
The recordings [are available online](https://www.youtube.com/playlist?list=PLApZHRDK3cFc).

## The Workshop

Expand Down Expand Up @@ -54,7 +54,7 @@ Please make sure that you have [checked out and built](https://gitlab.haskell.or

<table>

<tr><th colspan="3">2025-06-05</th></tr>
<tr><th colspan="3">2026-06-04</th></tr>
Comment thread
dschrempf marked this conversation as resolved.
<tr><th>8:30-9:00</th><td> Registration</td><td></td></tr>
<tr><th>9:00-9:20</th><td> Welcome and Intro</td><td>Farhad&nbsp;Mehta and Laurent&nbsp;P. René de Cotret</td></tr>
<tr><th>9:20-10:20</th><td> Optimising for fast builds with GHC</td><td>Teo Camarasu </td></tr>
Expand Down
5 changes: 1 addition & 4 deletions events/2026-haskell-implementors-workshop.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,7 @@ Coffee, tea, and fruit will be provided. There is also easy access to a tap for

### Video Recordings and Live Streaming

The event will be recorded.
<!--
The recordings [are available on YouTube](https://www.youtube.com/playlist?list=PLQpeDZt0_xQfpBPdVV3hUZ3_pDxmYhsbr).
-->
The recordings [are available online](https://www.youtube.com/playlist?list=PLV9Q98f69SkA).

## Call for Proposals

Expand Down
12 changes: 11 additions & 1 deletion haskell-foundation.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,17 @@ executable site
, hakyll ^>= 4.14 || ^>= 4.15 || ^>= 4.16
, monadlist
, pandoc >=2.11 && <3.8
, filepath ^>= 1.4
, filepath ^>= 1.5
, text
ghc-options: -threaded
default-language: Haskell2010

executable social-draft
main-is: Main.hs
hs-source-dirs: tools/social-crossposting
build-depends: base == 4.*
, directory
, filepath ^>= 1.5
, pandoc >=2.11 && <3.8
, text
default-language: Haskell2010
1 change: 0 additions & 1 deletion news/2025-03-24

This file was deleted.

58 changes: 58 additions & 0 deletions news/2026-07-18/hiw-hew-2026-videos.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
title: 2026 Haskell Workshop Videos Now Online
---

Couldn't make it to Rapperswil, or want to revisit a talk? The recordings from
this year's [Haskell Implementors' Workshop](/events/2026-haskell-implementors-workshop.html)
and [Haskell Ecosystem Workshop](/events/2026-haskell-ecosystem-workshop.html)
are now available online. Both workshops were held on the lakeside campus of
the University of Applied Sciences of Eastern Switzerland (OST) in Rapperswil
on June 4th and 5th, alongside ZuriHac, and hosted by the Haskell Foundation.

## Haskell Implementors' Workshop

The Haskell Implementors' Workshop is a forum for everyone interested in the
design and development of Haskell implementations, tools, libraries, and
supporting infrastructure — whether you build them or just want to follow
along. Watch the
[Haskell Implementors' Workshop 2026 playlist](https://www.youtube.com/playlist?list=PLV9Q98f69SkA).

This year's program ranged from the state of the compiler to concrete tooling
you can use today:

- **GHC Status Report** — Andreas Klebinger
- **Stable Haskell**, on making GHC easier to build and ship — Julian Ospald
- **MicroHs Dead or Alive? — A status report** — Lennart Augustsson
- **Lightweight profiling with `ghc-stack-profiler`** — Hannes Siebenhandl
- **Evolving the Haskell Debugger** — Rodrigo Mesquita
- **Is There a Future for a Formally Specified Haskell Report** — David Binder
- **Towards better implicit parameters** — Lorenzo Tabacchini
- **GHC String interpolation** — Brandon Chinn

The recordings also include a round of lightning talks. See the [workshop
page](/events/2026-haskell-implementors-workshop.html) for the full schedule and
abstracts.

## Haskell Ecosystem Workshop

The Haskell Ecosystem Workshop is for everyone interested in using Haskell to
build real-world tools and applications — from side projects to large
production systems. Speakers share hard-won lessons on developing and
maintaining Haskell software, and stay around during ZuriHac to answer
questions and dig into the details. Watch the
[Haskell Ecosystem Workshop 2026 playlist](https://www.youtube.com/playlist?list=PLApZHRDK3cFc).

The talks:

- **Optimising for fast builds with GHC** — Teo Camarasu
- **Servant at Bitnomial — Expanding type-safety from applications to systems** — Laurent P. René de Cotret
- **Why you should want to contribute to the Haskell Ecosystem** — Andreas Klebinger
- **Flora** — Théophile Choutri de Tarle
- **50,000 Lines of LLM Haskell: What Broke, What Held, and Letting Go** — Jappie Klooster
- **Stackage: a community Haskell source package distribution** — Jens Petersen
- **Haskell Security** — Fraser Tweedale (published at a later date)

The full program is on the
[workshop page](/events/2026-haskell-ecosystem-workshop.html).

Enjoy!
72 changes: 28 additions & 44 deletions site.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
import Control.Monad (filterM, guard)
import Control.Monad.ListM (sortByM)
import Data.List (sortOn, isPrefixOf)
import Data.Maybe (fromJust, fromMaybe, isJust)
import Data.Maybe (fromMaybe, isJust)
import qualified Data.Text as T
import Hakyll
import Hakyll.Web.Html.RelativizeUrls (relativizeUrls)
import Hakyll.Web.Template (loadAndApplyTemplate)
import Hakyll.Web.Template.Context (defaultContext)
import System.FilePath (dropExtension, splitFileName, takeBaseName, (</>))
import System.FilePath (dropExtension, splitFileName, takeBaseName, takeDirectory, takeFileName, (</>))
import System.IO (SeekMode (RelativeSeek))
import Text.Pandoc as Pandoc (
Block (Para, Plain),
Expand Down Expand Up @@ -130,13 +130,25 @@ main = hakyllWith config $ do
>>= relativizeUrls

-- news ------------------------------------------------------------------------------------------------
match "news/**.markdown" $ compile pandocCompiler
-- An entry is either a full article (own page) or a headline linking out
-- (front matter `link`, no own page). `hasLink` splits the two.
let hasLink = isJust . lookupString "link"
matchMetadata "news/**.markdown" (not . hasLink) $ do
route $ setExtension "html"
compile $ do
sponsors <- buildBoilerplateCtx Nothing
pandocCompiler
>>= loadAndApplyTemplate "templates/news/page.html" newsItemCtx
>>= loadAndApplyTemplate "templates/boilerplate.html" sponsors
>>= relativizeUrls
matchMetadata "news/**.markdown" hasLink $ compile pandocCompiler

categories <- buildCategories "news/**.markdown" (fromCapture "news/categories/**.html")

tagsRules categories $ \category catId -> compile $ do
news <- recentFirst =<< loadAll catId
let ctx =
listField "news" (newsWithCategoriesCtx categories) (pure news)
listField "news" newsItemCtx (pure news)
<> dateField "category" "%B %e, %Y"
<> defaultContext

Expand All @@ -159,19 +171,6 @@ main = hakyllWith config $ do
>>= loadAndApplyTemplate "templates/boilerplate.html" sponsors
>>= relativizeUrls

match "news/*.markdown" $ do
route $ setExtension "html"
let ctxt =
mconcat
[defaultContext]
compile $ do
sponsors <- buildBoilerplateCtx Nothing
pandocCompiler
>>= applyAsTemplate sponsors
>>= loadAndApplyTemplate "templates/news/page.html" ctxt
>>= loadAndApplyTemplate "templates/boilerplate.html" sponsors
>>= relativizeUrls

-- press -----------------------------------------------------------------------------------------------
match "press/**.markdown" $ compile pandocCompiler
create ["news/press/index.html"] $ do
Expand Down Expand Up @@ -242,8 +241,8 @@ main = hakyllWith config $ do
route $ setExtension "html"
compile $ do
sponsors <- buildBoilerplateCtx Nothing
-- extract the captures path fragment. really no easier way?
episode <- head . fromJust . capture "podcast/*/index.markdown" <$> getUnderlying
-- the episode slug is the directory name in podcast/<slug>/index.markdown
episode <- takeFileName . takeDirectory . toFilePath <$> getUnderlying

let ctxt =
mconcat
Expand Down Expand Up @@ -500,30 +499,15 @@ slugField name =

-- news ------------------------------------------------------------------------------------------------

-- | build group of news inside date of publishing (category)
newsWithCategoriesCtx :: Tags -> Context String
newsWithCategoriesCtx categories =
listField "categories" categoryCtx getAllCategories
-- | Context for a single news entry, shared by the index tiles, the homepage
-- announcement and the standalone article page. `teaser` is the entry's first
-- paragraph as plain text (from the "description" version), used as a preview
-- so the index links to the full article rather than inlining it.
newsItemCtx :: Context String
newsItemCtx =
field "teaser" (loadBody . setVersion (Just "description") . itemIdentifier)
<> dateField "date" "%B %e, %Y"
<> defaultContext
where
getAllCategories :: Compiler [Item (String, [Identifier])]
getAllCategories = pure . map buildItemFromTag $ tagsMap categories
where
buildItemFromTag :: (String, [Identifier]) -> Item (String, [Identifier])
buildItemFromTag c@(name, _) = Item (tagsMakeId categories name) c
categoryCtx :: Context (String, [Identifier])
categoryCtx =
listFieldWith "news" newsCtx getNews
<> metadataField
<> urlField "link"
<> pathField "path"
<> titleField "title"
<> missingField
where
getNews :: Item (String, [Identifier]) -> Compiler [Item String]
getNews (itemBody -> (_, ids)) = mapM load ids
newsCtx :: Context String
newsCtx = newsWithCategoriesCtx categories
Comment thread
LaurentRDC marked this conversation as resolved.

-- faq -------------------------------------------------------------------------------------------------
faqCtx :: [Item String] -> Context String
Expand Down Expand Up @@ -567,7 +551,7 @@ podcastListCtx episodes =
<> defaultContext

podcastOrd :: Item String -> Integer
podcastOrd = read . head . fromJust . capture "podcast/*/index.markdown" . itemIdentifier
podcastOrd = read . takeFileName . takeDirectory . toFilePath . itemIdentifier

-- careers ---------------------------------------------------------------------------------------------
careersCtx :: [Item String] -> Context String
Expand All @@ -585,7 +569,7 @@ hiringSponsorsCtx sponsors =

announcementsCtx :: [Item String] -> Context String
announcementsCtx ads =
listField "announcements" defaultContext (pure ads)
listField "announcements" newsItemCtx (pure ads)

-- Events

Expand Down
7 changes: 2 additions & 5 deletions stack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# resolver:
# name: custom-snapshot
# location: "./custom-snapshot.yaml"
resolver: lts-18.28
resolver: lts-24.51

# User packages to be built.
# Various formats can be used as shown in the example below.
Expand All @@ -39,10 +39,7 @@ packages:
- '.'
# Dependency packages to be pulled from upstream that are not in the resolver
# (e.g., acme-missiles-0.3)
extra-deps: [
hakyll-4.14.1.0
, lrucache-1.2.0.1
]
extra-deps: []

# Override default flag values for local packages and extra-deps
flags: {}
Expand Down
2 changes: 1 addition & 1 deletion templates/footer.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<div class="flex space-x-4">
<a href="https://twitter.com/haskellfound" target="_blank" class="text-4xl block"><span class="fab fa-twitter"></span></a>
<a href="https://www.linkedin.com/company/haskell-foundation-inc" target="_blank" class="text-4xl block"><span class="fab fa-linkedin-in"></span></a>
<a href="https://discourse.haskell.org/c/haskell-foundation/11" target="_blank" class="text-4xl block"><span class="fab fa-discourse"></span></a>
<a href="https://discourse.haskell.org/c/haskell-foundation" target="_blank" class="text-4xl block"><span class="fab fa-discourse"></span></a>
<a rel="me" href="https://mastodon.social/@haskell_foundation" target="_blank" class="text-4xl block"><span class="fab fa-mastodon"></span></a>
<a href="https://www.youtube.com/@HaskellFoundation" target="_blank" class="text-4xl block"><span class="fab fa-youtube"></span></a>
<a href="https://github.com/haskellfoundation" target="_blank" class="text-4xl block"><span class="fab fa-github"></span></a>
Expand Down
8 changes: 5 additions & 3 deletions templates/news/frontpage.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@
<div class="bg-gray-100 px-6 sm:px-12 lg:px-16 py-6 lg:py-24 h-full">
<div class="space-y-4">
<h2 class="text-center text-2xl md:text-4xl leading-tight font-normal">$title$</h2>
$body$
<p>$teaser$</p>

$if(link)$
<div class="mt-4">
$if(link)$
<a class="arrow-link" href="$link$">&gt;&gt; Read more</a>
$else$
<a class="arrow-link" href="$url$">&gt;&gt; Read more</a>
$endif$
</div>
$endif$
</div>
</div>
</div>
3 changes: 3 additions & 0 deletions templates/news/page.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
<div class="xl:max-w-screen-xl mx-auto md:px-12 lg:px-16 py-16 md:py-24">
<div class="bg-gray-800 shadow-lg shadow-xl shadow-md shadow-sm px-6 sm:px-12 md:px-12 lg:px-16 py-16 md:py-20">
<h2 class="text-gray-50 font-normal text-3xl md:text-4xl leading-tight text-center">$title$</h2>
<div class="mt-10 lg:text-xl text-gray-300 text-center">
<strong>$if(author)$$author$, $endif$$date$</strong>
</div>
</div>
</div>
</div>
Expand Down
8 changes: 5 additions & 3 deletions templates/news/tile.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ <h2 class="text-2xl md:text-4xl leading-tight font-normal">$title$</h2>
$author$
</div>
$endif$
<div class="mt-8 space-y-4">$body$</div>
<div class="mt-8 space-y-4"><p>$teaser$</p></div>
</div>
$if(link)$
<div class="mt-4">
$if(link)$
<a class="arrow-link" href="$link$" target="_blank">&gt;&gt; Read more</a>
$else$
<a class="arrow-link" href="$url$">&gt;&gt; Read more</a>
$endif$
</div>
$endif$
</div>
</div>
</div>
Expand Down
Loading
Loading