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 · 10/09/2026
I've always been curious what folks will accomplish with custom backends and jj, stoked to see more on this!
231
Chris Penner @chrispenner.ca · 05/08/2026
Also the whole ListT situation is a bit of a mess.
010
Chris Penner @chrispenner.ca · 05/08/2026
And it's a "structural" ability, so you don't even need to depend on it if you don't want to; you can redefine it yourself and it will still be compatible :)
020
Chris Penner @chrispenner.ca · 05/08/2026
Totally. It's interesting too how in Haskell, Monad Transformers do tend to throw a wrench into things; in Unison the only thing you need to depend on is just a two line ability definition, then libraries can handle it however they like: structural ability Stream e where emit : e -> ()
120
Chris Penner @chrispenner.ca · 05/08/2026
In Unison it's great because producers use the Stream effect, and you can upgrade it to a Coroutine by just adding the `Ask` effect, they compose!
040
Chris Penner @chrispenner.ca · 05/08/2026
Obviously many other languages have a take on this, but in Haskell for example there are many different and incompatible kinds. Optimizing for specific use-cases is nice, but I think having a shared foundational and compatible interface wins out in this case.
230
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
I don't have to serialize some state machine, the code itself and the real Unison values are serialized for me by the language itself. Pretty cool 😎
040
Chris Penner @chrispenner.ca · 04/08/2026
It doesn't look like much, and that's kinda the point. That single line saves the full workflow seamlessly to a DB, it can be re-hydrated and continue running like nothing happened whenever the response is received whether in a second or a week.
120
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 · 04/08/2026
Glad to hear you're back on your feet!
010
Chris Penner @chrispenner.ca · 30/07/2026
Also the only person who has permission to write his code in Comic Sans
040
Chris Penner @chrispenner.ca · 30/07/2026
I feel like a lot of metaprogramming tasks require a lot of "normalprogramming" experience, which is going to be tough for newer generations of programmers to acquire.
040
Chris Penner @chrispenner.ca · 30/07/2026
How do you feel about that change?
100
Chris Penner @chrispenner.ca · 28/07/2026
Thanks for writing this up Steve! I'm saddened that more infrastructure doesn't run on these ideas, but am heartened that it seems to be catching on lately, and aspire to build in support for these ideas in apps I build from now out!
110
Chris Penner @chrispenner.ca · 16/07/2026
More than ever, see this great Hank Green video on Jevons Paradox www.youtube.com/watch?v=IfvB...
youtube.com
Coal is Extremely Dumb
YouTube video by Hank Green
020
Chris Penner @chrispenner.ca · 01/07/2026
Ogmo is so back!!
020
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 · 14/01/2026
"unspecified" behaviours are fun too, for instance in JSON duplicate keys aren't disallowed, and there was at least recorded case where a middleware validation layer used the first value of a key and the application used the last value of a key, which was never validated. Chaos ensues.
020
Chris Penner @chrispenner.ca · 10/01/2026
As it happens, labour is currently the primary means of non-upper-class folks getting the money they need to live, so any automation which threatens labour directly threatens their way of life. In order for automation to thrive it's important to first establish better systems for sharing value
140
Chris Penner @chrispenner.ca · 10/01/2026
Absolutely. When folks tell me about how much more productive AI has made them, my conversation with them goes like this: "Oh that's great! I'm sure you've gotten a raise then right? No? Oh well at least you must not work as many hours now right? No? What's that? Your co-worker got laid off?"
140
Chris Penner @chrispenner.ca · 04/01/2026
I hadn't heard of them but good shout, looks great! I'll give that a go 👍
020
Chris Penner @chrispenner.ca · 02/01/2026
I'm learning that the model for the fully-formed shape wasn't too bad, but splitting it up into individually printable parts for assembly is much trickier 🤷‍♂️
120
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
When I'm feeling impure I go to Church to improve... hackage.haskell.org/package/free...
hackage.haskell.org
Control.Monad.Trans.Free.Church
070
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
Chris Penner @chrispenner.ca · 23/10/2025
Congrats Steve! Knock down those barriers to jj adoption one at a time! P.s. building a code collaboration is good fun with interesting challenges, I’m sure you’ll enjoy it.
000
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 · 17/10/2025
Can confirm that I’ve had nothing but problems with Spotify support. Dont worry though it’s not a sign of beef or anything, @danimalcannon.com and I are cool 😎
110
Chris Penner @chrispenner.ca · 15/10/2025
lol, and when I implemented my own public wrapper over it, and implemented `publicJWKFromPrivateJWK` the AI auto-complete confidently returned the private JWK as-is, asserting that the library "takes care of it for you" which AFAICT is NOT the case... the next generation of app security is cooked.
010
Chris Penner @chrispenner.ca · 15/10/2025
Even the #Haskell `jose` library doesn't have a separate type for public vs private JWKs, even a phantom type would do the trick. TBH this is just as bad as how generated certs are named key and key.pub; If you tab-complete you'll get the private one every time and there's no `.private` as a hint
110
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 · 14/10/2025
At the moment I use STM as my lowest-level primitive; then leave it up to the STM implementors to use the mutexes haha. STM has all the channels, queues and vars you need to do any form of actors or CSP you like :)
010
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
My current thoughts: go down the list and use the first approach that you can fit your problem into: * Pipeline processing * CSP * Actors (a half dozen or fewer, statically defined) * STM * Mutexes (only ever use these if you're implementing STM 😆)
120