Sign in

Matt Massicotte

@massicotte.org
2.9K followers 1.4K following 2.8K posts

apple platform dev, outdoors, justice, games, he/him Every problem has a simple wrong answer github.com/mattmassicotte www.massicotte.org mastodon.social/@mattiem

PostsRepliesMedia
Matt Massicotte @massicotte.org · 07/10/2026
Still so rough. But here's an in-editor voxel tool adding and removing matter, then paint textures selected from a palette control. github.com/mattmassicotte/Vox... #Godot
0100
Matt Massicotte @massicotte.org · 28/09/2026
I really want to play the game on the fake Ikea TV
Picture of a display IKEA TV. There is a print of a video game scene on it. A woman with her back turned, holding a sword, is looking out into a dimly-lit forest. Several hovering stones with glowing tunic symbols surround her.
3150
Matt Massicotte @massicotte.org · 26/09/2026
Found this jacket. Got it as a speaker gift for a Twitter conference. There were quite a few attempts to "acquire" my handle, including one that caused quite a bit of drama. I suppose someone will eventually get it now that it's abandoned. But the jacket (I never wear) is mine forever.
Close up of a fleece jacket sleeve with “@mattie” embroidered in blue thread.
2130
Matt Massicotte @massicotte.org · 16/09/2026
Something is wrong… somewhere… because the incorrect textures are being used. Possibly a shader problem, honestly there's a lot going on here. But I got somewhere with voxel painting! #Godot
0274
Matt Massicotte @massicotte.org · 02/09/2026
I have now added a janky target visualizer and an add/remove toggle to my Godot 3D editor plugin. (This is all just an interface to the incredible voxel-tools project.) github.com/Zylann/godot_voxel
070
Matt Massicotte @massicotte.org · 30/08/2026
Tiny bit of progress! Still so much to do for better control of what, and where in space, this happens. (painting volumes in 3D space feels very weird)
170
Matt Massicotte @massicotte.org · 29/08/2026
Editing voxel data in the Godot editor with the mouse. Very limited and really not useful… yet?
050
Matt Massicotte @massicotte.org · 11/08/2026
It's a weird, poorly-defined diamond-ish shape. But I made it using a custom tool that manipulates SDF voxel data live in the Godot editor, driven by github.com/Zylann/godot_voxel. This was a challenge… Made a number of doc PRs to both Godot and this repo along the way (10/10 experiences!)
Screenshot of Godot 3D editor. There’s a horizon with color 3d axes visible. At the origin of these axes is a rough, poorly-shaded 3d diamond-like shape.
0100
Matt Massicotte @massicotte.org · 22/07/2026
Vanya and Five Drive By Each Other meme
010
Matt Massicotte @massicotte.org · 09/07/2026
I am having feelings today.
A four-cell comic, known as the drowning meme.

The first cell has a hand just above water with the word “society” next to it.

Second cell has a hand approaching, could it be there to help?

Instead in the next cell, it gets a high-five along with the quote “it’s just a tool!”.

The last cell shows the hand now nearly submerged.
0191
Matt Massicotte @massicotte.org · 26/06/2026
Inventory management, 3d models in a 2d control, input/mouse controls. It looks *just terrible* but I've managed to a lot working here. I'm learning way more about how to manage state and object relationships with Godot, all with amazingly little difficulty.
1100
Matt Massicotte @massicotte.org · 24/06/2026
I cannot decide if I like the "update" or the "premium" badge more
Yahoo financial news with two posts by MT Newswire, both with a premium badge.

First: Gold rises as the dollar climbs to the highest in more than a year.

Second: Update: Gold falls as the dollar climbs to the highest in more than a year.
110
Matt Massicotte @massicotte.org · 21/06/2026
Area-triggered object spawning. Getting the rotation right for arbitrary surfaces was tricky. I had to learn about quaternions!
2160
Matt Massicotte @massicotte.org · 17/06/2026
ok pretty happy with this. 3d collision detection with animated crosshairs.
3190
Matt Massicotte @massicotte.org · 13/06/2026
I'm quite pleased I was able to build some landscape, texture it, cut a hole it in, and then, very intentionally this time, fall though into the void
1160
Matt Massicotte @massicotte.org · 20/05/2026
Had an interesting discussion with @danielsaidi.bsky.social about protocol isolation. Extensions that also need MainActor push you in one direction, but it's still a trade-off. Both options can make sense. Would have been a documentation problem before, but is now a type system problem.
screenshot of swift code:

// makes sense if it's reasonable to use this
// protocol off main and you want to support that
protocol Option1 {
	func coreFunction()
}

@MainActor
extension Option1 {
	func mainOnlyFunction() {
	}
}

// much easier for main-only users, but does
// reduce flexibilty
protocol Option2 {
	@MainActor
	func coreFunction()
}

@MainActor
extension Option2 {
	func mainOnlyFunction() {
	}
}
093
Matt Massicotte @massicotte.org · 17/05/2026
Ok calling this text corruption effect good enough.
2120
Matt Massicotte @massicotte.org · 27/04/2026
SHHH THE NEIGHBORS
Sign attached to a pole that reads:

WARNING

alcohol consumption will make you believe you are whispering. I assure you, you’re not.
080
Matt Massicotte @massicotte.org · 27/04/2026
This is probably something that iOS people knew all along, more likely never even realized was an issue. But I *just* figured out a better way to do multi-platform imports, after years of doing it the wrong way.
screenshot of swift code, with a dark theme:

// you can import AppKit in Catalyst, so a guard is needed
#if canImport(AppKit) && !targetEnvironment(macCatalyst)
import AppKit
#elseif canImport(UIKit)
import UIKit
#endif

// but inverting the order makes it so much simpler!
#if canImport(UIKit)
import UIKit
#elseif canImport(AppKit)
import AppKit
#endif
 Public • 13s ‒ Apr 27 at 6:45 AM

screenshot of swift code, with a dark theme:

// you can import AppKit in Catalyst, so a guard is needed
#if canImport(AppKit) && !targetEnvironment(macCatalyst)
import AppKit
#elseif canImport(UIKit)
import UIKit
#endif

// but inverting the order makes it so much simpler!
#if canImport(UIKit)
import UIKit
#elseif canImport(AppKit)
import AppKit
#endif
0211
Matt Massicotte @massicotte.org · 09/04/2026
I've been thinking on this lately. Adding internal concurrency to a thread-unsafe type like this should possible, and it is. But should it be easier? I don't think so, because you should probably avoid it unless you have no other choice.
Screenshot of Swift code, light on dark background:

class NonSendable {
	func createTask() {
		Task {
			// you cannot reference self or any other thread-unsafe
			// data from a new concurrent task without more work
			// and that makes sense
		}
	}

	func withGCD() {
		DispatchQueue.global().async {
			// This same problem exists with GCD. You'll need some
			// queue to return to.
		}
	}
}
040
Matt Massicotte @massicotte.org · 19/02/2026
A while ago, I changed my blog over to Zola. I like it! But almost immediately it started costing more, due to increased outgoing data. Today I finally figured it out! (Zola includes all posts in your RSS feed by default and the file was getting big)
Screenshot from AWS Amplify of a graph. The trend line is pretty steady, then after a short spike, it goes down to a much lower baseline.
170
Matt Massicotte @massicotte.org · 17/10/2025
In worse condition than I would have hoped for. But very legit wear and tear from the rockabilly dude I bought it from. Feels amazing and sounds way better than I expected. (NS Design WAV 4 electric upright bass)
Electric upright bass, red-toned gloss body with dark fingerboard. Set up in a corner next to an amplifier.
3511
Matt Massicotte @massicotte.org · 28/09/2025
This trochus snail has done an incredible job of keeping hair algae under control in my aquarium… except for the one spot it cannot reach. Life can be so cruel.
Close up shot of a trochus snail perched on top of a rock structure. Its shell is covered in a thin layer of hair algae.
180
Matt Massicotte @massicotte.org · 21/08/2025
Survived. About 3 km hiking and 4km paddling, which is a lot for this kind of boat. Very cold overnight, which made it incredibly foggy for the morning trip back. I could barely see. Cool, but also kinda scary.
A rocky stream running through a forest.A green raft with a paddle across it, on the beach of a lake. Trees line the shores, and a few rocks are visible in the water.A tent set up in a clearing. A backpack and deflated raft are to the side. Mostly covered by trees, with some water visible though them.Green raft on a lake beach, paddle to its side. There’s intense fog, and the trees on opposite shore are just barely visible.
3250
Matt Massicotte @massicotte.org · 25/06/2025
Wow! I've just discovered a new capability of Swift 6.2 that could have a pretty dramatic effect on many designs. It's now possible to return non-Sendable from nonisolated functions. This is lifting a huge constraint! (it also it ruins a bunch of my teaching material 😅)
Screenshot of Swift Code:

// Being non-Sendable, this type cannot cross isolation boundaries.
class NonSendable {}

// This return value will *always* cross a boundary when
// called from an isolated context...
nonisolated func makeNonSendable() async -> NonSendable {
	NonSendable()
}

@MainActor
func test() async {
    // In 6.2 the compiler is now able to use its flow-sensitive analysis
    // system (called Region-Based Isolation) to prove that, despite
    // the type crossing a boundary here, the situation is always safe.
    let _ = await makeNonSendable()
}
6311
Matt Massicotte @massicotte.org · 03/06/2025
This slide has been cut from my upcoming talk. The decision was not easy.
Screenshot of a keynote slide:

"lazy let" is small and in the center. "How?" is much larger over top, and "WHEN??" is even bigger and at an angle.
0170
Matt Massicotte @massicotte.org · 21/05/2025
On a lark, I picked up a Doqo keyboard case for my iPad mini. Keys are tiny but useable-ish. Weighs ~ 50% more that the iPad. Trackpad isn’t bad! Build quality is ok. I’m not sure I’ll actually use this, so it was kinda dumb. But it’s quite something!
Case without iPad sitting on 14” MacBook pro. An adult hand on the iPad keyboard case in a position to type.Open case next to open 14” MacBook. About 50% smaller.Closed case sitting on top of closed 14” MacBook. About half the surface.
220
Matt Massicotte @massicotte.org · 14/05/2025
Thankfully there are multiple multiverses 😉 (But actually I have no idea why these would be different. Mastodon is just weird that way.)
Screenshot of my Mastodon post with 26 stars
120
Matt Massicotte @massicotte.org · 03/04/2025
I need some placeholder data, so naturally
screenshot of Swift code:

let names = [
	"Aknot",
	"Aziz",
	"Billy",
	"Jean-Baptiste Emanuel Zorg",
	"Korben",
	"Leeloo",
	"Ruby Rhod",
	"Vito Cornelius",
]
080
Matt Massicotte @massicotte.org · 04/03/2025
I completely understand the idea of changing your relationship with Apple given their behavior. It makes sense, especially if I think only about how it affects me personally. But then I come back to the wisdom of Michael Bolton. Unsure how to reconcile these…
Scene from Office Space. The Michael character is just reacting to the suggestion that he change his name to avoid confusion with other Michael Bolton.

“No way. Why should I change? He’s the one who sucks?”
1183
Matt Massicotte @massicotte.org · 13/02/2025
Got a teeny bit lost to start (typical). Had to break trail the entire way. Lost a glove, but passing skier found it (thank goodness). Got tired, called it about 1/3 of the way up. Old bones and all. Winter vacation. #splitboarding
Splitboard gear on the snow, in preparation for some uphill touring.Splitboard skis breaking trail in light snow. Trees in the background.Shot of legs strapped into assembled splitboard. An open trail is visible with untouched snow ahead.Can of The Alchemist’s Heady Topper beer on a restaurant table.
1110
Matt Massicotte @massicotte.org · 08/02/2025
Why can't I stop wasting time on this?? github.com/mattmassicot...
Screenshot of iOS app showing a feed of Mastodon and Bluesky postsScreenshot of macOS app showing a feed of Mastodon and Bluesky posts
13292
Matt Massicotte @massicotte.org · 22/01/2025
Tried to exploit how @_inheritActorContext works here by capturing the isolation variable. But it appears to be more sensitive to where the closure is formed than I realized. Works for simple cases, but not this one. But, one day! forums.swift.org/t/closure-is...
screenshot of swift source code:

  public func observe(
    isolation: (any Actor)? = #isolation,
    @_inheritActorContext _ apply: @escaping @Sendable (_ transaction: UITransaction) -> Void
  ) -> ObserveToken {
//    let actor = ActorProxy(base: isolation)
    return observe(
      apply,
      task: { transaction, operation in
        Task {
          _ = isolation
//          await actor.perform {
            operation()
//          }
        }
      }
    )
  }
100
Matt Massicotte @massicotte.org · 26/12/2024
Surprise update:
Two Nintendo Switch game cases: Witcher 3 and Zelda Echoes of Wisdom
190
Matt Massicotte @massicotte.org · 08/12/2024
The SwiftUI environment is great for immutable values, but! How I am supposed to deal with Observable types that require stuff in their initializer? Optional? Init with (bogus) placeholders for the default case? Not do this at all? If you have stuff I should read about this, please send my way!
Screenshot of Swift code:

@Observable
class SomeClass {
}

extension EnvironmentValues {
	@Entry var usedAllOverThePlace = SomeClass(
		// ok but I want to pass stuff in here...
	)
}
3150
Matt Massicotte @massicotte.org · 02/12/2024
it is time
Ellis from Die Hard is smiling.

“Hans, bubby, I’m your white knight”
071
Matt Massicotte @massicotte.org · 23/11/2024
Did you know urchins like to pick up and carry around loose stuff? Mine has found an empty shell.
Close up shot of a blue tuxedo urchin with an empty shell hat on.
1140
Matt Massicotte @massicotte.org · 22/11/2024
Multipass: an open source unified Mastodon/Bluesky client for macOS and iOS. Is it good? No. Do I have time for this? Also no. Is it functional? Definitely no. I cannot stress enough how this is not a thing, but it's Friday and I thought it would be fun to share. github.com/mattmassicot...
Screenshot of a macOS app displaying a an extremely simplified social timeline featuring a mix of both mastodon and Bluesky posts.
8636