Skip to content
Open
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
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
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!
62 changes: 23 additions & 39 deletions site.hs
Original file line number Diff line number Diff line change
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 @@ -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 @@ -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
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