| date | 2026-04-23 |
|---|---|
| title | Some updates about Hell in 2026 |
I've added a few neat bits and bobs to Hell since I last blogged about it.
On the API side, things have slowed down when compared with the prior year,[^1] but other improvements were still made.
| date | 2026-04-23 |
|---|---|
| title | Some updates about Hell in 2026 |
I've added a few neat bits and bobs to Hell since I last blogged about it.
On the API side, things have slowed down when compared with the prior year,[^1] but other improvements were still made.
| // ==UserScript== | |
| // @name Auto-follow Slack links | |
| // @version 1 | |
| // @match https://artificial.slack.com/* | |
| // @grant none | |
| // ==/UserScript== | |
| setInterval(() => { | |
| document.querySelectorAll('a').forEach((a) => { | |
| if (a.innerText == 'open this link in your browser') { |
| // ==UserScript== | |
| // @name Slack->Todoist | |
| // @version 1 | |
| // @match https://app.slack.com/* | |
| // ==/UserScript== | |
| const timer = setInterval(() => { | |
| const containers = Array.from(document.querySelectorAll(`div[data-qa="message_container"]:not([${TAG}])`)); | |
| if (containers.length == 0) { | |
| } else { |
| {-# LANGUAGE KindSignatures, BlockArguments #-} | |
| {-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-} | |
| import Data.Kind | |
| import Data.Functor.Const | |
| import Control.Monad.Free | |
| import Control.Applicative.Free | |
| import qualified Data.ByteString as S | |
| import qualified Data.ByteString.Char8 as S8 | |
| import Data.Functor.Identity | |
| import Data.ByteString (ByteString) |
| {-# LANGUAGE KindSignatures, BlockArguments #-} | |
| {-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-} | |
| import Data.Kind | |
| import Data.Coerce | |
| import Data.Functor.Const | |
| import Control.Monad.Free | |
| import Control.Applicative.Free | |
| import qualified Data.ByteString as S | |
| import qualified Data.ByteString.Char8 as S8 | |
| import Data.Functor.Identity |
| {-# LANGUAGE KindSignatures, BlockArguments #-} | |
| {-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-} | |
| import Control.Monad.Free | |
| import Control.Applicative.Free | |
| import qualified Data.ByteString as S | |
| import qualified Data.ByteString.Char8 as S8 | |
| import Data.Functor.Identity | |
| import Data.ByteString (ByteString) | |
| import qualified Data.Map as Map | |
| import Data.Map (Map) |
| {-# LANGUAGE KindSignatures #-} | |
| {-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-} | |
| import Control.Monad.Free | |
| import Control.Applicative.Free | |
| import qualified Data.ByteString as S | |
| import qualified Data.ByteString.Char8 as S8 | |
| import Data.Functor.Identity | |
| import Data.ByteString (ByteString) | |
| import qualified Data.Map as Map | |
| import Data.Map (Map) |
| -- needs to be a `M i o a', but almost there. LH is difficult (bad docs, bad errors, changing syntax) | |
| {-# LANGUAGE GADTs #-} | |
| {-# OPTIONS_GHC -fplugin=LiquidHaskell #-} | |
| {-# language GeneralizedNewtypeDeriving, DeriveFunctor #-} | |
| {-@ LIQUID "--prune-unsorted" @-} | |
| import Control.Monad.State | |
| import Data.Set qualified as Set |
| {-# OPTIONS_GHC -fplugin=LiquidHaskell #-} | |
| {-# language OverloadedStrings, BangPatterns #-} | |
| import Data.Word | |
| import Foreign.Ptr | |
| import Foreign.C.Types | |
| import Foreign.Marshal.Alloc | |
| import System.Posix.IO.ByteString | |
| import System.Posix.Types | |
| main :: IO () |
| data Todo = Todo { | |
| id :: Text, | |
| created :: UTCTime, | |
| title :: Text, | |
| description :: Text, | |
| priority :: Int | |
| } | |
| data Command | |
| = Add Main.Todo |