Built a locksmith website with a custom Haskell framework

Thought I’d share something our team’s been working on. My co-founder just finished a website for a locksmith business using Jenga, a framework he’s been developing on top of Obelisk. The site’s been running in production with 100% uptime.

Jenga sits on top of Obelisk and adds a static page generation layer plus an SEO optimization using a library called lamarckian, if you want to check it out on his GitHub. He’s been using Reflex-DOM and Obelisk for years but kept wanting better tooling for static sites and SEO stuff that most Haskell web frameworks don’t really focus on.

The core piece is lamarckian, which handles meta tags, structured data, and sitemap generation. When you change a route, everything that references it gets handled appropriately at compile time thanks to obelisk-route package and Jenga Links. Saves a lot of the typical “oh crap, I broke a link” moments. It also has strict markdown handling at compile time thanks to MMark package (https://hackage.haskell.org/package/mmark)

The site uses SendGrid’s HTTP API for contact forms, runs on NixOS deployed to DigitalOcean, standard Namecheap DNS setup. The HTML generation, through Reflex dom static builder, uses custom quasi-quoters he wrote for cleaner string interpolation. Template Haskell handles the routing layer, but that’s pretty standard for this kind of thing.

He’s just released version 1.0.0 of Jenga, which you can check out here: https://github.com/Ace-Interview-Prep/jenga! We also are building a job board as part of the Ace Talent platform, where Jenga is the core infrastructure. Might explore some FFI bindings for browser APIs down the line.

Just wanted to share since we’re finding Haskell works pretty well for this kind of production web work. Curious if anyone else has tackled similar problems with static generation and SEO in Haskell, or has thoughts on what’s missing in that space.

14 Likes

Really exciting project! I can see how Jenga could be a game-changer for static site generation and SEO in Haskell. One challenge I’ve encountered with static sites in Haskell is handling dynamic content or client-side interactivity, especially for things like forms or live updates. If you’re not already doing so, you could potentially leverage a minimal JavaScript layer for things like client-side form validation, or even use Haskell’s FFI to connect to browser APIs for dynamic functionality. Also, have you considered integrating any server-side rendering (SSR) techniques to improve initial page load speeds for SEO purposes? Curious if there are plans for any future enhancements in this space!