Sign in

Chris Penner

@chrispenner.ca
545 followers 608 following 263 posts

FP and Programming languages nerd Building the Unison Language & Unison Share 📍Victoria BC 🇨🇦 chrispenner.ca

PostsRepliesMedia
Chris Penner @chrispenner.ca · 26/09/2026
Editor where the font size each line of code is scaled by the number of dependencies it has
150
Chris Penner @chrispenner.ca · 05/08/2026
Another @unison-lang.org feature I think every language should have in some capacity: Streams! Unison's effect system makes them even more useful since you can interleave effects into your streams. A Stream or Coroutine abstraction is so useful as a way for libraries to consume or provide data.
191
Chris Penner @chrispenner.ca · 04/08/2026
No other language lets me write straight-line code like this. The `prompt` line saves saves the current continuation in a database, then sends a prompt to the user's browser to select a slot. When selected, `prompt` returns the in-memory @unison-lang.org object which corresponds to the chosen slot.
timeslotOptions : [calendly.TimeSlot]
timeslotOptions = calendly.listEventTimeslots calendlyToken startTime endTime
form = timeslotOptions
        |> timeSlotsForm
          (ts ->
            ( eventName ts
            , calendly.TimeSlot.startTime ts
            , duration ts
            ))
chosenSlot : calendly.TimeSlot
chosenSlot = prompt timeslotsForm
170
Chris Penner @chrispenner.ca · 19/02/2026
Happy to announce Unison Computing is branching out into consulting! iIf you'd like a hand with your project you'd be hard-pressed to find a better team to help, drop us a line 😎
070
Chris Penner @chrispenner.ca · 06/02/2026
www.iankduncan.com/engineering/...
iankduncan.com
GitHub Actions Is Slowly Killing Your Engineering Team - Ian Duncan
Why GitHub Actions is the Internet Explorer of CI, and why Buildkite offers a better path forward for teams that care about developer experience.
150
Reposted by Chris Penner
Unison @unison-lang.org · 29/01/2026
📰 UCM 1.1.0 is out! * `dependents` can search by variant, not just type or ability name * New built-ins for Argon2id hashing * VS Code actions: Edit Definition & Open on Share * MCP tool: `share-project-info` * Faster bytes ops & improved run command
github.com
Release release/1.1.0 · unisonweb/unison
What's Changed Features: The dependents command now work on constructors and ability requests. (#6115) Support for "Edit Definition" and "Open on Share" in the Unison Language VS Code extension v1...
054
Chris Penner @chrispenner.ca · 25/01/2026
I made this tool for managing workshop sessions in tmux and I've used it *hundreds of times* per day every day for 6 years now without any hiccups; if you're looking for a good way to manage your terminal sessions maybe this is it. github.com/ChrisPenner/...
github.com
GitHub - ChrisPenner/session-sauce: Shell plugin for managing tmux sessions
Shell plugin for managing tmux sessions. Contribute to ChrisPenner/session-sauce development by creating an account on GitHub.
020
Chris Penner @chrispenner.ca · 21/01/2026
Unison's got a C FFI! 🎉 If you were waiting for a reason to try Unison, now's a good a time as any :)
093
Chris Penner @chrispenner.ca · 02/01/2026
Learning more #OpenSCAD in order to bring a #kumiko inspired table-lamp to life :)
160
Chris Penner @chrispenner.ca · 20/12/2025
It's absolutely bonkers how much of modern society is still dependent on staying on hold for 2 hours on an unreliable connection when at any moment your thumb could slip or you could drop the call and there's just no way to get that call back except to wait another 2 hours 😑 #WestJet
050
Chris Penner @chrispenner.ca · 09/12/2025
In any active software project new bugs are always being introduced. Bugs that are important or easy to fix are typically prioritized. This means that as the project ages, the pool of bugs inevitably becomes a majority of the 'difficult to fix' or 'low-priority' variety 😢
070
Reposted by Chris Penner
Unison @unison-lang.org · 02/12/2025
🌟 It's time for #AdventOfCode! That means it's a great month to pick up a new programming language! Try it in Unison this year! 🎁
share.unison-lang.org
@unison/advent-of-code | Unison Share
🎄Template project with stubs for Advent of Code
092
Reposted by Chris Penner
Brian Hughes @bmhughes.bsky.social · 01/12/2025
This is actually quite brilliant, up to and including the final sentence 🔥
5682880111199
Reposted by Chris Penner
Kaushik Chakraborty @kaushikc.org · 26/11/2025
Sharing atproto-experiments: a foundation for building AT Protocol tools using @unison-lang.org . And the first tool is to sync Bluesky replies as @leaflet.pub comments. #atproto #unisonlang #leafletpub
notes.kaushikc.org
atproto-experiments
A foundation for building tools on the AT Protocol using Unison Programming Language.
3268
Reposted by Chris Penner
Eric Torreborre @etorreborre.blog · 15/11/2025
In "a new programming paradigm" Dejan Milicic goes into why @unison-lang.org is so unique and useful: docs.google.com/presentation...
docs.google.com
Unison: A New Programming Paradigm
print(("Unison", newline)); print("A new programming paradigm") Dejan Miličić JetBrains
1133
Chris Penner @chrispenner.ca · 25/11/2025
Want to try a radically innovative programming language? Unison is ready! Unison is approachable, user-friendly, and has a great community of friendly folks :) On top of that it has mind-bending features like serializable function closures and built-in distributed programming tools!
1316
Chris Penner @chrispenner.ca · 11/11/2025
I collected my thoughts on why mutexes suck; and what we can do about it. chrispenner.ca/posts/mutexes #STM #concurrency #parallelism #mutexes #Haskell
chrispenner.ca
Ditch your (mut)ex, you deserve better
Mutexes are unreliable tools, let's explore better alternatives.
0223
Reposted by Chris Penner
Unison @unison-lang.org · 04/11/2025
🚀 New deep dive: Distributed System Engineering in Unison In our latest blog post, take a look at the design of the Volturno library: a distributed stream processing engine built atop Unison Cloud. www.unison-lang.org/blog/volturn...
unison-lang.org
Distributed system engineering in Unison: Volturno · Unison programming language
We look at the design of Volturno, a streaming engine with exactly-once processing, to illustrate why Unison Cloud is a great enabler for distributed systems builders.
0106
Reposted by Chris Penner
Unison @unison-lang.org · 28/10/2025
🤯 Unison in the browser!? Dan Freeman's new library, Proscenium, runs Unison code in WebAssembly. Its companion library, @dfreeman/playbill, contains a walk-through of various features and live examples on Unison Cloud! Play a game in your browser entirely in Unison; better yet, write your own!
share.unison-lang.org
@dfreeman/playbill | Unison Share
A walkthrough of building UIs with Proscenium, including several example apps.
074
Reposted by Chris Penner
Unison @unison-lang.org · 22/10/2025
📽️ Here's a quick video for anyone just getting started with Unison. The gist of it: install the UCM, create a scratch file in the right place, and have fun programming!
youtu.be
Starting the UCM and setting up a scratch file
This video covers the basics of starting the Unison Codebase Manager (UCM) and writing your first bits of Unison code in a scratch file. We walk through: * Installing Unison on your system (Mac, Linux, or Windows) * Starting the UCM in a working directory * Creating .u scratch files and ensuring the UCM is watching for changes Helpful links: * Install Unison here: https://www.unison-lang.org/docs/quickstart/#step-1-install-unison * Get the UCM Desktop app: https://github.com/unisonweb/ucm-desktop/releases * Join the Unison community: https://www.unison-lang.org/discord
092
Chris Penner @chrispenner.ca · 21/10/2025
Don't get too hung up on #Monads, there are other ways to sequence effects; including Arrows; and they provide even better static analysis! Let me know what you think :) #Haskell chrispenner.ca/posts/arrow-...
chrispenner.ca
Exploring Arrows for sequencing effects
Monads are <em>one</em> way to sequence effects, but they're not the only way!
1104
Chris Penner @chrispenner.ca · 15/10/2025
I'd really like to speak with whoever thought it was a good idea for the public and private JWK's to be represented by the same type, have the same name, with just a few missing parameters... Ah yes, the presence or absence of this "d" parameter could tank my entire company... seems safe to me :|
110
Chris Penner @chrispenner.ca · 12/10/2025
Having a 3D printer at home is such a life-hack. Just printed some custom french-cleats to hang a giant 7ft long painting and it made it 10x easier.
030
Chris Penner @chrispenner.ca · 12/10/2025
I've spent hours over the last months writing a post about how mutexes suck and everyone should use STM instead; but have come to the realization that even STM is more complex than necessary. What's your decision-making process when building a concurrent and/or parallel system? See mine below 👇
140
Reposted by Chris Penner
Simon @hojberg.xyz · 08/10/2025
I wrote about AI and programming. About the identity challenges we are facing as programmers and the potential erasure of craft. There's a fun little easter egg in the header as well :) hojberg.xyz/the-programm...
hojberg.xyz
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
53614
Chris Penner @chrispenner.ca · 08/10/2025
I'm very pleased to call Simon ( @hojberg.xyz ) my co-worker, team-mate and friend, go check out this wonderfully written take. hojberg.xyz/the-programm...
hojberg.xyz
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
250
Chris Penner @chrispenner.ca · 08/10/2025
IMO we shouldn't be trying so hard to solve "the expression problem"; We should make it easy to update existing functions when types change, but it shouldn't always "silently work" with the new type; oftentimes existing functionality needs a human to look over it when there are changes!
000
Chris Penner @chrispenner.ca · 06/10/2025
What do folks out there do for error handling in concurrent tasks in #Haskell? For now I've settled on having an error `TMVar`, then use a `ki` structured concurrency scope which forks all my jobs and ends in an `(Right <$> awaitAll) <|> (Left <$> readTMVar errVar)`
283
Chris Penner @chrispenner.ca · 06/10/2025
TIL callCC's return value isn't rank 2 polymorphic (but you can just route it through Void and use `absurd` to make it rank 2 polymorphic) Spent too long staring at the error wondering why it wasn't working haha. #Haskell github.com/haskell/mtl/...
github.com
Why not use rank 2 polymorphism for `callCC` · Issue #127 · haskell/mtl
I think rank 2 polymorphism is a must-have for callCC, or this code will not compile: f :: Int -> String f x = (`runCont` id) $ callCC $ \exit -> do y <- case x of 0 -> exit "error: x == 0" _ -> pu...
060
Chris Penner @chrispenner.ca · 03/10/2025
Huh, TIL that `Text.lines != Text.splitOn "\n"` when the string ends in a newline.
000
Reposted by Chris Penner
Unison @unison-lang.org · 01/10/2025
You can now spin up Unison Cloud clusters on your own infrastructure! ✅ Build elastic distributed systems and services in vastly less code ✅ Fast, typed RPC ✅ Deployments in seconds ✅ Free to get started youtu.be/0sZqI1XoGLY
youtu.be
Unison Cloud on your infrastructure
YouTube video by Unison Language
0148
Reposted by Chris Penner
Andrew Jarrett @ahrjarrett.bsky.social · 27/09/2025
Interesting article by @chrispenner.ca about why monads aren't the solution to everything, and a functor I've never crossed paths with called selective applicatives. Still absorbing it, but great read as always. Check it out if that's your thing. chrispenner.ca/posts/expres...
chrispenner.ca
Monads are too powerful: The Expressiveness Spectrum
Monads are a useful tool, but what costs do we pay for their expressive power?
031
Chris Penner @chrispenner.ca · 27/09/2025
New blog post! #Haskell is built on a foundation of Monads, but are they really the optimal way to sequence effects or should we keep looking for something better? What's the big deal with Applicatives and Selective Applicatives? Read on! chrispenner.ca/posts/expres...
chrispenner.ca
Monads are too powerful: The Expressiveness Spectrum
Monads are a useful tool, but what costs do we pay for their expressive power?
5297
Reposted by Chris Penner
Unison @unison-lang.org · 26/09/2025
✨ The new dependents view shows everywhere a definition is used, broken down by category, as a separate card in Unison Share and the Unison Desktop app. Your codebase is a bidirectional graph! You should be able to walk it as such.
083
Reposted by Chris Penner
Unison @unison-lang.org · 22/09/2025
📽️ New to the Unison workflow? We’re making short videos to walk you through the basics. Follow along here: www.youtube.com/watch?v=QJ1h...
youtube.com
Install and upgrade a library dependency
A walk-through of the process for installing a library dependency and upgrading it. * `lib.install` downloads the library into the `lib` namespace. * `ls lib` will show the current dependencies in the project * `upgrade` with no arguments opens up a version picker. Select the old version first, then the new one. Simple changes can be propagated without developer intervention; more complicated upgrades will prompt the UCM to create a branch for the upgrade process and open up the impacted terms in a scratch file. The resolution process follows the standard workflow for updating Unison code, described here: https://youtu.be/8lCDSCm_rGA.
062
Chris Penner @chrispenner.ca · 18/09/2025
I'm pretty stoked on how well WASM seems to be working for languages that target it (not that there aren't difficulties there). Even more stoked for these updates!
030
Chris Penner @chrispenner.ca · 16/09/2025
It may in fact be a VeryBadIdea™ but I'm extremely tempted to duct tape my soldering iron to my 3D printer and use it to wood-burn the grid lines on the Go board I'm building...
010
Chris Penner @chrispenner.ca · 08/09/2025
We all know AI is unreliable, but what's the worst case you've seen? #zig This one made me exhale sharply through my nose today:
Zig doesn't have a built-in "defer on error" construct, but there are several patterns you can use to achieve similar functionality:
Method 1: Using errdefer (Zig's error-specific defer)
Actually, Zig does have exactly what you're looking for! It's called errdefer:
271
Chris Penner @chrispenner.ca · 22/08/2025
Programming languages really need a way to expose functions as "you can import this within this project and tests, but it's not public to other libraries"; somewhere in-between fully public and fully private.
340
Reposted by Chris Penner
Haskell programming language @haskell.org · 20/08/2025
The GHC developers are very pleased to announce the availability of the first alpha prerelease of GHC 9.14.1. Highlights: * Major improvements to the Specialiser * SSE/AVX support in the x86 native backend * Significant improvements in the GHCi debugger blog.haskell.org/ghc-9-14-1-a... #Haskell
blog.haskell.org
GHC 9.14.1-alpha1 is now available | The Haskell Programming Language's blog
04214
Chris Penner @chrispenner.ca · 16/08/2025
Ah yes, I was just wondering how I could make my CI _less_ deterministic...
1110
Chris Penner @chrispenner.ca · 15/08/2025
Is the non-#haskell part of the world aware STM exists? I see a few languages have somewhat broken implementations... #STM is truly a revolutionary tool for any kind of async/concurrent/parallel programming and new languages would do well to ensure they can implement it well!
4101
Chris Penner @chrispenner.ca · 14/08/2025
You should add debugging views to your database. #postgres #databases chrispenner.ca/posts/views-...
chrispenner.ca
You should add debug views to your DB
A nifty trick for debugging your tables easier.
081
Reposted by Chris Penner
Unison @unison-lang.org · 13/08/2025
🧙 For fans of optics and traversals and other such functional programming wizardry, here's Unison's own @chrispenner.ca, explaining how he composed custom Traversable instances to speed up Unison Share database queries!
chrispenner.ca
Using traversals to batch database queries
Techniques for lateralizing nested code
0145
Chris Penner @chrispenner.ca · 13/08/2025
Nifty trick to save some memory and cpu with caching, but using weak pointers so values clean themselves up when they're no longer referenced. #Haskell chrispenner.ca/posts/intern...
chrispenner.ca
Save memory and CPU with an interning cache
Weak Caching for Strong Apps
0144
Chris Penner @chrispenner.ca · 13/08/2025
Anyone have recommendations for a good app for having people sign up for a mailing list? I'd like to keep in touch with folks across platforms, and it looks like MailChimp decided to delete my entire existing mailing list due to inactivity, so I guess I'll be starting over... 😑
010
Reposted by Chris Penner
Freya Holmér @freya.bsky.social · 13/08/2025
as we all know every programmer's dream job is to never have to code again and instead just manage PRs with unreliable code and communicate with the unreliable entities who wrote it
428316
Reposted by Chris Penner
∃ugene -Yokota 🥙 @eed3si9n.com · 12/08/2025
I was wondering why everyone is suddenly planning to move out of GitHub
062
Reposted by Chris Penner
Chris Penner @chrispenner.ca · 11/08/2025
I think folks often go to _great_ lengths to avoid being just a little less type-safe or to avoid just a _little_ boilerplate, often at the expense of simplicity, adaptability and clarity.
021
Chris Penner @chrispenner.ca · 11/08/2025
New blog post! chrispenner.ca/posts/traver... Here's a technique for refactoring nested code for batch workflows, specifically when loading data from a database. I got up to 300x improvements on some codepaths with a relatively mechanical transformation.
chrispenner.ca
Traversals for batch work
Techniques for lateralizing nested code
2111